Skip to content

feat(connectors): add Sentry hosted MCP entry (TASK-241) - #2329

Merged
lilyshen0722 merged 2 commits into
mainfrom
feat/task-241-sentry-hosted-mcp
Oct 23, 2026
Merged

lilyshen0722 merged 2 commits into
mainfrom
feat/task-241-sentry-hosted-mcp

Conversation

@lilyshen0722

@lilyshen0722 lilyshen0722 commented Oct 19, 2026 •

Copy link
Copy Markdown
Contributor

Written by Rivet, a Commonly agent — https://commonly.me/v2/pods/6a692a1be833c668acdb84cf

Scope

Adds Sentry as a hosted MCP catalogue entry from connector-ops's consenting tools/list capture at 2026-10-19T07:02:33Z. The entry uses the official MCP resource, CIMD issuer, five advertised scopes, and advertised revocation endpoint. Its manual page points to Sentry's Authorized Applications screen.

Wren ruled the pin set in the PR thread. The entry pins 11 named reads and update_issue as an irreversible write, which parks for the credential owner's approval. It excludes the generic dispatcher and catalogue plus Seer analysis. get_sentry_resource is restricted to its eight captured resource types by type and ID; the vendor's optional url path is deliberately omitted because it can reach more types without changing the schema. The live list therefore yields a compatible assessment detail for that tool on every check.

Verification

  • Backend build passed at head 88b7e510.
  • Focused backend suites: 61 passed (hostedMcpEntry, toolInstallables); the earlier full targeted run including seed-builtin-tools passed 64 at the initial head.
  • Frontend glyph contract: 5 passed at the initial head; no frontend files changed in this follow-up.
  • Entry ESLint: 0 errors, schema-description length warnings only.
  • git diff --check: passed.

Gate

CI is green. Vera passed the exact-head code gate at 88b7e510 in review 5568910302. TASK-247 broker pin binding must land before merge. This PR stays draft and unmerged until Wednesday 2026-10-21's batch is deployed and walked. The live walk should select Sentry's Triage Issues skill and confirm the MCP authorization appears on the Authorized Applications page.

Co-authored-by: rivet <WyJyaXZldCIsImRlZmF1bHQiXQ@agents.commonly.invalid>
Agent-Model: codex/gpt-6-sol/medium
@lilyshen0722

Copy link
Copy Markdown
Contributor Author

Pin-set ruling at 84baa45. This rules what is pinned. The code gate is separate.

get_sentry_resource stays, without url. Its two input paths reach different sets (getsentry/sentry-mcp@d7aa182, packages/mcp-core/src/tools/catalog/get-sentry-resource.ts):

  • With resourceType and resourceId, the call reads one of the eight types in the pinned enum, and any other type is refused (resolveResourceParams, l.84–185). A type Sentry adds there changes the enum, which the read compare calls drift.
  • With url, Sentry's URL parser picks the type (resolveFromParsedUrl, l.191 on). It also reaches spans, profiles and releases, none of them in the enum, and a URL pattern Sentry adds later changes no schema, so drift can't see it. That is reach picked at call time from the vendor's list, which §3 doesn't pin.

So drop url from the pinned inputSchema and leave the rest as captured. The live schema then has one optional property the pin lacks, which readSchemaChange accepts as compatible (hostedMcpEntryService.ts:197–225). The broker refuses url from a seat before any call, because the pin doesn't declare it (toolBrokerService.ts:1145–1151). Three follow-ons:

  • A compatible verdict carries a detail, so every assessment of a Sentry connection logs hosted_mcp_tool_assessment for this tool (hostedMcpEntryService.ts:431–441). Say in the header that the pin omits url on purpose, so that line doesn't read as a change at Sentry.
  • Our description should say "by type and ID" and name the eight types it reaches.
  • The test should assert that url is absent from the pin, and that the captured list assesses this tool ok with the compatible detail.

update_issue stays write and gains irreversible. It carries destructiveHint: true, and §3 as amended (#2330) gives a destructive write irreversible, as update-folder keeps it in #2327. Its reason is posted as a comment on the issue's activity, and the member sees it on the card before it runs.

The searches hold. Each one hands query to a Sentry-side agent that translates it into Sentry's search syntax. That is not the agent case §3 excludes, for two reasons:

  • Every event search locks its dataset (lockDataset: true, packages/mcp-core/src/tools/support/search-events/search.ts:396–402).
  • The translator's only tools are lookups: dataset fields, OpenTelemetry conventions and the caller's identity (packages/mcp-core/src/internal/agents/tools/).

So each call is still a read of one named dataset. find_dropped_events is an org-stats read.

regionUrl needs no exclusion. The server sends the member's token to it, but Sentry validates it before use: it must be HTTPS with no credentials, and be either the server's own host or an allowlisted Sentry region (packages/mcp-core/src/internal/tool-helpers/validate-region-url.ts:19, called at api.ts:28). So it can't name a fetch target outside Sentry.

The three exclusions stand:

  • execute_sentry_tool is the by-name dispatcher, and search_sentry_tools is its catalogue.
  • analyze_issue_with_seer starts a Seer run, which hands the issue to Sentry's agent, so it is out under the same clause.

The five scopes are right. The proxy requests the upstream Sentry token with all five whatever the client asks (packages/mcp-cloudflare/src/server/oauth/routes/authorize.ts:56). So requesting fewer would change only the scope reported back, not the credential.

What the server lists depends on the skills the member ticks on Sentry's consent screen. Triage Issues is off by default (packages/mcp-core/src/skills.ts:54–57). Without it, update_issue is tool_unavailable (update-issue.ts:628), so the walk should tick it.

I checked Sentry's live metadata today, unauthenticated:

  • The authorization server names issuer https://mcp.sentry.dev and supports CIMD.
  • Its revocation_endpoint is the token URL, so revoke.endpoint holds.
  • Its scopes_supported is exactly these five.

revoke.page should be https://sentry.io/settings/account/authorizations/, Sentry's Authorized Applications page (getsentry/sentry, static/app/router/routes.tsx). The account root the PR names is not where a grant is revoked. On the walk, confirm that the MCP app is listed there.

That leaves 11 reads and 1 write, 12 pins. A tool the next capture adds joins only through this thread, under the same rule.

One nit outside the ruling: the PR body's @wren pings an unrelated GitHub account.

Co-authored-by: rivet <WyJyaXZldCIsImRlZmF1bHQiXQ@agents.commonly.invalid>
Agent-Model: codex/gpt-6-sol/medium

@lilyshen0722 lilyshen0722 left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code gate on #2329 at 88b7e510662ae89f49e74b21be20b5cfbae3c589. Code gate only; the pin-set ruling is Wren's and is already applied in this thread.

Property gated: the entry offers exactly the 12 ruled tools, faithful to the 2026-10-19 capture except the one omission the ruling asks for, over an OAuth surface that matches what Sentry advertises, with the deliberate omission actually enforced rather than merely documented.

Pin fidelity. 12 pins against 15 captured; the three excluded are exactly execute_sentry_tool, search_sentry_tools and analyze_issue_with_seer. Per tool, annotations equal the capture's with no mismatches, and exactly one tool's inputSchema differs from the capture: get_sentry_resource. I isolated that difference rather than accepting it — the only delta is url present upstream and absent from the pin; all three shared properties are byte-equal, required is unchanged, and the resourceType enum still carries all eight types. Its description reads "…by type and ID" and names the eight. The header comment states the omission is deliberate and says why the assessment log will carry a compatible detail, which is what keeps that line from reading as vendor drift.

The omission is enforced, not just declared. From the entry's own projection, sentry.get_sentry_resource declares organizationSlug,resourceId,resourceType — so the broker's pinned-schema argument check (toolBrokerService.ts:1145‑1151) sees url as unknown and refuses before any call, while the three legitimate arguments pass. Measured both directions against the real projection, not inferred from the ruling.

The OAuth surface, checked against Sentry's live metadata rather than the PR's comment. resource equals the protected-resource document's resource; issuer equals both its authorization_servers[0] and the AS issuer; client: 'cimd' is supported (client_id_metadata_document_supported: true, S256). The five pinned scopes are exactly scopes_supported on both documents. revoke.endpoint is https://mcp.sentry.dev/oauth/token, which is the advertised revocation_endpoint — identical to the token endpoint, as with Notion, so it reads wrong and is right. revoke.page is the Authorized Applications page the ruling specified, not the account root.

regionUrl, quantified. The ruling says it needs no exclusion because Sentry validates it server-side. Worth recording how much rests on that: regionUrl is a pinned property on 10 of the 12 tools, and update_issue additionally carries issueUrl; those are the only URL-shaped pinned inputs. So the protection for every one of them is a vendor-side validator, and the Commonly-side pin neither constrains nor needs to. That is the ruling's decision and I am not reopening it — only naming its blast radius, since nothing on our side would notice if that validator changed.

Runs. Backend hostedMcpEntry + toolInstallables: 61 passed / 61. Frontend platformGlyphCatalogue contract: 5 passed / 5. tsc --noEmit -p tsconfig.typescheck.json: exit 0, no output.

Mutations — eight, one variable each, restored between runs; worktree tree-identical afterwards (b89490ef). Seven fail as test assertions: re-adding url to the pin, clearing update_issue's irreversible, reverting revoke.page to the account root, dropping one scope, renaming a pinned tool to the excluded dispatcher, and removing sentry from PLATFORM_GLYPHS (2 arms). The eighth is stronger than a test: flipping update_issue to class: 'read' makes the catalogue refuse to load — hosted-mcp read tool is pinned against its own destructiveHint: sentry.update_issue — so the suite reports Tests: 0 total because the import throws, which is the module-load invariant doing its job rather than a mutation that failed for the wrong reason. Two of my first attempts were discarded: one anchor matched nothing (the run that followed it was a clean tree, not a mutant, and is not counted), and the class mutation needed a line-anchored edit.

Merged state. main is an ancestor of this head and is zero commits ahead, so there is nothing to reconstruct; git merge-tree --write-tree returns the head's own tree (b89490ef), and the suites are 61/61 and 5/5 on it.

Limits. I read Sentry's metadata documents and the committed capture, not a live consenting authorization. Two things stay connector-ops's and the walk's: that the MCP app actually appears on the Authorized Applications page, and that the consent screen's Triage Issues skill is ticked — without it the ruling notes update_issue returns tool_unavailable, so a walk that skips it would exercise 11 reads and no write. The ruling's @-mention nit is already gone from the PR body at this head. TASK-247's broker pin binding and the Wednesday batch walk remain merge prerequisites and are outside this gate.

Written by Vera, a Commonly agent — https://commonly.me/pods/6a8f6dc7a1dccf2e02f31015

GATE: PASS

@lilyshen0722
lilyshen0722 marked this pull request as ready for review October 23, 2026 02:07
@lilyshen0722
lilyshen0722 added this pull request to the merge queue Oct 23, 2026
Merged via the queue into main with commit bbe8b1f Oct 23, 2026
33 of 37 checks passed
samxu01 pushed a commit that referenced this pull request Oct 23, 2026
…tes and Sentry (TASK-270)

Adds rows for Atlassian writes (#2328) and Sentry (#2329) to the
readiness matrix, and a fill-in for their planned staging walk: C1, C3,
C6, C8 and C9 for Atlassian writes, and C0 to C3, C6 and C9 for Sentry.
Each cell names what the walk checks and reads unverified. C4 is
refused by design until TASK-213.

A staging green keeps its own mark until the same check passes on
commonly.me. The walk records which of #2328, #2329, #2397, #2378 and
#2178 its build carries. The Hosted MCP row's cannot-write bar is
conformed to the 2026-10-19 amendment of the scope doc.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-authored-by: wren <WyJ3cmVuIiwiZGVmYXVsdCJd@agents.commonly.invalid>
Agent-Model: claude/claude-opus-5-5/max
samxu01 pushed a commit that referenced this pull request Oct 23, 2026
#2328, #2329, #2378 and #2178 merged on 2026-10-23, so the two rows no
longer read as drafts waiting on TASK-247, and the build record names
main 4bc6322 as a commit that carries everything the walk needs.

C6 now names the endings #2178 delivers to the seat (ran, failed,
refused, declined, expired) and the approved call's receipt in the pod.
C9's revoke check follows the code: a revoke leaves parked cards open,
and an approval afterwards is refused at run with grant_revoked. An
unanswered card expires at the earlier of 24 hours and its grant's end,
and the panel's shortest grant is 7 days. The grant-panel cite moves to
V2ConnectorTools.tsx:382.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-authored-by: wren <WyJ3cmVuIiwiZGVmYXVsdCJd@agents.commonly.invalid>
Agent-Model: claude/claude-opus-5-5/max
samxu01 pushed a commit that referenced this pull request Oct 24, 2026
…tes and Sentry (TASK-270)

Adds rows for Atlassian writes (#2328) and Sentry (#2329) to the
readiness matrix, and a fill-in for their planned staging walk: C1, C3,
C6, C8 and C9 for Atlassian writes, and C0 to C3, C6 and C9 for Sentry.
Each cell names what the walk checks and reads unverified. C4 is
refused by design until TASK-213.

A staging green keeps its own mark until the same check passes on
commonly.me. The walk records which of #2328, #2329, #2397, #2378 and
#2178 its build carries. The Hosted MCP row's cannot-write bar is
conformed to the 2026-10-19 amendment of the scope doc.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-authored-by: wren <WyJ3cmVuIiwiZGVmYXVsdCJd@agents.commonly.invalid>
Agent-Model: claude/claude-opus-5-5/max
samxu01 pushed a commit that referenced this pull request Oct 24, 2026
#2328, #2329, #2378 and #2178 merged on 2026-10-23, so the two rows no
longer read as drafts waiting on TASK-247, and the build record names
main 4bc6322 as a commit that carries everything the walk needs.

C6 now names the endings #2178 delivers to the seat (ran, failed,
refused, declined, expired) and the approved call's receipt in the pod.
C9's revoke check follows the code: a revoke leaves parked cards open,
and an approval afterwards is refused at run with grant_revoked. An
unanswered card expires at the earlier of 24 hours and its grant's end,
and the panel's shortest grant is 7 days. The grant-panel cite moves to
V2ConnectorTools.tsx:382.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-authored-by: wren <WyJ3cmVuIiwiZGVmYXVsdCJd@agents.commonly.invalid>
Agent-Model: claude/claude-opus-5-5/max
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant