Route stdio MCP tool calls to the stored account that knows the org
维护者通常 1 天内回复
已经有一个关联 PR 被合并了。
- #1802 来自 @sentry-junior —— 已合并
评估
- 难度
- 5/5
- 预计耗时
- 一周以上
- 新手友好度
- 38/100
- Issue 类型
- 功能
- 描述清晰度
- 基本清楚
- 活跃度
- 活跃
- 技术栈
- node.js, typescript
- 领域
- api, authentication, cli
调研方向
Start with the dependency-direction rule in AGENTS.md, then read ServerContext in packages/mcp-core/src/types.ts, apiServiceFromContext(), and the CLI host in packages/cli/src/lib/mcp.ts. Trace selectAccountForOrg in packages/cli/src/lib/db/auth.ts and region handling in packages/cli/src/lib/region.ts and internal/tool-helpers/resolve-region-url.ts. Run the relevant MCP and CLI tests; done means org-scoped calls use the owning account safely, cross-org tools merge results, and hosted/static-token behavior remains unchanged.
由索引模型根据 Issue 内容生成。
描述
Problem
The CLI stores several accounts and picks the right one for each command based on the targeted organization (selectAccountForOrg in packages/cli/src/lib/db/auth.ts, called from resolveOrgRegion in packages/cli/src/lib/region.ts). The stdio MCP server (@sentry/mcp-server and sentry mcp, which share the CLI's credential store after #1731) does not.
The server resolves one effective account at startup and uses it for every tool call. A token refresh after a 401 stays on that same account. Asking about an org that belongs to another stored login fails. The only workarounds are sentry auth switch plus a restart, or configuring a second MCP server with a different SENTRY_HOST or a static SENTRY_ACCESS_TOKEN.
Why it doesn't work today
ServerContextin mcp-core carries a singleaccessToken: string(packages/mcp-core/src/types.ts). All tools build their API client withapiServiceFromContext()(about 63 call sites), and the region cache (internal/tool-helpers/resolve-region-url.ts) reads the same token.- MCP tools use mcp-core's API client, not the CLI's, so the CLI's org-based selection never runs.
- mcp-core must not import the CLI (see the dependency-direction rule in
AGENTS.md), and the hosted MCP has one OAuth grant per session. So this has to be an optional capability that only the stdio host provides.
Proposed approach
- mcp-core: add an optional resolver to
ServerContext, e.g.resolveCredential({ organizationSlug }) => Promise<{ accessToken, sentryHost, sentryProtocol }>.apiServiceFromContext()takes the org and uses the resolver when present; otherwise it usesaccessToken. Key the region cache by the resolved credential. The hosted MCP stays unchanged. - CLI host (
packages/cli/src/lib/mcp.ts): implement the resolver with theselectAccountForOrgrules, running each call insidewithStoredAccount(). That function already isolates account scope per call throughwithEnvand AsyncLocalStorage, so overlapping tool calls are safe. Refresh-on-401 targets the account that made the call. An unknown org falls back to the active account. One tool call never mixes identities. - Cross-org tools (
find_organizations,whoami): query every usable account and merge the results, assentry org listdoes withlistUsableAccountsInScope(). The CLI already records which account saw each org in the regions cache (packages/cli/src/lib/db/regions.ts), so later calls route automatically. - Opt-outs and pins:
--access-token/SENTRY_ACCESS_TOKENdisables routing.--organization-slugpicks the account once at startup. An explicit server (SENTRY_HOST/SENTRY_URL) limits candidates to accounts on that server, matching the CLI.
An alternative would route inside an injected fetch by parsing /organizations/{slug}/ from request URLs. It touches fewer files, but it is implicit and misses endpoints whose paths do not include the org. The explicit resolver is preferred.
Scope
- First version: route only between accounts on the same server.
- Later: mixing self-hosted and sentry.io accounts in one server needs a host per account and the region-URL validation (
validateRegionUrl) checked against the right server.
Acceptance
- With two stored sentry.io accounts that each own a different org, one running stdio server can call org-scoped tools on both orgs without
auth switchor a restart. find_organizationslists orgs from all usable accounts.- A 401 refreshes only the account that made the call.
- The hosted MCP and static-token setups behave as before.
- Tests cover concurrent tool calls for different orgs and verify that each call sends its own account's token.
Related
- #1731:
@sentry/mcp-serveras a slim bundle that shares CLI auth (prerequisite) - #1669: shared API layer proposal; task group 11 (task 11.4, CLI capabilities injected into mcp-core) is the natural home
- #1396: CLI multi-account mode (done)
- #845: earlier
--profilerequest for the stdio transport, closed as not planned; this approach needs no per-process profiles
via BYK.
--
- 主要语言
- TypeScript
- 星标
- 949
- 派生
- 171
- 平均合并
- 1 天 1 小时
- 30 天内合并 PR
- 284
环境准备
这个项目没有提供开发容器、Dockerfile 或贡献指南,环境需要你自己搭建:先看它的 README,通用步骤见我们的新手贡献指南。
从这里开始
- 先读完整个 Issue,再读项目的贡献指南。
- 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
- Fork 仓库,在一个分支上完成修改。
- 提交 Pull Request,并在描述里引用这个 Issue 编号。
getsentry/toolkit 的其他 Issue
-
难度 1/5 1 小时以内 新手友好度 72/100
getsentry/toolkit#1844 · 1 条评论 ·
维护者通常 1 天内回复
-
Docs MCP URL normalization retains query strings and fragments可能已有人在做 关联的 PR 仍在进行中或已合并。 未关闭bug MCP
难度 2/5 1-3 小时 新手友好度 73/100
getsentry/toolkit#1618 · 1 条评论 ·
维护者通常 1 天内回复
-
难度 2/5 1-3 小时 新手友好度 72/100
getsentry/toolkit#1471 · 1 条评论 ·
维护者通常 1 天内回复
-
No way to create a cron monitor, so agents send users to the UI可能已有人在做 @Chipagosfinest 今天认领。 未关闭
难度 3/5 1-2 天 新手友好度 15/100
getsentry/toolkit#1845 · 1 条评论 ·
维护者通常 1 天内回复
-
Generate CLI output schemas from command output types可能已有人在做 @sentry-junior 今天认领。 未关闭CLI
难度 5/5 一周以上 新手友好度 12/100
getsentry/toolkit#1824 · 1 条评论 ·
维护者通常 1 天内回复
查看 getsentry/toolkit 的全部 Issue
相似的 Issue
-
难度 2/5 1-3 小时 新手友好度 72/100
维护者通常 1 天内回复
-
难度 1/5 1 小时以内 新手友好度 82/100
维护者通常 1 天内回复
-
needs-area
难度 2/5 1-3 小时 新手友好度 68/100
Azure/typespec-azure#5936 ·
维护者通常 1 天内回复
-
难度 2/5 半天 新手友好度 72/100
vercel-labs/scriptc#2910 ·
维护者通常 1 天内回复
-
automation missing-model model-sync provider:fireworks-ai
难度 2/5 1-3 小时 新手友好度 72/100
anomalyco/models.dev#12458 ·
维护者通常 1 天内回复