@vectros-ai/mcp-server 0.10.0 → 0.11.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 +56 -0
- package/README.md +1 -1
- package/dist/cli-http.js +55 -21
- package/dist/cli-http.js.map +1 -1
- package/dist/cli-http.mjs +55 -21
- package/dist/cli-http.mjs.map +1 -1
- package/dist/cli.js +55 -21
- package/dist/cli.js.map +1 -1
- package/dist/cli.mjs +55 -21
- package/dist/cli.mjs.map +1 -1
- package/dist/index.js +55 -21
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +55 -21
- package/dist/index.mjs.map +1 -1
- package/package.json +2 -2
package/dist/cli.mjs
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
// src/server.ts
|
|
4
4
|
import { Server } from "@modelcontextprotocol/sdk/server/index.js";
|
|
5
5
|
|
|
6
|
-
// node_modules/@vectros-ai/sdk/dist/index.mjs
|
|
6
|
+
// ../../node_modules/@vectros-ai/sdk/dist/index.mjs
|
|
7
7
|
var __defProp = Object.defineProperty;
|
|
8
8
|
var __export = (target, all) => {
|
|
9
9
|
for (var name in all)
|
|
@@ -38,6 +38,7 @@ __export(api_exports, {
|
|
|
38
38
|
FileUploadRequest: () => FileUploadRequest,
|
|
39
39
|
ForbiddenError: () => ForbiddenError,
|
|
40
40
|
IdentityLookupRequest: () => IdentityLookupRequest,
|
|
41
|
+
IndexFailure: () => IndexFailure,
|
|
41
42
|
InternalServerError: () => InternalServerError,
|
|
42
43
|
ListEntitiesRequestOrder: () => ListEntitiesRequestOrder,
|
|
43
44
|
ListUsersRequestOrder: () => ListUsersRequestOrder,
|
|
@@ -559,6 +560,17 @@ var IdentityLookupRequest;
|
|
|
559
560
|
Desc: "desc"
|
|
560
561
|
};
|
|
561
562
|
})(IdentityLookupRequest || (IdentityLookupRequest = {}));
|
|
563
|
+
var IndexFailure;
|
|
564
|
+
((IndexFailure2) => {
|
|
565
|
+
IndexFailure2.Code = {
|
|
566
|
+
SourceUnavailable: "SOURCE_UNAVAILABLE",
|
|
567
|
+
TextIndexFailed: "TEXT_INDEX_FAILED",
|
|
568
|
+
EmbeddingFailed: "EMBEDDING_FAILED",
|
|
569
|
+
IndexingFailed: "INDEXING_FAILED",
|
|
570
|
+
VectorLimitExceeded: "VECTOR_LIMIT_EXCEEDED",
|
|
571
|
+
Internal: "INTERNAL"
|
|
572
|
+
};
|
|
573
|
+
})(IndexFailure || (IndexFailure = {}));
|
|
562
574
|
var ModelDataVersionResponse;
|
|
563
575
|
((ModelDataVersionResponse2) => {
|
|
564
576
|
ModelDataVersionResponse2.ChangeType = {
|
|
@@ -4075,7 +4087,7 @@ var AuthClient = class {
|
|
|
4075
4087
|
);
|
|
4076
4088
|
}
|
|
4077
4089
|
/**
|
|
4078
|
-
* Creates a short-lived JWT bearer token restricted to specific actions and, optionally, to a particular user
|
|
4090
|
+
* Creates a short-lived JWT bearer token restricted to specific actions and, optionally, to a particular user or identity entity (in any namespace). Use this to hand a narrowly-scoped credential to a browser or downstream service so it never sees your root API key. Only callable with a root API key (`sk_*`).
|
|
4079
4091
|
*
|
|
4080
4092
|
* @param {Vectros.TokenRequest} request
|
|
4081
4093
|
* @param {AuthClient.RequestOptions} requestOptions - Request-specific configuration.
|
|
@@ -4292,7 +4304,7 @@ var ComplianceClient = class {
|
|
|
4292
4304
|
this._options = normalizeClientOptionsWithAuth(options);
|
|
4293
4305
|
}
|
|
4294
4306
|
/**
|
|
4295
|
-
* Submits a right-to-erasure request for a single end-subject (a user,
|
|
4307
|
+
* Submits a right-to-erasure request for a single end-subject (a user, or an identity entity in any namespace). Erasure removes exactly the data the subject solely owns across the declared contexts, plus the subject's identity and lookup rows. It never touches another account's data and never cascades into another subject's data. The request is asynchronous: it returns 202 with a `requestId`; poll `GET /v1/erasure-requests/{id}` until the job completes to obtain the completion certificate. Requires a root API key — a scoped credential is rejected with 403.
|
|
4296
4308
|
*
|
|
4297
4309
|
* @param {Vectros.ErasureRequest} request
|
|
4298
4310
|
* @param {ComplianceClient.RequestOptions} requestOptions - Request-specific configuration.
|
|
@@ -8593,8 +8605,8 @@ function warnOnSuboptimalKey(key, log) {
|
|
|
8593
8605
|
|
|
8594
8606
|
// src/build-info.ts
|
|
8595
8607
|
var BUILD_INFO = {
|
|
8596
|
-
mcpServer: true ? "0.
|
|
8597
|
-
sdk: true ? "0.
|
|
8608
|
+
mcpServer: true ? "0.11.0" : "dev",
|
|
8609
|
+
sdk: true ? "0.36.0" : "dev"
|
|
8598
8610
|
};
|
|
8599
8611
|
function formatBuildInfo() {
|
|
8600
8612
|
return `vectros-mcp-server ${BUILD_INFO.mcpServer} (sdk ${BUILD_INFO.sdk})`;
|
|
@@ -8801,31 +8813,45 @@ async function consumeStream(stream, onProgress) {
|
|
|
8801
8813
|
}
|
|
8802
8814
|
|
|
8803
8815
|
// src/tools/errors.ts
|
|
8816
|
+
function asErrorBody(body) {
|
|
8817
|
+
if (body && typeof body === "object") return body;
|
|
8818
|
+
return void 0;
|
|
8819
|
+
}
|
|
8804
8820
|
function toolError(toolName, err, docPointer) {
|
|
8805
8821
|
let summary = `${toolName} failed`;
|
|
8806
8822
|
let detail = String(err);
|
|
8823
|
+
let errorCode;
|
|
8824
|
+
let requestId;
|
|
8807
8825
|
if (err instanceof StreamError) {
|
|
8808
8826
|
summary = `${toolName} stream error`;
|
|
8809
8827
|
detail = err.message;
|
|
8810
8828
|
} else if (err instanceof Error) {
|
|
8811
8829
|
const e = err;
|
|
8812
8830
|
detail = e.message;
|
|
8831
|
+
const body = asErrorBody(e.body);
|
|
8832
|
+
if (body) {
|
|
8833
|
+
if (typeof body.message === "string" && body.message.trim().length > 0) detail = body.message;
|
|
8834
|
+
if (typeof body.errorCode === "string" && body.errorCode.length > 0) errorCode = body.errorCode;
|
|
8835
|
+
if (typeof body.requestId === "string" && body.requestId.length > 0) requestId = body.requestId;
|
|
8836
|
+
}
|
|
8813
8837
|
if (e.statusCode) {
|
|
8814
|
-
summary = `${toolName} failed: HTTP ${e.statusCode}`;
|
|
8838
|
+
summary = `${toolName} failed: HTTP ${e.statusCode}${errorCode ? ` (${errorCode})` : ""}`;
|
|
8815
8839
|
} else if (e.name && e.name !== "Error") {
|
|
8816
8840
|
summary = `${toolName} failed: ${e.name}`;
|
|
8817
8841
|
}
|
|
8818
8842
|
}
|
|
8819
|
-
const
|
|
8843
|
+
const trailer = (errorCode ? `
|
|
8844
|
+
errorCode: ${errorCode}` : "") + (requestId ? `
|
|
8845
|
+
requestId: ${requestId}` : "") + (docPointer ? `
|
|
8820
8846
|
|
|
8821
|
-
See: ${docPointer}` : "";
|
|
8847
|
+
See: ${docPointer}` : "");
|
|
8822
8848
|
return {
|
|
8823
8849
|
isError: true,
|
|
8824
8850
|
content: [
|
|
8825
8851
|
{
|
|
8826
8852
|
type: "text",
|
|
8827
8853
|
text: `${summary}
|
|
8828
|
-
${detail}${
|
|
8854
|
+
${detail}${trailer}`
|
|
8829
8855
|
}
|
|
8830
8856
|
]
|
|
8831
8857
|
};
|
|
@@ -8902,7 +8928,7 @@ var inputSchema = {
|
|
|
8902
8928
|
var hybridSearch = ({ client, log }) => ({
|
|
8903
8929
|
name: "hybrid_search",
|
|
8904
8930
|
title: "Hybrid search",
|
|
8905
|
-
description:
|
|
8931
|
+
description: 'Search your tenant\'s indexed content (documents + structured records) using hybrid BM25 + dense ranking. Returns up to `limit` results (default 3, max 50 \u2014 raise it in one call when you can accept the larger result) with citations and surrounding context for grounding follow-up reasoning. Narrow with contentTypes/typeName/filters, ownership (userId/scope), folder scope, a created date window, keyword precision (textMode OR/AND/PHRASE), relevance floors (minSimilarity/minTextRelevance), uniqueDocuments, and requireComplete (fail closed on a degraded backend). Tenant-isolated; the caller\'s scoped key fully constrains which content is visible. ARCHIVED (soft-retracted) documents never appear in results \u2014 fetch them by id via document_get, or restore them via document_update. To stay within the agent context window each hit returns its matched chunkText + a short snippet by default; set includeContext:true for the broader surrounding passage. If the whole result would be too large it is truncated to the top hits (truncated:true). totalResults is the full matching pool and hasMore:true means results remain past this page \u2014 raise limit or advance offset to fetch them. textLegEmpty:true flags that the keyword (BM25) leg matched nothing (all textScores 0) \u2014 typically the default PHRASE mode finding no contiguous match for a long natural-language query. Loosen the keyword leg: shorten the query to its key terms, or set textMode "AND" (all terms, higher precision) or "OR" (any term, broad recall).',
|
|
8906
8932
|
inputSchema,
|
|
8907
8933
|
handler: async (args) => {
|
|
8908
8934
|
const limit = args.limit ?? MCP_DEFAULT_LIMIT;
|
|
@@ -9154,7 +9180,7 @@ var inputSchema3 = {
|
|
|
9154
9180
|
var recordGet = ({ client, log }) => ({
|
|
9155
9181
|
name: "record_get",
|
|
9156
9182
|
title: "Get a record by id or externalId",
|
|
9157
|
-
description: "Fetch a single structured record, including the full payload. Select it EITHER by its Vectros `id` (e.g. from record_query / hybrid_search) OR by your own `externalId` + `type` \u2014 the same key you passed to record_create, resolved for you (no manual record_query lookup needed). Very large payloads are truncated to protect the agent context window.",
|
|
9183
|
+
description: "Fetch a single structured record, including the full payload. Select it EITHER by its Vectros `id` (e.g. from record_query / hybrid_search) OR by your own `externalId` + `type` \u2014 the same key you passed to record_create, resolved for you (no manual record_query lookup needed). Very large payloads are truncated to protect the agent context window. The response carries the record's processing `indexStatus`; when it is FAILED an `indexFailure.code` explains whether the content is still searchable (e.g. VECTOR_LIMIT_EXCEEDED keeps keyword search vs INDEXING_FAILED = not findable at all) \u2014 branch on the `code`, not the message.",
|
|
9158
9184
|
inputSchema: inputSchema3,
|
|
9159
9185
|
handler: async (args) => {
|
|
9160
9186
|
const id = args.id;
|
|
@@ -9192,7 +9218,7 @@ import { z as z4 } from "zod";
|
|
|
9192
9218
|
var inputSchema4 = {
|
|
9193
9219
|
type: z4.string().min(1, "type is required").describe('Record type / schema name (e.g. "task"). Must match an existing schema \u2014 see list_schemas.'),
|
|
9194
9220
|
fields: z4.record(z4.string(), z4.unknown()).describe(
|
|
9195
|
-
"The record payload \u2014 a JSON object of field\u2192value, validated against the type schema. Call list_schemas to learn required fields, types, and enum values."
|
|
9221
|
+
"The record payload \u2014 a JSON object of field\u2192value, validated against the type schema. Call list_schemas to learn required fields, types, and enum values. Every number must fall within the signed 64-bit range (a value outside it, or with >38 significant digits, is refused with a 400 naming the field) \u2014 send a larger whole number (e.g. a big external id) as a STRING, which stores it exactly and supports exact-match lookup."
|
|
9196
9222
|
),
|
|
9197
9223
|
externalId: z4.string().optional().describe(
|
|
9198
9224
|
"Stable caller-supplied id. Immutable; unique per type. Re-creating with the same externalId returns the existing record (idempotent) \u2014 use it to make creates safely retryable."
|
|
@@ -9210,7 +9236,7 @@ var inputSchema4 = {
|
|
|
9210
9236
|
var recordCreate = ({ client, log }) => ({
|
|
9211
9237
|
name: "record_create",
|
|
9212
9238
|
title: "Create a record",
|
|
9213
|
-
description: "Create a structured record of a given type. Provide `type` and `fields` (the payload, validated against the type schema \u2014 call list_schemas first to learn required fields and enums). Idempotent by `externalId`. Requires the key to allow records:c.",
|
|
9239
|
+
description: "Create a structured record of a given type. Provide `type` and `fields` (the payload, validated against the type schema \u2014 call list_schemas first to learn required fields and enums). Idempotent by `externalId`. Requires the key to allow records:c (and records:r to receive the existing record on a collision).",
|
|
9214
9240
|
inputSchema: inputSchema4,
|
|
9215
9241
|
handler: async (args) => {
|
|
9216
9242
|
const type = args.type;
|
|
@@ -9568,7 +9594,7 @@ function isNotAvailable(err) {
|
|
|
9568
9594
|
var documentGet = ({ client, log }) => ({
|
|
9569
9595
|
name: "document_get",
|
|
9570
9596
|
title: "Get document metadata (and optionally text)",
|
|
9571
|
-
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`.",
|
|
9597
|
+
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`. When `indexStatus` is FAILED the response also carries `indexFailure` with a machine-readable `code` telling you whether the content is still findable \u2014 e.g. TEXT_INDEX_FAILED / VECTOR_LIMIT_EXCEEDED (one leg still serves it) vs INDEXING_FAILED (not findable by search at all). Branch on `code`, not on the message.",
|
|
9572
9598
|
inputSchema: inputSchema10,
|
|
9573
9599
|
handler: async (args) => {
|
|
9574
9600
|
const documentId = args.documentId;
|
|
@@ -9902,7 +9928,7 @@ var inputSchema15 = {
|
|
|
9902
9928
|
var folderCreate = ({ client, log }) => ({
|
|
9903
9929
|
name: "folder_create",
|
|
9904
9930
|
title: "Create a folder",
|
|
9905
|
-
description: "Create a folder to organize documents and records. Pass `parentId` to nest it (create-only \u2014 folders cannot be moved later). Idempotent by `slug` within the parent. Requires the key to allow folders:c.",
|
|
9931
|
+
description: "Create a folder to organize documents and records. Pass `parentId` to nest it (create-only \u2014 folders cannot be moved later). Idempotent by `slug` within the parent. Requires the key to allow folders:c (and folders:r to receive the existing folder on a collision).",
|
|
9906
9932
|
inputSchema: inputSchema15,
|
|
9907
9933
|
handler: async (args) => {
|
|
9908
9934
|
try {
|
|
@@ -10001,7 +10027,7 @@ var inputSchema18 = {
|
|
|
10001
10027
|
var currentIdentity = ({ log, apiKey, environment }) => ({
|
|
10002
10028
|
name: "current_identity",
|
|
10003
10029
|
title: "Current identity (tenant + principal scope)",
|
|
10004
|
-
description: "Describe the credential the MCP server is operating under. Returns tenantId, environment (staging|production), principalType (root_key|scoped_key|token), principalKeyId, and (for scoped
|
|
10030
|
+
description: "Describe the credential the MCP server is operating under. Returns tenantId, environment (staging|production), principalType (root_key|scoped_key|token), principalKeyId, principalLabel, and (for scoped credentials) allowedActions plus dataScope \u2014 the credential's reach as { userId, scopes[] }, where each scope is a `namespace:value` string (e.g. \"org:<uuid>\"). Use this when the user asks 'what can you do here?' or 'what tenant am I in?'. Calls GET /v1/ping under the hood.",
|
|
10005
10031
|
inputSchema: inputSchema18,
|
|
10006
10032
|
handler: async () => {
|
|
10007
10033
|
try {
|
|
@@ -10099,7 +10125,7 @@ var inputSchema19 = {
|
|
|
10099
10125
|
"Index strategy. HYBRID (BM25 + dense, default; best for general retrieval), SEMANTIC (dense only; concept-driven queries), TEXT (BM25 only; exact-match / keyword), NONE (store-only / archival \u2014 retrievable by id and structured-field lookup but never in search results). Omit to inherit the bound schema's default."
|
|
10100
10126
|
),
|
|
10101
10127
|
externalId: z18.string().optional().describe(
|
|
10102
|
-
|
|
10128
|
+
'Stable caller-supplied id. Immutable; unique per type within your context. Re-ingesting with the same externalId returns the existing document (idempotent) instead of creating a duplicate \u2014 use it to make ingests safely retryable and as the key other records reference. Mirrors record_create. Receiving the existing document back is a read of it and needs documents:r in addition to documents:c; a create-only key gets an "already exists" error instead of the document.'
|
|
10103
10129
|
),
|
|
10104
10130
|
upsert: z18.boolean().optional().describe(
|
|
10105
10131
|
"When true, re-ingesting an existing externalId OVERWRITES that document and re-indexes the new body (text mode) / re-uploads and re-indexes the new file (file mode), instead of returning the existing one unchanged. This is the curation/re-sync primitive: edit a source, re-ingest with upsert:true, and the search index reflects the new content. Requires the documents:u scope. IMPORTANT: pass the SAME schemaId (and type) you used originally \u2014 externalId is unique WITHIN a type, so omitting schemaId resolves in the untyped namespace and mints a duplicate instead of updating. The response `created` flag confirms which happened (created:true = a new document was minted)."
|
|
@@ -10108,12 +10134,12 @@ var inputSchema19 = {
|
|
|
10108
10134
|
"Bind this document to a record schema. When set, `payload` is validated against the schema and its lookup fields become directly queryable via document_query (records parity). Resolve a schema id from its type via list_schemas. Omit for an untyped document."
|
|
10109
10135
|
),
|
|
10110
10136
|
payload: z18.record(z18.string(), z18.unknown()).optional().describe(
|
|
10111
|
-
"The document's structured data \u2014 a flat key/value object. With `schemaId`, declared fields are validated and lookup fields indexed; undeclared keys pass through as free-form and are searchable via the hybrid_search `filters` param. Without a schema it is stored as free-form metadata."
|
|
10137
|
+
"The document's structured data \u2014 a flat key/value object. With `schemaId`, declared fields are validated and lookup fields indexed; undeclared keys pass through as free-form and are searchable via the hybrid_search `filters` param. Without a schema it is stored as free-form metadata. Every number must fall within the signed 64-bit range \u2014 send a larger whole number as a STRING (stored exactly, exact-match lookup), else the ingest is refused with a 400 naming the field."
|
|
10112
10138
|
),
|
|
10113
10139
|
// Inline text mode (mutually exclusive with filePath):
|
|
10114
10140
|
text: z18.string().min(1).optional().describe("Text body to ingest inline. Mutually exclusive with filePath. Either text or filePath is required."),
|
|
10115
10141
|
storeText: z18.boolean().optional().describe(
|
|
10116
|
-
"Whether the
|
|
10142
|
+
"FILE MODE ONLY. Whether the uploaded file's EXTRACTED text is retained after indexing (default true), fixed at ingest. true keeps the extracted text retrievable via document_get(includeText:true) and usable by document_ask; false discards it once indexing completes \u2014 search still works and the original file remains downloadable, but includeText returns textAvailable:false and document_ask is unavailable. NOT accepted with `text`: a text-ingested body is the document itself and is ALWAYS retained, so the backend has no storeText knob on the text path \u2014 passing it with `text` is rejected rather than silently ignored."
|
|
10117
10143
|
),
|
|
10118
10144
|
// File upload mode (mutually exclusive with text; stdio-transport-only):
|
|
10119
10145
|
filePath: z18.string().min(1).optional().describe(
|
|
@@ -10130,7 +10156,7 @@ var inputSchema19 = {
|
|
|
10130
10156
|
var documentIngest = ({ client, log, transport, ingestRoot }) => ({
|
|
10131
10157
|
name: "document_ingest",
|
|
10132
10158
|
title: "Ingest a new document (text body or file upload)",
|
|
10133
|
-
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
|
|
10159
|
+
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 \u2014 requires documents:r in addition to documents:c, since being handed the existing document is a read of it). 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 is a FILE-MODE knob (default true): false discards the uploaded file's extracted text after indexing (search + file download keep working; text retrieval and document_ask do not). Text-mode bodies are always retained, so storeText is not accepted with `text`.",
|
|
10134
10160
|
inputSchema: inputSchema19,
|
|
10135
10161
|
handler: async (args) => {
|
|
10136
10162
|
const title = args.title;
|
|
@@ -10167,6 +10193,14 @@ var documentIngest = ({ client, log, transport, ingestRoot }) => ({
|
|
|
10167
10193
|
)
|
|
10168
10194
|
);
|
|
10169
10195
|
}
|
|
10196
|
+
if (text && args.storeText !== void 0) {
|
|
10197
|
+
return toolError(
|
|
10198
|
+
"document_ingest",
|
|
10199
|
+
new Error(
|
|
10200
|
+
"`storeText` is not supported with `text` \u2014 a text-ingested body is the document itself and is always retained; the text path has no storeText control. Omit it (text mode), or use `filePath` mode where storeText:false discards the uploaded file's extracted text after indexing."
|
|
10201
|
+
)
|
|
10202
|
+
);
|
|
10203
|
+
}
|
|
10170
10204
|
const common = {
|
|
10171
10205
|
folderId: args.folderId,
|
|
10172
10206
|
payload: args.payload,
|
|
@@ -10471,7 +10505,7 @@ var identityResource = ({ log, apiKey, environment }) => ({
|
|
|
10471
10505
|
name: "identity",
|
|
10472
10506
|
uri: "vectros://identity",
|
|
10473
10507
|
title: "Current identity (tenant + principal scope)",
|
|
10474
|
-
description: "The tenant + principal scope the MCP server is authenticated as. Returns the same payload as the `current_identity` tool: status, environment, principalType, principalKeyId, and (for scoped
|
|
10508
|
+
description: "The tenant + principal scope the MCP server is authenticated as. Returns the same payload as the `current_identity` tool: status, tenantId, environment, principalType, principalKeyId, principalLabel, and (for scoped credentials) allowedActions + dataScope ({ userId, scopes[] }). The /v1/ping backing call ships this extended shape today.",
|
|
10475
10509
|
mimeType: "application/json",
|
|
10476
10510
|
read: async () => {
|
|
10477
10511
|
const identity = await resolveIdentity({ log, apiKey, environment });
|