From 6a3e13952891452b55bb0af21a25dfdefd0f431b Mon Sep 17 00:00:00 2001 From: "sentry-junior[bot]" <264270552+sentry-junior[bot]@users.noreply.github.com> Date: Wed, 28 Oct 2026 17:05:45 +0000 Subject: [PATCH 1/2] fix(mcp): Defer find_dropped_events to the tool catalog Remove find_dropped_events from the default direct tools/list surface. It stays reachable through search_sentry_tools and execute_sentry_tool. Co-Authored-By: David Cramer --- packages/mcp-core/src/server.test.ts | 1 - packages/mcp-core/src/toolDefinitions.json | 2 +- packages/mcp-core/src/tools/surfaces.ts | 1 - plugins/sentry-mcp-experimental/agents/sentry-mcp.md | 1 - plugins/sentry-mcp/agents/sentry-mcp.md | 1 - 5 files changed, 1 insertion(+), 5 deletions(-) diff --git a/packages/mcp-core/src/server.test.ts b/packages/mcp-core/src/server.test.ts index 3b685213a..d0a99a772 100644 --- a/packages/mcp-core/src/server.test.ts +++ b/packages/mcp-core/src/server.test.ts @@ -119,7 +119,6 @@ async function callRegisteredTool( const DEFAULT_DIRECT_TOOL_NAMES = [ "analyze_issue_with_seer", "execute_sentry_tool", - "find_dropped_events", "find_organizations", "find_projects", "get_sentry_resource", diff --git a/packages/mcp-core/src/toolDefinitions.json b/packages/mcp-core/src/toolDefinitions.json index 14cdea45f..3165f01c0 100644 --- a/packages/mcp-core/src/toolDefinitions.json +++ b/packages/mcp-core/src/toolDefinitions.json @@ -2187,7 +2187,7 @@ }, "requiredScopes": ["event:read"], "skills": ["inspect"], - "surface": "direct" + "surface": "catalog" }, { "name": "find_dsns", diff --git a/packages/mcp-core/src/tools/surfaces.ts b/packages/mcp-core/src/tools/surfaces.ts index b5f6d89e6..19a694f54 100644 --- a/packages/mcp-core/src/tools/surfaces.ts +++ b/packages/mcp-core/src/tools/surfaces.ts @@ -24,7 +24,6 @@ export const TOP_LEVEL_TOOL_NAMES = [ "search_metrics", "search_profiles", "search_replays", - "find_dropped_events", "analyze_issue_with_seer", "search_issues", "get_sentry_resource", diff --git a/plugins/sentry-mcp-experimental/agents/sentry-mcp.md b/plugins/sentry-mcp-experimental/agents/sentry-mcp.md index eebfb87b7..37705a4f0 100644 --- a/plugins/sentry-mcp-experimental/agents/sentry-mcp.md +++ b/plugins/sentry-mcp-experimental/agents/sentry-mcp.md @@ -12,7 +12,6 @@ mcpServers: allowedTools: - analyze_issue_with_seer - execute_sentry_tool - - find_dropped_events - find_organizations - find_projects - get_sentry_resource diff --git a/plugins/sentry-mcp/agents/sentry-mcp.md b/plugins/sentry-mcp/agents/sentry-mcp.md index eebfb87b7..37705a4f0 100644 --- a/plugins/sentry-mcp/agents/sentry-mcp.md +++ b/plugins/sentry-mcp/agents/sentry-mcp.md @@ -12,7 +12,6 @@ mcpServers: allowedTools: - analyze_issue_with_seer - execute_sentry_tool - - find_dropped_events - find_organizations - find_projects - get_sentry_resource From f2a92c8dce7d97b212b227d52b518fe250180e6a Mon Sep 17 00:00:00 2001 From: "sentry-junior[bot]" <264270552+sentry-junior[bot]@users.noreply.github.com> Date: Wed, 28 Oct 2026 17:10:25 +0000 Subject: [PATCH 2/2] ref(mcp-core): Lock the default top-level tool list with ast-grep Add the no-expand-top-level-tools rule, which fails when TOP_LEVEL_TOOL_NAMES differs from the allowed list. Many harnesses still load every listed tool into the context window, so additions need an explicit rule update in the same PR. Restricted until tool search is standard in every mainstream harness, likely by 2027. Co-Authored-By: David Cramer --- .../no-expand-top-level-tools-test.yml | 55 +++++++++++++++++++ ast-grep-rules/no-expand-top-level-tools.yml | 39 +++++++++++++ packages/mcp-core/src/tools/surfaces.ts | 5 ++ 3 files changed, 99 insertions(+) create mode 100644 ast-grep-rule-tests/no-expand-top-level-tools-test.yml create mode 100644 ast-grep-rules/no-expand-top-level-tools.yml diff --git a/ast-grep-rule-tests/no-expand-top-level-tools-test.yml b/ast-grep-rule-tests/no-expand-top-level-tools-test.yml new file mode 100644 index 000000000..ae175cb89 --- /dev/null +++ b/ast-grep-rule-tests/no-expand-top-level-tools-test.yml @@ -0,0 +1,55 @@ +id: no-expand-top-level-tools +valid: + - | + export const TOP_LEVEL_TOOL_NAMES = [ + "find_organizations", + "find_projects", + "update_issue", + "search_errors", + "search_logs", + "search_traces", + "search_metrics", + "search_profiles", + "search_replays", + "analyze_issue_with_seer", + "search_issues", + "get_sentry_resource", + ...CATALOG_INFRASTRUCTURE_TOOL_NAMES, + ] as const; + - | + export const EXPERIMENTAL_TOP_LEVEL_TOOL_NAMES = TOP_LEVEL_TOOL_NAMES; +invalid: + - | + export const TOP_LEVEL_TOOL_NAMES = [ + "find_organizations", + "find_projects", + "update_issue", + "search_errors", + "search_logs", + "search_traces", + "search_metrics", + "search_profiles", + "search_replays", + "find_dropped_events", + "analyze_issue_with_seer", + "search_issues", + "get_sentry_resource", + ...CATALOG_INFRASTRUCTURE_TOOL_NAMES, + ] as const; + - | + export const TOP_LEVEL_TOOL_NAMES = [ + "find_organizations", + "find_projects", + "update_issue", + "search_errors", + "search_logs", + "search_traces", + "search_metrics", + "search_profiles", + "search_replays", + "analyze_issue_with_seer", + "search_issues", + "get_sentry_resource", + ...CATALOG_INFRASTRUCTURE_TOOL_NAMES, + ...EXTRA_TOOL_NAMES, + ] as const; diff --git a/ast-grep-rules/no-expand-top-level-tools.yml b/ast-grep-rules/no-expand-top-level-tools.yml new file mode 100644 index 000000000..565399dac --- /dev/null +++ b/ast-grep-rules/no-expand-top-level-tools.yml @@ -0,0 +1,39 @@ +id: no-expand-top-level-tools +language: TypeScript +severity: error +message: Do not change the default top-level MCP tool list. +note: | + Every tool in TOP_LEVEL_TOOL_NAMES ships in the default tools/list payload. + Many harnesses still load every listed tool definition into the context + window up front, so each addition is noise for every session. Keep new tools + deferred: they stay reachable through search_sentry_tools and + execute_sentry_tool. Restricted until tool search is standard in every + mainstream harness, which likely happens by 2027. If the list truly must + change, update the allowed list in this rule in the same PR so the change is + reviewed explicitly. +rule: + kind: lexical_declaration + has: + kind: variable_declarator + has: + field: name + regex: ^TOP_LEVEL_TOOL_NAMES$ + not: + pattern: | + const TOP_LEVEL_TOOL_NAMES = [ + "find_organizations", + "find_projects", + "update_issue", + "search_errors", + "search_logs", + "search_traces", + "search_metrics", + "search_profiles", + "search_replays", + "analyze_issue_with_seer", + "search_issues", + "get_sentry_resource", + ...CATALOG_INFRASTRUCTURE_TOOL_NAMES + ] as const +files: + - packages/mcp-core/src/tools/surfaces.ts diff --git a/packages/mcp-core/src/tools/surfaces.ts b/packages/mcp-core/src/tools/surfaces.ts index 19a694f54..755f60ea6 100644 --- a/packages/mcp-core/src/tools/surfaces.ts +++ b/packages/mcp-core/src/tools/surfaces.ts @@ -14,6 +14,11 @@ export const CATALOG_INFRASTRUCTURE_TOOL_NAMES = [ export const WRAPPER_TOOL_NAMES = [] as const; +// Locked by ast-grep-rules/no-expand-top-level-tools.yml. Every name here ships +// in the default tools/list payload, and many harnesses still load every listed +// tool into the context window up front. New tools stay deferred behind +// search_sentry_tools/execute_sentry_tool. Restricted until tool search is +// standard in every mainstream harness, which likely happens by 2027. export const TOP_LEVEL_TOOL_NAMES = [ "find_organizations", "find_projects",