@vectros-ai/mcp-server 0.17.2 → 0.18.1
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 +55 -0
- package/README.md +52 -29
- package/dist/cli-http.js +210 -169
- package/dist/cli-http.js.map +1 -1
- package/dist/cli-http.mjs +210 -169
- package/dist/cli-http.mjs.map +1 -1
- package/dist/cli.js +210 -169
- package/dist/cli.js.map +1 -1
- package/dist/cli.mjs +210 -169
- package/dist/cli.mjs.map +1 -1
- package/dist/index.d.mts +2 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.js +210 -169
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +210 -169
- package/dist/index.mjs.map +1 -1
- package/package.json +3 -3
package/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,61 @@
|
|
|
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.18.1 — 2026-10-12
|
|
7
|
+
|
|
8
|
+
### Changed
|
|
9
|
+
|
|
10
|
+
- **`folder_delete` tells the agent to keep a record it cannot re-file, and the `sk_*` startup warning points at
|
|
11
|
+
things you can find.** The `folder_delete` description says not to delete a record just because this server cannot
|
|
12
|
+
move it, and to tell the user to move it with the Vectros API or SDK instead. The warning logged for a wildcard `sk_*` key names the
|
|
13
|
+
command that mints a scoped key (`npx -y @vectros-ai/cli bootstrap`) and the README's "Recommended credential"
|
|
14
|
+
section.
|
|
15
|
+
- **`rag_ask` and `document_ask` name another reason a routed call (`providerAlias`) is refused with a `403`.**
|
|
16
|
+
Besides an unknown or inactive alias and a risk waiver your account has not signed, an account that has accepted the
|
|
17
|
+
Business Associate Agreement with Vectros in the developer portal also needs an account owner to attest each provider
|
|
18
|
+
config in the portal (Model Providers). Until then the platform refuses the call with a `403` that says it needs a
|
|
19
|
+
BAA-holder attestation. The `providerAlias` description and the README section on routing a call through your own
|
|
20
|
+
provider say so; nothing in this server records the attestation.
|
|
21
|
+
- **`rag_ask` and `document_ask` describe the generation limits as the platform applies them.** The platform's default
|
|
22
|
+
model is `claude-haiku-5-5`. It, `claude-sonnet-5`, `claude-sonnet-5-5` and `claude-opus-5-5` can reason before they
|
|
23
|
+
answer, and when they do the reasoning counts against `maxTokens`, so a small `maxTokens` can return little or no
|
|
24
|
+
text; the `maxTokens` description says so and suggests 1024 or more for a short answer. The same four models ignore a
|
|
25
|
+
`temperature`, so the `rag_ask` `temperature` description says it applies only to models that accept one, such as
|
|
26
|
+
`claude-haiku-4-5`. The `model` descriptions point to `defaultModel` in `GET /v1/models` instead of naming a default.
|
|
27
|
+
Only the descriptions change; what the tools send is the same.
|
|
28
|
+
- **The server is built against SDK 0.47.0.** During a long streamed answer the platform now sends a `: keepalive`
|
|
29
|
+
comment line about every 15 seconds; the server ignores it and the tools return the same answers.
|
|
30
|
+
- **Source comments state their rules themselves.** Comments that pointed at an internal design document
|
|
31
|
+
now say what the rule is, so the source maps that ship with the package read on their own. No behavior changes.
|
|
32
|
+
|
|
33
|
+
## 0.18.0 — 2026-10-01
|
|
34
|
+
|
|
35
|
+
### Added
|
|
36
|
+
|
|
37
|
+
- **`document_ingest` takes an optional `confirmUntyped`.** The platform refuses a document create that supplies an
|
|
38
|
+
`externalId` without a `schemaId` (`400`), because `externalId` is unique per schema. Pass `confirmUntyped: true`
|
|
39
|
+
to say an untyped document is intended; it works in both text and file mode and is never set for you. An agent
|
|
40
|
+
that calls `document_ingest` with an `externalId` and no `schemaId` gets that `400` unless it passes
|
|
41
|
+
`confirmUntyped: true` or a `schemaId`.
|
|
42
|
+
- **`rag_ask` and `document_ask` take an optional `providerAlias`.** It routes that one call through the model
|
|
43
|
+
provider your account has activated under that alias instead of platform-hosted Bedrock, and `model` then names a
|
|
44
|
+
model on that provider's own id space. It works only after your account has configured the provider and signed the
|
|
45
|
+
platform's risk-acceptance waiver; otherwise the platform refuses the call with a `403`, which the tool returns as
|
|
46
|
+
written. The README section on routing a call through your own provider has the details.
|
|
47
|
+
|
|
48
|
+
### Changed
|
|
49
|
+
|
|
50
|
+
- **`rag_ask` and `document_ask` descriptions say where a call is served:** platform-hosted AWS Bedrock by default,
|
|
51
|
+
your own model provider when `providerAlias` is set.
|
|
52
|
+
- **`document_ingest` in file mode reports how to confirm a replacement.** When the call replaces an existing
|
|
53
|
+
document's file (`created: false`), the tool description and the response note say to watch the document's
|
|
54
|
+
`fileItemId` for the new file instead of `indexStatus`, and `document_get`'s `includeDownloadUrl` description says a
|
|
55
|
+
download URL can stop working before its stated `downloadExpires` once the file is replaced. The description also
|
|
56
|
+
states that re-ingesting a file against an existing `externalId` needs `documents:u`.
|
|
57
|
+
- **`rag_ask`'s model example is `claude-opus-5-5`,** since `claude-opus-4-8` is retired.
|
|
58
|
+
- **The README states that tool output is untrusted, API-supplied content.** No tool sanitizes, escapes or
|
|
59
|
+
pre-renders the text it returns; render it safely in your own client.
|
|
60
|
+
|
|
6
61
|
## 0.17.2 — 2026-09-22
|
|
7
62
|
|
|
8
63
|
### Changed
|
package/README.md
CHANGED
|
@@ -86,7 +86,7 @@ Prefer to wire it up by hand? See **Configure manually** below.
|
|
|
86
86
|
|---|---|---|
|
|
87
87
|
| **Claude Desktop** | [Desktop Extension (`.mcpb`)](https://github.com/vectros-ai/vectros-mcp-server/releases/latest/download/vectros.mcpb) — double-click, paste your key | [JSON snippet](#configure-manually-claude-desktop-or-any-mcp-client) |
|
|
88
88
|
| **Cursor** | [](https://cursor.com/install-mcp?name=vectros&config=eyJjb21tYW5kIjoibnB4IiwiYXJncyI6WyIteSIsIkB2ZWN0cm9zLWFpL21jcC1zZXJ2ZXIiXSwiZW52Ijp7IlZFQ1RST1NfQVBJX0tFWSI6IiJ9fQ%3D%3D) | `.cursor/mcp.json`, same shape as below |
|
|
89
|
-
| **VS Code** | [](https://insiders.vscode.dev/redirect/mcp/install?name=vectros&config=%7B%22command%22%3A%22npx%22%2C%22args%22%3A%5B%22-y%22%2C%22%40vectros-ai%2Fmcp-server%22%5D%2C%22env%22%3A%7B%22VECTROS_API_KEY%22%3A%22%22%7D%7D) | `.vscode/mcp.json`, same
|
|
89
|
+
| **VS Code** | [](https://insiders.vscode.dev/redirect/mcp/install?name=vectros&config=%7B%22command%22%3A%22npx%22%2C%22args%22%3A%5B%22-y%22%2C%22%40vectros-ai%2Fmcp-server%22%5D%2C%22env%22%3A%7B%22VECTROS_API_KEY%22%3A%22%22%7D%7D) | `.vscode/mcp.json`, the same entry under a top-level `servers` key |
|
|
90
90
|
| **Claude Code** | `claude mcp add` (below) | [project `.mcp.json`](#configure-manually-claude-code) |
|
|
91
91
|
| **Cline / Continue** | — | same JSON snippet as Claude Desktop |
|
|
92
92
|
| **Smithery** | `npx -y @smithery/cli install @vectros-ai/mcp-server` | — |
|
|
@@ -207,8 +207,8 @@ directly with `-e VECTROS_API_KEY=ssk_live_...` — but then keep that config
|
|
|
207
207
|
**local**: add `.mcp.json` to `.gitignore` first, rather than committing it
|
|
208
208
|
with the key inside.
|
|
209
209
|
|
|
210
|
-
Add `-e VECTROS_API_BASE_URL
|
|
211
|
-
environment.
|
|
210
|
+
Add `-e VECTROS_API_BASE_URL=<your environment's API base URL>` to point the server at a
|
|
211
|
+
different environment.
|
|
212
212
|
|
|
213
213
|
**Load it into a session by restarting.** A Claude Code session that was
|
|
214
214
|
already open when you added the server won't pick it up mid-session — fully
|
|
@@ -219,12 +219,11 @@ instead. Config is keyed by the **git common root**, so a linked worktree
|
|
|
219
219
|
resolves to its main repo's `.mcp.json` — add and open from the same project.
|
|
220
220
|
|
|
221
221
|
> **Windows note:** if your `.npmrc` (or a global npm config) points the
|
|
222
|
-
> `@vectros-ai` scope at
|
|
223
|
-
> can resolve
|
|
224
|
-
>
|
|
225
|
-
>
|
|
226
|
-
>
|
|
227
|
-
> @vectros-ai/mcp-server@<version>`) known to work.
|
|
222
|
+
> `@vectros-ai` scope at another registry, a bare `npx -y @vectros-ai/mcp-server`
|
|
223
|
+
> can resolve a build other than the public release. If the command above fails
|
|
224
|
+
> to start, either remove the scoped-registry override for a plain `npx` run, or
|
|
225
|
+
> pin an explicit version (`npx -y @vectros-ai/mcp-server@<version>`) known to
|
|
226
|
+
> work.
|
|
228
227
|
|
|
229
228
|
## Tools (23 tools)
|
|
230
229
|
|
|
@@ -233,8 +232,8 @@ resolves to its main repo's `.mcp.json` — add and open from the same project.
|
|
|
233
232
|
| Tool | What it does |
|
|
234
233
|
|---|---|
|
|
235
234
|
| `hybrid_search` | Hybrid BM25 + dense search across the tenant's indexed content (records + documents). Narrow by ownership (`scope` for one dimension, `scopeFilters` for several at once — e.g. one client within one org), folder, type, metadata filters, a created date window, and keyword-precision (`textMode`) / relevance floors. Returns the indexed projection of each hit. |
|
|
236
|
-
| `rag_ask` | Ask a question grounded against the indexed corpus. Scope retrieval (ownership — `scope` or multi-dimension `scopeFilters` — / folder / type / metadata filters / date window) and steer generation (`instructions
|
|
237
|
-
| `document_ask` | Ask a question grounded against a single document. Same aggregation + progress-notification shape as `rag_ask`. |
|
|
235
|
+
| `rag_ask` | Ask a question grounded against the indexed corpus. Scope retrieval through `search` (ownership — `search.scope` or multi-dimension `search.scopeFilters` — / folder / type / metadata filters / date window) and steer generation (`instructions`, and `temperature` for the models that accept one). Streaming generation aggregated; progress notifications keep the call alive for the generation window. Optional `providerAlias` routes one call through your own model provider (see below). |
|
|
236
|
+
| `document_ask` | Ask a question grounded against a single document. Same aggregation + progress-notification shape as `rag_ask`, including the optional `providerAlias`. |
|
|
238
237
|
|
|
239
238
|
**Records** (structured, schema-validated data)
|
|
240
239
|
|
|
@@ -253,8 +252,8 @@ resolves to its main repo's `.mcp.json` — add and open from the same project.
|
|
|
253
252
|
|
|
254
253
|
| Tool | What it does |
|
|
255
254
|
|---|---|
|
|
256
|
-
| `document_ingest` | Create a document — inline text body OR local file upload (file mode is stdio-transport only). Idempotent by `externalId`; optional `schemaId` + `payload` for a typed, lookup-queryable document. |
|
|
257
|
-
| `document_query` | Query documents by lookup field (equality / range / prefix, with `asc`/`desc` ordering) or list mode (filter by
|
|
255
|
+
| `document_ingest` | Create a document — inline text body OR local file upload (file mode is stdio-transport only). Idempotent by `externalId`; optional `schemaId` + `payload` for a typed, lookup-queryable document. An `externalId` with no `schemaId` is refused by platform 0.46.0 and later unless you also pass `confirmUntyped: true`. |
|
|
256
|
+
| `document_query` | Query documents by lookup field (equality / range / prefix, with `asc`/`desc` ordering) or list mode (filter by folder and ownership). |
|
|
258
257
|
| `document_get` | Fetch a document by id (metadata incl. lifecycle `status` + processing `indexStatus`; optional text truncated at ~8K tokens; optional presigned `downloadUrl` for file-backed documents — always forces a download, never inline rendering, regardless of file type). |
|
|
259
258
|
| `document_update` | Patch a document's metadata / typed payload (deep-merged); archive/restore via `status` (`ARCHIVED` soft-retracts from search, `ACTIVE` restores); optimistic concurrency via `expectedVersion`. |
|
|
260
259
|
| `document_delete` | Permanently delete a document by id (removes it and its indexed content). |
|
|
@@ -280,11 +279,31 @@ All 23 tools wrap published Vectros HTTP API endpoints. JSON
|
|
|
280
279
|
responses are what the agent sees as tool output. Per-call cost
|
|
281
280
|
surfaces via the `usage` field on inference responses.
|
|
282
281
|
|
|
282
|
+
### Routing a call through your own model provider
|
|
283
|
+
|
|
284
|
+
`rag_ask` and `document_ask` take an optional `providerAlias`: the alias of a model provider config your Vectros
|
|
285
|
+
account has activated. When you pass it, that one call is served by your own provider instead of the
|
|
286
|
+
platform-hosted default, and `model` then names a model on your provider's own id space (it falls back to that
|
|
287
|
+
provider config's default model when omitted). The server forwards `providerAlias` only when you supply it and
|
|
288
|
+
never fills it in.
|
|
289
|
+
|
|
290
|
+
It works only after your account has set up the provider and signed the platform's risk-acceptance waiver. Without
|
|
291
|
+
both, the platform refuses the call with a `403`, which the tool returns to you as written.
|
|
292
|
+
|
|
293
|
+
If your account has accepted the Business Associate Agreement with Vectros in the developer portal, an account owner must also attest each provider
|
|
294
|
+
config in the developer portal (**Model Providers**) before a call can use it. Until then the platform refuses the
|
|
295
|
+
call with a `403` that says it needs a BAA-holder attestation. The owner does this in the portal; nothing in this
|
|
296
|
+
server does it.
|
|
297
|
+
|
|
298
|
+
A call served by your own provider leaves the platform-hosted Bedrock path, and Vectros's AWS BAA boundary, so
|
|
299
|
+
decide deliberately whether a given call should use it. Nothing here is a statement about how a provider you chose handles your data.
|
|
300
|
+
|
|
283
301
|
### Opting into a subset
|
|
284
302
|
|
|
285
|
-
Pass `VECTROS_MCP_TOOLS=hybrid_search,
|
|
286
|
-
|
|
287
|
-
exposing ingestion or inference costs to the credential.
|
|
303
|
+
Pass `VECTROS_MCP_TOOLS=hybrid_search,record_query,record_get` to register only those
|
|
304
|
+
three — useful for giving an agent read-only access without
|
|
305
|
+
exposing ingestion or inference costs to the credential. Add `rag_ask` or `document_ask`
|
|
306
|
+
only if the credential should be able to spend inference balance. Unknown tool
|
|
288
307
|
names fail fast at startup.
|
|
289
308
|
|
|
290
309
|
## Resources
|
|
@@ -309,12 +328,11 @@ server emits a `warn` log line on startup when you pass a wildcard
|
|
|
309
328
|
**The easiest way to get one is `npx -y @vectros-ai/cli bootstrap` (above)**
|
|
310
329
|
— it mints a least-privilege `ssk_*` and an AccessProfile for you, no root
|
|
311
330
|
key required. To do it by hand instead: mint a scoped key from the developer
|
|
312
|
-
portal under **Keys → Create scoped key**, bind it to
|
|
313
|
-
|
|
331
|
+
portal under **Keys → Create scoped key**, bind it to a read-only AccessProfile
|
|
332
|
+
(any name, for example `mcp-read`), and drop the resulting
|
|
314
333
|
`ssk_live_...` into the config above.
|
|
315
334
|
|
|
316
|
-
See the Vectros developer documentation on scoped tokens
|
|
317
|
-
AccessProfile for MCP") for least-privilege credential setup — the
|
|
335
|
+
See the Vectros developer documentation on scoped tokens for least-privilege credential setup — the
|
|
318
336
|
`vectros bootstrap` flow provisions a scoped `ssk_*` key and its AccessProfile
|
|
319
337
|
in one command.
|
|
320
338
|
|
|
@@ -349,7 +367,7 @@ The server resolves its API key from the first source that yields one:
|
|
|
349
367
|
|
|
350
368
|
The resolved key is held in memory and never logged. Startup logs which alias it
|
|
351
369
|
resolved (not the key), so you can tell at a glance which identity the server is
|
|
352
|
-
running as — `vectros keyring doctor` shows the same view.
|
|
370
|
+
running as — `vectros keyring doctor` (CLI 0.10.0+) shows the same view.
|
|
353
371
|
|
|
354
372
|
> **Startup warns when it picks an identity you didn't name.** If `VECTROS_API_KEY`
|
|
355
373
|
> is unset and no `VECTROS_KEYRING_ALIAS` is set, the server falls back to your
|
|
@@ -359,7 +377,7 @@ running as — `vectros keyring doctor` shows the same view.
|
|
|
359
377
|
> blank placeholder (`"VECTROS_API_KEY": ""` in a client config, or `-e VECTROS_API_KEY`
|
|
360
378
|
> passing through an unset var in Docker) reads as "not configured yet" but resolves
|
|
361
379
|
> like an unset key. Nothing is blocked — name an entry with `VECTROS_KEYRING_ALIAS`,
|
|
362
|
-
> or set `VECTROS_API_KEY`, and the warning goes away. `vectros keyring doctor` shows
|
|
380
|
+
> or set `VECTROS_API_KEY`, and the warning goes away. `vectros keyring doctor` (CLI 0.10.0+) shows
|
|
363
381
|
> which entry is active and which of your keys are live.
|
|
364
382
|
|
|
365
383
|
## Environment variables
|
|
@@ -368,7 +386,7 @@ running as — `vectros keyring doctor` shows the same view.
|
|
|
368
386
|
|---|---|---|---|
|
|
369
387
|
| `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. |
|
|
370
388
|
| `VECTROS_KEYRING_ALIAS` | no | (the active entry) | Resolve this `vectros` keyring entry instead of the active one. Ignored when `VECTROS_API_KEY` is set. |
|
|
371
|
-
| `VECTROS_API_BASE_URL` | no | `https://api.vectros.ai` | Override for
|
|
389
|
+
| `VECTROS_API_BASE_URL` | no | `https://api.vectros.ai` | Override for another environment. Validated: must be `https://` (or `http://` to localhost) and an official `*.vectros.ai` host. |
|
|
372
390
|
| `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. |
|
|
373
391
|
| `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. |
|
|
374
392
|
| `VECTROS_MCP_TOOLS` | no | (all tools) | Comma-separated tool names (e.g. `hybrid_search,rag_ask`). |
|
|
@@ -498,17 +516,16 @@ The server is on a pre-1.0 track toward a stable 1.0 release.
|
|
|
498
516
|
|
|
499
517
|
## Rate limits
|
|
500
518
|
|
|
501
|
-
Tool calls hit the same per-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
limits.
|
|
519
|
+
Tool calls hit the same per-minute rate limits as any API client; the
|
|
520
|
+
[rate limits guide](https://docs.vectros.ai/guides/operations-trust/rate-limits) says which requests count. On a `429` the tool returns the error with `HTTP 429` and `errorCode: RATE_LIMITED`, so the agent can pace and retry
|
|
521
|
+
rather than blind-retrying. The guide also lists
|
|
522
|
+
the per-plan limits.
|
|
506
523
|
|
|
507
524
|
## Building from source
|
|
508
525
|
|
|
509
526
|
```sh
|
|
510
527
|
git clone https://github.com/vectros-ai/vectros-mcp-server
|
|
511
|
-
cd mcp-server
|
|
528
|
+
cd vectros-mcp-server
|
|
512
529
|
npm install
|
|
513
530
|
npm run build
|
|
514
531
|
npm test
|
|
@@ -530,6 +547,12 @@ tamper-evident audit and version history. Customer-facing surfaces are hardened
|
|
|
530
547
|
adversarial security review. For the full trust posture, drawn plainly with its boundaries, see the
|
|
531
548
|
[compliance and trust guide](https://docs.vectros.ai/guides/operations-trust/compliance).
|
|
532
549
|
|
|
550
|
+
**Tool output is untrusted, API-supplied content.** Every tool here returns your own tenant's data —
|
|
551
|
+
document text, search results, error messages — as plain text inside the MCP response. This server
|
|
552
|
+
does not sanitize, escape, or pre-render that text, and none of these tools evaluate or execute it.
|
|
553
|
+
Render tool output the same way you'd render any other data an agent pulled from an external source
|
|
554
|
+
— safely, in your client — rather than `eval`-ing it or trusting it as pre-sanitized.
|
|
555
|
+
|
|
533
556
|
## License
|
|
534
557
|
|
|
535
558
|
Apache-2.0. See the LICENSE file.
|