@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/dist/index.mjs CHANGED
@@ -4896,7 +4896,7 @@ var DocumentsClient = class {
4896
4896
  return handleNonStatusCodeError(_response.error, _response.rawResponse, "DELETE", "/v1/documents/{id}");
4897
4897
  }
4898
4898
  /**
4899
- * 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`, `storeText`, `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` and `externalId` 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.
4899
+ * 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.
4900
4900
  *
4901
4901
  * @param {Vectros.PatchDocumentRequest} request
4902
4902
  * @param {DocumentsClient.RequestOptions} requestOptions - Request-specific configuration.
@@ -5148,7 +5148,7 @@ var DocumentsClient = class {
5148
5148
  return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/v1/documents/{id}/download");
5149
5149
  }
5150
5150
  /**
5151
- * Returns the full extracted or ingested text body for documents that were stored with `storeText=true`. Returns 404 when the document does not exist or when no text is available (because `storeText` was false, or extraction has not yet completed). Requires the `documents:r` scope.
5151
+ * 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.
5152
5152
  *
5153
5153
  * @param {Vectros.GetDocumentTextRequest} request
5154
5154
  * @param {DocumentsClient.RequestOptions} requestOptions - Request-specific configuration.
@@ -8762,8 +8762,8 @@ function warnOnSuboptimalKey(key, log) {
8762
8762
 
8763
8763
  // src/build-info.ts
8764
8764
  var BUILD_INFO = {
8765
- mcpServer: true ? "0.6.0" : "dev",
8766
- sdk: true ? "0.32.0" : "dev"
8765
+ mcpServer: true ? "0.7.0" : "dev",
8766
+ sdk: true ? "0.33.0" : "dev"
8767
8767
  };
8768
8768
 
8769
8769
  // src/log.ts
@@ -9722,7 +9722,7 @@ function isNotAvailable(err) {
9722
9722
  var documentGet = ({ client, log }) => ({
9723
9723
  name: "document_get",
9724
9724
  title: "Get document metadata (and optionally text)",
9725
- 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). If the document was ingested without `storeText: true`, text is unavailable \u2014 `textAvailable: false` flag is set and the agent should use `document_ask` for question-driven extraction instead. 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`.",
9725
+ 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`.",
9726
9726
  inputSchema: inputSchema10,
9727
9727
  handler: async (args) => {
9728
9728
  const documentId = args.documentId;
@@ -9746,7 +9746,7 @@ var documentGet = ({ client, log }) => ({
9746
9746
  if (isNotAvailable(textErr)) {
9747
9747
  log.debug(
9748
9748
  { tool: "document_get", id },
9749
- "document_get text unavailable (ingested without storeText)"
9749
+ "document_get text unavailable (not retained \u2014 storeText:false upload)"
9750
9750
  );
9751
9751
  extra = { ...extra, textAvailable: false };
9752
9752
  } else {
@@ -9908,7 +9908,6 @@ var inputSchema12 = {
9908
9908
  "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."
9909
9909
  ),
9910
9910
  folderId: z12.string().optional().describe("Move the document into this folder (cannot be cleared once set)."),
9911
- storeText: z12.boolean().optional().describe("Whether the raw text is stored + retrievable."),
9912
9911
  status: z12.enum(["ACTIVE", "ARCHIVED"]).optional().describe(
9913
9912
  "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."
9914
9913
  ),
@@ -9932,7 +9931,6 @@ var documentUpdate = ({ client, log }) => ({
9932
9931
  const fields = args.fields;
9933
9932
  const text = args.text;
9934
9933
  const folderId = args.folderId;
9935
- const storeText = args.storeText;
9936
9934
  const status = args.status;
9937
9935
  const userId = args.userId;
9938
9936
  const orgId = args.orgId;
@@ -9946,7 +9944,6 @@ var documentUpdate = ({ client, log }) => ({
9946
9944
  if (fields !== void 0) body.payload = fields;
9947
9945
  if (text !== void 0) body.text = text;
9948
9946
  if (folderId !== void 0) body.folderId = folderId;
9949
- if (storeText !== void 0) body.storeText = storeText;
9950
9947
  if (status !== void 0) body.status = status;
9951
9948
  if (userId !== void 0) body.userId = userId;
9952
9949
  if (orgId !== void 0) body.orgId = orgId;
@@ -10266,7 +10263,7 @@ var inputSchema19 = {
10266
10263
  // Inline text mode (mutually exclusive with filePath):
10267
10264
  text: z18.string().min(1).optional().describe("Text body to ingest inline. Mutually exclusive with filePath. Either text or filePath is required."),
10268
10265
  storeText: z18.boolean().optional().describe(
10269
- "If true (default), the text body is stored alongside the index so document_get(includeText:true) can retrieve it later. Set false to index only \u2014 saves storage cost on large corpora but document_get(includeText) will return textAvailable:false."
10266
+ "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."
10270
10267
  ),
10271
10268
  // File upload mode (mutually exclusive with text; stdio-transport-only):
10272
10269
  filePath: z18.string().min(1).optional().describe(
@@ -10282,7 +10279,7 @@ var inputSchema19 = {
10282
10279
  var documentIngest = ({ client, log, transport, ingestRoot }) => ({
10283
10280
  name: "document_ingest",
10284
10281
  title: "Ingest a new document (text body or file upload)",
10285
- 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 (set false to skip storing the text body).",
10282
+ 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.",
10286
10283
  inputSchema: inputSchema19,
10287
10284
  handler: async (args) => {
10288
10285
  const title = args.title;
@@ -10322,14 +10319,12 @@ var documentIngest = ({ client, log, transport, ingestRoot }) => ({
10322
10319
  };
10323
10320
  try {
10324
10321
  if (text) {
10325
- const storeText = args.storeText ?? true;
10326
10322
  const result = await client.documents.ingestDocument({
10327
10323
  upsert,
10328
10324
  body: {
10329
10325
  title,
10330
10326
  text,
10331
10327
  indexMode,
10332
- storeText,
10333
10328
  ...common
10334
10329
  }
10335
10330
  });
@@ -10360,11 +10355,13 @@ var documentIngest = ({ client, log, transport, ingestRoot }) => ({
10360
10355
  }
10361
10356
  const fileName = basename(safePath);
10362
10357
  const fileType = args.fileType ?? inferMimeType(safePath);
10358
+ const storeTextFile = args.storeText ?? true;
10363
10359
  const upload = await client.documents.uploadDocument({
10364
10360
  upsert,
10365
10361
  fileName,
10366
10362
  fileType,
10367
10363
  indexMode,
10364
+ storeText: storeTextFile,
10368
10365
  ...common
10369
10366
  });
10370
10367
  const uploadUrl = upload?.uploadUrl;