@vectros-ai/mcp-server 0.6.0 → 0.7.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 +21 -0
- package/dist/cli-http.js +10 -13
- package/dist/cli-http.js.map +1 -1
- package/dist/cli-http.mjs +10 -13
- package/dist/cli-http.mjs.map +1 -1
- package/dist/cli.js +10 -13
- package/dist/cli.js.map +1 -1
- package/dist/cli.mjs +10 -13
- package/dist/cli.mjs.map +1 -1
- package/dist/index.js +10 -13
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +10 -13
- package/dist/index.mjs.map +1 -1
- package/package.json +2 -2
package/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,27 @@
|
|
|
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.7.0 — 2026-07-05
|
|
7
|
+
|
|
8
|
+
Text-retention control that works, and tool descriptions that tell the truth
|
|
9
|
+
about it.
|
|
10
|
+
|
|
11
|
+
### Added
|
|
12
|
+
|
|
13
|
+
- **`storeText` works in file mode on `document_ingest`.** The flag was advertised but silently
|
|
14
|
+
dropped on file uploads; it now forwards your retention choice. Default `true` keeps the
|
|
15
|
+
extracted text available to `document_get(includeText: true)` and `document_ask`; `false`
|
|
16
|
+
discards it once indexing completes (search and the original-file download keep working).
|
|
17
|
+
Fixed at ingest — a re-ingest of the same document keeps the original choice.
|
|
18
|
+
|
|
19
|
+
### Changed
|
|
20
|
+
|
|
21
|
+
- **`document_update` no longer accepts `storeText`** — retention is immutable after ingest, so
|
|
22
|
+
the input was misleading (the server now rejects such updates).
|
|
23
|
+
- `document_ingest`, `document_get`, and `document_update` descriptions rewritten to the real
|
|
24
|
+
retention semantics: text-mode bodies are always retained; text availability on
|
|
25
|
+
`document_get` reflects whether the text actually exists.
|
|
26
|
+
|
|
6
27
|
## 0.6.0 — 2026-07-03
|
|
7
28
|
|
|
8
29
|
Curation-focused tool improvements: look records and documents up by your own
|
package/dist/cli-http.js
CHANGED
|
@@ -4921,7 +4921,7 @@ var DocumentsClient = class {
|
|
|
4921
4921
|
return handleNonStatusCodeError(_response.error, _response.rawResponse, "DELETE", "/v1/documents/{id}");
|
|
4922
4922
|
}
|
|
4923
4923
|
/**
|
|
4924
|
-
* Partially updates a document using an RFC 7386 JSON Merge Patch. The `payload` object is deep-merged: keys you send overwrite existing values (recursing into nested objects), a key set to `null` is deleted, and keys you omit are preserved — unlike PUT, which replaces the whole payload. Top-level fields (`title`, `
|
|
4924
|
+
* Partially updates a document using an RFC 7386 JSON Merge Patch. The `payload` object is deep-merged: keys you send overwrite existing values (recursing into nested objects), a key set to `null` is deleted, and keys you omit are preserved — unlike PUT, which replaces the whole payload. Top-level fields (`title`, `folderId`, `schemaId`, ownership) are set when present and left unchanged when omitted; sending a top-level field as `null` is rejected. Supplying `text` re-ingests the document body (same as PUT). `indexMode`, `externalId`, and `storeText` (text retention is fixed at ingest) are immutable and rejected if present. The merged result is validated against the bound schema. Pass `expectedVersion` for optimistic concurrency (409 on conflict). Requires the `documents:u` scope.
|
|
4925
4925
|
*
|
|
4926
4926
|
* @param {Vectros.PatchDocumentRequest} request
|
|
4927
4927
|
* @param {DocumentsClient.RequestOptions} requestOptions - Request-specific configuration.
|
|
@@ -5173,7 +5173,7 @@ var DocumentsClient = class {
|
|
|
5173
5173
|
return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/v1/documents/{id}/download");
|
|
5174
5174
|
}
|
|
5175
5175
|
/**
|
|
5176
|
-
* Returns the full
|
|
5176
|
+
* Returns the document's full text body when it is retained: always available for text-ingested documents, and for file-uploaded documents unless they were uploaded with `storeText=false` (which discards the extracted text once indexing completes — the original file remains available via `GET /{id}/download`). Returns 404 when the document does not exist, its text was not retained, or extraction has not yet completed. Requires the `documents:r` scope.
|
|
5177
5177
|
*
|
|
5178
5178
|
* @param {Vectros.GetDocumentTextRequest} request
|
|
5179
5179
|
* @param {DocumentsClient.RequestOptions} requestOptions - Request-specific configuration.
|
|
@@ -8782,8 +8782,8 @@ function warnOnSuboptimalKey(key, log) {
|
|
|
8782
8782
|
|
|
8783
8783
|
// src/build-info.ts
|
|
8784
8784
|
var BUILD_INFO = {
|
|
8785
|
-
mcpServer: true ? "0.
|
|
8786
|
-
sdk: true ? "0.
|
|
8785
|
+
mcpServer: true ? "0.7.0" : "dev",
|
|
8786
|
+
sdk: true ? "0.33.0" : "dev"
|
|
8787
8787
|
};
|
|
8788
8788
|
|
|
8789
8789
|
// src/log.ts
|
|
@@ -9742,7 +9742,7 @@ function isNotAvailable(err) {
|
|
|
9742
9742
|
var documentGet = ({ client, log }) => ({
|
|
9743
9743
|
name: "document_get",
|
|
9744
9744
|
title: "Get document metadata (and optionally text)",
|
|
9745
|
-
description: "Fetch metadata for a single document \u2014 select it by its Vectros `documentId` OR by your own `externalId` + `type` (resolved for you). Pass `includeText: true` to also fetch the text body (capped at ~8K tokens; `truncated: true` flag if cut).
|
|
9745
|
+
description: "Fetch metadata for a single document \u2014 select it by its Vectros `documentId` OR by your own `externalId` + `type` (resolved for you). Pass `includeText: true` to also fetch the text body (capped at ~8K tokens; `truncated: true` flag if cut). Text is available for every text-ingested document and for file-ingested documents unless they were uploaded with `storeText: false` (extracted text discarded after indexing) \u2014 then `textAvailable: false` is set; the original file is still retrievable via `includeDownloadUrl`. Pass `includeDownloadUrl: true` to also get a short-lived presigned `downloadUrl` for the original file (file-backed documents only). Returns the full document metadata, including its lifecycle `status` (ACTIVE, or ARCHIVED when soft-retracted from search \u2014 restorable via document_update) and its processing `indexStatus`.",
|
|
9746
9746
|
inputSchema: inputSchema10,
|
|
9747
9747
|
handler: async (args) => {
|
|
9748
9748
|
const documentId = args.documentId;
|
|
@@ -9766,7 +9766,7 @@ var documentGet = ({ client, log }) => ({
|
|
|
9766
9766
|
if (isNotAvailable(textErr)) {
|
|
9767
9767
|
log.debug(
|
|
9768
9768
|
{ tool: "document_get", id },
|
|
9769
|
-
"document_get text unavailable (
|
|
9769
|
+
"document_get text unavailable (not retained \u2014 storeText:false upload)"
|
|
9770
9770
|
);
|
|
9771
9771
|
extra = { ...extra, textAvailable: false };
|
|
9772
9772
|
} else {
|
|
@@ -9928,7 +9928,6 @@ var inputSchema12 = {
|
|
|
9928
9928
|
"New raw text body. Supplying it re-ingests the document body and re-queues it for indexing, so the search index reflects the edit (text-ingested documents only \u2014 not file-backed ones). Omit to leave the stored text unchanged. This is the in-place alternative to re-ingesting with upsert:true."
|
|
9929
9929
|
),
|
|
9930
9930
|
folderId: import_zod12.z.string().optional().describe("Move the document into this folder (cannot be cleared once set)."),
|
|
9931
|
-
storeText: import_zod12.z.boolean().optional().describe("Whether the raw text is stored + retrievable."),
|
|
9932
9931
|
status: import_zod12.z.enum(["ACTIVE", "ARCHIVED"]).optional().describe(
|
|
9933
9932
|
"Lifecycle status. `ARCHIVED` soft-retracts the document \u2014 it is pulled from search and recall but kept and recoverable; set it back to `ACTIVE` to re-index and restore it. The way to retire superseded content when the credential has no delete authority. Omit to leave unchanged."
|
|
9934
9933
|
),
|
|
@@ -9952,7 +9951,6 @@ var documentUpdate = ({ client, log }) => ({
|
|
|
9952
9951
|
const fields = args.fields;
|
|
9953
9952
|
const text = args.text;
|
|
9954
9953
|
const folderId = args.folderId;
|
|
9955
|
-
const storeText = args.storeText;
|
|
9956
9954
|
const status = args.status;
|
|
9957
9955
|
const userId = args.userId;
|
|
9958
9956
|
const orgId = args.orgId;
|
|
@@ -9966,7 +9964,6 @@ var documentUpdate = ({ client, log }) => ({
|
|
|
9966
9964
|
if (fields !== void 0) body.payload = fields;
|
|
9967
9965
|
if (text !== void 0) body.text = text;
|
|
9968
9966
|
if (folderId !== void 0) body.folderId = folderId;
|
|
9969
|
-
if (storeText !== void 0) body.storeText = storeText;
|
|
9970
9967
|
if (status !== void 0) body.status = status;
|
|
9971
9968
|
if (userId !== void 0) body.userId = userId;
|
|
9972
9969
|
if (orgId !== void 0) body.orgId = orgId;
|
|
@@ -10286,7 +10283,7 @@ var inputSchema19 = {
|
|
|
10286
10283
|
// Inline text mode (mutually exclusive with filePath):
|
|
10287
10284
|
text: import_zod18.z.string().min(1).optional().describe("Text body to ingest inline. Mutually exclusive with filePath. Either text or filePath is required."),
|
|
10288
10285
|
storeText: import_zod18.z.boolean().optional().describe(
|
|
10289
|
-
"
|
|
10286
|
+
"Whether the document's text is retained after indexing (default true). Applies to BOTH modes and is fixed at ingest time. Text mode: the ingested body is always retained (this flag is effectively always true \u2014 the body is the document). File mode: true keeps the extracted text retrievable via document_get(includeText:true) and usable by document_ask; false discards the extracted text once indexing completes \u2014 search still works and the original file remains downloadable, but includeText returns textAvailable:false and document_ask is unavailable."
|
|
10290
10287
|
),
|
|
10291
10288
|
// File upload mode (mutually exclusive with text; stdio-transport-only):
|
|
10292
10289
|
filePath: import_zod18.z.string().min(1).optional().describe(
|
|
@@ -10302,7 +10299,7 @@ var inputSchema19 = {
|
|
|
10302
10299
|
var documentIngest = ({ client, log, transport, ingestRoot }) => ({
|
|
10303
10300
|
name: "document_ingest",
|
|
10304
10301
|
title: "Ingest a new document (text body or file upload)",
|
|
10305
|
-
description: "Create a new document in your Vectros tenant. Two modes:\n \u2022 Text mode: pass `text` (string body). Single-call. Use for crawled content, notes, generated text.\n \u2022 File mode: pass `filePath` (local path on the MCP server's host machine). STDIO-TRANSPORT ONLY \u2014 rejected on HTTP transport. MCP server reads the bytes, requests a presigned upload URL, and PUTs them. Returns when the upload is accepted (indexStatus: PENDING_INDEX); poll with `document_get` until indexStatus is INDEXED.\nEither `text` or `filePath` must be present; both is an error. Idempotent by `externalId` (re-ingest returns the existing document, not a duplicate). To UPDATE an existing document instead \u2014 re-index an edited body \u2014 pass `upsert:true` with the same `externalId` (and the same `schemaId`); this is the re-sync primitive for keeping a knowledge base current. Pass `schemaId` + `payload` for a typed, lookup-queryable document (records parity). indexMode defaults to HYBRID for untyped documents (omit to inherit a bound schema's default). storeText defaults to true
|
|
10302
|
+
description: "Create a new document in your Vectros tenant. Two modes:\n \u2022 Text mode: pass `text` (string body). Single-call. Use for crawled content, notes, generated text.\n \u2022 File mode: pass `filePath` (local path on the MCP server's host machine). STDIO-TRANSPORT ONLY \u2014 rejected on HTTP transport. MCP server reads the bytes, requests a presigned upload URL, and PUTs them. Returns when the upload is accepted (indexStatus: PENDING_INDEX); poll with `document_get` until indexStatus is INDEXED.\nEither `text` or `filePath` must be present; both is an error. Idempotent by `externalId` (re-ingest returns the existing document, not a duplicate). To UPDATE an existing document instead \u2014 re-index an edited body \u2014 pass `upsert:true` with the same `externalId` (and the same `schemaId`); this is the re-sync primitive for keeping a knowledge base current. Pass `schemaId` + `payload` for a typed, lookup-queryable document (records parity). indexMode defaults to HYBRID for untyped documents (omit to inherit a bound schema's default). storeText defaults to true and is fixed at ingest: in file mode, false discards the extracted text after indexing (search + file download keep working; text retrieval and document_ask do not). Text-mode bodies are always retained.",
|
|
10306
10303
|
inputSchema: inputSchema19,
|
|
10307
10304
|
handler: async (args) => {
|
|
10308
10305
|
const title = args.title;
|
|
@@ -10342,14 +10339,12 @@ var documentIngest = ({ client, log, transport, ingestRoot }) => ({
|
|
|
10342
10339
|
};
|
|
10343
10340
|
try {
|
|
10344
10341
|
if (text) {
|
|
10345
|
-
const storeText = args.storeText ?? true;
|
|
10346
10342
|
const result = await client.documents.ingestDocument({
|
|
10347
10343
|
upsert,
|
|
10348
10344
|
body: {
|
|
10349
10345
|
title,
|
|
10350
10346
|
text,
|
|
10351
10347
|
indexMode,
|
|
10352
|
-
storeText,
|
|
10353
10348
|
...common
|
|
10354
10349
|
}
|
|
10355
10350
|
});
|
|
@@ -10380,11 +10375,13 @@ var documentIngest = ({ client, log, transport, ingestRoot }) => ({
|
|
|
10380
10375
|
}
|
|
10381
10376
|
const fileName = (0, import_node_path.basename)(safePath);
|
|
10382
10377
|
const fileType = args.fileType ?? inferMimeType(safePath);
|
|
10378
|
+
const storeTextFile = args.storeText ?? true;
|
|
10383
10379
|
const upload = await client.documents.uploadDocument({
|
|
10384
10380
|
upsert,
|
|
10385
10381
|
fileName,
|
|
10386
10382
|
fileType,
|
|
10387
10383
|
indexMode,
|
|
10384
|
+
storeText: storeTextFile,
|
|
10388
10385
|
...common
|
|
10389
10386
|
});
|
|
10390
10387
|
const uploadUrl = upload?.uploadUrl;
|