diff --git a/docs/contributing/adding-tools.md b/docs/contributing/adding-tools.md index 8ada19eb0..b952bb4c3 100644 --- a/docs/contributing/adding-tools.md +++ b/docs/contributing/adding-tools.md @@ -72,6 +72,7 @@ import type { ServerContext } from "../../types"; export default defineTool({ name: "your_tool_name", + title: "Your Tool Name", description: [ "One-line summary.", "", @@ -103,6 +104,14 @@ export default defineTool({ }); ``` +### Title + +**REQUIRED**: Every tool sets `title`, a short Title Case display name such as +`"Search Issues"`. The server exports it as the MCP tool `title`, which clients +show instead of the snake_case `name`. Titles must be unique across tools; +`tools.test.ts` enforces this. Deprecated aliases add a ` (Deprecated)` +suffix, for example `"Search AI Conversations (Deprecated)"`. + ### Safety Annotations **REQUIRED**: Every tool must declare `readOnlyHint`, `destructiveHint`, and diff --git a/packages/mcp-core/scripts/generate-definitions.ts b/packages/mcp-core/scripts/generate-definitions.ts index 20c0714ad..1c3bb2777 100644 --- a/packages/mcp-core/scripts/generate-definitions.ts +++ b/packages/mcp-core/scripts/generate-definitions.ts @@ -76,6 +76,7 @@ type DefinitionTool = { availableToolNames?: ReadonlySet; directToolNames?: ReadonlySet; }) => string); + title: string; inputSchema: Record; outputSchema?: ZodTypeAny; skills: string[]; @@ -159,6 +160,7 @@ function generateToolDefinitions({ const surface: ToolSurface = isDirect ? "direct" : "catalog"; return { name: t.name, + title: t.title, description: toolTypesModule.resolveDescription(t.description, { experimentalMode, availableToolNames, diff --git a/packages/mcp-core/scripts/measure-token-cost.ts b/packages/mcp-core/scripts/measure-token-cost.ts index e75cd8739..2807e2f67 100644 --- a/packages/mcp-core/scripts/measure-token-cost.ts +++ b/packages/mcp-core/scripts/measure-token-cost.ts @@ -55,6 +55,7 @@ Examples: type ToolDefinition = { name: string; + title: string; description: string | ((context: { experimentalMode: boolean }) => string); inputSchema: Record; experimental?: boolean; @@ -87,6 +88,7 @@ function formatToolsForMCP(tools: Record) { return { name: tool.name, + title: tool.title, description: toolTypesModule.resolveDescription(tool.description, { experimentalMode: false, }), diff --git a/packages/mcp-core/src/internal/fresh-reads.test.ts b/packages/mcp-core/src/internal/fresh-reads.test.ts index daae7523a..8e881dd86 100644 --- a/packages/mcp-core/src/internal/fresh-reads.test.ts +++ b/packages/mcp-core/src/internal/fresh-reads.test.ts @@ -10,6 +10,7 @@ function probeTool() { const calls: { params: Record; fresh: boolean }[] = []; const tool = withFreshReadInput({ name: "probe", + title: "Probe", description: "Probe", inputSchema: { id: z.string() }, skills: ["inspect"], diff --git a/packages/mcp-core/src/internal/tool-helpers/default-organization.test.ts b/packages/mcp-core/src/internal/tool-helpers/default-organization.test.ts index 1d4a299e5..a8a995bbc 100644 --- a/packages/mcp-core/src/internal/tool-helpers/default-organization.test.ts +++ b/packages/mcp-core/src/internal/tool-helpers/default-organization.test.ts @@ -13,6 +13,7 @@ import type { CredentialRouter, ServerContext } from "../../types"; const requiredOrgTool: ToolConfig = { name: "required_org_tool", + title: "Required Org Tool", description: "required_org_tool description", skills: ["inspect"], requiredScopes: [], diff --git a/packages/mcp-core/src/server-capabilities.test.ts b/packages/mcp-core/src/server-capabilities.test.ts index ae4f2b37d..a7c066b48 100644 --- a/packages/mcp-core/src/server-capabilities.test.ts +++ b/packages/mcp-core/src/server-capabilities.test.ts @@ -16,6 +16,7 @@ const context: ServerContext = { const tools: Record = { static_tool: { name: "static_tool", + title: "Static Tool", description: "A tool fixed for the lifetime of the server", inputSchema: {}, skills: ["inspect"], diff --git a/packages/mcp-core/src/server.all-tools.test.ts b/packages/mcp-core/src/server.all-tools.test.ts index 4c2b211fb..37fdcaffa 100644 --- a/packages/mcp-core/src/server.all-tools.test.ts +++ b/packages/mcp-core/src/server.all-tools.test.ts @@ -80,6 +80,22 @@ describe.skipIf(!EXPOSE_ALL_TOOLS)("buildServer with EXPOSE_ALL_TOOLS", () => { expect(toolNames).toContain("create_project"); }); + it("exports each tool's title in tools/list", async () => { + const listed = await withClient( + getContext(), + async (client) => (await client.listTools()).tools, + ); + const titles = new Map( + Object.values(tools).map((tool) => [tool.name, tool.title]), + ); + + expect(listed.length).toBeGreaterThan(0); + for (const tool of listed) { + expect(tool.title, tool.name).toBe(titles.get(tool.name)); + expect(tool.title?.trim(), tool.name).toBeTruthy(); + } + }); + it("lists the replacements of deprecated tools instead of the tools", async () => { const toolNames = await listToolNames(getContext()); const deprecatedTools = Object.values(tools).filter( diff --git a/packages/mcp-core/src/server.test.ts b/packages/mcp-core/src/server.test.ts index 4d26eda31..73d518227 100644 --- a/packages/mcp-core/src/server.test.ts +++ b/packages/mcp-core/src/server.test.ts @@ -173,6 +173,7 @@ describe("buildServer", () => { options: Partial = {}, ): ToolConfig => ({ name, + title: `${name} title`, description: `${name} description`, inputSchema: {}, skills: ["inspect"], diff --git a/packages/mcp-core/src/server.ts b/packages/mcp-core/src/server.ts index 5c3491069..65ec14c2b 100644 --- a/packages/mcp-core/src/server.ts +++ b/packages/mcp-core/src/server.ts @@ -394,6 +394,7 @@ function configureServer({ }); const toolRegistration = { + title: tool.title, description: resolvedDescription, inputSchema: filteredInputSchema, outputSchema: tool.outputSchema, diff --git a/packages/mcp-core/src/toolDefinitions.json b/packages/mcp-core/src/toolDefinitions.json index f98edd6ab..e2598f4ca 100644 --- a/packages/mcp-core/src/toolDefinitions.json +++ b/packages/mcp-core/src/toolDefinitions.json @@ -1,6 +1,7 @@ [ { "name": "add_issue_note", + "title": "Add Issue Note", "description": "Add a comment to a Sentry issue's activity feed.\n\nUse this tool to record findings, context, or decisions on an issue.\n\n\nadd_issue_note(organizationSlug='my-organization', issueId='PROJECT-123', text='Investigating with the payments team.')\nadd_issue_note(issueUrl='https://my-organization.sentry.io/issues/PROJECT-123/', text='Resolved by deploy 1.2.3.')\n\n\n\n- This mutates visible Sentry issue state by posting a comment.\n- Do not use this for private scratch notes, secrets, credentials, or unapproved content.\n", "inputSchema": { "type": "object", @@ -45,6 +46,7 @@ }, { "name": "add_team_to_project", + "title": "Add Team to Project", "description": "Grant a team access to an existing Sentry project.\n\nUse this tool when you need to:\n- Add another team to a project\n- Grant a team access without changing project metadata\n- Check whether a team already has project access before adding it\n\n\nadd_team_to_project(organizationSlug='my-organization', projectSlug='my-project', teamSlug='my-team')\n\n\n\n- Team access changes are separate from project metadata updates.\n- If the team is already assigned, this tool returns the current team list without making another change.\n", "inputSchema": { "type": "object", @@ -111,6 +113,7 @@ }, { "name": "analyze_issue_with_seer", + "title": "Analyze Issue with Seer", "description": "Use Seer to analyze production errors and get detailed root cause analysis with specific code fixes.\n\nUse this tool when:\n- The user explicitly asks for root cause analysis, Seer analysis, or help fixing/debugging an issue\n- You are unable to accurately determine the root cause from the issue details alone\n\nDo NOT call this tool as an automatic follow-up to get_sentry_resource.\n\nWhat this tool provides:\n- Root cause analysis with code-level explanations\n- Specific file locations and line numbers where errors occur\n- Concrete code fixes you can apply\n- Step-by-step implementation guidance\n\nThis tool automatically:\n1. Checks if analysis already exists (instant results)\n2. Starts new AI analysis if needed (~2-5 minutes)\n3. Returns complete fix recommendations\n\n\n### User: \"Run Seer on this issue\"\n\n```\nanalyze_issue_with_seer(issueUrl='https://my-org.sentry.io/issues/PROJECT-1Z43')\n```\n\n### User: \"Analyze this issue and suggest a fix\"\n\n```\nanalyze_issue_with_seer(organizationSlug='my-organization', issueId='ERROR-456')\n```\n\n\n\n- Only use when the user explicitly requests analysis or you cannot determine the root cause from issue details alone\n- Seer Autofix does not support metric alert issues (issueCategory: metric); use get_issue_details and search_metrics or search_traces instead\n- If the user provides an issueUrl, extract it and use that parameter alone\n- The analysis includes actual code snippets and fixes, not just error descriptions\n- Results are cached - subsequent calls return instantly\n", "inputSchema": { "type": "object", @@ -152,6 +155,7 @@ }, { "name": "create_alert_rule", + "title": "Create Alert Rule", "description": "Create a Sentry Alert (workflow) that sends notifications, such as Slack, email or PagerDuty, when its issue or monitor sources trigger.\nUse get_alert_options for available actions, integrations, conditions, and sources. All notification providers use their native config and data fields.\nTo copy an Alert, read get_alert_rule(kind='issue') and pass its configuration here; component IDs are discarded while integration and destination IDs are retained. New trigger groups require logicType='any-short'.\nTo reuse an existing Alert across projects, use update_alert_rule instead.\nSupply projectSlugs for project issue streams and/or detectorIds for individual monitors. Pass detectorIds=[] explicitly to create an Alert without sources; it will not send notifications until connected.\nNew Alerts default to active with a 30-minute notification interval. Use status='disabled' to configure one before enabling it.\nProject-constrained sessions require sources exclusively within that project. All-project sources require Sentry's feature and org:write in addition to alerts:write.\nAfter a timeout or error, search for the Alert before retrying: creation may already have succeeded.\n\ncreate_alert_rule(organizationSlug='my-org', name='Backend notifications', status='disabled', detectorIds=[], actionFilters=[])\n", "inputSchema": { "type": "object", @@ -501,6 +505,7 @@ }, { "name": "create_dsn", + "title": "Create DSN", "description": "Create an additional DSN for an EXISTING project.\n\nUSE THIS TOOL WHEN:\n- Project already exists and needs additional DSN\n- 'Create another DSN for project X'\n- 'I need a production DSN for existing project'\n\nDO NOT USE for new projects (use create_project instead)\n\nBe careful when using this tool!\n\n\n### Create additional DSN for existing project\n```\ncreate_dsn(organizationSlug='my-organization', projectSlug='my-project', name='Production')\n```\n\n\n\n- If the user passes a parameter in the form of name/otherName, its likely in the format of /.\n- If any parameter is ambiguous, you should clarify with the user what they meant.\n", "inputSchema": { "type": "object", @@ -561,6 +566,7 @@ }, { "name": "create_metric_monitor", + "title": "Create Metric Monitor", "description": "Create a Sentry Metric Monitor that detects when a metric, such as an error count or latency, crosses a threshold. Supports Static, Percent or Dynamic detection.\nProvide the complete query, detection config and conditions. Time windows and comparison deltas use seconds. Percent comparisons are absolute: 110 means 10% higher.\nTo copy a monitor, use the query, config and conditionGroup from get_metric_monitor_details. Component IDs are discarded; new condition groups use logicType='any'.\nNew monitors start ACTIVE and immediately evaluate data. Initially disabled creation is not supported. Use update_metric_monitor to disable an existing monitor.\nworkflowIds optionally connect existing notification Alerts, including shared Alerts, without modifying their configuration. Create an Alert separately with create_alert_rule if needed.\nDataset access, quota, aggregate, window and historical-data requirements are enforced by Sentry. Dynamic detection requires sufficient history and Seer availability.\nCreation can fail after persisting a monitor, especially during Dynamic setup. After an error or timeout, use find_metric_monitors with the name and project before retrying; do not assume rollback or blindly repeat creation.\ncreate_metric_monitor(organizationSlug='my-org', projectSlug='backend', name='High error count', query={dataset:'events', query:'level:error', aggregate:'count()', eventTypes:['error'], timeWindowSeconds:300}, config={detectionType:'static'}, conditionGroup={conditions:[{type:'gt', comparison:100, conditionResult:75}, {type:'lte', comparison:50, conditionResult:0}]})", "inputSchema": { "type": "object", @@ -945,6 +951,7 @@ }, { "name": "create_monitor", + "title": "Create Cron Monitor", "description": "Create a Sentry cron monitor.\n\nUse this tool when you need to:\n- Monitor a scheduled job (cron job, scheduled task) for missed, failed, or slow runs\n- Set up a cron monitor before instrumenting check-ins\n\nSet `schedule` to exactly one crontab or interval schedule. Check-ins must still be sent by the job (SDK `monitor_config`/check-ins or `sentry monitor run`) using the returned slug.\nworkflowIds optionally connect existing notification Alerts without modifying them. Use find_alert_rules(kind='issue') to find workflow IDs.\nIf the returned status is `disabled` but you did not request that, the organization has no cron monitor seat available. Tell the user; the monitor ignores check-ins until a seat frees up and it is enabled.\nAfter an error or timeout, use find_monitors with the name and project before retrying; creation is not idempotent.\n\n\ncreate_monitor(organizationSlug='my-organization', projectSlug='backend', name='Nightly Import', schedule={ type: 'crontab', crontab: '0 3 * * *' }, timezone='America/Los_Angeles', checkInMargin=5, maxRuntime=30)\ncreate_monitor(organizationSlug='my-organization', projectSlug='backend', name='Queue Drain', schedule={ type: 'interval', value: 15, unit: 'minute' })\n", "inputSchema": { "type": "object", @@ -1165,6 +1172,7 @@ }, { "name": "create_project", + "title": "Create Project", "description": "Create a new project in Sentry (provisions DSN automatically).\n\nUSE THIS TOOL WHEN USERS WANT TO:\n- 'Create a new project'\n- 'Set up a project for [app/service] with team [X]'\n- 'I need a new Sentry project'\n- Create project AND need DSN in one step\n- Create project and link an existing repository\n\nReturns the created project slug and a usable SENTRY_DSN when key setup succeeds.\n\nBe careful when using this tool!\n\n\n### Create new project with team\n```\ncreate_project(organizationSlug='my-organization', teamSlug='my-team', name='my-project', platform='javascript')\n```\n### Create project with an explicit slug\n```\ncreate_project(organizationSlug='my-organization', teamSlug='my-team', name='My Project', slug='my-project', platform='javascript')\n```\n### Create project and link to a repository\n```\ncreate_project(organizationSlug='my-organization', teamSlug='my-team', name='my-project', platform='javascript', repository='getsentry/sentry')\n```\n", "inputSchema": { "type": "object", @@ -1231,6 +1239,7 @@ }, { "name": "create_team", + "title": "Create Team", "description": "Create a new team in Sentry.\n\nUSE THIS TOOL WHEN USERS WANT TO:\n- 'Create a new team'\n- 'Set up a team called [X]'\n- 'I need a team for my project'\n\nBe careful when using this tool!\n\n\n### Create a new team\n```\ncreate_team(organizationSlug='my-organization', name='the-goats')\n```\n\n\n\n- If any parameter is ambiguous, you should clarify with the user what they meant.\n", "inputSchema": { "type": "object", @@ -1287,6 +1296,7 @@ }, { "name": "create_uptime_monitor", + "title": "Create Uptime Monitor", "description": "Create a Sentry HTTP uptime monitor.\n\nUse this tool when you need to:\n- Start monitoring a URL for availability\n- Create a new uptime check with interval and timeout\n\nBe careful when using this tool!\n\nRequired fields match Sentry's uptime API: name, url, intervalSeconds, timeoutMs.\nAdvanced response assertions are not supported in this MVP; configure them in the Sentry UI if needed.\n\n\ncreate_uptime_monitor(organizationSlug='my-organization', projectSlug='backend', name='API Health', url='https://api.example.com/health', intervalSeconds=60, timeoutMs=5000)\ncreate_uptime_monitor(organizationSlug='my-organization', projectSlug='backend', name='Checkout', url='https://example.com/checkout', intervalSeconds=300, timeoutMs=10000, method='GET', environment='production')\n", "inputSchema": { "type": "object", @@ -1488,6 +1498,7 @@ }, { "name": "delete_alert_rule", + "title": "Delete Alert Rule", "description": "Permanently delete a Sentry Alert (workflow), preserving its connected monitors.\nUse get_alert_rule(kind='issue') to inspect the Alert and obtain its workflow ID before deletion. Metric Monitor IDs and legacy metric alert IDs are not workflow IDs.\nDeleting a shared Alert removes its notifications for every connected project and monitor. Use update_alert_rule to disconnect individual sources or disable it instead.\nA project-constrained session can only delete Alerts affecting that project exclusively.\nSentry removes the Alert from normal reads immediately and completes internal deletion in the background.\n\ndelete_alert_rule(organizationSlug='my-org', ruleId='12345')\n", "inputSchema": { "type": "object", @@ -1547,6 +1558,7 @@ }, { "name": "delete_metric_monitor", + "title": "Delete Metric Monitor", "description": "Permanently delete a Sentry Metric Monitor, preserving its connected Alerts and their other monitors.\nUse get_metric_monitor_details to inspect the monitor and obtain its native monitorId. Legacy metric alert IDs are not monitor IDs.\nUse update_metric_monitor(status='disabled') to pause detection instead. Deletion also removes an associated legacy metric alert and its incident history when present.\nSentry hides the monitor from normal reads immediately and completes deletion in the background.\ndelete_metric_monitor(organizationSlug='my-org', monitorId='12345')", "inputSchema": { "type": "object", @@ -1599,6 +1611,7 @@ }, { "name": "delete_monitor_environment", + "title": "Delete Cron Monitor Environment", "description": "Delete one environment from a Sentry cron monitor.\n\nUse find_monitors or get_monitor_details to identify the monitor and exact environment name.\n\nDeletion is irreversible and completes in the background. The monitor and its other environments are preserved. An already absent environment is treated as success.\n\n\ndelete_monitor_environment(organizationSlug='my-organization', projectSlug='backend', monitorSlug='nightly-import', environment='production')\n", "inputSchema": { "type": "object", @@ -1667,6 +1680,7 @@ }, { "name": "delete_uptime_monitor", + "title": "Delete Uptime Monitor", "description": "Delete a Sentry HTTP uptime monitor.\n\nUse this tool when you need to permanently remove an uptime monitor.\n\nBe careful when using this tool! Deletion cannot be undone.\n\n\ndelete_uptime_monitor(organizationSlug='my-organization', projectSlug='backend', uptimeMonitorId='12345')\n", "inputSchema": { "type": "object", @@ -1722,6 +1736,7 @@ }, { "name": "find_alert_rules", + "title": "Find Alert Rules", "description": "Find Sentry alert rules.\n\nUse this tool when you need to:\n- List Alerts (workflows) for an organization or project, including Alerts without connected sources\n- List Metric Monitors using compatibility references; prefer find_metric_monitors for canonical monitor IDs\n- Find an alert rule ID by name before inspecting it\n- Check alert conditions, queries, triggers, actions, owner, or environment\n\n\nfind_alert_rules(organizationSlug='my-org')\nfind_alert_rules(organizationSlug='my-org', projectSlug='backend')\nfind_alert_rules(organizationSlug='my-org', kind='issue', projectSlug='backend', query='critical')\n\n\n\n- Omit `projectSlug` to search organization-wide. A project filter finds connected Alerts, which may also cover other projects.\n- Metric entries expose monitorId and projectId. id retains a legacy alert-rule ID when available, otherwise detector:. status describes enabled/disabled monitoring, not a legacy alert status.\n- Issue and metric alert rules have independent pagination state. Reuse a nextCursor only with its matching kind.\n", "inputSchema": { "type": "object", @@ -1983,6 +1998,7 @@ }, { "name": "find_dashboards", + "title": "Find Dashboards", "description": "Find Sentry dashboards in an organization.\n\nUse this tool when you need to:\n- List dashboards in an organization\n- Find a dashboard ID before calling get_dashboard_details\n- Search dashboards by title\n\n\nfind_dashboards(organizationSlug='my-organization')\nfind_dashboards(organizationSlug='my-organization', titleQuery='errors')\n\n\n\n- Dashboard IDs are organization-scoped.\n- Use `get_dashboard_details` after finding the correct dashboard ID.\n", "inputSchema": { "type": "object", @@ -2134,6 +2150,7 @@ }, { "name": "find_dropped_events", + "title": "Find Dropped Events", "description": "Find events dropped before they were stored in Sentry — ground-truth data-fidelity information about what was and wasn't captured.\n\nEvents can be dropped client-side in the SDK (sample_rate, before_send) or\nserver-side at ingest (rate limited, over quota, filtered, invalid, abuse/spike\nprotection, cardinality limited). Accepted-only views (searches, aggregates,\ncharts) can't show this, so the data may be incomplete in ways they don't reveal\n— for example, a flat or spiky chart caused entirely by drops.\n\nUse this tool when you need to:\n- Explain why a chart is flat, lower than expected, or doesn't match what the user is sending\n- Confirm the data you need is actually in Sentry (not dropped) before trusting a query, aggregate, or dashboard\n- Attribute a volume anomaly to a specific drop reason (quota, spike protection, sampling, filters)\n- Tell the user why their data is missing and what to do about it (raise quota, fix sampling, etc.)\n\nReturns dropped event volume bucketed over time, with the drop `outcome` and `reason`\nfor each bucket, plus the accepted volume per bucket so you can compute the dropped share.\n\n\nfind_dropped_events(organizationSlug='my-org', dataset='spans', projectSlug='my-project')\nfind_dropped_events(organizationSlug='my-org', dataset='logs', statsPeriod='30d', interval='1d')\nfind_dropped_events(organizationSlug='my-org', dataset='errors', outcome='rate_limited')\n\n\n\n- This is independent of any search query — it reports drops for the whole project/time range.\n- `outcome` is the drop kind (e.g. rate_limited, filtered); `reason` is the sub-cause (e.g. key_quota, sample_rate).\n- Each bucket's `tags` classify the drop: `intentional` (user-configured, e.g. sampling or filters) vs `unintentional` (not intended, e.g. quota or abuse).\n- Pass `outcome` and/or `reason` to scope the dropped side to one classification; the accepted volume is always returned in full.\n- An empty `droppedEvents` list means no drops in the window — the data can be trusted.\n", "inputSchema": { "type": "object", @@ -2364,6 +2381,7 @@ }, { "name": "find_dsns", + "title": "Find DSNs", "description": "List the DSNs (client keys) for a Sentry project: the SENTRY_DSN an SDK uses to send events.\n\nUse this tool when you need to:\n- Retrieve a SENTRY_DSN for a specific project\n- Configure a Sentry SDK for an existing project\n\n\n- If the user passes a parameter in the form of name/otherName, its likely in the format of /.\n- If only one parameter is provided, and it could be either `organizationSlug` or `projectSlug`, its probably `organizationSlug`, but if you're really uncertain you might want to call `find_organizations()` first.\n", "inputSchema": { "type": "object", @@ -2427,6 +2445,7 @@ }, { "name": "find_metric_monitors", + "title": "Find Metric Monitors", "description": "Find Sentry Metric Monitors that evaluate errors, performance, logs, metrics or crash rates.\nUse this tool to find a monitor ID before inspecting its query and detection conditions with get_metric_monitor_details.\nResults contain native monitor IDs, separate from legacy metric alert IDs. Alerts connected through workflowIds control notifications; inspect them with get_alert_rule(kind='issue').\nOmit projectSlug to search all accessible projects. Pass nextCursor as cursor with the same filters to retrieve more results.\nfind_metric_monitors(organizationSlug='my-org', projectSlug='backend', query='latency')", "inputSchema": { "type": "object", @@ -2531,6 +2550,7 @@ }, { "name": "find_monitors", + "title": "Find Cron Monitors", "description": "List or search Sentry cron monitors, which track scheduled jobs through check-ins.\nFor HTTP uptime checks use find_uptime_monitors; for metric thresholds use find_metric_monitors.\n\nUse this tool when you need to:\n- List cron monitors in an organization\n- Find a monitor by name or slug before getting details\n- Check monitor status, owner, project, schedule, or recent environment state\n- When `hasMore` is true, narrow the results with project, environment, owner, or query filters\n\n\nfind_monitors(organizationSlug='my-organization')\nfind_monitors(organizationSlug='my-organization', projectSlug='backend', query='billing')\n", "inputSchema": { "type": "object", @@ -2760,6 +2780,7 @@ }, { "name": "find_organizations", + "title": "Find Organizations", "description": "List or search the Sentry organizations the user has access to.\n\nUse this tool when you need to:\n- View organizations in Sentry\n- Find an organization's slug to aid other tool requests\n- Search for specific organizations by name or slug\n\nReturns up to 25 results per page. When hasMore is true, pass the returned nextCursor with the same filters and scope to fetch the next page.", "inputSchema": { "type": "object", @@ -2848,6 +2869,7 @@ }, { "name": "find_projects", + "title": "Find Projects", "description": "List or search projects in a Sentry organization.\n\nUse this tool when you need to:\n- View projects in a Sentry organization\n- Find a project's slug to aid other tool requests\n- Search for specific projects by name or slug\n\nReturns up to 25 results per page. When hasMore is true, pass the returned nextCursor with the same filters and scope to fetch the next page.", "inputSchema": { "type": "object", @@ -2931,6 +2953,7 @@ }, { "name": "find_releases", + "title": "Find Releases", "description": "List or search releases (deployed versions) in a Sentry organization or project.\n\nUse this tool when you need to:\n- Find recent releases in a Sentry organization\n- Find the most recent version released of a specific project\n- Determine when a release was deployed to an environment\n\nReturns up to 25 results. When hasMore is true, use the projectSlug or query parameter to narrow down results.\n\n\n### Find the most recent releases in the 'my-organization' organization\n\n```\nfind_releases(organizationSlug='my-organization')\n```\n\n### Find releases matching '2ce6a27' in the 'my-organization' organization\n\n```\nfind_releases(organizationSlug='my-organization', query='2ce6a27')\n```\n\n\n\n- If the user passes a parameter in the form of name/otherName, its likely in the format of /.\n", "inputSchema": { "type": "object", @@ -3148,6 +3171,7 @@ }, { "name": "find_teams", + "title": "Find Teams", "description": "List or search teams in a Sentry organization.\n\nUse this tool when you need to:\n- View teams in a Sentry organization\n- Find a team's slug and numeric ID to aid other tool requests\n- Search for specific teams by name or slug\n\nReturns up to 25 results per page. When hasMore is true, pass the returned nextCursor with the same filters and scope to fetch the next page.", "inputSchema": { "type": "object", @@ -3234,6 +3258,7 @@ }, { "name": "find_uptime_monitors", + "title": "Find Uptime Monitors", "description": "Find Sentry uptime monitors.\n\nUse this tool when you need to:\n- List HTTP uptime monitors in an organization\n- Find a monitor by name or URL before getting details\n- Check monitor status, owner, project, interval, or target URL\n- When `hasMore` is true, narrow results with project, environment, owner, or query filters\n\nThis is separate from cron monitors (`find_monitors`).\n\n\nfind_uptime_monitors(organizationSlug='my-organization')\nfind_uptime_monitors(organizationSlug='my-organization', projectSlug='backend', query='api')\n", "inputSchema": { "type": "object", @@ -3357,6 +3382,7 @@ }, { "name": "get_agent_conversation_details", + "title": "Get Agent Conversation Details", "description": "Fetch the chronological transcript and debugging details for one agent conversation, formerly called an AI conversation.\n\nReturns a timeline of user messages, assistant messages, and tool calls, with trace/span IDs for deeper debugging. To discover or list conversations, use search_agent_conversations.", "inputSchema": { "type": "object", @@ -3812,6 +3838,7 @@ }, { "name": "get_ai_conversation_details", + "title": "Get AI Conversation Details (Deprecated)", "description": "Deprecated alias for get_agent_conversation_details.\n\nUse get_agent_conversation_details for new integrations. This alias is kept for backward compatibility.", "inputSchema": { "type": "object", @@ -4270,6 +4297,7 @@ }, { "name": "get_alert_options", + "title": "Get Alert Options", "description": "Discover available actions, conditions, or sources for a Sentry Alert (notification workflow).\n\nChoose one section per call; reuse its cursor with the same section and filters.\n- actions: installed integrations, notification services, native config/data schemas and Sentry App settings. These schemas use Sentry's internal field names and target enums; inputGuide explains the update format.\n- conditions: condition types and comparison schemas for workflow triggers or action filters.\n- sources: accessible monitors and project issue streams. Use an issue_stream source to connect all issues from its project; a source with projectId=null covers all projects.\nSlack and Teams accept channel names; Discord needs a channel ID or URL. Dynamic Sentry App fields require explicit values; this tool does not enumerate their external choices.\n\n\nget_alert_options(organizationSlug='my-org', section='actions', actionTypes=['slack', 'msteams'])\nget_alert_options(organizationSlug='my-org', section='conditions', conditionGroup='action_filter')\nget_alert_options(organizationSlug='my-org', section='sources', projectSlug='backend', sourceTypes=['issue_stream'])\n", "inputSchema": { "type": "object", @@ -4624,6 +4652,7 @@ }, { "name": "get_alert_rule", + "title": "Get Alert Rule", "description": "Get details for one Sentry alert rule by ID or exact name.\n\nUse this tool when you need to inspect an alert rule's exact conditions, query, triggers, and actions before explaining or planning changes.\nTo list or search alert rules, use find_alert_rules instead.\n\n\nget_alert_rule(organizationSlug='my-org', kind='metric', ruleIdOrName='12345')\nget_alert_rule(organizationSlug='my-org', kind='issue', projectSlug='backend', ruleIdOrName='Notify backend team')\nget_alert_rule(organizationSlug='my-org', projectSlug='backend', ruleIdOrName='P95 latency')\n\n\n\n- Prefer get_metric_monitor_details for Metric Monitors. With kind=metric, numeric IDs retain their legacy alert-rule meaning; detector:123 explicitly identifies monitor 123.\n- With `kind='all'`, a digit-only `ruleIdOrName` is treated as an exact alert rule name.\n- Issue Alerts are notification workflows and may cover multiple projects or have no connected sources. Omit projectSlug to inspect organization-wide.\n- Issue details include complete conditions, notification actions, connected monitors and project scope. Inaccessible or session-restricted sources are marked explicitly.\n", "inputSchema": { "type": "object", @@ -4680,6 +4709,7 @@ }, { "name": "get_dashboard_details", + "title": "Get Dashboard Details", "description": "Get detailed information about a specific Sentry dashboard.\n\nUse this tool when you need to:\n- Inspect a dashboard's widgets and saved query definitions\n- View dashboard projects, environments, filters, layout, and widget IDs\n- Resolve a dashboard by exact title or numeric ID\n\n\nget_dashboard_details(organizationSlug='my-organization', dashboardIdOrTitle='12345')\nget_dashboard_details(organizationSlug='my-organization', dashboardIdOrTitle='Errors Overview')\n\n\n\n- Numeric dashboard IDs are resolved directly.\n- Title lookups require one exact case-insensitive match. Use `find_dashboards` first if uncertain.\n- This returns saved widget query definitions, not live widget data.\n", "inputSchema": { "type": "object", @@ -4718,6 +4748,7 @@ }, { "name": "get_doc", + "title": "Get Sentry Doc", "description": "Fetch the full markdown content of a Sentry documentation page.\n\nUse this tool when you need to:\n- Read the complete documentation for a specific topic\n- Get detailed implementation examples or code snippets\n- Access the full context of a documentation page\n- Extract specific sections from documentation\n\n\n### Get the Next.js integration guide\n\n```\nget_doc(path='/platforms/javascript/guides/nextjs.md')\n```\n\n\n\n- Use the path from search_docs results for accurate fetching\n- Paths should end with .md extension\n", "inputSchema": { "type": "object", @@ -4735,6 +4766,7 @@ }, { "name": "get_event_attachment", + "title": "Get Event Attachment", "description": "Download attachments from a Sentry event.\n\nUse this tool when you need to:\n- Download files attached to a specific event\n- Access screenshots, log files, or other attachments uploaded with an error report\n- Retrieve attachment metadata and download URLs\n\n\n### Download a specific attachment by ID\n\n```\nget_event_attachment(organizationSlug='my-organization', projectSlug='my-project', eventId='c49541c747cb4d8aa3efb70ca5aba243', attachmentId='12345')\n```\n\n### List all attachments for an event\n\n```\nget_event_attachment(organizationSlug='my-organization', projectSlug='my-project', eventId='c49541c747cb4d8aa3efb70ca5aba243')\n```\n\n\n\n\n- If `attachmentId` is provided, the specific attachment will be downloaded as an embedded resource\n- If `attachmentId` is omitted, all attachments for the event will be listed with download information\n- The `projectSlug` is required to identify which project the event belongs to\n", "inputSchema": { "type": "object", @@ -4789,6 +4821,7 @@ }, { "name": "get_event_stacktrace", + "title": "Get Event Stacktrace", "description": "Get the full stack trace (stacktrace) for one thread of a specific Sentry event.\n\nUse this tool when you need to:\n- Fetch the full stacktrace for a thread listed in issue details\n- Inspect a non-crashed thread from an event with multiple threads\n- Get Sentry's default selected thread stacktrace when no thread is specified\n\n\nget_event_stacktrace(organizationSlug='my-org', issueId='PROJECT-123')\nget_event_stacktrace(organizationSlug='my-org', issueId='PROJECT-123', eventId='c49541c747cb4d8aa3efb70ca5aba243', thread=259)\nget_event_stacktrace(organizationSlug='my-org', issueId='PROJECT-123', thread='main')\n\n\n\n- `thread` is optional. If omitted, this returns the same default thread Sentry selects: first crashed thread, then first thread with a stacktrace, then first thread.\n- Pass `thread` as a numeric Thread ID or exact thread Name from the issue details thread list.\n- If the issue details show only one useful thread, omit `thread`.\n", "inputSchema": { "type": "object", @@ -4855,6 +4888,7 @@ }, { "name": "get_issue_activity", + "title": "Get Issue Activity", "description": "Get the activity feed and comments for a Sentry issue.\n\nUse this tool when you need to:\n- Review prior comments before triaging an issue\n- Understand who resolved, ignored, assigned, or commented on an issue\n- See recent issue activity that is not included in `get_issue_details`\n\n\nget_issue_activity(organizationSlug='my-organization', issueId='PROJECT-123')\nget_issue_activity(issueUrl='https://my-organization.sentry.io/issues/PROJECT-123/')\n", "inputSchema": { "type": "object", @@ -4906,6 +4940,7 @@ }, { "name": "get_issue_breadcrumbs", + "title": "Get Issue Breadcrumbs", "description": "Get the breadcrumb trail from a Sentry issue event.\nDefaults to the latest event when eventId is omitted.\n\nUse this tool when you need to:\n- See the user and application actions leading up to an error\n- Inspect navigation, console, HTTP, and other breadcrumb events\n- Reconstruct the immediate context before an issue occurred\n- Compare breadcrumb trails across multiple events in the same issue\n\n\nget_issue_breadcrumbs(organizationSlug='my-org', issueId='PROJECT-123')\nget_issue_breadcrumbs(organizationSlug='my-org', issueId='PROJECT-123', eventId='c49541c747cb4d8aa3efb70ca5aba243')\nget_issue_breadcrumbs(issueUrl='https://my-org.sentry.io/issues/PROJECT-123/')\n", "inputSchema": { "type": "object", @@ -4962,6 +4997,7 @@ }, { "name": "get_issue_details", + "title": "Get Issue Details", "description": "Get detailed information about a specific Sentry issue by ID.\n\nUSE THIS TOOL WHEN USERS:\n- Provide a specific issue ID (e.g., 'CLOUDFLARE-MCP-41', 'PROJECT-123')\n- Ask to 'explain [ISSUE-ID]', 'tell me about [ISSUE-ID]'\n- Want details/stacktrace/analysis for a known issue\n- Need installed package versions for an exact event (pass eventId and packageNames)\n- Want the suspect commit's SHA, message, author, and source when available\n- Provide a Sentry issue URL\n\nDO NOT USE for:\n- General searching or listing issues (use search_issues)\n\nTRIGGER PATTERNS:\n- 'Explain ISSUE-123' → use get_issue_details\n- 'Tell me about PROJECT-456' → use get_issue_details\n- 'What happened in [issue URL]' → use get_issue_details\n\n\n### With Sentry URL (recommended - simplest approach)\n```\nget_issue_details(issueUrl='https://sentry.sentry.io/issues/6916805731/?project=4509062593708032&query=is%3Aunresolved')\n```\n\n### With issue ID and organization\n```\nget_issue_details(organizationSlug='my-organization', issueId='CLOUDFLARE-MCP-41')\n```\n\n### With event ID and organization\n```\nget_issue_details(organizationSlug='my-organization', eventId='c49541c747cb4d8aa3efb70ca5aba243')\n```\n\n\n\n- **IMPORTANT**: If user provides a Sentry URL, pass the ENTIRE URL to issueUrl parameter unchanged\n- When using issueUrl, all other parameters are automatically extracted - don't provide them separately\n- If using issueId (not URL), then organizationSlug is required\n", "inputSchema": { "type": "object", @@ -5019,6 +5055,7 @@ }, { "name": "get_issue_tag_values", + "title": "Get Issue Tag Values", "description": "Get tag value distribution for a specific Sentry issue.\n\nUse this tool when you need to:\n- Understand how an issue is distributed across different tag values\n- Get aggregate counts of unique tag values (e.g., 'how many unique URLs are affected')\n- Analyze which browsers, environments, or URLs are most impacted by an issue\n- View the tag distributions page data programmatically\n\nTag keys depend on the issue's platform, SDK, and custom tags, so keys such as `browser` or `url` are missing from many issues. The `### Tags` section of `get_issue_details` shows the tags on one of the issue's events, which is a good place to pick a key from. If the key is not on the issue, the error lists the keys it has.\n\n\n### Get environment distribution for an issue\n```\nget_issue_tag_values(organizationSlug='my-organization', issueId='PROJECT-123', tagKey='environment')\n```\n\n### Get release distribution using issue URL\n```\nget_issue_tag_values(issueUrl='https://sentry.io/issues/PROJECT-123/', tagKey='release')\n```\n\n\n\n- If user provides a Sentry URL, pass the ENTIRE URL to issueUrl parameter unchanged\n- Tag keys are case-sensitive\n", "inputSchema": { "type": "object", @@ -5111,6 +5148,7 @@ }, { "name": "get_issue_user_reports", + "title": "Get Issue User Reports", "description": "Get legacy User Reports or crash-report feedback attached to a Sentry issue.\n\nUse this tool when you need to:\n- See what a user said happened when an error occurred\n- Check if any legacy bug reports or crash-report feedback were submitted for this issue\n- Get the human-provided context behind a crash, beyond the stack trace\n\n\nget_issue_user_reports(organizationSlug='my-organization', issueId='PROJECT-123')\nget_issue_user_reports(issueUrl='https://my-organization.sentry.io/issues/PROJECT-123/')\n\n\n\n- For standalone User Feedback Widget submissions, use `search_issues(query='issue.category:feedback')`.\n- Reuse pagination cursors only with the same issue scope.\n", "inputSchema": { "type": "object", @@ -5171,6 +5209,7 @@ }, { "name": "get_latest_base_snapshot", + "title": "Get Latest Base Snapshot", "description": "Get the latest UI screenshots/images for an app from the preprod snapshot system.\n\nThis is the primary tool for retrieving app screenshots.\n\nUse this tool when you need to:\n- Get screenshots, screens, golden images, or reference images for an app\n- Find what the current UI looks like (latest screenshots from the main/default branch)\n- List available snapshots or browse images before requesting specific ones\n- Look up dark mode, light mode, or other variant screenshots\n- Understand what baseline images exist when investigating snapshot test or visual regression CI failures\n\nThe appId parameter is the app identifier (e.g. 'sentry-frontend', 'com.emergetools.hackernews').\nReturns compact image metadata (display_name, image_file_name, group, description) for every image.\n\n\n### Get the latest screenshots for an app\n\n```\nget_latest_base_snapshot(organizationSlug=\"sentry\", appId=\"sentry-frontend\", project=\"frontend\")\n```\n\n### Get the latest screenshots for a specific branch\n\n```\nget_latest_base_snapshot(organizationSlug=\"sentry\", appId=\"sentry-frontend\", project=\"frontend\", branch=\"main\")\n```\n\n\n\n- The response includes compact metadata per image. Scan the list to find images matching what you need (e.g. filter by group or name containing 'button').\n- To view a specific image, use get_sentry_resource(url='?selectedSnapshot=').\n- If you need to investigate a specific snapshot comparison, use get_sentry_resource with the snapshot URL.\n", "inputSchema": { "type": "object", @@ -5232,6 +5271,7 @@ }, { "name": "get_metric_monitor_details", + "title": "Get Metric Monitor Details", "description": "Inspect a Sentry Metric Monitor's query, dataset, detection mode, thresholds, resolution conditions and connected Alerts.\nUse monitorId from find_metric_monitors, not a legacy metric alert ID. Time windows and comparison deltas are in seconds.\nCondition results use 75 for critical, 50 for warning and 0 for resolved. Percent comparisons are absolute percentages (110 means 10% higher); dynamic conditions include sensitivity and direction.\nworkflowIds identify notification Alerts; inspect their actions with get_alert_rule(kind='issue').\nget_metric_monitor_details(organizationSlug='my-org', monitorId='12345')", "inputSchema": { "type": "object", @@ -5441,6 +5481,7 @@ }, { "name": "get_monitor_details", + "title": "Get Cron Monitor Details", "description": "Get details and recent check-ins for a Sentry cron monitor (scheduled job).\n\nUse this tool when you need to:\n- Inspect a monitor's schedule, status, owner, project, and environments\n- Review recent check-ins for missed, failed, timeout, or OK runs\n- Check monitor stats over a recent time range\n\n\nget_monitor_details(organizationSlug='my-organization', monitorSlug='nightly-import')\nget_monitor_details(organizationSlug='my-organization', monitorSlug='nightly-import', projectSlugOrId='backend', environment='production', period='7d')\n", "inputSchema": { "type": "object", @@ -5563,6 +5604,7 @@ }, { "name": "get_profile", + "title": "Get Transaction Profile", "description": "Analyze aggregated CPU profiling data (flamegraph) for a transaction to identify performance bottlenecks and detect regressions.\nFor one specific profile by ID or URL, use get_profile_details.\n\nUSE THIS TOOL WHEN:\n- User asks why a specific endpoint/transaction is slow\n- User wants to understand where CPU time is spent\n- User asks about performance bottlenecks\n- User wants to compare performance between time periods\n- User shares a Sentry profile URL\n\nRETURNS:\n- Hot paths (call stacks consuming the most CPU time)\n- Performance percentiles (p75, p95, p99) for each function\n- User code vs library code breakdown\n- Actionable recommendations for optimization\n- Regression analysis when comparing periods\n\n\n### Analyze from URL (with transaction name)\n```\nget_profile(\n profileUrl='https://my-org.sentry.io/explore/profiling/profile/backend/flamegraph/?profilerId=abc123',\n transactionName='/api/users'\n)\n```\n\n### Analyze by transaction name\n```\nget_profile(\n organizationSlug='my-org',\n transactionName='/api/users',\n projectSlugOrId='backend'\n)\n```\n\n### Compare performance between periods\n```\nget_profile(\n organizationSlug='my-org',\n transactionName='/api/users',\n projectSlugOrId='backend',\n period='7d',\n compareAgainstPeriod='14d'\n)\n```\n\n\n\n- Use `focusOnUserCode: true` (default) to filter out library code\n- High p99 relative to p75 indicates inconsistent performance\n- Use compareAgainstPeriod to detect regressions over time\n- Transaction names are case-sensitive\n", "inputSchema": { "type": "object", @@ -5631,6 +5673,7 @@ }, { "name": "get_profile_details", + "title": "Get Profile Details", "description": "Inspect one specific Sentry profile in detail, by profile ID, profiler ID or URL.\nFor aggregated hot paths across a transaction, use get_profile.\n\nUSE THIS TOOL WHEN:\n- User shares a transaction profile URL and wants the details\n- User has a profile ID and wants a concise summary plus raw sample structure\n- User needs to inspect a continuous profile session by profiler ID and time range\n\nRETURNS:\n- Transaction profile summary with profile URL, transaction, trace, release, and runtime details\n- Sample structure summaries such as frame count, sample count, stacks, and thread breakdown\n- Top frames by occurrence for a quick hotspot overview\n\nNOTE: This tool supports two profile modes.\n- Transaction profiles: pass `profileUrl` or `organizationSlug` + `projectSlugOrId` + `profileId`\n- Continuous profiles: pass `profileUrl` or `organizationSlug` + `projectSlugOrId` + `profilerId` + `start` + `end`\n\n\n### Transaction profile URL\n```\nget_profile_details(\n profileUrl='https://my-org.sentry.io/explore/profiling/profile/backend/cfe78a5c892d4a64a962d837673398d2/flamegraph/'\n)\n```\n\n### Transaction profile by ID\n```\nget_profile_details(\n organizationSlug='my-org',\n projectSlugOrId='backend',\n profileId='cfe78a5c892d4a64a962d837673398d2'\n)\n```\n\n### Continuous profile by session\n```\nget_profile_details(\n organizationSlug='my-org',\n projectSlugOrId='backend',\n profilerId='041bde57b9844e36b8b7e5734efae5f7',\n start='2024-01-01T00:00:00Z',\n end='2024-01-01T01:00:00Z'\n)\n```\n", "inputSchema": { "type": "object", @@ -5693,6 +5736,7 @@ }, { "name": "get_release_details", + "title": "Get Release Details", "description": "Get details for a Sentry release.\n\nUse this tool when you need to:\n- Inspect an exact release version\n- Scope a release lookup to a specific project\n- See deploys and environments for a release\n- See recent commits attached to a release\n- Gather release health metadata when a project is known\n\nTo find issues introduced in a release, call search_issues with query `release:`.\n\n\nget_release_details(organizationSlug='my-organization', releaseVersion='1.2.3')\nget_release_details(organizationSlug='my-organization', releaseVersion='1.2.3', projectSlugOrId='backend')\nget_release_details(organizationSlug='my-organization', releaseVersion='1.2.3', includeHealth=true, projectSlugOrId='backend')\n", "inputSchema": { "type": "object", @@ -5995,6 +6039,7 @@ }, { "name": "get_replay_details", + "title": "Get Replay Details", "description": "Get a Sentry replay's summary and a timeline of what the user did: page loads and navigations, clicks (including dead and rage clicks), inputs and key presses, console warnings and errors, failed requests, and feedback.\n\nUSE THIS TOOL WHEN USERS:\n- Share a replay URL\n- Ask what happened in a replay, or what a user saw and clicked\n- Need the moments before an error, a dead click, or the end of a session\n\n\nget_replay_details(replayUrl='https://my-organization.sentry.io/explore/replays/7e07485f-12f9-416b-8b14-26260799b51f/')\nget_replay_details(organizationSlug='my-organization', replayId='7e07485f-12f9-416b-8b14-26260799b51f', startOffsetSeconds=-10)\nget_replay_details(replayUrl='...', categories=['click', 'network'], startOffsetSeconds=60, endOffsetSeconds=90)\n\n\n\n- Offsets are seconds from the replay start; negative offsets count back from the end, so startOffsetSeconds=-10 shows the last 10 seconds\n- The timeline header counts every recorded event, so you can see what to ask for next\n", "inputSchema": { "type": "object", @@ -6092,6 +6137,7 @@ }, { "name": "get_sentry_mcp_info", + "title": "Get Sentry MCP Info", "description": "Get information about the running Sentry MCP server.\n\nUse this tool when you need to:\n- Check the Sentry MCP server version\n- Verify compatibility with a Skill or integration", "inputSchema": {}, "outputSchema": { @@ -6111,6 +6157,7 @@ }, { "name": "get_sentry_resource", + "title": "Get Sentry Resource", "description": "Fetch a Sentry resource by URL, or by resourceType plus resourceId.\nUse it when the user shares a Sentry link. Pass the URL directly when possible; the resource type is auto-detected.\n\nSupports issues, events, traces, spans, agent conversations, replays, monitors, dashboards, preprod snapshots, and snapshot images.\nTrace lookups return a condensed overview by default.\nFor installed package versions recorded with an exact event, pass packageNames with an event URL or resourceType='event'.\n\nAgent Conversations: A conversation is a set of spans sharing the same gen_ai.conversation.id. Use resourceType='ai_conversation' with a conversation ID, or pass a Sentry conversation URL, to fetch the transcript/details. To discover or list conversations, use search_agent_conversations. Conversations are NOT issues — do not use search_issues for conversation queries.\n\nFor preprod snapshot URLs (matching 'sentry.io/preprod/snapshots/'):\n- Without ?selectedSnapshot=: returns the snapshot diff summary (changed, added, removed images)\n- With ?selectedSnapshot=: returns the image preview and metadata. Use the Sentry tool `get_snapshot_image` for full-resolution image bytes.\n\nResource IDs:\n- monitor: \n- dashboard: \n- snapshot: \n\n\nget_sentry_resource(url='https://sentry.io/issues/PROJECT-123/')\nget_sentry_resource(resourceType='issue', organizationSlug='my-org', resourceId='PROJECT-123')\nget_sentry_resource(resourceType='ai_conversation', organizationSlug='my-org', resourceId='conversation-123')\nget_sentry_resource(url='https://sentry.sentry.io/dashboard/542438/')\nget_sentry_resource(url='https://sentry.sentry.io/preprod/snapshots/123/')\nget_sentry_resource(url='https://sentry.sentry.io/preprod/snapshots/123/?selectedSnapshot=login_screen.png')\n", "inputSchema": { "type": "object", @@ -6177,6 +6224,7 @@ }, { "name": "get_snapshot", + "title": "Get Snapshot", "description": "Get a preprod snapshot comparison summary, including metadata, counts, and changed image sections.\n\nUse this tool when you need to:\n- Investigate a failed snapshot test from CI\n- Review what changed in a specific preprod snapshot\n- Browse snapshot image file names before viewing a specific image\n\nPass organizationSlug and snapshotId. Use get_sentry_resource for snapshot URLs.\nCompact output is returned by default. Set showUnmodified=true to list unchanged and skipped images separately.\n\n\n### Browse a snapshot\n\n```\nget_snapshot(organizationSlug=\"sentry\", snapshotId=\"231949\")\n```\n\n### Include unchanged and skipped images\n\n```\nget_snapshot(organizationSlug=\"sentry\", snapshotId=\"231949\", showUnmodified=true)\n```\n\n\n\n- Use the Sentry tool `get_snapshot_image` to view a specific image preview or full-resolution image bytes.\n- Use get_sentry_resource when starting from a Sentry snapshot URL.\n- The diff percent field shows what percentage of pixels changed (0-100).\n- showUnmodified=true is useful when a diff snapshot has no changed image sections.\n", "inputSchema": { "type": "object", @@ -6220,6 +6268,7 @@ }, { "name": "get_snapshot_image", + "title": "Get Snapshot Image", "description": "Get metadata and image content for one image in a preprod snapshot.\n\nUse this tool when you need to:\n- View the current, previous, or diff image for a snapshot entry\n- Inspect metadata and context for a specific snapshot image\n- Fetch full-resolution image bytes when preview images are insufficient; full-resolution images can substantially increase response size and token usage\n\nPass organizationSlug, snapshotId, and imageIdentifier. Use get_sentry_resource for snapshot URLs.\nPreview images are returned by default; set imageResolution=full for original bytes when needed, but expect higher response size and token usage.\n\n\n### View a preview image\n\n```\nget_snapshot_image(organizationSlug=\"sentry\", snapshotId=\"231949\", imageIdentifier=\"login_screen.png\")\n```\n\n### Fetch original full-resolution bytes\n\n```\nget_snapshot_image(organizationSlug=\"sentry\", snapshotId=\"231949\", imageIdentifier=\"login_screen.png\", imageResolution=\"full\")\n```\n\n\n\n- Use get_snapshot first if you need to discover available image file names.\n- Use get_sentry_resource when starting from a Sentry snapshot URL.\n- imageIdentifier values may include slashes; pass the full image_file_name exactly as shown by get_snapshot.\n", "inputSchema": { "type": "object", @@ -6269,6 +6318,7 @@ }, { "name": "get_span_details", + "title": "Get Span Details", "description": "Get detailed information about a specific span within a Sentry trace.\n\nUse this tool when you need to:\n- Inspect a span when you already know its trace ID and span ID\n- Focus a trace investigation on one operation\n- Review a span's attributes, timing, errors, and child spans\n\n\nget_span_details(organizationSlug='my-organization', traceId='a4d1aae7216b47ff8117cf4e09ce9d0a', spanId='aa8e7f3384ef4ff5')\n\n\n\n- Pass traceId and spanId as separate parameters.\n- Use get_trace_details for a trace overview when no span is selected.\n- Use get_sentry_resource when starting from a Sentry trace or span URL.\n", "inputSchema": { "type": "object", @@ -6312,6 +6362,7 @@ }, { "name": "get_trace_details", + "title": "Get Trace Details", "description": "Get detailed information about a specific Sentry trace by ID.\n\nUSE THIS TOOL WHEN USERS:\n- Provide a specific trace ID (e.g., 'a4d1aae7216b47ff8117cf4e09ce9d0a')\n- Ask to 'show me trace [TRACE-ID]', 'explain trace [TRACE-ID]'\n- Want high-level overview and link to view trace details in Sentry\n- Need trace statistics and span breakdown\n- Want an overview first, then a guided pivot into additional spans or events\n\nDO NOT USE for:\n- General searching for traces (use search_traces)\n- Complete span enumeration or branch-by-branch reconstruction (use search_traces scoped to the trace)\n\nTRIGGER PATTERNS:\n- 'Show me trace abc123' → use get_trace_details\n- 'Explain trace a4d1aae7216b47ff8117cf4e09ce9d0a' → use get_trace_details\n- 'What is trace [trace-id]' → use get_trace_details\n\n\n### Get trace overview\n```\nget_trace_details(organizationSlug='my-organization', traceId='a4d1aae7216b47ff8117cf4e09ce9d0a')\n```\n\n### Focus a single span\n```\nget_trace_details(organizationSlug='my-organization', traceId='a4d1aae7216b47ff8117cf4e09ce9d0a', spanId='aa8e7f3384ef4ff5')\n```\n\n\n\n- Trace IDs are 32-character hexadecimal strings\n- This returns a condensed trace overview, not a full span dump\n- Provide `spanId` to focus on a single span within the trace\n- If the response says it shows a subset of spans, use search_traces to inspect the rest of the trace\n", "inputSchema": { "type": "object", @@ -6355,6 +6406,7 @@ }, { "name": "get_uptime_monitor_details", + "title": "Get Uptime Monitor Details", "description": "Get details for a Sentry uptime monitor, including recent checks.\n\nUse this tool when you need to:\n- Inspect an uptime monitor's URL, interval, thresholds, and status\n- Review recent HTTP check results (success/failure, status code, duration)\n- Debug why an uptime monitor is failing\n\nThis is separate from cron monitors (`get_monitor_details`).\n\nRequest bodies are never returned. Sensitive header values are redacted.\n\n\nget_uptime_monitor_details(organizationSlug='my-organization', projectSlug='backend', uptimeMonitorId='12345')\nget_uptime_monitor_details(organizationSlug='my-organization', projectSlug='backend', uptimeMonitorId='12345', period='7d', checkLimit=20)\n", "inputSchema": { "type": "object", @@ -6421,6 +6473,7 @@ }, { "name": "link_issue", + "title": "Link Issue", "description": "Link an existing external ticket or GitHub pull request to a Sentry issue by URL.\nSupports native Jira, GitHub/GitHub Enterprise, GitLab, Bitbucket, and Azure DevOps integrations, and installed Sentry Apps whose issue-link forms use single-value select or text fields.\nCreates a reference: it does not create a ticket, resolve the Sentry issue, or associate a commit. Use update_issue separately to change status or assignment.\nA repeated link returns already_linked. A different App association must be unlinked first.\nFor Apps, copy the canonical issue URL from the provider. Supply fields only when the installed App requires additional form values.\n\nlink_issue(organizationSlug='my-org', issueId='PROJECT-123', externalIssueUrl='https://github.com/example/repo/pull/42')\nlink_issue(issueUrl='https://my-org.sentry.io/issues/123/', externalIssueUrl='https://linear.app/example/issue/ENG-42/fix-crash')\n", "inputSchema": { "type": "object", @@ -6526,6 +6579,7 @@ }, { "name": "onboarding_status_update", + "title": "Update Onboarding Status", "description": "Update the progress shown in Sentry's agentic onboarding UI.\n\nUse this tool only when the Sentry getting started skill provides a run token. Call it at the workflow boundaries described by that skill.\n\n\n- Progress updates are operational UI state, not user analytics.\n- Keep eventNote brief and limited to context useful in the progress UI.\n- Do not include source code, repository paths, credentials, error output, or other sensitive data.\n- status is required for every update.\n- Set runStatus to completed or failed only when the entire onboarding run reaches that state.\n- A failed status requires a brief eventNote explaining the failure.\n", "inputSchema": { "type": "object", @@ -6711,6 +6765,7 @@ }, { "name": "remove_team_from_project", + "title": "Remove Team from Project", "description": "Revoke a team's access to an existing Sentry project.\n\nUse this tool when you need to:\n- Remove a team from a project\n- Revoke team access without changing project metadata\n- Check project team assignments before removing access\n\nBe careful when using this tool because it revokes project access.\n\n\nremove_team_from_project(organizationSlug='my-organization', projectSlug='my-project', teamSlug='my-team')\n\n\n\n- The team must already be assigned to the project.\n- This tool will not remove the last team assigned to a project.\n", "inputSchema": { "type": "object", @@ -6777,6 +6832,7 @@ }, { "name": "search_agent_conversations", + "title": "Search Agent Conversations", "description": "Search Sentry Agent Conversations, formerly called AI Conversations, and return one summary row per conversation.\n\nUse this tool to find or list Agent Conversations. Results are conversation summaries, not raw span rows.\nEach row includes title (when available), USD cost, tokens, call counts, previews, and other list metadata.\nUse get_agent_conversation_details with a conversationId to fetch the transcript. Use get_sentry_resource for Sentry conversation URLs.\n\n\nsearch_agent_conversations(organizationSlug='my-org', query='failed conversations', period='7d')\nsearch_agent_conversations(organizationSlug='my-org', query='checkout', project='backend')\n", "inputSchema": { "type": "object", @@ -7004,6 +7060,7 @@ }, { "name": "search_ai_conversations", + "title": "Search AI Conversations (Deprecated)", "description": "Deprecated alias for search_agent_conversations.\n\nUse search_agent_conversations for new integrations. This alias is kept for backward compatibility.", "inputSchema": { "type": "object", @@ -7234,6 +7291,7 @@ }, { "name": "search_docs", + "title": "Search Sentry Docs", "description": "Search Sentry documentation for SDK setup, instrumentation, and configuration guidance.\n\nUse this tool when you need to:\n- Set up Sentry SDK or framework integrations (Django, Flask, Express, Next.js, etc.)\n- Configure features like performance monitoring, error sampling, or release tracking\n- Implement custom instrumentation (spans, transactions, breadcrumbs)\n- Configure data scrubbing, filtering, or sampling rules\n\nReturns snippets only. Use the Sentry tool `get_doc` to fetch full documentation content.\n\n\n```\nsearch_docs(query='Django setup configuration SENTRY_DSN', guide='python/django')\nsearch_docs(query='source maps webpack upload', guide='javascript/nextjs')\n```\n\n\n\n- Use guide parameter to filter to specific technologies (e.g., 'javascript/nextjs')\n- Include specific feature names like 'beforeSend', 'tracesSampleRate', 'SENTRY_DSN'\n", "inputSchema": { "type": "object", @@ -7392,6 +7450,7 @@ }, { "name": "search_errors", + "title": "Search Errors", "description": "Search Sentry error events: exceptions and crashes with stack traces. Use for error counts, statistics, trends, and individual error events.\n\n`query` is natural language (preferred) or Sentry search syntax; a configured agent translates it into query, fields, and sort.\n\nSupports aggregations ('how many errors today', 'top error types'), individual events ('latest TypeErrors in checkout'), and time series ('errors per hour last 24h').\n\nNOT for log messages, including error/warning logs (use search_logs), requests or latency (use search_traces), or grouped issue lists (use search_issues).\n\n\nsearch_errors(organizationSlug='my-org', query='how many errors today')\nsearch_errors(organizationSlug='my-org', query='most common error types in production this week')\nsearch_errors(organizationSlug='my-org', query='errors per hour last 24h')\n\n\n\n- name/otherName notation means /; parse it directly, don't call find_organizations/find_projects.\n- Natural language is usually enough. Only pass fields/sort when you need exact columns or ordering.\n", "inputSchema": { "type": "object", @@ -7476,6 +7535,7 @@ }, { "name": "search_events", + "title": "Search Events", "description": "Deprecated multi-dataset event search, kept for backward compatibility.\n\nUse search_errors, search_logs, search_traces, search_metrics, search_profiles, or search_replays for new integrations.", "inputSchema": { "type": "object", @@ -7592,6 +7652,7 @@ }, { "name": "search_issue_events", + "title": "Search Issue Events", "description": "Search and filter events within a specific issue.\n\nProvide `query` as natural language or Sentry event search syntax. When an embedded agent is configured, it fixes filters, fields, sort, and time range before running.\n\nThe tool automatically constrains results to the specified issue.\n\nCommon Query Filters:\n- environment:production - Filter by environment\n- release:1.0.0 - Filter by release version\n- user.email:alice@example.com - Filter by user\n- trace:TRACE_ID - Filter by trace ID\n\nFor cross-issue searches use search_issues. For single issue or event details use get_sentry_resource.\n\n\nsearch_issue_events(issueId='MCP-41', organizationSlug='my-org', query='from last hour')\nsearch_issue_events(issueId='MCP-41', organizationSlug='my-org', query='environment:production')\nsearch_issue_events(issueUrl='https://sentry.io/.../issues/123/', query='release:v1.0.0', period='7d')\n", "inputSchema": { "type": "object", @@ -7681,6 +7742,7 @@ }, { "name": "search_issues", + "title": "Search Issues", "description": "Search for grouped issues/problems in Sentry - returns a LIST of issues, NOT counts or aggregations.\n\nProvide `query` as natural language or Sentry issue search syntax. When an embedded agent is configured, it fixes query and sort before running while preserving explicit Sentry search syntax.\n\nReturns grouped issues with metadata like title, status, and user count.\n\nCommon Query Syntax:\n- is:unresolved / is:resolved / is:ignored / is:for_review / is:new / is:regressed / is:escalating\n- level:error / level:warning\n- firstSeen:-24h / lastSeen:-7d\n- assigned:me / assigned_or_suggested:me\n- release:latest\n- issue.category:feedback\n- issue.priority:high\n- environment:production\n- userCount:>100\n\nNo AND/OR or parentheses: spaces mean AND. For OR on one field use field:[a,b]; for several statuses use status:[resolved,ignored] or substatus:[regressed,escalating].\n\nDO NOT USE FOR COUNTS/AGGREGATIONS → use search_errors\nDO NOT USE FOR individual events with timestamps → use search_errors, search_logs, or search_traces\nDO NOT USE FOR details about a specific issue → use get_sentry_resource\n\n\nsearch_issues(organizationSlug='my-org', query='critical bugs from last week')\nsearch_issues(organizationSlug='my-org', query='is:unresolved is:unassigned', sort='freq')\nsearch_issues(organizationSlug='my-org', query='level:error firstSeen:-24h', projectSlugOrId='my-project')\n\n\n\n- If the user passes a parameter in the form of name/otherName, it's likely in the format of /.\n- Parse org/project notation directly without calling find_organizations or find_projects.\n- The projectSlugOrId parameter accepts both project slugs (e.g., 'my-project') and numeric IDs (e.g., '123456').\n", "inputSchema": { "type": "object", @@ -7748,6 +7810,7 @@ }, { "name": "search_logs", + "title": "Search Logs", "description": "Search Sentry logs: application log entries, including error- and warning-severity log messages. Use for log counts, statistics, trends, and individual log lines.\n\n`query` is natural language (preferred) or Sentry search syntax; a configured agent translates it into query, fields, and sort.\n\nSupports aggregations ('warning logs by service'), individual entries ('error logs from the last hour'), and time series ('error logs per hour').\n\nNOT for exceptions/crashes (use search_errors). For requests or spans whose trace also has a matching log, use search_traces.\n\n\nsearch_logs(organizationSlug='my-org', query='error logs from the last hour')\nsearch_logs(organizationSlug='my-org', query='logs mentioning payment timeout in production')\nsearch_logs(organizationSlug='my-org', query='count warning logs by service over 7 days')\n\n\n\n- name/otherName notation means /; parse it directly, don't call find_organizations/find_projects.\n- Natural language is usually enough. Only pass fields/sort when you need exact columns or ordering.\n- Sentry search syntax for logs includes RE2 regex filters, never quoted: `message://^Timeout after \\d+ms//`.\n", "inputSchema": { "type": "object", @@ -7832,6 +7895,7 @@ }, { "name": "search_metrics", + "title": "Search Metrics", "description": "Search Sentry metrics: counters, gauges, and distributions, as rows or aggregates. Use for metric values, percentiles, totals, and trends.\n\n`query` is natural language (preferred) or Sentry search syntax; a configured agent translates it into query, fields, and sort.\n\nSupports aggregations ('p95 http.request.duration by environment'), individual metric rows, and time series ('total tokens per day this week').\n\nNOT for span or request latency recorded on traces (use search_traces).\n\n\nsearch_metrics(organizationSlug='my-org', query='p95 http.request.duration grouped by environment over the last 24 hours')\nsearch_metrics(organizationSlug='my-org', query='total tokens used per day this week')\n\n\n\n- name/otherName notation means /; parse it directly, don't call find_organizations/find_projects.\n- Natural language is usually enough. Only pass fields/sort when you need exact columns or ordering.\n", "inputSchema": { "type": "object", @@ -7916,6 +7980,7 @@ }, { "name": "search_profiles", + "title": "Search Profiles", "description": "Search Sentry profiles: transaction and continuous profile results, profile IDs, and profiled transactions. Use to find profiles to inspect.\n\n`query` is natural language (preferred) or Sentry search syntax; a configured agent translates it into query, fields, and sort.\n\nUse get_profile or get_profile_details on a result for flamegraph and hotspot analysis.\n\n\nsearch_profiles(organizationSlug='my-org', query='recent profiles for the /checkout transaction')\n\n\n\n- name/otherName notation means /; parse it directly, don't call find_organizations/find_projects.\n- Natural language is usually enough. Only pass fields/sort when you need exact columns or ordering.\n", "inputSchema": { "type": "object", @@ -8000,6 +8065,7 @@ }, { "name": "search_replays", + "title": "Search Replays", "description": "Search Sentry session replays: rage clicks, dead clicks, visited pages, errors seen, and replay users.\n\n`query` is natural language (preferred) or replay search syntax; a configured agent translates it into a replay search.\n\nReturns replay lists only; count()/avg()/sum() are not supported. Use get_replay_details on a result for one replay.\n\n\nsearch_replays(organizationSlug='my-org', query='replays with rage clicks on checkout in the last day')\nsearch_replays(organizationSlug='my-org', query='count_errors:>0', sort='-count_errors')\n\n\n\n- name/otherName notation means /; parse it directly, don't call find_organizations/find_projects.\n", "inputSchema": { "type": "object", @@ -8087,6 +8153,7 @@ }, { "name": "search_traces", + "title": "Search Traces", "description": "Search Sentry spans and traces: requests, API/HTTP calls, endpoints, DB queries, AI/LLM calls, and other operations. Use for latency, throughput, slowness, and performance questions.\n\n`query` is natural language (preferred) or Sentry search syntax; a configured agent translates it into query, fields, and sort.\n\nAlso use for spans whose trace contains a matching log, metric, or other span, e.g. 'slow checkout requests that also logged an error'.\n\nSupports aggregations ('p95 duration by span.op'), individual spans ('slowest API calls today'), and time series ('requests per minute last hour').\n\nNOT for exceptions/crashes (use search_errors), standalone log lines (use search_logs), or a single trace's span tree (use get_sentry_resource with the trace).\n\n\nsearch_traces(organizationSlug='my-org', query='slowest API calls in the last 24 hours')\nsearch_traces(organizationSlug='my-org', query='p95 duration of db spans grouped by span.op over 7 days')\nsearch_traces(organizationSlug='my-org', query='checkout requests that also have an error log')\n\n\n\n- name/otherName notation means /; parse it directly, don't call find_organizations/find_projects.\n- Natural language is usually enough. Only pass fields/sort when you need exact columns or ordering.\n", "inputSchema": { "type": "object", @@ -8171,6 +8238,7 @@ }, { "name": "submit_feedback_to_sentry_team", + "title": "Submit Feedback to Sentry Team", "description": "Report friction with the Sentry MCP server to its maintainers.\n\nUse this tool when you need to:\n- Report that no Sentry MCP tool could do what the user asked\n- Report a tool that failed, returned wrong data, or was confusing\n- Suggest an improvement to the Sentry MCP tools\n\n\nsubmit_feedback_to_sentry_team(task='find slow endpoints', kind='missing', impact='blocked', description='No tool returns p95 latency per endpoint.')\n\n\n\n- Call at most once per task, after you finish or give up.\n- Feedback goes to the Sentry MCP maintainers, not the user's Sentry organization.\n- Do not include secrets, credentials, or personal data.\n", "inputSchema": { "type": "object", @@ -8222,6 +8290,7 @@ }, { "name": "unlink_issue", + "title": "Unlink Issue", "description": "Remove an external ticket or GitHub pull request reference from a Sentry issue by URL.\nRemoves only the Sentry association. It does not delete the external ticket or the Sentry issue, or change resolution status.\nSupports native integrations and installed Sentry Apps. Repeating the request is safe: not_linked means the association is absent, whether removed by this call or already absent.\n\nunlink_issue(organizationSlug='my-org', issueId='PROJECT-123', externalIssueUrl='https://github.com/example/repo/issues/42')\n", "inputSchema": { "type": "object", @@ -8317,6 +8386,7 @@ }, { "name": "update_alert_rule", + "title": "Update Alert Rule", "description": "Update a Sentry Alert (workflow), including notification actions and connections.\nUse get_alert_rule with kind='issue' first to inspect the complete triggers and actionFilters configuration.\nUse get_alert_options to discover notification actions, integrations, conditions, and available sources.\nOmit fields to leave them unchanged. Pass null to clear owner or environment.\ntriggers replaces the trigger conditions. actionFilters replaces ALL action groups: copy the complete configuration, retain existing IDs, and change only the intended values. Omitted groups, conditions, and actions are removed.\nFor Slack or Microsoft Teams, change config.targetDisplay to the channel name and use integrationId for the workspace or team. Sentry resolves the channel ID. Slack also accepts an explicit new targetIdentifier; a copied old ID is cleared when the name or workspace changes.\nOther actions use their provider's config and data. For Discord, PagerDuty, Opsgenie, and email, update targetIdentifier to the channel, service, team, or recipient ID; changing only its display name does not change the destination.\nUse addProjectSlugs/removeProjectSlugs to connect/disconnect a project's issue stream. Other monitors in that project remain connected. Use addDetectorIds/removeDetectorIds for individual monitors. Unmentioned connections are preserved.\nMetric Monitor detection queries and thresholds are separate operations.\nAll-project connections require Sentry's all-project feature and an API token with org:write in addition to alerts:write.\nA project-constrained session can only edit alerts affecting that project exclusively.\nRequires alerts:write; reconnect OAuth if the existing token lacks it.\n\nupdate_alert_rule(organizationSlug='my-org', ruleIdOrName='12345', status='disabled')\nupdate_alert_rule(organizationSlug='my-org', projectSlug='backend', ruleIdOrName='Notify backend team', frequencyMinutes=30)\n", "inputSchema": { "type": "object", @@ -8705,6 +8775,7 @@ }, { "name": "update_dsn", + "title": "Update DSN", "description": "Update settings for an existing DSN (client key) in a project, such as name, active status, rate limit, and loader script options.\n\nUSE THIS TOOL WHEN:\n- Deactivating or activating a DSN/client key\n- Setting or removing DSN rate limits ('set rate limit of 1000 per hour on DSN X')\n- Renaming a DSN ('rename DSN X to Production')\n- Configuring Javascript SDK loader script options (session replay, performance, debug, feedback, etc.)\n\nBe careful when using this tool!\n\n\n### Rename DSN and set rate limit\n```\nupdate_dsn(organizationSlug='my-organization', projectSlug='my-project', keyId='d20df0a1ab5031c7f3c7edca9c02814d', name='Production Key', rateLimitWindow=3600, rateLimitCount=500)\n```\n\n### Deactivate a DSN\n```\nupdate_dsn(organizationSlug='my-organization', projectSlug='my-project', keyId='d20df0a1ab5031c7f3c7edca9c02814d', isActive=false)\n```\n\n### Disable rate limit entirely\n```\nupdate_dsn(organizationSlug='my-organization', projectSlug='my-project', keyId='d20df0a1ab5031c7f3c7edca9c02814d', disableRateLimit=true)\n```\n\n\n\n- Use `find_dsns()` first to find the `keyId` for the DSN you want to update.\n- Both `rateLimitWindow` (seconds) and `rateLimitCount` (error cap) must be provided together to set a rate limit.\n", "inputSchema": { "type": "object", @@ -8791,6 +8862,7 @@ }, { "name": "update_issue", + "title": "Update Issue", "description": "Update a Sentry issue's status or assignment.\n\nUse this to resolve, reopen, assign, unassign, or ignore an issue.\n\n\n```\nupdate_issue(organizationSlug='my-org', issueId='PROJECT-123', status='resolved')\nupdate_issue(organizationSlug='my-org', issueId='PROJECT-123', assignedTo='user:123456')\nupdate_issue(organizationSlug='my-org', issueId='PROJECT-123', assignedTo=null)\nupdate_issue(organizationSlug='my-org', issueId='PROJECT-123', status='ignored')\nupdate_issue(organizationSlug='my-org', issueId='PROJECT-123', status='ignored', ignoreMode='forever')\nupdate_issue(organizationSlug='my-org', issueId='PROJECT-123', status='ignored', ignoreMode='untilOccurrenceCount', ignoreCount=100, ignoreWindowMinutes=60)\nupdate_issue(organizationSlug='my-org', issueId='PROJECT-123', status='ignored', reason='Ignoring because this is expected noise from the staging deploy')\n```\n\n\n\n- Provide `issueUrl` or `organizationSlug` + `issueId`.\n- At least one of `status` or `assignedTo` is required.\n- Omit `assignedTo` to leave assignment unchanged. Pass `null` to unassign; otherwise use `user:ID` or `team:ID_OR_SLUG`.\n- Use the `whoami` tool to find your user ID for self-assignment.\n- Status values: `resolved`, `resolvedInNextRelease`, `unresolved`, `ignored`.\n- `status='ignored'` defaults to `ignoreMode='untilEscalating'`.\n- Ignore modes: `untilEscalating`, `forever`, `forDuration`, `untilOccurrenceCount`, `untilUserCount`.\n- Matching ignore inputs are `ignoreDurationMinutes`, `ignoreCount` + optional `ignoreWindowMinutes`, or `ignoreUserCount` + optional `ignoreUserWindowMinutes`.\n- To switch an already ignored issue between `untilEscalating`, `forever`, and condition-based ignore modes, first set `status='unresolved'`, then ignore it again with the new rule.\n- `reason` is optional. When provided, it will be posted as a comment on the issue's activity feed explaining why the action was taken.\n", "inputSchema": { "type": "object", @@ -8896,6 +8968,7 @@ }, { "name": "update_metric_monitor", + "title": "Update Metric Monitor", "description": "Update a Sentry Metric Monitor's query, detection conditions, metadata, status or connected Alerts.\nUse get_metric_monitor_details first and its native monitorId, not a legacy metric alert ID. projectSlug identifies scope; it does not move the monitor.\nOmit fields to preserve them. query and config accept partial changes. conditionGroup and workflowIds replace their complete configuration; preserve IDs and entries you want to retain.\nStatic, Percent and Dynamic detection are supported. Windows and comparison deltas are in seconds. Percent thresholds are absolute (110 means 10% higher), not percentage changes.\nDynamic changes may require sufficient historical data. Dataset access, query and window constraints are enforced by Sentry.\nworkflowIds connect existing Alerts, including shared Alerts, without editing their actions or other monitors. Use update_alert_rule for notification configuration.\nRequires alerts:write; reconnect OAuth if the existing token lacks it.\nupdate_metric_monitor(organizationSlug='my-org', monitorId='12345', status='disabled')\nupdate_metric_monitor(organizationSlug='my-org', monitorId='12345', query={query:'level:error', timeWindowSeconds:300})", "inputSchema": { "type": "object", @@ -9276,6 +9349,7 @@ }, { "name": "update_project", + "title": "Update Project", "description": "Update project metadata in Sentry, such as name, slug, and platform.\n\nBe careful when using this tool!\n\nUse this tool when you need to:\n- Update a project's name or slug to fix onboarding mistakes\n- Change the platform assigned to a project\n\n\n### Update a project's name and slug\n\n```\nupdate_project(organizationSlug='my-organization', projectSlug='old-project', name='New Project Name', slug='new-project-slug')\n```\n\n### Update platform\n\n```\nupdate_project(organizationSlug='my-organization', projectSlug='my-project', platform='python')\n```\n\n\n\n\n- If the user passes a parameter in the form of name/otherName, it's likely in the format of /.\n- Team access changes are handled by separate project-management tools.\n- If any parameter is ambiguous, you should clarify with the user what they meant.\n- When updating the slug, the project will be accessible at the new slug after the update\n- Do not update the slug from a project-scoped session; reconnect with an organization-scoped or unconstrained session first.\n", "inputSchema": { "type": "object", @@ -9371,6 +9445,7 @@ }, { "name": "update_uptime_monitor", + "title": "Update Uptime Monitor", "description": "Update a Sentry HTTP uptime monitor.\n\nUse this tool when you need to:\n- Change URL, interval, timeout, method, headers, or body\n- Enable or disable a monitor (`status`)\n- Update owner, environment, or failure thresholds\n\nBe careful when using this tool!\n\nOmit a field to leave it unchanged. Pass explicit `null` to clear `owner`, `environment`, or `body`.\n\n\nupdate_uptime_monitor(organizationSlug='my-organization', projectSlug='backend', uptimeMonitorId='12345', status='disabled')\nupdate_uptime_monitor(organizationSlug='my-organization', projectSlug='backend', uptimeMonitorId='12345', intervalSeconds=300, timeoutMs=8000)\nupdate_uptime_monitor(organizationSlug='my-organization', projectSlug='backend', uptimeMonitorId='12345', owner=null)\n", "inputSchema": { "type": "object", @@ -9579,6 +9654,7 @@ }, { "name": "whoami", + "title": "Who Am I", "description": "Identify the authenticated user in Sentry.\n\nUse this tool when you need to:\n- Get the user's name and email address.", "inputSchema": { "type": "object", diff --git a/packages/mcp-core/src/toolDefinitions.ts b/packages/mcp-core/src/toolDefinitions.ts index c04652296..aa2011811 100644 --- a/packages/mcp-core/src/toolDefinitions.ts +++ b/packages/mcp-core/src/toolDefinitions.ts @@ -7,6 +7,8 @@ export type ToolDefinitionSurface = "direct" | "catalog"; export interface ToolDefinition { name: string; + // Human-readable display name + title: string; description: string; // Full JSON Schema object for parameters inputSchema: unknown; diff --git a/packages/mcp-core/src/tools/catalog/add-issue-note.ts b/packages/mcp-core/src/tools/catalog/add-issue-note.ts index 8c48b1e8d..0cc5ffbd2 100644 --- a/packages/mcp-core/src/tools/catalog/add-issue-note.ts +++ b/packages/mcp-core/src/tools/catalog/add-issue-note.ts @@ -36,6 +36,7 @@ function formatComment(comment: IssueComment): string { export default defineTool({ name: "add_issue_note", + title: "Add Issue Note", skills: ["triage"], requiredScopes: ["event:write"], description: [ diff --git a/packages/mcp-core/src/tools/catalog/add-team-to-project.ts b/packages/mcp-core/src/tools/catalog/add-team-to-project.ts index accfeec91..eaf0beb64 100644 --- a/packages/mcp-core/src/tools/catalog/add-team-to-project.ts +++ b/packages/mcp-core/src/tools/catalog/add-team-to-project.ts @@ -33,6 +33,7 @@ function mapTeam(team: Team) { export default defineTool({ name: "add_team_to_project", + title: "Add Team to Project", skills: ["project-management"], requiredScopes: ["project:write", "team:read", "org:read"], description: [ diff --git a/packages/mcp-core/src/tools/catalog/analyze-issue-with-seer.ts b/packages/mcp-core/src/tools/catalog/analyze-issue-with-seer.ts index 954576341..3788f0df0 100644 --- a/packages/mcp-core/src/tools/catalog/analyze-issue-with-seer.ts +++ b/packages/mcp-core/src/tools/catalog/analyze-issue-with-seer.ts @@ -31,6 +31,7 @@ import type { ServerContext } from "../../types"; export default defineTool({ name: "analyze_issue_with_seer", + title: "Analyze Issue with Seer", skills: ["seer"], // Only available in seer skill requiredScopes: [], // No Sentry API scopes required - authorization via 'seer' skill description: [ diff --git a/packages/mcp-core/src/tools/catalog/create-alert-rule.ts b/packages/mcp-core/src/tools/catalog/create-alert-rule.ts index 21baabf9a..bfa8f153a 100644 --- a/packages/mcp-core/src/tools/catalog/create-alert-rule.ts +++ b/packages/mcp-core/src/tools/catalog/create-alert-rule.ts @@ -22,6 +22,7 @@ import { resolveAlertRuleConnections } from "../support/alert-rule-connections"; export default defineTool({ name: "create_alert_rule", + title: "Create Alert Rule", skills: ["project-management"], requiredScopes: ["org:read", "project:read", "alerts:write"], description: [ diff --git a/packages/mcp-core/src/tools/catalog/create-dsn.ts b/packages/mcp-core/src/tools/catalog/create-dsn.ts index 8606e2439..317c0281a 100644 --- a/packages/mcp-core/src/tools/catalog/create-dsn.ts +++ b/packages/mcp-core/src/tools/catalog/create-dsn.ts @@ -20,6 +20,7 @@ export const createDsnOutputSchema = z.object({ export default defineTool({ name: "create_dsn", + title: "Create DSN", skills: ["project-management"], // Only available in project-management skill requiredScopes: ["project:write"], description: [ diff --git a/packages/mcp-core/src/tools/catalog/create-metric-monitor.ts b/packages/mcp-core/src/tools/catalog/create-metric-monitor.ts index b24e9fff5..44a5a20b8 100644 --- a/packages/mcp-core/src/tools/catalog/create-metric-monitor.ts +++ b/packages/mcp-core/src/tools/catalog/create-metric-monitor.ts @@ -22,6 +22,7 @@ import { assertProjectRefWithinConstraint } from "./support/project-constraints" export default defineTool({ name: "create_metric_monitor", + title: "Create Metric Monitor", skills: ["project-management"], requiredScopes: ["org:read", "project:read", "alerts:write"], description: [ diff --git a/packages/mcp-core/src/tools/catalog/create-monitor.ts b/packages/mcp-core/src/tools/catalog/create-monitor.ts index 0da49b09d..cd0391940 100644 --- a/packages/mcp-core/src/tools/catalog/create-monitor.ts +++ b/packages/mcp-core/src/tools/catalog/create-monitor.ts @@ -110,6 +110,7 @@ function toMonitorSummary( export default defineTool({ name: "create_monitor", + title: "Create Cron Monitor", skills: ["project-management"], requiredScopes: ["org:read", "project:read", "alerts:write"], description: [ diff --git a/packages/mcp-core/src/tools/catalog/create-project.ts b/packages/mcp-core/src/tools/catalog/create-project.ts index 520b0d257..cac15bf7b 100644 --- a/packages/mcp-core/src/tools/catalog/create-project.ts +++ b/packages/mcp-core/src/tools/catalog/create-project.ts @@ -108,6 +108,7 @@ async function getOrCreateClientKey({ export default defineTool({ name: "create_project", + title: "Create Project", skills: ["project-management"], // Only available in project-management skill requiredScopes: ["project:write", "team:read", "org:read"], description: [ diff --git a/packages/mcp-core/src/tools/catalog/create-team.ts b/packages/mcp-core/src/tools/catalog/create-team.ts index 17de91822..96d88f0f2 100644 --- a/packages/mcp-core/src/tools/catalog/create-team.ts +++ b/packages/mcp-core/src/tools/catalog/create-team.ts @@ -16,6 +16,7 @@ export const createTeamOutputSchema = z.object({ export default defineTool({ name: "create_team", + title: "Create Team", skills: ["project-management"], // Only available in project-management skill requiredScopes: ["team:write"], description: [ diff --git a/packages/mcp-core/src/tools/catalog/create-uptime-monitor.ts b/packages/mcp-core/src/tools/catalog/create-uptime-monitor.ts index 9d1394f25..85f431434 100644 --- a/packages/mcp-core/src/tools/catalog/create-uptime-monitor.ts +++ b/packages/mcp-core/src/tools/catalog/create-uptime-monitor.ts @@ -27,6 +27,7 @@ export const createUptimeMonitorOutputSchema = z.object({ export default defineTool({ name: "create_uptime_monitor", + title: "Create Uptime Monitor", skills: ["project-management"], requiredScopes: ["project:write"], description: [ diff --git a/packages/mcp-core/src/tools/catalog/delete-alert-rule.ts b/packages/mcp-core/src/tools/catalog/delete-alert-rule.ts index bf38c714f..a88438eb7 100644 --- a/packages/mcp-core/src/tools/catalog/delete-alert-rule.ts +++ b/packages/mcp-core/src/tools/catalog/delete-alert-rule.ts @@ -13,6 +13,7 @@ import { validateAlertRuleProjectScope } from "../support/alert-rule-connections export default defineTool({ name: "delete_alert_rule", + title: "Delete Alert Rule", skills: ["project-management"], requiredScopes: ["org:read", "project:read", "alerts:write"], description: [ diff --git a/packages/mcp-core/src/tools/catalog/delete-metric-monitor.ts b/packages/mcp-core/src/tools/catalog/delete-metric-monitor.ts index 9b829c96e..ae8b79296 100644 --- a/packages/mcp-core/src/tools/catalog/delete-metric-monitor.ts +++ b/packages/mcp-core/src/tools/catalog/delete-metric-monitor.ts @@ -11,6 +11,7 @@ import { export default defineTool({ name: "delete_metric_monitor", + title: "Delete Metric Monitor", skills: ["project-management"], requiredScopes: ["org:read", "project:read", "alerts:write"], description: [ diff --git a/packages/mcp-core/src/tools/catalog/delete-monitor-environment.ts b/packages/mcp-core/src/tools/catalog/delete-monitor-environment.ts index 5bc297074..b55844e8b 100644 --- a/packages/mcp-core/src/tools/catalog/delete-monitor-environment.ts +++ b/packages/mcp-core/src/tools/catalog/delete-monitor-environment.ts @@ -20,6 +20,7 @@ export const deleteMonitorEnvironmentOutputSchema = z.object({ export default defineTool({ name: "delete_monitor_environment", + title: "Delete Cron Monitor Environment", skills: ["project-management"], requiredScopes: ["project:write"], description: [ diff --git a/packages/mcp-core/src/tools/catalog/delete-uptime-monitor.ts b/packages/mcp-core/src/tools/catalog/delete-uptime-monitor.ts index 1892ccb77..7ffa1cc71 100644 --- a/packages/mcp-core/src/tools/catalog/delete-uptime-monitor.ts +++ b/packages/mcp-core/src/tools/catalog/delete-uptime-monitor.ts @@ -19,6 +19,7 @@ export const deleteUptimeMonitorOutputSchema = z.object({ export default defineTool({ name: "delete_uptime_monitor", + title: "Delete Uptime Monitor", skills: ["project-management"], requiredScopes: ["project:write"], description: [ diff --git a/packages/mcp-core/src/tools/catalog/find-alert-rules.ts b/packages/mcp-core/src/tools/catalog/find-alert-rules.ts index 7d4d17ef1..2d84e6bb9 100644 --- a/packages/mcp-core/src/tools/catalog/find-alert-rules.ts +++ b/packages/mcp-core/src/tools/catalog/find-alert-rules.ts @@ -99,6 +99,7 @@ function getOwner(owner: unknown): string | null { export default defineTool({ name: "find_alert_rules", + title: "Find Alert Rules", skills: ["inspect"], requiredScopes: ["org:read", "project:read"], description: [ diff --git a/packages/mcp-core/src/tools/catalog/find-dashboards.ts b/packages/mcp-core/src/tools/catalog/find-dashboards.ts index 68afd6256..569266ac1 100644 --- a/packages/mcp-core/src/tools/catalog/find-dashboards.ts +++ b/packages/mcp-core/src/tools/catalog/find-dashboards.ts @@ -223,6 +223,7 @@ async function listProjectVisibleDashboards({ export default defineTool({ name: "find_dashboards", + title: "Find Dashboards", skills: ["inspect"], requiredScopes: ["org:read"], description: [ diff --git a/packages/mcp-core/src/tools/catalog/find-dropped-events.ts b/packages/mcp-core/src/tools/catalog/find-dropped-events.ts index ad82b3dd9..9dee10150 100644 --- a/packages/mcp-core/src/tools/catalog/find-dropped-events.ts +++ b/packages/mcp-core/src/tools/catalog/find-dropped-events.ts @@ -62,6 +62,7 @@ export const findDroppedEventsOutputSchema = z.object({ export default defineTool({ name: "find_dropped_events", + title: "Find Dropped Events", skills: ["inspect"], requiredScopes: ["event:read"], description: [ diff --git a/packages/mcp-core/src/tools/catalog/find-dsns.ts b/packages/mcp-core/src/tools/catalog/find-dsns.ts index 9f367c5e0..f7ae0932e 100644 --- a/packages/mcp-core/src/tools/catalog/find-dsns.ts +++ b/packages/mcp-core/src/tools/catalog/find-dsns.ts @@ -22,6 +22,7 @@ export const findDsnsOutputSchema = z.object({ export default defineTool({ name: "find_dsns", + title: "Find DSNs", skills: ["project-management"], // DSN management is part of project setup requiredScopes: ["project:read"], description: [ diff --git a/packages/mcp-core/src/tools/catalog/find-metric-monitors.ts b/packages/mcp-core/src/tools/catalog/find-metric-monitors.ts index 6df392174..1b0fad381 100644 --- a/packages/mcp-core/src/tools/catalog/find-metric-monitors.ts +++ b/packages/mcp-core/src/tools/catalog/find-metric-monitors.ts @@ -23,6 +23,7 @@ export const findMetricMonitorsOutputSchema = z.object({ export default defineTool({ name: "find_metric_monitors", + title: "Find Metric Monitors", skills: ["inspect"], requiredScopes: ["org:read", "project:read"], description: [ diff --git a/packages/mcp-core/src/tools/catalog/find-monitors.ts b/packages/mcp-core/src/tools/catalog/find-monitors.ts index 406326484..0028a6138 100644 --- a/packages/mcp-core/src/tools/catalog/find-monitors.ts +++ b/packages/mcp-core/src/tools/catalog/find-monitors.ts @@ -137,6 +137,7 @@ function getSchedule(monitor: Monitor) { export default defineTool({ name: "find_monitors", + title: "Find Cron Monitors", skills: ["inspect"], requiredScopes: ["org:read"], description: [ diff --git a/packages/mcp-core/src/tools/catalog/find-organizations.ts b/packages/mcp-core/src/tools/catalog/find-organizations.ts index 1ed55c1ae..42740b55d 100644 --- a/packages/mcp-core/src/tools/catalog/find-organizations.ts +++ b/packages/mcp-core/src/tools/catalog/find-organizations.ts @@ -135,6 +135,7 @@ async function listAcrossAccounts( export default defineTool({ name: "find_organizations", + title: "Find Organizations", skills: ALL_SKILLS, // Foundational tool - available to all skills requiredScopes: ["org:read"], description: [ diff --git a/packages/mcp-core/src/tools/catalog/find-projects.ts b/packages/mcp-core/src/tools/catalog/find-projects.ts index 5ceaf048c..913ac32b7 100644 --- a/packages/mcp-core/src/tools/catalog/find-projects.ts +++ b/packages/mcp-core/src/tools/catalog/find-projects.ts @@ -27,6 +27,7 @@ export const findProjectsOutputSchema = z.object({ export default defineTool({ name: "find_projects", + title: "Find Projects", skills: ALL_SKILLS, // Foundational tool - available to all skills requiredScopes: ["project:read"], description: [ diff --git a/packages/mcp-core/src/tools/catalog/find-releases.ts b/packages/mcp-core/src/tools/catalog/find-releases.ts index f39cf97ce..c3182fc36 100644 --- a/packages/mcp-core/src/tools/catalog/find-releases.ts +++ b/packages/mcp-core/src/tools/catalog/find-releases.ts @@ -45,6 +45,7 @@ export const findReleasesOutputSchema = z.object({ export default defineTool({ name: "find_releases", + title: "Find Releases", skills: ["inspect"], // Only available in inspect skill requiredScopes: ["project:read"], description: [ diff --git a/packages/mcp-core/src/tools/catalog/find-teams.ts b/packages/mcp-core/src/tools/catalog/find-teams.ts index f03b2f69b..5ca240a7c 100644 --- a/packages/mcp-core/src/tools/catalog/find-teams.ts +++ b/packages/mcp-core/src/tools/catalog/find-teams.ts @@ -27,6 +27,7 @@ export const findTeamsOutputSchema = z.object({ export default defineTool({ name: "find_teams", + title: "Find Teams", skills: ["inspect", "triage", "project-management"], // Team viewing and management requiredScopes: ["team:read"], description: [ diff --git a/packages/mcp-core/src/tools/catalog/find-uptime-monitors.ts b/packages/mcp-core/src/tools/catalog/find-uptime-monitors.ts index 61405b4a7..f442b010b 100644 --- a/packages/mcp-core/src/tools/catalog/find-uptime-monitors.ts +++ b/packages/mcp-core/src/tools/catalog/find-uptime-monitors.ts @@ -22,6 +22,7 @@ export const findUptimeMonitorsOutputSchema = z.object({ export default defineTool({ name: "find_uptime_monitors", + title: "Find Uptime Monitors", skills: ["inspect"], requiredScopes: ["org:read", "project:read"], description: [ diff --git a/packages/mcp-core/src/tools/catalog/get-agent-conversation-details.ts b/packages/mcp-core/src/tools/catalog/get-agent-conversation-details.ts index 601ba33c9..3a78de973 100644 --- a/packages/mcp-core/src/tools/catalog/get-agent-conversation-details.ts +++ b/packages/mcp-core/src/tools/catalog/get-agent-conversation-details.ts @@ -660,6 +660,7 @@ function buildConversationArtifact( export default defineTool({ name: "get_agent_conversation_details", + title: "Get Agent Conversation Details", skills: ["inspect", "triage", "seer"], requiredScopes: ["event:read", "project:read"], diff --git a/packages/mcp-core/src/tools/catalog/get-alert-options.ts b/packages/mcp-core/src/tools/catalog/get-alert-options.ts index 9550dffeb..d0454dff3 100644 --- a/packages/mcp-core/src/tools/catalog/get-alert-options.ts +++ b/packages/mcp-core/src/tools/catalog/get-alert-options.ts @@ -50,6 +50,7 @@ export const getAlertOptionsOutputSchema = z.object({ export default defineTool({ name: "get_alert_options", + title: "Get Alert Options", skills: ["inspect"], requiredScopes: ["org:read", "project:read"], description: [ diff --git a/packages/mcp-core/src/tools/catalog/get-alert-rule.ts b/packages/mcp-core/src/tools/catalog/get-alert-rule.ts index dd119a195..449388cd0 100644 --- a/packages/mcp-core/src/tools/catalog/get-alert-rule.ts +++ b/packages/mcp-core/src/tools/catalog/get-alert-rule.ts @@ -51,6 +51,7 @@ function describeMatch(match: AlertRuleMatch): string { export default defineTool({ name: "get_alert_rule", + title: "Get Alert Rule", skills: ["inspect"], requiredScopes: ["org:read", "project:read"], description: [ diff --git a/packages/mcp-core/src/tools/catalog/get-dashboard-details.ts b/packages/mcp-core/src/tools/catalog/get-dashboard-details.ts index febb61981..f3e207661 100644 --- a/packages/mcp-core/src/tools/catalog/get-dashboard-details.ts +++ b/packages/mcp-core/src/tools/catalog/get-dashboard-details.ts @@ -13,6 +13,7 @@ import { export default defineTool({ name: "get_dashboard_details", + title: "Get Dashboard Details", skills: ["inspect"], requiredScopes: ["org:read"], description: [ diff --git a/packages/mcp-core/src/tools/catalog/get-doc.ts b/packages/mcp-core/src/tools/catalog/get-doc.ts index 1108f7716..42e68836e 100644 --- a/packages/mcp-core/src/tools/catalog/get-doc.ts +++ b/packages/mcp-core/src/tools/catalog/get-doc.ts @@ -9,6 +9,7 @@ import { USER_AGENT } from "../../version"; export default defineTool({ name: "get_doc", + title: "Get Sentry Doc", skills: ["inspect", "docs"], // Docs is retained for legacy docs-only grants. requiredScopes: [], description: [ diff --git a/packages/mcp-core/src/tools/catalog/get-event-attachment.ts b/packages/mcp-core/src/tools/catalog/get-event-attachment.ts index 8aaed8199..d874a5399 100644 --- a/packages/mcp-core/src/tools/catalog/get-event-attachment.ts +++ b/packages/mcp-core/src/tools/catalog/get-event-attachment.ts @@ -83,6 +83,7 @@ function formatOversizedAttachment( export default defineTool({ name: "get_event_attachment", + title: "Get Event Attachment", skills: ["inspect"], // Only available in inspect skill requiredScopes: ["event:read"], description: [ diff --git a/packages/mcp-core/src/tools/catalog/get-event-stacktrace.ts b/packages/mcp-core/src/tools/catalog/get-event-stacktrace.ts index dfacc2e42..d86d4a110 100644 --- a/packages/mcp-core/src/tools/catalog/get-event-stacktrace.ts +++ b/packages/mcp-core/src/tools/catalog/get-event-stacktrace.ts @@ -16,6 +16,7 @@ import { fetchAndFormatEventStacktrace } from "../support/event-stacktrace"; export default defineTool({ name: "get_event_stacktrace", + title: "Get Event Stacktrace", skills: ["inspect", "triage", "seer"], requiredScopes: ["event:read"], description: [ diff --git a/packages/mcp-core/src/tools/catalog/get-issue-activity.ts b/packages/mcp-core/src/tools/catalog/get-issue-activity.ts index c79ffcc66..5cd65ae75 100644 --- a/packages/mcp-core/src/tools/catalog/get-issue-activity.ts +++ b/packages/mcp-core/src/tools/catalog/get-issue-activity.ts @@ -60,6 +60,7 @@ function formatActivity(activity: IssueActivity | IssueComment): string { export default defineTool({ name: "get_issue_activity", + title: "Get Issue Activity", skills: ["inspect", "triage"], requiredScopes: ["event:read"], description: [ diff --git a/packages/mcp-core/src/tools/catalog/get-issue-breadcrumbs.ts b/packages/mcp-core/src/tools/catalog/get-issue-breadcrumbs.ts index 351a80a29..4901d32c2 100644 --- a/packages/mcp-core/src/tools/catalog/get-issue-breadcrumbs.ts +++ b/packages/mcp-core/src/tools/catalog/get-issue-breadcrumbs.ts @@ -19,6 +19,7 @@ import type { ServerContext } from "../../types"; export default defineTool({ name: "get_issue_breadcrumbs", + title: "Get Issue Breadcrumbs", skills: ["inspect", "triage"], requiredScopes: ["event:read"], description: [ diff --git a/packages/mcp-core/src/tools/catalog/get-issue-details.ts b/packages/mcp-core/src/tools/catalog/get-issue-details.ts index 36200eaeb..5163a6dbd 100644 --- a/packages/mcp-core/src/tools/catalog/get-issue-details.ts +++ b/packages/mcp-core/src/tools/catalog/get-issue-details.ts @@ -334,6 +334,7 @@ function buildIssueDetailsPayload({ export default defineTool({ name: "get_issue_details", + title: "Get Issue Details", skills: ["inspect", "triage", "seer"], // Available in inspect, triage, and seer skills requiredScopes: ["event:read"], description: [ diff --git a/packages/mcp-core/src/tools/catalog/get-issue-tag-values.ts b/packages/mcp-core/src/tools/catalog/get-issue-tag-values.ts index b025e6857..01d522e97 100644 --- a/packages/mcp-core/src/tools/catalog/get-issue-tag-values.ts +++ b/packages/mcp-core/src/tools/catalog/get-issue-tag-values.ts @@ -43,6 +43,7 @@ export const getIssueTagValuesOutputSchema = z.object({ export default defineTool({ name: "get_issue_tag_values", + title: "Get Issue Tag Values", skills: ["inspect"], // Available in inspect skill for understanding issue distribution requiredScopes: ["event:read"], description: [ diff --git a/packages/mcp-core/src/tools/catalog/get-issue-user-reports.ts b/packages/mcp-core/src/tools/catalog/get-issue-user-reports.ts index 82e9d1ef6..db3d44db8 100644 --- a/packages/mcp-core/src/tools/catalog/get-issue-user-reports.ts +++ b/packages/mcp-core/src/tools/catalog/get-issue-user-reports.ts @@ -42,6 +42,7 @@ function formatUserReport(report: UserReportList[number]): string { export default defineTool({ name: "get_issue_user_reports", + title: "Get Issue User Reports", skills: ["inspect", "triage"], requiredScopes: ["event:read"], description: [ diff --git a/packages/mcp-core/src/tools/catalog/get-latest-base-snapshot.ts b/packages/mcp-core/src/tools/catalog/get-latest-base-snapshot.ts index 7dab2f240..12bc8791b 100644 --- a/packages/mcp-core/src/tools/catalog/get-latest-base-snapshot.ts +++ b/packages/mcp-core/src/tools/catalog/get-latest-base-snapshot.ts @@ -12,6 +12,7 @@ import { export default defineTool({ name: "get_latest_base_snapshot", + title: "Get Latest Base Snapshot", skills: ["inspect"], requiredScopes: ["project:read"], description: [ diff --git a/packages/mcp-core/src/tools/catalog/get-metric-monitor-details.ts b/packages/mcp-core/src/tools/catalog/get-metric-monitor-details.ts index 32a7886f7..a3996beb0 100644 --- a/packages/mcp-core/src/tools/catalog/get-metric-monitor-details.ts +++ b/packages/mcp-core/src/tools/catalog/get-metric-monitor-details.ts @@ -17,6 +17,7 @@ export const getMetricMonitorDetailsOutputSchema = z.object({ export default defineTool({ name: "get_metric_monitor_details", + title: "Get Metric Monitor Details", skills: ["inspect"], requiredScopes: ["org:read", "project:read"], description: [ diff --git a/packages/mcp-core/src/tools/catalog/get-monitor-details.ts b/packages/mcp-core/src/tools/catalog/get-monitor-details.ts index 3d476be47..54168df80 100644 --- a/packages/mcp-core/src/tools/catalog/get-monitor-details.ts +++ b/packages/mcp-core/src/tools/catalog/get-monitor-details.ts @@ -73,6 +73,7 @@ function formatStat(stat: MonitorStat): string { export default defineTool({ name: "get_monitor_details", + title: "Get Cron Monitor Details", skills: ["inspect"], requiredScopes: ["project:read"], description: [ diff --git a/packages/mcp-core/src/tools/catalog/get-profile-details.ts b/packages/mcp-core/src/tools/catalog/get-profile-details.ts index ad40135b2..6367b75bb 100644 --- a/packages/mcp-core/src/tools/catalog/get-profile-details.ts +++ b/packages/mcp-core/src/tools/catalog/get-profile-details.ts @@ -177,6 +177,7 @@ async function resolveProjectContext( export default defineTool({ name: "get_profile_details", + title: "Get Profile Details", skills: ["inspect"], requiredScopes: ["event:read"], requiredCapabilities: ["profiles"], diff --git a/packages/mcp-core/src/tools/catalog/get-profile.ts b/packages/mcp-core/src/tools/catalog/get-profile.ts index 3991f61f2..35af548e0 100644 --- a/packages/mcp-core/src/tools/catalog/get-profile.ts +++ b/packages/mcp-core/src/tools/catalog/get-profile.ts @@ -79,6 +79,7 @@ function resolveProfileParams(params: { export default defineTool({ name: "get_profile", + title: "Get Transaction Profile", skills: ["inspect"], requiredScopes: ["event:read"], requiredCapabilities: ["profiles"], diff --git a/packages/mcp-core/src/tools/catalog/get-release-details.ts b/packages/mcp-core/src/tools/catalog/get-release-details.ts index 5d7069208..4334ba28f 100644 --- a/packages/mcp-core/src/tools/catalog/get-release-details.ts +++ b/packages/mcp-core/src/tools/catalog/get-release-details.ts @@ -144,6 +144,7 @@ function toHealth(release: ReleaseDetails): ReleaseHealth { export default defineTool({ name: "get_release_details", + title: "Get Release Details", skills: ["inspect"], requiredScopes: ["project:read"], description: [ diff --git a/packages/mcp-core/src/tools/catalog/get-replay-details.ts b/packages/mcp-core/src/tools/catalog/get-replay-details.ts index 5703a0308..502988f0c 100644 --- a/packages/mcp-core/src/tools/catalog/get-replay-details.ts +++ b/packages/mcp-core/src/tools/catalog/get-replay-details.ts @@ -73,6 +73,7 @@ const MAX_REPLAY_SEGMENTS = 500; export default defineTool({ name: "get_replay_details", + title: "Get Replay Details", skills: ["inspect"], requiredScopes: ["org:read", "project:read", "event:read"], requiredCapabilities: ["replays"], diff --git a/packages/mcp-core/src/tools/catalog/get-sentry-mcp-info.ts b/packages/mcp-core/src/tools/catalog/get-sentry-mcp-info.ts index 01b18605d..100209030 100644 --- a/packages/mcp-core/src/tools/catalog/get-sentry-mcp-info.ts +++ b/packages/mcp-core/src/tools/catalog/get-sentry-mcp-info.ts @@ -10,6 +10,7 @@ export const getSentryMcpInfoOutputSchema = z.object({ export default defineTool({ name: "get_sentry_mcp_info", + title: "Get Sentry MCP Info", description: [ "Get information about the running Sentry MCP server.", "", diff --git a/packages/mcp-core/src/tools/catalog/get-sentry-resource.ts b/packages/mcp-core/src/tools/catalog/get-sentry-resource.ts index 6180f77e2..e2438b270 100644 --- a/packages/mcp-core/src/tools/catalog/get-sentry-resource.ts +++ b/packages/mcp-core/src/tools/catalog/get-sentry-resource.ts @@ -491,6 +491,7 @@ function generateUnsupportedResourceMessage( export default defineTool({ name: "get_sentry_resource", + title: "Get Sentry Resource", skills: ["inspect", "triage", "seer"], requiredScopes: ["event:read", "project:read"], diff --git a/packages/mcp-core/src/tools/catalog/get-snapshot-image.ts b/packages/mcp-core/src/tools/catalog/get-snapshot-image.ts index db0f8f060..58190a19b 100644 --- a/packages/mcp-core/src/tools/catalog/get-snapshot-image.ts +++ b/packages/mcp-core/src/tools/catalog/get-snapshot-image.ts @@ -9,6 +9,7 @@ import { fetchSnapshotImage } from "../support/snapshots/handlers"; export default defineTool({ name: "get_snapshot_image", + title: "Get Snapshot Image", skills: ["inspect"], requiredScopes: ["project:read"], description: [ diff --git a/packages/mcp-core/src/tools/catalog/get-snapshot.ts b/packages/mcp-core/src/tools/catalog/get-snapshot.ts index 380b34194..e42bc35af 100644 --- a/packages/mcp-core/src/tools/catalog/get-snapshot.ts +++ b/packages/mcp-core/src/tools/catalog/get-snapshot.ts @@ -10,6 +10,7 @@ import { fetchSnapshotSummary } from "../support/snapshots/handlers"; export default defineTool({ name: "get_snapshot", + title: "Get Snapshot", skills: ["inspect"], requiredScopes: ["project:read"], description: ({ experimentalMode, availableToolNames, directToolNames }) => { diff --git a/packages/mcp-core/src/tools/catalog/get-span-details.ts b/packages/mcp-core/src/tools/catalog/get-span-details.ts index fd9e88ffe..59701466d 100644 --- a/packages/mcp-core/src/tools/catalog/get-span-details.ts +++ b/packages/mcp-core/src/tools/catalog/get-span-details.ts @@ -10,6 +10,7 @@ import getTraceDetails from "./get-trace-details"; export default defineTool({ name: "get_span_details", + title: "Get Span Details", skills: ["inspect"], requiredScopes: ["event:read"], requiredCapabilities: ["traces"], diff --git a/packages/mcp-core/src/tools/catalog/get-trace-details.ts b/packages/mcp-core/src/tools/catalog/get-trace-details.ts index ba2758b10..4146f3b2e 100644 --- a/packages/mcp-core/src/tools/catalog/get-trace-details.ts +++ b/packages/mcp-core/src/tools/catalog/get-trace-details.ts @@ -60,6 +60,7 @@ interface SpanExpansionCandidate { export default defineTool({ name: "get_trace_details", + title: "Get Trace Details", skills: ["inspect"], // Only available in inspect skill requiredScopes: ["event:read"], requiredCapabilities: ["traces"], diff --git a/packages/mcp-core/src/tools/catalog/get-uptime-monitor-details.ts b/packages/mcp-core/src/tools/catalog/get-uptime-monitor-details.ts index d1a06cdea..f0c791ad5 100644 --- a/packages/mcp-core/src/tools/catalog/get-uptime-monitor-details.ts +++ b/packages/mcp-core/src/tools/catalog/get-uptime-monitor-details.ts @@ -58,6 +58,7 @@ function formatCheck( export default defineTool({ name: "get_uptime_monitor_details", + title: "Get Uptime Monitor Details", skills: ["inspect"], requiredScopes: ["project:read"], description: [ diff --git a/packages/mcp-core/src/tools/catalog/index.ts b/packages/mcp-core/src/tools/catalog/index.ts index 8d0b81765..36e99f2d5 100644 --- a/packages/mcp-core/src/tools/catalog/index.ts +++ b/packages/mcp-core/src/tools/catalog/index.ts @@ -79,6 +79,7 @@ import type { ToolConfig } from "../types"; const legacyGetAIConversationDetails = { ...getAgentConversationDetails, name: "get_ai_conversation_details", + title: "Get AI Conversation Details (Deprecated)", includeInSkillDefinitions: false, deprecated: { replacedBy: ["get_agent_conversation_details"] }, description: [ @@ -91,6 +92,7 @@ const legacyGetAIConversationDetails = { const legacySearchAIConversations = { ...searchAgentConversations, name: "search_ai_conversations", + title: "Search AI Conversations (Deprecated)", includeInSkillDefinitions: false, deprecated: { replacedBy: ["search_agent_conversations"] }, description: [ diff --git a/packages/mcp-core/src/tools/catalog/link-issue.ts b/packages/mcp-core/src/tools/catalog/link-issue.ts index 7823d60d1..88a565345 100644 --- a/packages/mcp-core/src/tools/catalog/link-issue.ts +++ b/packages/mcp-core/src/tools/catalog/link-issue.ts @@ -10,6 +10,7 @@ import { export default defineTool({ name: "link_issue", + title: "Link Issue", skills: ["triage"], requiredScopes: ["event:write", "org:read"], description: [ diff --git a/packages/mcp-core/src/tools/catalog/onboarding-status-update.ts b/packages/mcp-core/src/tools/catalog/onboarding-status-update.ts index c5c152868..42baecd89 100644 --- a/packages/mcp-core/src/tools/catalog/onboarding-status-update.ts +++ b/packages/mcp-core/src/tools/catalog/onboarding-status-update.ts @@ -94,6 +94,7 @@ const onboardingUpdateSchema = z export default defineTool({ name: "onboarding_status_update", + title: "Update Onboarding Status", skills: ALL_SKILLS, includeInSkillDefinitions: false, requiredScopes: ["org:read"], diff --git a/packages/mcp-core/src/tools/catalog/remove-team-from-project.ts b/packages/mcp-core/src/tools/catalog/remove-team-from-project.ts index 59fc94b39..3b6753927 100644 --- a/packages/mcp-core/src/tools/catalog/remove-team-from-project.ts +++ b/packages/mcp-core/src/tools/catalog/remove-team-from-project.ts @@ -34,6 +34,7 @@ function mapTeam(team: Team) { export default defineTool({ name: "remove_team_from_project", + title: "Remove Team from Project", skills: ["project-management"], requiredScopes: ["project:write", "team:read", "org:read"], description: [ diff --git a/packages/mcp-core/src/tools/catalog/search-agent-conversations.ts b/packages/mcp-core/src/tools/catalog/search-agent-conversations.ts index bd3168401..4ff9b5296 100644 --- a/packages/mcp-core/src/tools/catalog/search-agent-conversations.ts +++ b/packages/mcp-core/src/tools/catalog/search-agent-conversations.ts @@ -200,6 +200,7 @@ function buildArtifact( export default defineTool({ name: "search_agent_conversations", + title: "Search Agent Conversations", skills: ["inspect", "triage", "seer"], requiredScopes: ["event:read", "project:read"], description: [ diff --git a/packages/mcp-core/src/tools/catalog/search-attributes.ts b/packages/mcp-core/src/tools/catalog/search-attributes.ts index ec17941d5..aab44ec22 100644 --- a/packages/mcp-core/src/tools/catalog/search-attributes.ts +++ b/packages/mcp-core/src/tools/catalog/search-attributes.ts @@ -18,6 +18,7 @@ export default defineTool({ experimental: true, includeInSkillDefinitions: false, name: "search_attributes", + title: "Search Attributes", // TODO: Edit this description, figure out what we want it to do description: [ "Find span, log, or metric attribute keys in Sentry: which attributes exist, their types, short descriptions, and whether they're deprecated or follow semantic conventions.", diff --git a/packages/mcp-core/src/tools/catalog/search-docs.ts b/packages/mcp-core/src/tools/catalog/search-docs.ts index eef7cee6f..514926bc3 100644 --- a/packages/mcp-core/src/tools/catalog/search-docs.ts +++ b/packages/mcp-core/src/tools/catalog/search-docs.ts @@ -10,6 +10,7 @@ import type { SearchResponse } from "../types"; export default defineTool({ name: "search_docs", + title: "Search Sentry Docs", skills: ["inspect", "docs"], // Docs is retained for legacy docs-only grants. requiredScopes: [], description: ({ experimentalMode, availableToolNames, directToolNames }) => diff --git a/packages/mcp-core/src/tools/catalog/search-errors.ts b/packages/mcp-core/src/tools/catalog/search-errors.ts index 8953999e0..5b649c372 100644 --- a/packages/mcp-core/src/tools/catalog/search-errors.ts +++ b/packages/mcp-core/src/tools/catalog/search-errors.ts @@ -9,6 +9,7 @@ import { export default defineTool({ ...searchToolBase("search_errors"), name: "search_errors", + title: "Search Errors", description: [ "Search Sentry error events: exceptions and crashes with stack traces. Use for error counts, statistics, trends, and individual error events.", "", diff --git a/packages/mcp-core/src/tools/catalog/search-events.ts b/packages/mcp-core/src/tools/catalog/search-events.ts index 4c36bba76..02c0effa0 100644 --- a/packages/mcp-core/src/tools/catalog/search-events.ts +++ b/packages/mcp-core/src/tools/catalog/search-events.ts @@ -13,6 +13,7 @@ import { export default defineTool({ ...searchToolBase("search_events"), name: "search_events", + title: "Search Events", includeInSkillDefinitions: false, deprecated: { replacedBy: [ diff --git a/packages/mcp-core/src/tools/catalog/search-issue-events.ts b/packages/mcp-core/src/tools/catalog/search-issue-events.ts index 60d27e72b..89b9b7536 100644 --- a/packages/mcp-core/src/tools/catalog/search-issue-events.ts +++ b/packages/mcp-core/src/tools/catalog/search-issue-events.ts @@ -44,6 +44,7 @@ function buildIssueEventSearchRepairPrompt(params: { export default defineTool({ name: "search_issue_events", + title: "Search Issue Events", skills: ["inspect", "triage"], // Available in inspect and triage skills requiredScopes: ["event:read"], description: [ diff --git a/packages/mcp-core/src/tools/catalog/search-issues.ts b/packages/mcp-core/src/tools/catalog/search-issues.ts index 749aa4681..4fe8560d5 100644 --- a/packages/mcp-core/src/tools/catalog/search-issues.ts +++ b/packages/mcp-core/src/tools/catalog/search-issues.ts @@ -63,6 +63,7 @@ function buildIssueSearchRepairPrompt(params: { export default defineTool({ name: "search_issues", + title: "Search Issues", skills: ["inspect", "triage", "seer"], // Available in inspect, triage, and seer skills requiredScopes: ["event:read"], description: [ diff --git a/packages/mcp-core/src/tools/catalog/search-logs.ts b/packages/mcp-core/src/tools/catalog/search-logs.ts index 1f17f5a16..40aceba23 100644 --- a/packages/mcp-core/src/tools/catalog/search-logs.ts +++ b/packages/mcp-core/src/tools/catalog/search-logs.ts @@ -9,6 +9,7 @@ import { export default defineTool({ ...searchToolBase("search_logs"), name: "search_logs", + title: "Search Logs", description: [ "Search Sentry logs: application log entries, including error- and warning-severity log messages. Use for log counts, statistics, trends, and individual log lines.", "", diff --git a/packages/mcp-core/src/tools/catalog/search-metrics.ts b/packages/mcp-core/src/tools/catalog/search-metrics.ts index 8b6807066..44010b527 100644 --- a/packages/mcp-core/src/tools/catalog/search-metrics.ts +++ b/packages/mcp-core/src/tools/catalog/search-metrics.ts @@ -9,6 +9,7 @@ import { export default defineTool({ ...searchToolBase("search_metrics"), name: "search_metrics", + title: "Search Metrics", description: [ "Search Sentry metrics: counters, gauges, and distributions, as rows or aggregates. Use for metric values, percentiles, totals, and trends.", "", diff --git a/packages/mcp-core/src/tools/catalog/search-profiles.ts b/packages/mcp-core/src/tools/catalog/search-profiles.ts index d959cfb6d..208352ed0 100644 --- a/packages/mcp-core/src/tools/catalog/search-profiles.ts +++ b/packages/mcp-core/src/tools/catalog/search-profiles.ts @@ -9,6 +9,7 @@ import { export default defineTool({ ...searchToolBase("search_profiles"), name: "search_profiles", + title: "Search Profiles", description: [ "Search Sentry profiles: transaction and continuous profile results, profile IDs, and profiled transactions. Use to find profiles to inspect.", "", diff --git a/packages/mcp-core/src/tools/catalog/search-replays.ts b/packages/mcp-core/src/tools/catalog/search-replays.ts index 455b80ad1..0244a9994 100644 --- a/packages/mcp-core/src/tools/catalog/search-replays.ts +++ b/packages/mcp-core/src/tools/catalog/search-replays.ts @@ -9,6 +9,7 @@ import { export default defineTool({ ...searchToolBase("search_replays"), name: "search_replays", + title: "Search Replays", description: [ "Search Sentry session replays: rage clicks, dead clicks, visited pages, errors seen, and replay users.", "", diff --git a/packages/mcp-core/src/tools/catalog/search-traces.ts b/packages/mcp-core/src/tools/catalog/search-traces.ts index ef81ded85..97b8ab843 100644 --- a/packages/mcp-core/src/tools/catalog/search-traces.ts +++ b/packages/mcp-core/src/tools/catalog/search-traces.ts @@ -9,6 +9,7 @@ import { export default defineTool({ ...searchToolBase("search_traces"), name: "search_traces", + title: "Search Traces", description: [ "Search Sentry spans and traces: requests, API/HTTP calls, endpoints, DB queries, AI/LLM calls, and other operations. Use for latency, throughput, slowness, and performance questions.", "", diff --git a/packages/mcp-core/src/tools/catalog/submit-feedback-to-sentry-team.ts b/packages/mcp-core/src/tools/catalog/submit-feedback-to-sentry-team.ts index e8dc0f9b6..899e521ff 100644 --- a/packages/mcp-core/src/tools/catalog/submit-feedback-to-sentry-team.ts +++ b/packages/mcp-core/src/tools/catalog/submit-feedback-to-sentry-team.ts @@ -33,6 +33,7 @@ export const submitFeedbackToSentryTeamOutputSchema = z.object({ export default defineTool({ name: "submit_feedback_to_sentry_team", + title: "Submit Feedback to Sentry Team", description: [ "Report friction with the Sentry MCP server to its maintainers.", "", diff --git a/packages/mcp-core/src/tools/catalog/unlink-issue.ts b/packages/mcp-core/src/tools/catalog/unlink-issue.ts index 2310b2d4f..142ec8c9f 100644 --- a/packages/mcp-core/src/tools/catalog/unlink-issue.ts +++ b/packages/mcp-core/src/tools/catalog/unlink-issue.ts @@ -9,6 +9,7 @@ import { export default defineTool({ name: "unlink_issue", + title: "Unlink Issue", skills: ["triage"], requiredScopes: ["event:write", "org:read"], description: [ diff --git a/packages/mcp-core/src/tools/catalog/update-alert-rule.ts b/packages/mcp-core/src/tools/catalog/update-alert-rule.ts index 0d1395ad5..bc7bfab01 100644 --- a/packages/mcp-core/src/tools/catalog/update-alert-rule.ts +++ b/packages/mcp-core/src/tools/catalog/update-alert-rule.ts @@ -73,6 +73,7 @@ function resolveChangedSlackDestinations( export default defineTool({ name: "update_alert_rule", + title: "Update Alert Rule", skills: ["project-management"], requiredScopes: ["org:read", "project:read", "alerts:write"], description: [ diff --git a/packages/mcp-core/src/tools/catalog/update-dsn.ts b/packages/mcp-core/src/tools/catalog/update-dsn.ts index f0cd77762..dcc48b064 100644 --- a/packages/mcp-core/src/tools/catalog/update-dsn.ts +++ b/packages/mcp-core/src/tools/catalog/update-dsn.ts @@ -13,6 +13,7 @@ import { validateResourceId } from "../../utils/slug-validation"; export default defineTool({ name: "update_dsn", + title: "Update DSN", skills: ["project-management"], // DSN management is part of project setup requiredScopes: ["project:write"], description: [ diff --git a/packages/mcp-core/src/tools/catalog/update-issue.ts b/packages/mcp-core/src/tools/catalog/update-issue.ts index c11ca3993..175055259 100644 --- a/packages/mcp-core/src/tools/catalog/update-issue.ts +++ b/packages/mcp-core/src/tools/catalog/update-issue.ts @@ -649,6 +649,7 @@ function formatReasonCommentLine( export default defineTool({ name: "update_issue", + title: "Update Issue", skills: ["triage"], // Only available in triage skill requiredScopes: ["event:write"], description: [ diff --git a/packages/mcp-core/src/tools/catalog/update-metric-monitor.ts b/packages/mcp-core/src/tools/catalog/update-metric-monitor.ts index bb2402e52..cc1280712 100644 --- a/packages/mcp-core/src/tools/catalog/update-metric-monitor.ts +++ b/packages/mcp-core/src/tools/catalog/update-metric-monitor.ts @@ -17,6 +17,7 @@ import { export default defineTool({ name: "update_metric_monitor", + title: "Update Metric Monitor", skills: ["project-management"], requiredScopes: ["org:read", "project:read", "alerts:write"], description: [ diff --git a/packages/mcp-core/src/tools/catalog/update-project.ts b/packages/mcp-core/src/tools/catalog/update-project.ts index 30b31406b..7dca0a3ab 100644 --- a/packages/mcp-core/src/tools/catalog/update-project.ts +++ b/packages/mcp-core/src/tools/catalog/update-project.ts @@ -26,6 +26,7 @@ export const updateProjectOutputSchema = z.object({ export default defineTool({ name: "update_project", + title: "Update Project", skills: ["project-management"], // Only available in project-management skill requiredScopes: ["project:write"], description: [ diff --git a/packages/mcp-core/src/tools/catalog/update-uptime-monitor.ts b/packages/mcp-core/src/tools/catalog/update-uptime-monitor.ts index 9f3926476..d29125084 100644 --- a/packages/mcp-core/src/tools/catalog/update-uptime-monitor.ts +++ b/packages/mcp-core/src/tools/catalog/update-uptime-monitor.ts @@ -34,6 +34,7 @@ function hasDefinedUpdate( export default defineTool({ name: "update_uptime_monitor", + title: "Update Uptime Monitor", skills: ["project-management"], requiredScopes: ["project:write"], description: [ diff --git a/packages/mcp-core/src/tools/catalog/whoami.ts b/packages/mcp-core/src/tools/catalog/whoami.ts index fd40e5106..7de27f17d 100644 --- a/packages/mcp-core/src/tools/catalog/whoami.ts +++ b/packages/mcp-core/src/tools/catalog/whoami.ts @@ -42,6 +42,7 @@ function toUser(user: { export default defineTool({ name: "whoami", + title: "Who Am I", description: [ "Identify the authenticated user in Sentry.", "", diff --git a/packages/mcp-core/src/tools/special/execute-tool.ts b/packages/mcp-core/src/tools/special/execute-tool.ts index 0f11961bc..0f1e38380 100644 --- a/packages/mcp-core/src/tools/special/execute-tool.ts +++ b/packages/mcp-core/src/tools/special/execute-tool.ts @@ -91,6 +91,7 @@ async function executeCatalogToolWithSpan({ export function createExecuteTool(getTools: () => ToolRegistry) { return defineTool({ name: "execute_sentry_tool", + title: "Execute Sentry Tool", skills: ALL_SKILLS, requiredScopes: [], description: [ diff --git a/packages/mcp-core/src/tools/special/search-tools.ts b/packages/mcp-core/src/tools/special/search-tools.ts index eb6512ec4..7a807ff1e 100644 --- a/packages/mcp-core/src/tools/special/search-tools.ts +++ b/packages/mcp-core/src/tools/special/search-tools.ts @@ -52,6 +52,7 @@ function createSearchToolsResult(payload: SearchToolsOutput) { export function createSearchToolsTool(getTools: () => ToolRegistry) { return defineTool({ name: "search_sentry_tools", + title: "Search Sentry Tools", skills: ALL_SKILLS, requiredScopes: [], description: [ diff --git a/packages/mcp-core/src/tools/tools.test.ts b/packages/mcp-core/src/tools/tools.test.ts index 53ad6991f..0fc41f888 100644 --- a/packages/mcp-core/src/tools/tools.test.ts +++ b/packages/mcp-core/src/tools/tools.test.ts @@ -59,6 +59,16 @@ test(`all tool descriptions under maximum length`, () => { } }); +test("all tools declare a unique display title", () => { + const seen = new Map(); + for (const tool of Object.values(tools.default)) { + assert(tool.title.trim(), `${tool.name} must define a non-empty title`); + const owner = seen.get(tool.title); + assert(!owner, `${tool.name} reuses the title of ${owner}`); + seen.set(tool.title, tool.name); + } +}); + test("all tools declare complete MCP safety annotations", () => { for (const tool of Object.values(tools.default)) { // Every tool must declare readOnlyHint, destructiveHint, and openWorldHint diff --git a/packages/mcp-core/src/tools/types.ts b/packages/mcp-core/src/tools/types.ts index 95dff2ee5..34dc44e77 100644 --- a/packages/mcp-core/src/tools/types.ts +++ b/packages/mcp-core/src/tools/types.ts @@ -82,6 +82,8 @@ export interface ToolConfig< TSchema extends Record = Record, > { name: string; + /** Human-readable display name exported as the MCP tool `title`. */ + title: string; description: ToolDescription; inputSchema: TSchema; skills: Skill[]; // Which skill categories this tool belongs to