@vectros-ai/mcp-server 0.7.0 → 0.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +101 -0
- package/README.md +41 -3
- package/dist/cli-http.js +513 -528
- package/dist/cli-http.js.map +1 -1
- package/dist/cli-http.mjs +513 -528
- package/dist/cli-http.mjs.map +1 -1
- package/dist/cli.js +513 -528
- package/dist/cli.js.map +1 -1
- package/dist/cli.mjs +513 -528
- package/dist/cli.mjs.map +1 -1
- package/dist/index.js +376 -525
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +376 -525
- package/dist/index.mjs.map +1 -1
- package/package.json +2 -2
package/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,107 @@
|
|
|
3
3
|
All notable changes to `@vectros-ai/mcp-server` are documented here.
|
|
4
4
|
This project adheres to [Semantic Versioning](https://semver.org).
|
|
5
5
|
|
|
6
|
+
## 0.10.0
|
|
7
|
+
|
|
8
|
+
### Changed (breaking)
|
|
9
|
+
|
|
10
|
+
- **Organization and client identities are now namespaces.** The tools that took
|
|
11
|
+
`orgId` / `clientId` now use namespaced scopes:
|
|
12
|
+
- `lookup_principal`: `kind` is `"user"` or a namespace (`org`, `client`, or
|
|
13
|
+
one you define).
|
|
14
|
+
- Write tools (`record_create`, `folder_create`, `folder_update`,
|
|
15
|
+
`document_ingest`, `document_update`): the `orgId` / `clientId` inputs are
|
|
16
|
+
replaced by `scopes` — an array of `namespace:value` entries, e.g.
|
|
17
|
+
`["org:<id>"]`.
|
|
18
|
+
- Read and query tools (`record_query`, `document_query`, `folder_query`,
|
|
19
|
+
`hybrid_search`, `rag_ask`, `list_schemas`): the `orgId` / `clientId` filters
|
|
20
|
+
are replaced by a single `scope` filter (`namespace:value`). `list_schemas`'s
|
|
21
|
+
`surface` now accepts `record`, `document`, `user`, `entity`.
|
|
22
|
+
|
|
23
|
+
### Added
|
|
24
|
+
|
|
25
|
+
- **Automatic API-key resolution from the Vectros CLI keyring.** When
|
|
26
|
+
`VECTROS_API_KEY` is not set, the server now resolves its key by invoking the
|
|
27
|
+
`vectros` CLI credential helper (`vectros keyring show --format raw`) as a
|
|
28
|
+
subprocess — so a key stored once in the CLI keyring is shared by the server, agent
|
|
29
|
+
hooks, and scripts, instead of a plaintext copy pasted into the server's config
|
|
30
|
+
that silently drifts. `VECTROS_API_KEY` still takes precedence when set (behavior
|
|
31
|
+
unchanged), and an unset key now falls back to the keyring rather than failing
|
|
32
|
+
immediately. Set `VECTROS_KEYRING_ALIAS` to resolve a specific keyring entry
|
|
33
|
+
instead of the active one. Requires **`@vectros-ai/cli` 0.9.0+** on `PATH` (the
|
|
34
|
+
version the keyring itself shipped in — the helper deliberately calls no command
|
|
35
|
+
newer than that, so it works with an existing install); if neither an env key nor
|
|
36
|
+
the CLI is available, startup fails with actionable guidance naming both options.
|
|
37
|
+
The resolved key is held in memory only and never logged.
|
|
38
|
+
- **Startup says which identity it resolved, and warns when you didn't name one.**
|
|
39
|
+
The startup log names the keyring entry the key came from (never the key itself).
|
|
40
|
+
When `VECTROS_API_KEY` is unset and no `VECTROS_KEYRING_ALIAS` is given, the key
|
|
41
|
+
comes from whichever entry was last made active — and that log is a **warning**,
|
|
42
|
+
whatever key turns up: silently getting a live key (acting on real data) and
|
|
43
|
+
silently getting a test key (not acting on it, when you believed you were) are both
|
|
44
|
+
unwelcome. It is easy to reach by accident, because a blank placeholder
|
|
45
|
+
(`"VECTROS_API_KEY": ""` in a client config, or a Docker `-e` pass-through of an
|
|
46
|
+
unset var) reads as "not configured yet" but resolves like an unset key. Nothing is
|
|
47
|
+
blocked, and naming an entry never warns.
|
|
48
|
+
|
|
49
|
+
## 0.9.0
|
|
50
|
+
|
|
51
|
+
### Added
|
|
52
|
+
|
|
53
|
+
- **Ownership scopes on writes.** `record_create`, `document_ingest`, and `folder_create`
|
|
54
|
+
accept a `scopes` array of `namespace:value` entries (at most 2 — e.g.
|
|
55
|
+
`["org:<uuid>", "group:eng-team"]`), declaring the item's complete scope ownership
|
|
56
|
+
from the credential's own identity. An empty array (`[]`) creates a **private**,
|
|
57
|
+
user-owned item — the building block for per-user agent memory alongside shared
|
|
58
|
+
team content. Omit the field to keep today's behavior (the credential's full
|
|
59
|
+
identity is stamped).
|
|
60
|
+
- **`scope` filter on reads and retrieval.** `record_query` and `document_query`
|
|
61
|
+
(list mode), `hybrid_search`, and `rag_ask` retrieval accept a `scope` filter in the
|
|
62
|
+
same `namespace:value` form, confining results — or a grounded answer's corpus — to
|
|
63
|
+
one scope. `scope=org:<id>` / `scope=client:<id>` are equivalent to the existing
|
|
64
|
+
`orgId`/`clientId` filters.
|
|
65
|
+
|
|
66
|
+
## 0.8.1 — 2026-07-10
|
|
67
|
+
|
|
68
|
+
### Changed
|
|
69
|
+
|
|
70
|
+
- **Dependency maintenance** — repinned the bundled `@vectros-ai/sdk` to `0.34.0`
|
|
71
|
+
(additive `scopes` read-back on record/document/folder responses, plus webhooks).
|
|
72
|
+
The server bundles the SDK into its published output, so this is a rebuild against
|
|
73
|
+
the current SDK; no tool behavior changes.
|
|
74
|
+
|
|
75
|
+
## 0.8.0 — 2026-07-10
|
|
76
|
+
|
|
77
|
+
Larger result limits and real pagination across every enumeration tool — no tool
|
|
78
|
+
forces you to accept a hard ceiling you can't get past.
|
|
79
|
+
|
|
80
|
+
### Changed
|
|
81
|
+
|
|
82
|
+
- **Higher `limit` ceilings, up to each API's max.** Every enumeration tool keeps a low
|
|
83
|
+
default (context protection) but now lets you raise `limit` in a single call when you
|
|
84
|
+
can accept the larger payload: `record_query` and `document_query` max **10 → 100**;
|
|
85
|
+
`hybrid_search` max **10 → 50**; `rag_ask`'s grounding-corpus limit max **10 → 50**;
|
|
86
|
+
`lookup_principal` max **50 → 100**; `folder_query` max **50 → 100**. Heavy
|
|
87
|
+
passages/payloads already auto-truncate, so a high limit is safe.
|
|
88
|
+
- **Pagination on every enumeration tool, with an explicit "more remains" signal.**
|
|
89
|
+
- `record_query`, `document_query`, and `lookup_principal` now return a
|
|
90
|
+
`{ data, nextCursor }` page and accept a `startFrom` cursor. **This is a shape change**
|
|
91
|
+
— these tools previously returned a bare array. A non-null `nextCursor` means more
|
|
92
|
+
results remain; pass it back as `startFrom` to page. (This matches `folder_query` and
|
|
93
|
+
`version_history`, which already worked this way.)
|
|
94
|
+
- `hybrid_search` keeps `offset` pagination and now adds an explicit `hasMore` flag
|
|
95
|
+
(derived from `totalResults`) so you know when results remain past the current page.
|
|
96
|
+
- **Tool descriptions refreshed** to state the real max, that raising it is the agent's
|
|
97
|
+
context-cost call, and how to page.
|
|
98
|
+
|
|
99
|
+
## 0.7.1 — 2026-07-09
|
|
100
|
+
|
|
101
|
+
### Changed
|
|
102
|
+
|
|
103
|
+
- **`rag_ask` model examples updated.** The `model` parameter description now lists
|
|
104
|
+
`claude-sonnet-5`; the earlier `claude-sonnet-4-6` alias has been retired. Call
|
|
105
|
+
`GET /v1/models` for the current inference catalog your key can reach.
|
|
106
|
+
|
|
6
107
|
## 0.7.0 — 2026-07-05
|
|
7
108
|
|
|
8
109
|
Text-retention control that works, and tool descriptions that tell the truth
|
package/README.md
CHANGED
|
@@ -242,7 +242,7 @@ Two read-only resources for ambient context (no tool call required):
|
|
|
242
242
|
Use a **scoped permanent API key** (`ssk_*`), not a root key (`sk_*`).
|
|
243
243
|
|
|
244
244
|
A scoped key is bound to a narrowed `AccessProfile` — e.g. read-only
|
|
245
|
-
across one `
|
|
245
|
+
across one org scope (`scope:org`). If your MCP install is compromised, the blast
|
|
246
246
|
radius is whatever the profile allows, not the whole tenant. The
|
|
247
247
|
server emits a `warn` log line on startup when you pass a wildcard
|
|
248
248
|
`sk_*` for exactly this reason.
|
|
@@ -259,11 +259,42 @@ AccessProfile for MCP") for least-privilege credential setup — the
|
|
|
259
259
|
`vectros bootstrap` flow provisions a scoped `ssk_*` key and its AccessProfile
|
|
260
260
|
in one command.
|
|
261
261
|
|
|
262
|
+
## Credential resolution
|
|
263
|
+
|
|
264
|
+
The server resolves its API key from the first source that yields one:
|
|
265
|
+
|
|
266
|
+
1. **`VECTROS_API_KEY`** — always wins when set.
|
|
267
|
+
2. **The `vectros` CLI keyring** — if the key is unset and
|
|
268
|
+
[`@vectros-ai/cli`](https://www.npmjs.com/package/@vectros-ai/cli) **0.9.0+** is on
|
|
269
|
+
your `PATH`, the server runs `vectros keyring show --format raw` as a subprocess
|
|
270
|
+
and uses the key it prints. By default that is your **active** identity; set
|
|
271
|
+
`VECTROS_KEYRING_ALIAS` to pick a specific entry. This is the same pattern as
|
|
272
|
+
`git credential` / `docker-credential-*` / `aws credential_process`: the key
|
|
273
|
+
lives in one place, and the server, your scripts, and your agent hooks all read
|
|
274
|
+
it from there instead of each keeping a plaintext copy that drifts.
|
|
275
|
+
3. **Neither** — startup fails with a message naming both options.
|
|
276
|
+
|
|
277
|
+
The resolved key is held in memory and never logged. Startup logs which alias it
|
|
278
|
+
resolved (not the key), so you can tell at a glance which identity the server is
|
|
279
|
+
running as — `vectros keyring doctor` shows the same view.
|
|
280
|
+
|
|
281
|
+
> **Startup warns when it picks an identity you didn't name.** If `VECTROS_API_KEY`
|
|
282
|
+
> is unset and no `VECTROS_KEYRING_ALIAS` is set, the server falls back to your
|
|
283
|
+
> **active** keyring entry and logs a warning — it is running as whatever identity
|
|
284
|
+
> `vectros switch` last selected, which may be a `ssk_live_*` key acting on real data
|
|
285
|
+
> or a `ssk_test_*` one that isn't. Either can be an unwelcome surprise, because a
|
|
286
|
+
> blank placeholder (`"VECTROS_API_KEY": ""` in a client config, or `-e VECTROS_API_KEY`
|
|
287
|
+
> passing through an unset var in Docker) reads as "not configured yet" but resolves
|
|
288
|
+
> like an unset key. Nothing is blocked — name an entry with `VECTROS_KEYRING_ALIAS`,
|
|
289
|
+
> or set `VECTROS_API_KEY`, and the warning goes away. `vectros keyring doctor` shows
|
|
290
|
+
> which entry is active and which of your keys are live.
|
|
291
|
+
|
|
262
292
|
## Environment variables
|
|
263
293
|
|
|
264
294
|
| Var | Required | Default | Purpose |
|
|
265
295
|
|---|---|---|---|
|
|
266
|
-
| `VECTROS_API_KEY` |
|
|
296
|
+
| `VECTROS_API_KEY` | no\* | — | Vectros API key. Accepts `sk_*` / `ssk_*` / `st_*`; `ssk_*` recommended. \*Required **unless** the `vectros` CLI is installed with a usable keyring entry — see [Credential resolution](#credential-resolution). Takes precedence when set. |
|
|
297
|
+
| `VECTROS_KEYRING_ALIAS` | no | (the active entry) | Resolve this `vectros` keyring entry instead of the active one. Ignored when `VECTROS_API_KEY` is set. |
|
|
267
298
|
| `VECTROS_API_BASE_URL` | no | `https://api.vectros.ai` | Override for staging or other envs. Validated: must be `https://` (or `http://` to localhost) and an official `*.vectros.ai` host. |
|
|
268
299
|
| `VECTROS_ALLOW_INSECURE_BASE_URL` | no | — | Set `1` to bypass the base-URL allow-list (e.g. a trusted local proxy). **Not recommended** — sends your key to an unvalidated host; logs a warning. |
|
|
269
300
|
| `VECTROS_MCP_INGEST_ROOT` | no | process cwd | Directory `document_ingest`'s `filePath` mode is jailed to. Paths escaping it (traversal/absolute/symlink) or matching a sensitive pattern are rejected. |
|
|
@@ -310,7 +341,7 @@ Health probe lives at `GET /healthz` (always unauthenticated, k8s
|
|
|
310
341
|
readiness-friendly).
|
|
311
342
|
|
|
312
343
|
Current limitation: the server uses one upstream credential per process
|
|
313
|
-
(the
|
|
344
|
+
(the key resolved at startup). Per-request credential override via the
|
|
314
345
|
incoming Authorization header is a planned enhancement. For now, deploy one
|
|
315
346
|
server per credential boundary you want.
|
|
316
347
|
|
|
@@ -376,6 +407,13 @@ registry.
|
|
|
376
407
|
self-contained and works without `.npmrc` config on the consumer's
|
|
377
408
|
machine.
|
|
378
409
|
|
|
410
|
+
## Security & trust
|
|
411
|
+
|
|
412
|
+
Vectros enforces per-customer, fail-closed isolation and least-privilege scoped keys, with a
|
|
413
|
+
tamper-evident audit and version history. Customer-facing surfaces are hardened through extensive
|
|
414
|
+
adversarial security review. For the full trust posture, drawn plainly with its boundaries, see the
|
|
415
|
+
[compliance and trust guide](https://docs.vectros.ai/guides/operations-trust/compliance).
|
|
416
|
+
|
|
379
417
|
## License
|
|
380
418
|
|
|
381
419
|
Apache-2.0. See the LICENSE file.
|