@vectros-ai/mcp-server 0.17.1 → 0.17.2

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 CHANGED
@@ -3,6 +3,15 @@
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.17.2 — 2026-09-22
7
+
8
+ ### Changed
9
+
10
+ - **Repinned the bundled `@vectros-ai/sdk` to `0.45.0`.** No tool behavior changes: 0.45.0's one
11
+ surface addition (trusted-issuer proof-of-control) is identity/access administration, which stays
12
+ off this package's tool surface by the same standing exclusion documented for issuer update/suspend
13
+ in earlier releases.
14
+
6
15
  ## 0.17.1 — 2026-09-17
7
16
 
8
17
  ### Security
package/dist/cli-http.js CHANGED
@@ -26,7 +26,7 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
26
26
  // src/server.ts
27
27
  var import_server = require("@modelcontextprotocol/sdk/server/index.js");
28
28
 
29
- // node_modules/@vectros-ai/sdk/dist/index.mjs
29
+ // ../../node_modules/@vectros-ai/sdk/dist/index.mjs
30
30
  var __defProp2 = Object.defineProperty;
31
31
  var __export = (target, all) => {
32
32
  for (var name in all)
@@ -3546,7 +3546,7 @@ var AuthClient = class {
3546
3546
  return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/v1/app-contexts/{contextId}");
3547
3547
  }
3548
3548
  /**
3549
- * Updates the name, description, and/or companyName of an app context. This is a partial update: any field you omit (or send as null) keeps its existing value. The `contextId` is immutable and is taken from the URL path, so any `contextId` in the request body is ignored. Requires the `app-contexts:u` scope.
3549
+ * Updates an app context. This is a partial update: any field you omit (or send as null) keeps its existing value. The `contextId` is immutable and is taken from the URL path, so any `contextId` in the request body is ignored. Patchable fields: `name`, `description`, `companyName`; the per-principal metering trio (`meteringAxis`, `principalBurstLimit`, `principalUsageCap` — only takes effect for a partner with the corresponding account-level feature enabled); `readAccessLogDefault` (the PHI read-access-logging context default); and `identityProjectionClaims` (requires the platform provisioning capability on top of the ordinary scope below — see its own field description). Requires the `app-contexts:u` scope.
3550
3550
  *
3551
3551
  * @param {Vectros.UpdateAppContextRequest} request
3552
3552
  * @param {AuthClient.RequestOptions} requestOptions - Request-specific configuration.
@@ -4149,7 +4149,7 @@ var AuthClient = class {
4149
4149
  return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/v1/auth/issuers/{issuerId}");
4150
4150
  }
4151
4151
  /**
4152
- * Updates the mutable fields of a registered issuer: `subClaim`, `emailClaim`, `userinfoUri`, `capturedClaims`, `restrictedToDomain` (a new non-blank value must already be a VERIFIED domain for your account; an empty string clears it back to domain-less; see `IssuerUpdateRequest.restrictedToDomain` for the full semantics), `status` (`active`/`suspended` — a suspended issuer's tokens are rejected identically to an unregistered issuer at exchange time), and `selfSignupPolicies`. Fields omitted from the body are left unchanged (partial update). `issuer`, `jwksUri`, `audience`, and `contextId` are trust-anchor / routing-pin fields and are immutable via this route — supplying a value that differs from the current registration is rejected with 400; supplying the current value back is a no-op. Rotating a trust anchor requires deleting and re-registering the issuer, which is itself refused while any user is bound through it. **`subClaim` is identity-determining, not merely cosmetic**: it names which verified JWT claim is read as the federated user's identifier, so changing it on an issuer that already has bound users would silently re-identify (or, under self-signup, orphan) every one of them — changing it is therefore refused once any user has bound through this issuer, the same guard `DELETE` already applies, and is only free before the first real login. Requires a root API key or the bootstrap's provisioning capability, gated identically to every other operation on this surface. A credential confined to one app context may only update an issuer registered in that context; naming one registered in another context returns 404, identically to a nonexistent issuerId. A root API key may update any issuer.
4152
+ * Updates the mutable fields of a registered issuer: `subClaim`, `emailClaim`, `userinfoUri`, `capturedClaims`, `restrictedToDomain` (a new non-blank value must already be a VERIFIED domain for your account; an empty string clears it back to domain-less; see `IssuerUpdateRequest.restrictedToDomain` for the full semantics), `status` (`active`/`suspended` — a registration awaiting verification (`pending_verification`) accepts no status change until it is verified; a suspended issuer's tokens are rejected identically to an unregistered issuer at exchange time), and `selfSignupPolicies`. Fields omitted from the body are left unchanged (partial update). `issuer`, `jwksUri`, `audience`, and `contextId` are trust-anchor / routing-pin fields and are immutable via this route — supplying a value that differs from the current registration is rejected with 400; supplying the current value back is a no-op. Rotating a trust anchor requires deleting and re-registering the issuer, which is itself refused while any user is bound through it. **`subClaim` is identity-determining, not merely cosmetic**: it names which verified JWT claim is read as the federated user's identifier, so changing it on an issuer that already has bound users would silently re-identify (or, under self-signup, orphan) every one of them — changing it is therefore refused once any user has bound through this issuer, the same guard `DELETE` already applies, and is only free before the first real login. Requires a root API key or the bootstrap's provisioning capability, gated identically to every other operation on this surface. A credential confined to one app context may only update an issuer registered in that context; naming one registered in another context returns 404, identically to a nonexistent issuerId. A root API key may update any issuer.
4153
4153
  *
4154
4154
  * @param {Vectros.IssuerUpdateRequest} request
4155
4155
  * @param {AuthClient.RequestOptions} requestOptions - Request-specific configuration.
@@ -4342,7 +4342,7 @@ var AuthClient = class {
4342
4342
  return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/v1/auth/issuers");
4343
4343
  }
4344
4344
  /**
4345
- * Registers a trusted third-party IdP issuer that BYO-IdP token exchange (`POST /v1/auth/token/exchange`) may accept a `subject_token` from. Requires a root API key or the CLI bootstrap's provisioning capability — never an ordinary partner-grantable scope. A credential authorized only via the provisioning capability may register only against the app context it is bound to; naming a different one returns 403. A root API key is unaffected and may register against any of its contexts. Idempotent by `issuerId` within your tenant; the `(issuer, audience)` pair must not already be registered by a different issuerId/tenant. If `issuerId` collides with a registration owned by a different app context than the one you're confined to, the request fails with 400 rather than returning that context's configuration. An app context may have at most one active issuer — deregister the existing one first if you need to replace it. One issuer MAY serve several contexts today, each via its own registration row with a distinct `audience`. Optionally name `restrictedToDomain` to scope this registration's (issuer, audience) uniqueness to a specific VERIFIED domain rather than the bare pair — see that field's own description for the full contract, including why it does NOT protect a shared/consumer-IdP registration with no company-domain population.
4345
+ * Registers a trusted third-party IdP issuer that BYO-IdP token exchange (`POST /v1/auth/token/exchange`) may accept a `subject_token` from. Requires a root API key or the CLI bootstrap's provisioning capability — never an ordinary partner-grantable scope. A credential authorized only via the provisioning capability may register only against the app context it is bound to; naming a different one returns 403. A root API key is unaffected and may register against any of its contexts. A registration without `restrictedToDomain` is created `pending_verification` with a one-time challenge (`verificationClaim`, `verificationNonce`, `verificationExpiresAt`) and accepts no token until you prove you control the issuer with `POST /v1/auth/issuers/{issuerId}/verify`; it claims no `(issuer, audience)` pair until then, so registering never reveals whether another tenant holds one. A registration scoped to an already-verified domain with `restrictedToDomain` is `active` at once. Idempotent by `issuerId` within your tenant. If `issuerId` collides with a registration owned by a different app context than the one you're confined to, the request fails with 400 rather than returning that context's configuration. An app context may have at most one active issuer — deregister the existing one first if you need to replace it. One issuer MAY serve several contexts today, each via its own registration row with a distinct `audience`. Optionally name `restrictedToDomain` to scope this registration's (issuer, audience) uniqueness to a specific VERIFIED domain rather than the bare pair — see that field's own description. A domain-scoped registration proves control of the DOMAIN, not of the issuer itself: it routes only tokens carrying that domain's `hd` claim.
4346
4346
  *
4347
4347
  * @param {Vectros.IssuerRequest} request
4348
4348
  * @param {AuthClient.RequestOptions} requestOptions - Request-specific configuration.
@@ -4408,6 +4408,82 @@ var AuthClient = class {
4408
4408
  }
4409
4409
  return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/v1/auth/issuers");
4410
4410
  }
4411
+ /**
4412
+ * Proves you administer the IdP application a `pending_verification` registration names, activating it. A registration created without `restrictedToDomain` accepts no tokens until this succeeds. Configure your IdP, with an admin-controlled rule (an Auth0 Action, an Okta inline hook, an Entra claims-mapping policy, a Keycloak protocol mapper), to add the registration's `verificationClaim` to the tokens it issues, set to its `verificationNonce`; sign in once; and send that token here. The `jwksUri` you registered must be exactly the `jwks_uri` your issuer's OpenID Connect discovery document (`<issuer>/.well-known/openid-configuration`) publishes, and the token must verify against that key set — an issuer that publishes no discovery document cannot be verified this way. The token is checked and discarded; it is never stored. The `(issuer, audience)` pair is claimed at this moment, so a pair another registration already holds is refused with 400. A challenge expires 7 days after registration; an expired registration cannot be verified — delete it and register again. Requires a root API key or the bootstrap's provisioning capability, gated identically to every other operation on this surface. A credential confined to one app context may only verify an issuer registered in that context; naming one registered in another context returns 404, identically to a nonexistent issuerId.
4413
+ *
4414
+ * @param {Vectros.IssuerVerifyRequest} request
4415
+ * @param {AuthClient.RequestOptions} requestOptions - Request-specific configuration.
4416
+ *
4417
+ * @throws {@link Vectros.BadRequestError}
4418
+ * @throws {@link Vectros.ForbiddenError}
4419
+ * @throws {@link Vectros.NotFoundError}
4420
+ * @throws {@link Vectros.ConflictError}
4421
+ * @throws {@link Vectros.TooManyRequestsError}
4422
+ *
4423
+ * @example
4424
+ * await client.auth.verifyIssuer({
4425
+ * issuerId: "auth0-prod",
4426
+ * token: "token"
4427
+ * })
4428
+ */
4429
+ verifyIssuer(request, requestOptions) {
4430
+ return HttpResponsePromise.fromPromise(this.__verifyIssuer(request, requestOptions));
4431
+ }
4432
+ async __verifyIssuer(request, requestOptions) {
4433
+ const { issuerId, ..._body } = request;
4434
+ const _authRequest = await this._options.authProvider.getAuthRequest();
4435
+ const _headers = mergeHeaders(
4436
+ _authRequest.headers,
4437
+ this._options?.headers,
4438
+ requestOptions?.headers
4439
+ );
4440
+ const _response = await fetcher({
4441
+ url: url_exports.join(
4442
+ await Supplier.get(this._options.baseUrl) ?? await Supplier.get(this._options.environment),
4443
+ `v1/auth/issuers/${url_exports.encodePathParam(issuerId)}/verify`
4444
+ ),
4445
+ method: "POST",
4446
+ headers: _headers,
4447
+ contentType: "application/json",
4448
+ queryString: url_exports.queryBuilder().mergeAdditional(requestOptions?.queryParams).build(),
4449
+ requestType: "json",
4450
+ body: _body,
4451
+ timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1e3,
4452
+ maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries,
4453
+ abortSignal: requestOptions?.abortSignal,
4454
+ fetchFn: this._options?.fetch,
4455
+ logging: this._options.logging
4456
+ });
4457
+ if (_response.ok) {
4458
+ return { data: _response.body, rawResponse: _response.rawResponse };
4459
+ }
4460
+ if (_response.error.reason === "status-code") {
4461
+ switch (_response.error.statusCode) {
4462
+ case 400:
4463
+ throw new BadRequestError(_response.error.body, _response.rawResponse);
4464
+ case 403:
4465
+ throw new ForbiddenError(_response.error.body, _response.rawResponse);
4466
+ case 404:
4467
+ throw new NotFoundError(_response.error.body, _response.rawResponse);
4468
+ case 409:
4469
+ throw new ConflictError(_response.error.body, _response.rawResponse);
4470
+ case 429:
4471
+ throw new TooManyRequestsError(_response.error.body, _response.rawResponse);
4472
+ default:
4473
+ throw new VectrosError({
4474
+ statusCode: _response.error.statusCode,
4475
+ body: _response.error.body,
4476
+ rawResponse: _response.rawResponse
4477
+ });
4478
+ }
4479
+ }
4480
+ return handleNonStatusCodeError(
4481
+ _response.error,
4482
+ _response.rawResponse,
4483
+ "POST",
4484
+ "/v1/auth/issuers/{issuerId}/verify"
4485
+ );
4486
+ }
4411
4487
  /**
4412
4488
  * Returns the identity bound to your credential — your account, principal type, key id, and scope details — so you can confirm who you are authenticated as and that the credential is valid. MCP clients use this to render "signed in as ..." in a chat UI without a separate identity endpoint.
4413
4489
  *
@@ -10201,8 +10277,8 @@ function warnOnSuboptimalKey(key, log) {
10201
10277
 
10202
10278
  // src/build-info.ts
10203
10279
  var BUILD_INFO = {
10204
- mcpServer: true ? "0.17.1" : "dev",
10205
- sdk: true ? "0.44.0" : "dev"
10280
+ mcpServer: true ? "0.17.2" : "dev",
10281
+ sdk: true ? "0.45.0" : "dev"
10206
10282
  };
10207
10283
 
10208
10284
  // src/log.ts