@vectros-ai/mcp-server 0.10.0 → 0.12.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 +85 -0
- package/README.md +1 -1
- package/dist/cli-http.js +105 -51
- package/dist/cli-http.js.map +1 -1
- package/dist/cli-http.mjs +105 -51
- package/dist/cli-http.mjs.map +1 -1
- package/dist/cli.js +105 -51
- package/dist/cli.js.map +1 -1
- package/dist/cli.mjs +105 -51
- package/dist/cli.mjs.map +1 -1
- package/dist/index.js +105 -51
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +105 -51
- package/dist/index.mjs.map +1 -1
- package/package.json +2 -2
package/dist/cli-http.mjs
CHANGED
|
@@ -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.
|
|
@@ -4601,7 +4613,7 @@ var DocumentsClient = class {
|
|
|
4601
4613
|
return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/v1/documents");
|
|
4602
4614
|
}
|
|
4603
4615
|
/**
|
|
4604
|
-
* Creates a document from a raw text string and queues it for asynchronous indexing so it becomes searchable. Optionally supply an `externalId` to make the create idempotent — if a document with the same `externalId` already exists in your context, that existing document is returned unchanged instead of a duplicate being created. The response's `created` field (and the HTTP status — 201 when created, 200 when an existing document was returned) tells the two apart. To overwrite an existing document's content instead of returning it unchanged, set `?upsert=true` (this also requires the `documents:u` scope). Requires the `documents:c` scope.
|
|
4616
|
+
* Creates a document from a raw text string and queues it for asynchronous indexing so it becomes searchable. Optionally supply an `externalId` to make the create idempotent — if a document with the same `externalId` already exists in your context, that existing document is returned unchanged instead of a duplicate being created. The response's `created` field (and the HTTP status — 201 when created, 200 when an existing document was returned) tells the two apart. To overwrite an existing document's content instead of returning it unchanged, set `?upsert=true` (this also requires the `documents:u` scope). Requires the `documents:c` scope to create. Being returned the existing document on a collision is a read of that document's data and additionally requires the `documents:r` scope — a credential holding `documents:c` alone receives a `400` ("already exists") on collision instead of the document.
|
|
4605
4617
|
*
|
|
4606
4618
|
* @param {Vectros.IngestDocumentRequest} request
|
|
4607
4619
|
* @param {DocumentsClient.RequestOptions} requestOptions - Request-specific configuration.
|
|
@@ -4927,25 +4939,29 @@ var DocumentsClient = class {
|
|
|
4927
4939
|
return handleNonStatusCodeError(_response.error, _response.rawResponse, "PATCH", "/v1/documents/{id}");
|
|
4928
4940
|
}
|
|
4929
4941
|
/**
|
|
4930
|
-
* Finds documents of a given type by field value. Supported fields: `externalId` (the document's first-class external identifier — no schema declaration required) and any field declared as a lookup field on the bound schema. A lookup on a sensitive field is rejected here because the value would appear in the URL query string; use POST /v1/documents/lookup (the request-body variant) for a sensitive field instead. Results are paginated: set `limit` for the page size and feed the returned `nextCursor` back as `startFrom` to fetch the next page. The response is a `{data, nextCursor}` envelope. Requires the `documents:r` scope.
|
|
4942
|
+
* Finds documents of a given type by field value. Supported fields: `externalId` (the document's first-class external identifier — no schema declaration required) and any field declared as a lookup field on the bound schema. A lookup on a sensitive field is rejected here because the value would appear in the URL query string; use POST /v1/documents/lookup (the request-body variant) for a sensitive field instead. `type`'s schema resolves with basedOn-aware shadowing: your own `userId`- or `scope`-owned variant if you have one, otherwise the shared base — for a scoped credential the owner is always your own token identity; `userId`/`scope` here only apply as an explicit owner selector for a root API key. Results are paginated: set `limit` for the page size and feed the returned `nextCursor` back as `startFrom` to fetch the next page. The response is a `{data, nextCursor}` envelope. Requires the `documents:r` scope.
|
|
4931
4943
|
*
|
|
4932
4944
|
* @param {Vectros.LookupDocumentsRequest} request
|
|
4933
4945
|
* @param {DocumentsClient.RequestOptions} requestOptions - Request-specific configuration.
|
|
4934
4946
|
*
|
|
4947
|
+
* @throws {@link Vectros.BadRequestError}
|
|
4948
|
+
*
|
|
4935
4949
|
* @example
|
|
4936
4950
|
* await client.documents.lookupDocuments({
|
|
4937
4951
|
* type: "invoice",
|
|
4938
4952
|
* field: "po_number",
|
|
4939
4953
|
* value: "PO-1001",
|
|
4940
4954
|
* prefix: "PO-2024",
|
|
4941
|
-
* startFrom: "550e8400-e29b-41d4-a716-446655440000"
|
|
4955
|
+
* startFrom: "550e8400-e29b-41d4-a716-446655440000",
|
|
4956
|
+
* userId: "550e8400-e29b-41d4-a716-446655440000",
|
|
4957
|
+
* scope: "org:6ba7b810-9dad-11d1-80b4-00c04fd430c8"
|
|
4942
4958
|
* })
|
|
4943
4959
|
*/
|
|
4944
4960
|
lookupDocuments(request, requestOptions) {
|
|
4945
4961
|
return HttpResponsePromise.fromPromise(this.__lookupDocuments(request, requestOptions));
|
|
4946
4962
|
}
|
|
4947
4963
|
async __lookupDocuments(request, requestOptions) {
|
|
4948
|
-
const { type: type_, field, value, from: from_, to, prefix, startFrom, limit, order } = request;
|
|
4964
|
+
const { type: type_, field, value, from: from_, to, prefix, startFrom, limit, order, userId, scope } = request;
|
|
4949
4965
|
const _queryParams = {
|
|
4950
4966
|
type: type_,
|
|
4951
4967
|
field,
|
|
@@ -4955,7 +4971,9 @@ var DocumentsClient = class {
|
|
|
4955
4971
|
prefix,
|
|
4956
4972
|
startFrom,
|
|
4957
4973
|
limit,
|
|
4958
|
-
order: order != null ? order : void 0
|
|
4974
|
+
order: order != null ? order : void 0,
|
|
4975
|
+
userId,
|
|
4976
|
+
scope
|
|
4959
4977
|
};
|
|
4960
4978
|
const _authRequest = await this._options.authProvider.getAuthRequest();
|
|
4961
4979
|
const _headers = mergeHeaders(
|
|
@@ -4981,11 +4999,16 @@ var DocumentsClient = class {
|
|
|
4981
4999
|
return { data: _response.body, rawResponse: _response.rawResponse };
|
|
4982
5000
|
}
|
|
4983
5001
|
if (_response.error.reason === "status-code") {
|
|
4984
|
-
|
|
4985
|
-
|
|
4986
|
-
|
|
4987
|
-
|
|
4988
|
-
|
|
5002
|
+
switch (_response.error.statusCode) {
|
|
5003
|
+
case 400:
|
|
5004
|
+
throw new BadRequestError(_response.error.body, _response.rawResponse);
|
|
5005
|
+
default:
|
|
5006
|
+
throw new VectrosError({
|
|
5007
|
+
statusCode: _response.error.statusCode,
|
|
5008
|
+
body: _response.error.body,
|
|
5009
|
+
rawResponse: _response.rawResponse
|
|
5010
|
+
});
|
|
5011
|
+
}
|
|
4989
5012
|
}
|
|
4990
5013
|
return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/v1/documents/lookup");
|
|
4991
5014
|
}
|
|
@@ -5353,7 +5376,7 @@ var FoldersClient = class {
|
|
|
5353
5376
|
return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/v1/folders");
|
|
5354
5377
|
}
|
|
5355
5378
|
/**
|
|
5356
|
-
* Creates a folder to organize your documents and records. If `parentFolderId` is omitted, the folder is created under your context's default root folder. Folder creation is idempotent by (slug + parent): if a folder with the same slug already exists under the same parent, that existing folder is returned unchanged instead of a duplicate being created. The response's `created` field (and the HTTP status — 201 when created, 200 when an existing folder was returned) tells the two apart. To overwrite an existing folder's mutable fields instead of returning it unchanged, set `?upsert=true` (this also requires the `folders:u` scope). Requires the `folders:c` scope.
|
|
5379
|
+
* Creates a folder to organize your documents and records. If `parentFolderId` is omitted, the folder is created under your context's default root folder. Folder creation is idempotent by (slug + parent): if a folder with the same slug already exists under the same parent, that existing folder is returned unchanged instead of a duplicate being created. The response's `created` field (and the HTTP status — 201 when created, 200 when an existing folder was returned) tells the two apart. To overwrite an existing folder's mutable fields instead of returning it unchanged, set `?upsert=true` (this also requires the `folders:u` scope). Requires the `folders:c` scope to create. Being returned the existing folder on a collision is a read of that folder's data and additionally requires the `folders:r` scope — a credential holding `folders:c` alone receives a `400` ("already exists") on collision instead of the folder.
|
|
5357
5380
|
*
|
|
5358
5381
|
* @param {Vectros.CreateFolderRequest} request
|
|
5359
5382
|
* @param {FoldersClient.RequestOptions} requestOptions - Request-specific configuration.
|
|
@@ -5811,7 +5834,7 @@ var IdentityClient = class {
|
|
|
5811
5834
|
return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/v1/entities/{namespace}");
|
|
5812
5835
|
}
|
|
5813
5836
|
/**
|
|
5814
|
-
* Creates a new entity in the given namespace. This call is idempotent on `externalId` within the namespace: if an entity with the same `externalId` already exists, the existing record is returned instead of creating a duplicate (`created: false`, HTTP 200). To overwrite an existing entity's content instead of returning it unchanged, set `?upsert=true` (also requires the `entities:u:<namespace>` scope). The namespace must be entity-backed (`org`/`client`, or registered via `POST /v1/namespaces`). Requires the `entities:c:<namespace>` scope.
|
|
5837
|
+
* Creates a new entity in the given namespace. This call is idempotent on `externalId` within the namespace: if an entity with the same `externalId` already exists, the existing record is returned instead of creating a duplicate (`created: false`, HTTP 200). To overwrite an existing entity's content instead of returning it unchanged, set `?upsert=true` (also requires the `entities:u:<namespace>` scope). The namespace must be entity-backed (`org`/`client`, or registered via `POST /v1/namespaces`). Requires the `entities:c:<namespace>` scope to create. Being returned the existing entity on a collision is a read of that entity's data and additionally requires the `entities:r:<namespace>` scope — a credential holding `entities:c:<namespace>` alone receives a `400` ("already in use") on collision instead of the entity.
|
|
5815
5838
|
*
|
|
5816
5839
|
* @param {Vectros.CreateEntityRequest} request
|
|
5817
5840
|
* @param {IdentityClient.RequestOptions} requestOptions - Request-specific configuration.
|
|
@@ -6255,7 +6278,7 @@ var IdentityClient = class {
|
|
|
6255
6278
|
return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/v1/namespaces/{namespace}");
|
|
6256
6279
|
}
|
|
6257
6280
|
/**
|
|
6258
|
-
* Updates the mutable fields (`entityBacked`, `defaultSchemaId`) of a registered namespace. The namespace name itself is immutable. Requires a root API key. The reserved built-ins cannot be updated.
|
|
6281
|
+
* Updates the mutable fields (`entityBacked`, `defaultSchemaId`, `specificityRank`) of a registered namespace. The namespace name itself is immutable. Requires a root API key. The reserved built-ins cannot be updated.
|
|
6259
6282
|
*
|
|
6260
6283
|
* @param {Vectros.UpdateNamespaceRequest} request
|
|
6261
6284
|
* @param {IdentityClient.RequestOptions} requestOptions - Request-specific configuration.
|
|
@@ -6268,7 +6291,8 @@ var IdentityClient = class {
|
|
|
6268
6291
|
* await client.identity.updateNamespace({
|
|
6269
6292
|
* namespace: "team",
|
|
6270
6293
|
* body: {
|
|
6271
|
-
* namespace: "team"
|
|
6294
|
+
* namespace: "team",
|
|
6295
|
+
* specificityRank: 1500
|
|
6272
6296
|
* }
|
|
6273
6297
|
* })
|
|
6274
6298
|
*/
|
|
@@ -6433,7 +6457,7 @@ var IdentityClient = class {
|
|
|
6433
6457
|
return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/v1/namespaces");
|
|
6434
6458
|
}
|
|
6435
6459
|
/**
|
|
6436
|
-
* Registers a new scope namespace and declares whether its values resolve to identity entities (`entityBacked`). Requires a root API key. The reserved names `org` and `client` are built in and cannot be registered.
|
|
6460
|
+
* Registers a new scope namespace and declares whether its values resolve to identity entities (`entityBacked`). Also requires `specificityRank`, an explicit, account-unique position in the specificity order used to break recordType schema-resolution ties. Requires a root API key. The reserved names `org` and `client` are built in and cannot be registered.
|
|
6437
6461
|
*
|
|
6438
6462
|
* @param {Vectros.NamespaceRequest} request
|
|
6439
6463
|
* @param {IdentityClient.RequestOptions} requestOptions - Request-specific configuration.
|
|
@@ -6444,7 +6468,8 @@ var IdentityClient = class {
|
|
|
6444
6468
|
*
|
|
6445
6469
|
* @example
|
|
6446
6470
|
* await client.identity.registerNamespace({
|
|
6447
|
-
* namespace: "team"
|
|
6471
|
+
* namespace: "team",
|
|
6472
|
+
* specificityRank: 1500
|
|
6448
6473
|
* })
|
|
6449
6474
|
*/
|
|
6450
6475
|
registerNamespace(request, requestOptions) {
|
|
@@ -6561,7 +6586,7 @@ var IdentityClient = class {
|
|
|
6561
6586
|
return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/v1/users");
|
|
6562
6587
|
}
|
|
6563
6588
|
/**
|
|
6564
|
-
* Creates a user identity in your account. The operation is idempotent on `externalId`: if a user with the same `externalId` already exists, the existing record is returned instead of creating a duplicate. The response's `created` field (and the HTTP status — 201 when created, 200 when an existing user was returned) tells the two apart. To overwrite an existing user's mutable fields (email, status, payload, schema binding) instead of returning it unchanged, set `?upsert=true` (this also requires the `users:u` scope). Requires the `users:c` scope.
|
|
6589
|
+
* Creates a user identity in your account. The operation is idempotent on `externalId`: if a user with the same `externalId` already exists, the existing record is returned instead of creating a duplicate. The response's `created` field (and the HTTP status — 201 when created, 200 when an existing user was returned) tells the two apart. To overwrite an existing user's mutable fields (email, status, payload, schema binding) instead of returning it unchanged, set `?upsert=true` (this also requires the `users:u` scope). Requires the `users:c` scope to create. Being returned the existing user on a collision is a read of that user's data and additionally requires the `users:r` scope — a credential holding `users:c` alone receives a `400` ("already exists") on collision instead of the user.
|
|
6565
6590
|
*
|
|
6566
6591
|
* @param {Vectros.CreateUserRequest} request
|
|
6567
6592
|
* @param {IdentityClient.RequestOptions} requestOptions - Request-specific configuration.
|
|
@@ -7432,7 +7457,7 @@ var RecordsClient = class {
|
|
|
7432
7457
|
return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/v1/records");
|
|
7433
7458
|
}
|
|
7434
7459
|
/**
|
|
7435
|
-
* Creates a new record of a given type. The `payload` is validated against that type's schema before the record is stored. Identify the type by sending `typeName`, `schemaId`, or both (they must agree); if you send only `schemaId`, the type is taken from that schema. Optionally supply an `externalId` to make the create idempotent — if a record with the same `externalId` already exists in your context, that existing record is returned unchanged instead of a duplicate being created. The response's `created` field (and the HTTP status — 201 when created, 200 when an existing record was returned) tells the two apart. To overwrite an existing record's content instead of returning it unchanged, set `?upsert=true` (this also requires the `records:u:<type>` scope). Requires the `records:c:<type>` scope.
|
|
7460
|
+
* Creates a new record of a given type. The `payload` is validated against that type's schema before the record is stored. Identify the type by sending `typeName`, `schemaId`, or both (they must agree); if you send only `schemaId`, the type is taken from that schema. Optionally supply an `externalId` to make the create idempotent — if a record with the same `externalId` already exists in your context, that existing record is returned unchanged instead of a duplicate being created. The response's `created` field (and the HTTP status — 201 when created, 200 when an existing record was returned) tells the two apart. To overwrite an existing record's content instead of returning it unchanged, set `?upsert=true` (this also requires the `records:u:<type>` scope). Requires the `records:c:<type>` scope to create. Being returned the existing record on a collision is a read of that record's data and additionally requires the `records:r:<type>` scope — a credential holding `records:c:<type>` alone receives a `400` ("already exists") on collision instead of the record.
|
|
7436
7461
|
*
|
|
7437
7462
|
* @param {Vectros.CreateRecordRequest} request
|
|
7438
7463
|
* @param {RecordsClient.RequestOptions} requestOptions - Request-specific configuration.
|
|
@@ -8023,6 +8048,8 @@ var SchemasClient = class {
|
|
|
8023
8048
|
* @param {Vectros.ListSchemasRequest} request
|
|
8024
8049
|
* @param {SchemasClient.RequestOptions} requestOptions - Request-specific configuration.
|
|
8025
8050
|
*
|
|
8051
|
+
* @throws {@link Vectros.BadRequestError}
|
|
8052
|
+
*
|
|
8026
8053
|
* @example
|
|
8027
8054
|
* await client.schemas.listSchemas({
|
|
8028
8055
|
* userId: "550e8400-e29b-41d4-a716-446655440000",
|
|
@@ -8069,16 +8096,21 @@ var SchemasClient = class {
|
|
|
8069
8096
|
return { data: _response.body, rawResponse: _response.rawResponse };
|
|
8070
8097
|
}
|
|
8071
8098
|
if (_response.error.reason === "status-code") {
|
|
8072
|
-
|
|
8073
|
-
|
|
8074
|
-
|
|
8075
|
-
|
|
8076
|
-
|
|
8099
|
+
switch (_response.error.statusCode) {
|
|
8100
|
+
case 400:
|
|
8101
|
+
throw new BadRequestError(_response.error.body, _response.rawResponse);
|
|
8102
|
+
default:
|
|
8103
|
+
throw new VectrosError({
|
|
8104
|
+
statusCode: _response.error.statusCode,
|
|
8105
|
+
body: _response.error.body,
|
|
8106
|
+
rawResponse: _response.rawResponse
|
|
8107
|
+
});
|
|
8108
|
+
}
|
|
8077
8109
|
}
|
|
8078
8110
|
return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/v1/schemas");
|
|
8079
8111
|
}
|
|
8080
8112
|
/**
|
|
8081
|
-
* Defines a new record type with optional field definitions, validation rules, and lookup indexes. Idempotent by `typeName` within the same ownership scope: re-creating an existing `typeName` returns the existing schema rather than failing. The response's `created` field (and the HTTP status — 201 when created, 200 when an existing schema was returned) tells the two apart. To reconcile an existing schema to the submitted shape instead of returning it unchanged, set `?upsert=true` (this also requires the `schemas:
|
|
8113
|
+
* Defines a new record type with optional field definitions, validation rules, and lookup indexes. Idempotent by `typeName` within the same ownership scope: re-creating an existing `typeName` returns the existing schema rather than failing. The response's `created` field (and the HTTP status — 201 when created, 200 when an existing schema was returned) tells the two apart. To reconcile an existing schema to the submitted shape instead of returning it unchanged, set `?upsert=true` (this also requires the `schemas:u` scope; only legal schema changes are applied — migration-locked changes are rejected). Requires the `schemas:c` scope to create. Being returned the existing schema on a collision is a read of that schema's data and additionally requires the `schemas:r` scope — a credential holding `schemas:c` alone receives a `400` ("already in use") on collision instead of the schema.
|
|
8082
8114
|
*
|
|
8083
8115
|
* @param {Vectros.CreateSchemaRequest} request
|
|
8084
8116
|
* @param {SchemasClient.RequestOptions} requestOptions - Request-specific configuration.
|
|
@@ -8222,7 +8254,7 @@ var SchemasClient = class {
|
|
|
8222
8254
|
return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/v1/schemas/{id}");
|
|
8223
8255
|
}
|
|
8224
8256
|
/**
|
|
8225
|
-
* Updates a record schema. Fields you omit are preserved; `typeName` is immutable and cannot be changed. Collection fields (`fields`, `lookupFields`, `renderHints`, `capabilities`) are replaced in full when supplied. Requires the `schemas:
|
|
8257
|
+
* Updates a record schema. Fields you omit are preserved; `typeName` is immutable and cannot be changed. Collection fields (`fields`, `lookupFields`, `renderHints`, `capabilities`) are replaced in full when supplied. Requires the `schemas:u` scope.
|
|
8226
8258
|
*
|
|
8227
8259
|
* @param {Vectros.UpdateSchemaRequest} request
|
|
8228
8260
|
* @param {SchemasClient.RequestOptions} requestOptions - Request-specific configuration.
|
|
@@ -8291,7 +8323,7 @@ var SchemasClient = class {
|
|
|
8291
8323
|
return handleNonStatusCodeError(_response.error, _response.rawResponse, "PUT", "/v1/schemas/{id}");
|
|
8292
8324
|
}
|
|
8293
8325
|
/**
|
|
8294
|
-
* Permanently deletes a record schema. The request is refused with 409 if records of this type still exist — delete those records first, since every record must reference a live schema. Requires the `schemas:
|
|
8326
|
+
* Permanently deletes a record schema. The request is refused with 409 if records of this type still exist — delete those records first, since every record must reference a live schema. A lineage base (a schema other schemas declare `basedOn`) also cannot be deleted while any such variant still exists — delete the variant schema(s) first. Requires the `schemas:d` scope.
|
|
8295
8327
|
*
|
|
8296
8328
|
* @param {Vectros.DeleteSchemaRequest} request
|
|
8297
8329
|
* @param {SchemasClient.RequestOptions} requestOptions - Request-specific configuration.
|
|
@@ -8593,8 +8625,8 @@ function warnOnSuboptimalKey(key, log) {
|
|
|
8593
8625
|
|
|
8594
8626
|
// src/build-info.ts
|
|
8595
8627
|
var BUILD_INFO = {
|
|
8596
|
-
mcpServer: true ? "0.
|
|
8597
|
-
sdk: true ? "0.
|
|
8628
|
+
mcpServer: true ? "0.12.0" : "dev",
|
|
8629
|
+
sdk: true ? "0.37.0" : "dev"
|
|
8598
8630
|
};
|
|
8599
8631
|
|
|
8600
8632
|
// src/log.ts
|
|
@@ -8798,31 +8830,45 @@ async function consumeStream(stream, onProgress) {
|
|
|
8798
8830
|
}
|
|
8799
8831
|
|
|
8800
8832
|
// src/tools/errors.ts
|
|
8833
|
+
function asErrorBody(body) {
|
|
8834
|
+
if (body && typeof body === "object") return body;
|
|
8835
|
+
return void 0;
|
|
8836
|
+
}
|
|
8801
8837
|
function toolError(toolName, err, docPointer) {
|
|
8802
8838
|
let summary = `${toolName} failed`;
|
|
8803
8839
|
let detail = String(err);
|
|
8840
|
+
let errorCode;
|
|
8841
|
+
let requestId;
|
|
8804
8842
|
if (err instanceof StreamError) {
|
|
8805
8843
|
summary = `${toolName} stream error`;
|
|
8806
8844
|
detail = err.message;
|
|
8807
8845
|
} else if (err instanceof Error) {
|
|
8808
8846
|
const e = err;
|
|
8809
8847
|
detail = e.message;
|
|
8848
|
+
const body = asErrorBody(e.body);
|
|
8849
|
+
if (body) {
|
|
8850
|
+
if (typeof body.message === "string" && body.message.trim().length > 0) detail = body.message;
|
|
8851
|
+
if (typeof body.errorCode === "string" && body.errorCode.length > 0) errorCode = body.errorCode;
|
|
8852
|
+
if (typeof body.requestId === "string" && body.requestId.length > 0) requestId = body.requestId;
|
|
8853
|
+
}
|
|
8810
8854
|
if (e.statusCode) {
|
|
8811
|
-
summary = `${toolName} failed: HTTP ${e.statusCode}`;
|
|
8855
|
+
summary = `${toolName} failed: HTTP ${e.statusCode}${errorCode ? ` (${errorCode})` : ""}`;
|
|
8812
8856
|
} else if (e.name && e.name !== "Error") {
|
|
8813
8857
|
summary = `${toolName} failed: ${e.name}`;
|
|
8814
8858
|
}
|
|
8815
8859
|
}
|
|
8816
|
-
const
|
|
8860
|
+
const trailer = (errorCode ? `
|
|
8861
|
+
errorCode: ${errorCode}` : "") + (requestId ? `
|
|
8862
|
+
requestId: ${requestId}` : "") + (docPointer ? `
|
|
8817
8863
|
|
|
8818
|
-
See: ${docPointer}` : "";
|
|
8864
|
+
See: ${docPointer}` : "");
|
|
8819
8865
|
return {
|
|
8820
8866
|
isError: true,
|
|
8821
8867
|
content: [
|
|
8822
8868
|
{
|
|
8823
8869
|
type: "text",
|
|
8824
8870
|
text: `${summary}
|
|
8825
|
-
${detail}${
|
|
8871
|
+
${detail}${trailer}`
|
|
8826
8872
|
}
|
|
8827
8873
|
]
|
|
8828
8874
|
};
|
|
@@ -8899,7 +8945,7 @@ var inputSchema = {
|
|
|
8899
8945
|
var hybridSearch = ({ client, log }) => ({
|
|
8900
8946
|
name: "hybrid_search",
|
|
8901
8947
|
title: "Hybrid search",
|
|
8902
|
-
description:
|
|
8948
|
+
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).',
|
|
8903
8949
|
inputSchema,
|
|
8904
8950
|
handler: async (args) => {
|
|
8905
8951
|
const limit = args.limit ?? MCP_DEFAULT_LIMIT;
|
|
@@ -9092,14 +9138,14 @@ var record_query_default = recordQuery;
|
|
|
9092
9138
|
import { z as z3 } from "zod";
|
|
9093
9139
|
|
|
9094
9140
|
// src/tools/resolve-external-id.ts
|
|
9095
|
-
function validateSelector(sel, entity) {
|
|
9141
|
+
function validateSelector(sel, entity, fieldName) {
|
|
9096
9142
|
const hasId = sel.id !== void 0 && sel.id !== "";
|
|
9097
9143
|
const hasExt = sel.externalId !== void 0 && sel.externalId !== "";
|
|
9098
9144
|
if (hasId && hasExt) {
|
|
9099
|
-
return `Provide either
|
|
9145
|
+
return `Provide either ${fieldName} or externalId (not both) to identify the ${entity}.`;
|
|
9100
9146
|
}
|
|
9101
9147
|
if (!hasId && !hasExt) {
|
|
9102
|
-
return `Provide
|
|
9148
|
+
return `Provide ${fieldName}, or externalId + type, to identify the ${entity}.`;
|
|
9103
9149
|
}
|
|
9104
9150
|
if (hasExt && (sel.type === void 0 || sel.type === "")) {
|
|
9105
9151
|
return "type is required when selecting by externalId (externalId is unique within a type).";
|
|
@@ -9107,7 +9153,7 @@ function validateSelector(sel, entity) {
|
|
|
9107
9153
|
return void 0;
|
|
9108
9154
|
}
|
|
9109
9155
|
async function resolveRecordIdByExternalId(client, sel) {
|
|
9110
|
-
const err = validateSelector(sel, "record");
|
|
9156
|
+
const err = validateSelector(sel, "record", "id");
|
|
9111
9157
|
if (err) return { error: err };
|
|
9112
9158
|
if (sel.id) return { id: sel.id };
|
|
9113
9159
|
const page = await client.records.lookupRecordsByBody({
|
|
@@ -9123,7 +9169,7 @@ async function resolveRecordIdByExternalId(client, sel) {
|
|
|
9123
9169
|
return { id: items[0].id };
|
|
9124
9170
|
}
|
|
9125
9171
|
async function resolveDocumentIdByExternalId(client, sel) {
|
|
9126
|
-
const err = validateSelector(sel, "document");
|
|
9172
|
+
const err = validateSelector(sel, "document", "documentId");
|
|
9127
9173
|
if (err) return { error: err };
|
|
9128
9174
|
if (sel.id) return { id: sel.id };
|
|
9129
9175
|
const page = await client.documents.lookupDocumentsByBody({
|
|
@@ -9151,7 +9197,7 @@ var inputSchema3 = {
|
|
|
9151
9197
|
var recordGet = ({ client, log }) => ({
|
|
9152
9198
|
name: "record_get",
|
|
9153
9199
|
title: "Get a record by id or externalId",
|
|
9154
|
-
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.",
|
|
9200
|
+
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.",
|
|
9155
9201
|
inputSchema: inputSchema3,
|
|
9156
9202
|
handler: async (args) => {
|
|
9157
9203
|
const id = args.id;
|
|
@@ -9189,7 +9235,7 @@ import { z as z4 } from "zod";
|
|
|
9189
9235
|
var inputSchema4 = {
|
|
9190
9236
|
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.'),
|
|
9191
9237
|
fields: z4.record(z4.string(), z4.unknown()).describe(
|
|
9192
|
-
"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."
|
|
9238
|
+
"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."
|
|
9193
9239
|
),
|
|
9194
9240
|
externalId: z4.string().optional().describe(
|
|
9195
9241
|
"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."
|
|
@@ -9207,7 +9253,7 @@ var inputSchema4 = {
|
|
|
9207
9253
|
var recordCreate = ({ client, log }) => ({
|
|
9208
9254
|
name: "record_create",
|
|
9209
9255
|
title: "Create a record",
|
|
9210
|
-
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.",
|
|
9256
|
+
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).",
|
|
9211
9257
|
inputSchema: inputSchema4,
|
|
9212
9258
|
handler: async (args) => {
|
|
9213
9259
|
const type = args.type;
|
|
@@ -9565,7 +9611,7 @@ function isNotAvailable(err) {
|
|
|
9565
9611
|
var documentGet = ({ client, log }) => ({
|
|
9566
9612
|
name: "document_get",
|
|
9567
9613
|
title: "Get document metadata (and optionally text)",
|
|
9568
|
-
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`.",
|
|
9614
|
+
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.",
|
|
9569
9615
|
inputSchema: inputSchema10,
|
|
9570
9616
|
handler: async (args) => {
|
|
9571
9617
|
const documentId = args.documentId;
|
|
@@ -9899,7 +9945,7 @@ var inputSchema15 = {
|
|
|
9899
9945
|
var folderCreate = ({ client, log }) => ({
|
|
9900
9946
|
name: "folder_create",
|
|
9901
9947
|
title: "Create a folder",
|
|
9902
|
-
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.",
|
|
9948
|
+
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).",
|
|
9903
9949
|
inputSchema: inputSchema15,
|
|
9904
9950
|
handler: async (args) => {
|
|
9905
9951
|
try {
|
|
@@ -9998,7 +10044,7 @@ var inputSchema18 = {
|
|
|
9998
10044
|
var currentIdentity = ({ log, apiKey, environment }) => ({
|
|
9999
10045
|
name: "current_identity",
|
|
10000
10046
|
title: "Current identity (tenant + principal scope)",
|
|
10001
|
-
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
|
|
10047
|
+
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.",
|
|
10002
10048
|
inputSchema: inputSchema18,
|
|
10003
10049
|
handler: async () => {
|
|
10004
10050
|
try {
|
|
@@ -10096,7 +10142,7 @@ var inputSchema19 = {
|
|
|
10096
10142
|
"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."
|
|
10097
10143
|
),
|
|
10098
10144
|
externalId: z18.string().optional().describe(
|
|
10099
|
-
|
|
10145
|
+
'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.'
|
|
10100
10146
|
),
|
|
10101
10147
|
upsert: z18.boolean().optional().describe(
|
|
10102
10148
|
"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)."
|
|
@@ -10105,12 +10151,12 @@ var inputSchema19 = {
|
|
|
10105
10151
|
"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."
|
|
10106
10152
|
),
|
|
10107
10153
|
payload: z18.record(z18.string(), z18.unknown()).optional().describe(
|
|
10108
|
-
"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."
|
|
10154
|
+
"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."
|
|
10109
10155
|
),
|
|
10110
10156
|
// Inline text mode (mutually exclusive with filePath):
|
|
10111
10157
|
text: z18.string().min(1).optional().describe("Text body to ingest inline. Mutually exclusive with filePath. Either text or filePath is required."),
|
|
10112
10158
|
storeText: z18.boolean().optional().describe(
|
|
10113
|
-
"Whether the
|
|
10159
|
+
"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."
|
|
10114
10160
|
),
|
|
10115
10161
|
// File upload mode (mutually exclusive with text; stdio-transport-only):
|
|
10116
10162
|
filePath: z18.string().min(1).optional().describe(
|
|
@@ -10127,7 +10173,7 @@ var inputSchema19 = {
|
|
|
10127
10173
|
var documentIngest = ({ client, log, transport, ingestRoot }) => ({
|
|
10128
10174
|
name: "document_ingest",
|
|
10129
10175
|
title: "Ingest a new document (text body or file upload)",
|
|
10130
|
-
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
|
|
10176
|
+
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`.",
|
|
10131
10177
|
inputSchema: inputSchema19,
|
|
10132
10178
|
handler: async (args) => {
|
|
10133
10179
|
const title = args.title;
|
|
@@ -10164,6 +10210,14 @@ var documentIngest = ({ client, log, transport, ingestRoot }) => ({
|
|
|
10164
10210
|
)
|
|
10165
10211
|
);
|
|
10166
10212
|
}
|
|
10213
|
+
if (text && args.storeText !== void 0) {
|
|
10214
|
+
return toolError(
|
|
10215
|
+
"document_ingest",
|
|
10216
|
+
new Error(
|
|
10217
|
+
"`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."
|
|
10218
|
+
)
|
|
10219
|
+
);
|
|
10220
|
+
}
|
|
10167
10221
|
const common = {
|
|
10168
10222
|
folderId: args.folderId,
|
|
10169
10223
|
payload: args.payload,
|
|
@@ -10468,7 +10522,7 @@ var identityResource = ({ log, apiKey, environment }) => ({
|
|
|
10468
10522
|
name: "identity",
|
|
10469
10523
|
uri: "vectros://identity",
|
|
10470
10524
|
title: "Current identity (tenant + principal scope)",
|
|
10471
|
-
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
|
|
10525
|
+
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.",
|
|
10472
10526
|
mimeType: "application/json",
|
|
10473
10527
|
read: async () => {
|
|
10474
10528
|
const identity = await resolveIdentity({ log, apiKey, environment });
|