Skip to content

ref(mcp): Move issue and event reads onto @sentry/api - #1713

Merged
BYK merged 2 commits into
mainfrom
feat/mcp-issues-events-sentry-api
Oct 29, 2026
Merged

BYK merged 2 commits into
mainfrom
feat/mcp-issues-events-sentry-api

Conversation

@sentry-junior

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

Copy link
Copy Markdown
Contributor

Task 8.2 of the unify-sentry-api-layer change (#1669): the MCP's issue and event reads in SentryApiService now call @sentry/api operations instead of building requestJSON(apiPath...) URLs by hand.

The calls go through the existing sdkClient() bridge, the same one the organization, team, and project lists use. The SDK only builds the path and query. The MCP still owns auth, host and region routing, retries, the ApiError mapping (HTTP status kept), and Zod parsing. The bridge also rejects any URL that doesn't match the apiPath result, so path-traversal protection is unchanged. When 6.1 lands, that bridge is the one place to swap in the injected fetch. Tool output and snapshots don't change.

Events

Issues

  • listIssues, getIssue, getIssueTagValues, getIssueExternalLinks, listIssueIntegrations, and getAutofixState now use their operations. listIssues still sends query= when it's empty, because Sentry applies is:unresolved only when the parameter is missing. A new test covers this. The two link lists share a small collectAllPages walker with listIssueLinkPages, which the Sentry App lists still use. The external-issues operation has no per_page, so that call relies on Sentry's default page size of 100, which is what it used to send.

Still on requestJSON/request()

  • No @sentry/api operation: issue notes (createIssueComment, listIssueComments), getIssueActivity, getIssueUserReports, getEventCommitters.
  • Writes: updateIssue, linkNativeExternalIssue, unlinkNativeExternalIssue, unlinkSentryAppExternalIssue, startAutofix. sdkClient() only forwards GETs. Letting it forward write bodies now would be replaced by the 6.1 transport anyway. The generated types also don't fit yet: updateOrganizationIssue marks every body field required, and deleteOrganizationIssueIntegration types externalIssue as a number.
  • The attachment download (?download=1) and its redirect probe stay on request(), because they read binary data or the redirect URL rather than JSON.

The pnpm catalog moves @sentry/api from 0.420.0 to 0.423.0, the latest published version. #1712 makes the same bump, so either PR can land first. Regenerating the CLI's api-schema.json and idempotent-operations.json against 0.423.0 produced no changes.

via BYK.

--

View Junior Session in Sentry

sentry-junior Bot and others added 2 commits October 29, 2026 00:29
getEventForIssue, listEventsForIssue, and listEventAttachments now call
@sentry/api operations through the existing sdkClient bridge, which
keeps the MCP's auth, region routing, retries, ApiError mapping, and
apiPath checks. getEventAttachment reuses listEventAttachments for its
metadata lookup; the binary download stays on request().

@sentry/api sends collapse=adjacentEvents by default on
getOrganizationIssueEvent (since 0.421.0), so the hand-added query
parameter is gone. The pnpm catalog moves to 0.423.0.

listEventsForIssue no longer sends sort. Sentry's issue events endpoint
ignores it and always returns the newest events first.

Co-Authored-By: BYK <burak.kaya@sentry.io>
listIssues, getIssue, getIssueTagValues, getIssueExternalLinks,
listIssueIntegrations, and getAutofixState now call @sentry/api
operations through the sdkClient bridge. The two link lists share a
collectAllPages walker with the path-based listIssueLinkPages, which
the Sentry App installation and component lists still use.

listIssues keeps sending an empty query when none is given, because
Sentry applies is:unresolved only when the parameter is missing.

Issue writes stay on requestJSON: the bridge only forwards GETs until
the MCP transport injection lands.

Co-Authored-By: BYK <burak.kaya@sentry.io>
@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 12:47am UTC

Request Review

@BYK
BYK merged commit 38e1622 into main Oct 29, 2026
58 of 60 checks passed
@BYK
BYK deleted the feat/mcp-issues-events-sentry-api branch October 29, 2026 10:51
sentry-junior Bot added a commit that referenced this pull request Oct 29, 2026
sentry-junior Bot added a commit that referenced this pull request Oct 29, 2026
@sentry/api 0.423.0 (bumped in #1713) defaults `collapse=adjacentEvents`
on getOrganizationIssueEvent and getProjectEvent. CLI getEvent() now
sends it on the project event-details endpoint too (supported since
getsentry/sentry#129123), and getLatestEvent() drops the explicit param
it added in #1705 in favor of the SDK default. Tests assert both
requests still carry the param.

Co-Authored-By: BYK <burak.kaya@sentry.io>
BYK added a commit that referenced this pull request Oct 29, 2026
`@sentry/api` 0.423.0, which #1713 bumped on main, defaults
`collapse=adjacentEvents` on `getOrganizationIssueEvent` and
`getProjectEvent` (getsentry/sentry-api-schema#112 and #113). With it,
Sentry skips the next/previous-event lookups. Nothing in the CLI reads
`nextEventID` or `previousEventID`.

Requests that change:

- CLI `getEvent()` → `projects/{org}/{project}/events/{event_id}/`. This
is the explicit event-ID path in `sentry event view`, and it now sends
the param through the SDK default. #1705 skipped it because the project
endpoint didn't support `collapse` yet. getsentry/sentry#129123 added
that support. Until it deploys, Sentry ignores the unknown value.
- CLI `getLatestEvent()` keeps sending the param, but through the SDK
default now. The explicit `collapse` query #1705 added there is gone,
along with its URL assertion, since that would only test the SDK
default.

A tier test confirms that project event URLs with the param stay
`volatile`.

### Behavior notes

- Once getsentry/sentry#129123 deploys, `sentry event view
<org>/<project> <event-id> --json` will return
`nextEventID`/`previousEventID` as null. Issue latest-event lookups
already behave this way after #1705.
- Response-cache keys for project event URLs change, so existing entries
miss once and then fill again.

<!-- junior-session-footer:start -->
<!-- junior-conversation-id:agent%3Aea5efd697aa911af7986f685a5952441 -->

--

[View Junior Session in
Sentry](https://sentry.sentry.io/explore/conversations/agent%3Aea5efd697aa911af7986f685a5952441/?project=4510944073809921)

<!-- junior-session-footer:end -->

---------

Co-authored-by: sentry-junior[bot] <264270552+sentry-junior[bot]@users.noreply.github.com>
Co-authored-by: BYK <burak.kaya@sentry.io>

This branch was successfully deployed

2 active deployments
Preview — 639c9ffd Deployed Oct 29, 2026 by vercel[bot]
Actions — 639c9ffd Deployed Oct 29, 2026 by sentry-junior[bot] via eval #1394
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