Skip to content

ref(mcp): Call shared organization endpoints from SentryApiService - #1741

Merged
BYK merged 7 commits into
mainfrom
feat/shared-api-client-organizations
Oct 29, 2026
Merged

BYK merged 7 commits into
mainfrom
feat/shared-api-client-organizations

Conversation

@sentry-junior

@sentry-junior sentry-junior Bot commented Oct 29, 2026 •

Copy link
Copy Markdown
Contributor

Task 8.4, part 2 of the shared API client stack (#1669). It used to be stacked on #1737, which has merged, so it now targets main.

This adds the first shared endpoint wrappers to toolkit-core's api-client/, and the MCP's SentryApiService now calls them. The code moves as is, so it can go to @sentry/api later without changes.

Changes

  • endpoints/organizations adds getAuthenticatedUser, listOrganizations and getOrganization. Each one takes an ApiTarget (the request core plus an origin) and a Standard Schema from the host, and returns that schema's output. toolkit-core doesn't depend on Zod or valibot when the code runs.
  • The request core gains sdkClient, which sends one GET to an expected path and rejects any other path or method, and listPage, which walks a list endpoint up to a limit and validates each page. These are the MCP's sdkClient and sdkListPage, moved as is. The only change is that validation now uses Standard Schema.
  • SentryApiService still decides which host to call: the control host for the current user and for the organization list on public SaaS. Its own sdkClient and sdkListPage copies are deleted, and the teams and projects lists use the shared ones.
  • toolkit-core now depends on @sentry/api. To keep a single TypeScript copy, the pnpm catalog's TypeScript moves from ^5.8.3 to ^5.9.3, and toolkit-core and the CLI use catalog: instead of pinning their own version. Every workspace package now resolves TypeScript 5.9.3, and 5.8.3 drops out of the lockfile. The cache policy changes one type to match TypeScript 5.9's DOM BodyInit. Nothing changes at runtime.

One change in behaviour: if a response fails its schema in these calls, the error is now the shared ApiResponseValidationError instead of a ZodError. Both still reach the tool error handler as unexpected errors.

--

View Junior Session in Sentry

createApiClientCore sends a request through the host's transport with
the host's headers, turns network failures into readable errors
(ConfigurationError for an unreachable host), maps error responses to
the status's ApiError through readErrorResponse, and parses JSON bodies.
The transport, headers, and logger are injected, so it stays
browser-portable. It is the MCP's request path, moved as is; the next
commit switches SentryApiService onto it.
request and requestJSON keep their signatures and delegate to
createApiClientCore, so no endpoint method changes. SentryApiService
supplies its headers (User-Agent, Authorization, MCP attribution), the
shared transport, and logWarn under the api.client scope. Its copies of
the network error messages and the error-response mapping are deleted.

The one difference: the error-response warnings now log the host the
request went to, rather than the service's default host, when a call
overrides the host.
…oducts use

The shared client builds on @sentry/api operations next. toolkit-core
pinned TypeScript through the ^5.8.3 catalog (5.8.3) while mcp-core and
the CLI resolve 5.9.3, so adding @sentry/api resolved a second copy with
other peers. Using ^5.9.3, as the CLI does, keeps one copy.

TypeScript 5.9's DOM BodyInit takes only ArrayBuffer-backed views, so
the cache policy now says so when it builds a Response from a decoded
body. No runtime change.
sdkClient gives a @sentry/api operation a client that sends one GET to
an expected path through the core's request, and rejects any other
target or method. listPage walks a list endpoint up to a limit, asking
for exactly the rows still missing, and validates each page with the
host's Standard Schema. Both are the MCP's sdkClient and sdkListPage,
moved as is apart from validation.
endpoints/organizations in toolkit-core has getAuthenticatedUser,
listOrganizations, and getOrganization. Each takes an ApiTarget (the
request core and an origin) and the host's Standard Schema, and returns
that schema's output. SentryApiService calls them with its Zod schemas
and keeps choosing the host: the control host for the current user and
the organization list on public SaaS.

Its sdkClient and the teams and projects lists now use the core's
sdkClient and listPage; its own copies are deleted, and so is
getAuthenticatedUser's unused options argument.

A response that fails its schema in these calls now throws the shared
ApiResponseValidationError instead of a ZodError. Both reach the tool
error handler as unexpected errors.
@vercel

vercel Bot commented Oct 29, 2026 •

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated
sentry-local Ready Ready Preview Oct 29, 2026 9:56pm UTC

Request Review

@github-actions github-actions Bot added the risk: medium PR risk score: medium label Oct 29, 2026
Base automatically changed from feat/shared-api-client-core to main October 29, 2026 21:44
Comment thread packages/toolkit-core/package.json Resolved
main gained #1737 as a squash commit whose tree matches this branch's
copy of the request core (fc6aa08), so every conflict resolves to this
branch's side and the merged tree is unchanged.
Instead of pinning ^5.9.3 in toolkit-core alone, the pnpm catalog moves
from ^5.8.3 to ^5.9.3, and toolkit-core and the CLI go back to
`catalog:`. Every workspace package now resolves the same TypeScript
5.9.3, and 5.8.3 drops out of the lockfile.
@BYK
BYK enabled auto-merge (squash) October 29, 2026 21:54
@BYK
BYK merged commit 5a47bdf into main Oct 29, 2026
40 of 43 checks passed
@BYK
BYK deleted the feat/shared-api-client-organizations branch October 29, 2026 22:07

This branch was successfully deployed

1 active deployment
Preview — e4ce5c40 Deployed Oct 29, 2026 by vercel[bot]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

risk: medium PR risk score: medium

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant