A morning error briefing
Every weekday at 8:30, search my Sentry organization for unresolved issues first seen in the last 24 hours, and write me a short briefing that names the three affecting the most users and what each one looks like.
Verified MCP server: Sentry
The tool list below is a live capture from the running server; an authenticated tool call is still pending credentials.
The short answer
Last verified 2026-08-03
The Sentry MCP server lets an AI assistant look up your Sentry organizations and projects, search errors, logs and events, pull the details behind one issue, and resolve, assign or ignore it. It is Sentry's own server: the repository belongs to the getsentry organization, the npm package is published by Sentry, and the company also runs a hosted version of it. It needs a credential, a Sentry User Auth Token, so this page is an enumerated verification: we started the server on a Mac with a placeholder token, and the handshake and the complete tool table below are real captures from that live process. The one tool call we made was answered with an authentication error, which is printed here word for word rather than hidden. Every tool name, description and parameter on this page is the server's own text, including the em dash it writes in one of them. [1][3][4]
Verification
Method
We spawned the server with npx over stdio with a placeholder SENTRY_ACCESS_TOKEN in its environment, completed the MCP initialize handshake, and called tools/list. The nine tools below are that response, word for word. We then made one real tool call, find_organizations with no arguments, and Sentry rejected the placeholder credential: its exact reply is the sample call shown here, repeated in the troubleshooting section. So the tool table is enumerated live, and an authenticated call still waits on a real Sentry User Auth Token supplied through the SENTRY_ACCESS_TOKEN environment variable or the --access-token flag.
Startup banner
Warning: No LLM API key found (OPENAI_API_KEY, ANTHROPIC_API_KEY, or OPENROUTER_API_KEY). Agent-assisted search and use_sentry will be unavailable. Search tools still work with direct Sentry query syntax via the 'query' parameter.
One real tool call
tools/call find_organizations {}**Authorization Expired** Sentry rejected the stored access token for this session. Please re-authorize to continue.
Real lines from the captured result: enough to prove the call answered.
Tools
The server answered tools/list with 9 tools on 2026-08-03. The names, descriptions and parameters below are its own words, copied from that response and never edited.
| Tool | What it does |
|---|---|
| find_organizationsquery | Find organizations that the user has access to in Sentry. Use this tool when you need to: - View organizations in Sentry - Find an organization's slug to aid other tool requests - Search for specific organizations by name or slug Returns up to 25 results. If you hit this limit, use the query parameter to narrow down results. |
| find_projectsorganizationSlug*regionUrlquery | Find projects in Sentry. Use this tool when you need to: - View projects in a Sentry organization - Find a project's slug to aid other tool requests - Search for specific projects by name or slug Returns up to 25 results. If you hit this limit, use the query parameter to narrow down results. |
| update_issueorganizationSlugregionUrlissueIdissueUrlstatusassignedToignoreModeignoreDurationMinutesignoreCountignoreWindowMinutesignoreUserCountignoreUserWindowMinutesreason | Update a Sentry issue's status or assignment. Use this to resolve, reopen, assign, or ignore an issue. <examples> ``` update_issue(organizationSlug='my-org', issueId='PROJECT-123', status='resolved') update_issue(organizationSlug='my-org', issueId='PROJECT-123', assignedTo='user:123456') update_issue(organizationSlug='my-org', issueId='PROJECT-123', status='ignored') update_issue(organizationSlug='my-org', issueId='PROJECT-123', status='ignored', ignoreMode='forever') update_issue(organizationSlug='my-org', issueId='PROJECT-123', status='ignored', ignoreMode='untilOccurrenceCount', ignoreCount=100, ignoreWindowMinutes=60) update_issue(organizationSlug='my-org', issueId='PROJECT-123', status='ignored', reason='Ignoring because this is expected noise from the staging deploy') ``` </examples> <hints> - Provide `issueUrl` or `organizationSlug` + `issueId`. - At least one of `status` or `assignedTo` is required. - `assignedTo` format: `user:ID` or `team:ID_OR_SLUG`. - Use `execute_sentry_tool(name='whoami', arguments={})` to find your user ID for self-assignment. - Status values: `resolved`, `resolvedInNextRelease`, `unresolved`, `ignored`. - `status='ignored'` defaults to `ignoreMode='untilEscalating'`. - Ignore modes: `untilEscalating`, `forever`, `forDuration`, `untilOccurrenceCount`, `untilUserCount`. - Matching ignore inputs are `ignoreDurationMinutes`, `ignoreCount` + optional `ignoreWindowMinutes`, or `ignoreUserCount` + optional `ignoreUserWindowMinutes`. - 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. - `reason` is optional. When provided, it will be posted as a comment on the issue's activity feed explaining why the action was taken. </hints> |
| search_eventsorganizationSlug*datasetqueryfieldssortprojectSlugenvironmentperiodregionUrllimitincludeExplanation | Search Sentry events and replays. Use for event counts/statistics. `query` can be natural language or Sentry search syntax. With an agent configured, it fixes dataset, query, fields, and sort before running. Supports TWO query types: 1. AGGREGATIONS (counts, sums, averages): 'how many errors', 'total tokens' 2. Individual events with timestamps: 'error logs from last hour' Datasets: - errors: Exception/crash events with stack traces, usually grouped into issues - logs: Application log entries, including error-severity log messages - spans: Raw trace/span events for performance, AI/LLM calls, requests, and operations - metrics: Metric rows and aggregates: counters, gauges, distributions, values - profiles: Transaction/continuous profile results, profile IDs, profiled transactions - replays: Session replay results: rage clicks, dead clicks, visited pages, replay users If the user says logs, log messages, error logs, or warning logs, choose logs instead of errors. Replay searches return replay lists only; replay count()/avg()/sum() are not supported. NOT for grouped issue lists (use search_issues) or app screenshots/images (use get_latest_base_snapshot). <examples> search_events(organizationSlug='my-org', query='how many errors today') search_events(organizationSlug='my-org', dataset='errors', query='level:error') search_events(organizationSlug='my-org', dataset='errors', fields=['issue', 'count()'], sort='-count()') search_events(organizationSlug='my-org', dataset='spans', query='span.op:db', sort='-span.duration') search_events(organizationSlug='my-org', dataset='replays', query='count_errors:>0', sort='-count_errors') </examples> <hints> - If the user passes a parameter in the form of name/otherName, it's likely in the format of <organizationSlug>/<projectSlug>. - Parse org/project notation directly without calling find_organizations or find_projects. - Use fields with aggregate functions like count(), avg(), sum() for statistics - Sort by -count() for most common, -timestamp for newest </hints> |
| analyze_issue_with_seerorganizationSlugregionUrlissueIdissueUrlinstruction | Use Seer to analyze production errors and get detailed root cause analysis with specific code fixes. Use this tool when: - The user explicitly asks for root cause analysis, Seer analysis, or help fixing/debugging an issue - You are unable to accurately determine the root cause from the issue details alone Do NOT call this tool as an automatic follow-up to get_sentry_resource. What this tool provides: - Root cause analysis with code-level explanations - Specific file locations and line numbers where errors occur - Concrete code fixes you can apply - Step-by-step implementation guidance This tool automatically: 1. Checks if analysis already exists (instant results) 2. Starts new AI analysis if needed (~2-5 minutes) 3. Returns complete fix recommendations <examples> ### User: "Run Seer on this issue" ``` analyze_issue_with_seer(issueUrl='https://my-org.sentry.io/issues/PROJECT-1Z43') ``` ### User: "Analyze this issue and suggest a fix" ``` analyze_issue_with_seer(organizationSlug='my-organization', issueId='ERROR-456') ``` </examples> <hints> - Only use when the user explicitly requests analysis or you cannot determine the root cause from issue details alone - Seer Autofix does not support metric alert issues (issueCategory: metric); use get_issue_details and search_events instead - If the user provides an issueUrl, extract it and use that parameter alone - The analysis includes actual code snippets and fixes, not just error descriptions - Results are cached - subsequent calls return instantly </hints> |
| search_issuesorganizationSlug*querysortprojectSlugOrIdregionUrllimitperiodincludeExplanation | Search for grouped issues/problems in Sentry - returns a LIST of issues, NOT counts or aggregations. Provide `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. Returns grouped issues with metadata like title, status, and user count. Common Query Syntax: - is:unresolved / is:resolved / is:ignored / is:for_review / is:new / is:regressed / is:escalating - level:error / level:warning - firstSeen:-24h / lastSeen:-7d - assigned:me / assigned_or_suggested:me - release:latest - issue.category:feedback - issue.priority:high - environment:production - userCount:>100 DO NOT USE FOR COUNTS/AGGREGATIONS → use search_events DO NOT USE FOR individual events with timestamps → use search_events DO NOT USE FOR details about a specific issue → use get_sentry_resource <examples> search_issues(organizationSlug='my-org', query='critical bugs from last week') search_issues(organizationSlug='my-org', query='is:unresolved is:unassigned', sort='freq') search_issues(organizationSlug='my-org', query='level:error firstSeen:-24h', projectSlugOrId='my-project') </examples> <hints> - If the user passes a parameter in the form of name/otherName, it's likely in the format of <organizationSlug>/<projectSlugOrId>. - Parse org/project notation directly without calling find_organizations or find_projects. - The projectSlugOrId parameter accepts both project slugs (e.g., 'my-project') and numeric IDs (e.g., '123456'). </hints> |
| get_sentry_resourceurlresourceTyperesourceIdorganizationSlug | Fetch a Sentry resource by URL, or by resourceType plus resourceId. Pass a Sentry URL directly when possible; the resource type is auto-detected. Supports issues, events, traces, spans, AI conversations, breadcrumbs, replays, monitors, preprod snapshots, and snapshot images. Trace lookups return a condensed overview by default. AI 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_ai_conversations. Conversations are NOT issues — do not use search_issues for conversation queries. For preprod snapshot URLs (matching 'sentry.io/preprod/snapshots/'): - Without ?selectedSnapshot=: returns the snapshot diff summary (changed, added, removed images) - With ?selectedSnapshot=<image_file_name>: returns the image preview and metadata. Use the Sentry tool `get_snapshot_image` for full-resolution image bytes. Resource IDs: - span: <traceId>:<spanId> - monitor: <monitorSlug> - snapshot: <snapshotId> - snapshotImage: <snapshotId>:<image_file_name> <examples> get_sentry_resource(url='https://sentry.io/issues/PROJECT-123/') get_sentry_resource(resourceType='issue', organizationSlug='my-org', resourceId='PROJECT-123') get_sentry_resource(resourceType='span', organizationSlug='my-org', resourceId='<traceId>:<spanId>') get_sentry_resource(resourceType='ai_conversation', organizationSlug='my-org', resourceId='conversation-123') get_sentry_resource(url='https://sentry.sentry.io/preprod/snapshots/123/') get_sentry_resource(url='https://sentry.sentry.io/preprod/snapshots/123/?selectedSnapshot=login_screen.png') </examples> |
| search_sentry_toolsquery*limit | Search the available Sentry MCP tool catalog by name and description. Many Sentry operations are intentionally not exposed as top-level tools. Use this for any Sentry-related task when you do not see an obvious direct tool, including long-tail inspection, project management, documentation lookup, preprod snapshots, attachments, DSNs, releases, teams, and issue-specific pivots. Use this tool when you need to: - Find the right Sentry operation for a task - Discover catalog tools and their schemas for a task - Inspect the executable JSON input schema for an available tool <examples> search_sentry_tools(query='list projects') search_sentry_tools(query='issue details') search_sentry_tools(query='find dsn', limit=5) search_sentry_tools(query='snapshot image') </examples> <hints> - Results only include tools available in the current session. - If a Sentry operation is not listed as a direct tool, search here before deciding it is unavailable. - Returned schemas already account for active organization, project, and region constraints. - Use the returned name and schema when executing a catalog result. - This tool returns structured JSON. Do not parse markdown from its text content. </hints> |
| execute_sentry_toolname*arguments | Execute an available Sentry MCP tool discovered through search_sentry_tools. Use this tool when you need to: - Call a Sentry operation returned by search_sentry_tools - Execute a tool by name using arguments that match its returned schema <examples> execute_sentry_tool(name='find_projects', arguments={ organizationSlug: 'my-org' }) execute_sentry_tool(name='whoami', arguments={}) </examples> <hints> - Use search_sentry_tools first if you are not sure which name or arguments to pass. - Arguments are validated against the target tool's schema before execution. - Active organization, project, and region constraints are injected automatically. </hints> |
Parameters marked with * are required.
Setup
Copy the block for the app you use. Each one is the configuration this server was verified with.
Open the file ~/Library/Application Support/Claude/claude_desktop_config.json (in Claude Desktop: Settings, then Developer, then Edit Config) and add:
{
"mcpServers": {
"sentry": {
"command": "npx",
"args": [
"-y",
"@sentry/mcp-server"
],
"env": {
"SENTRY_ACCESS_TOKEN": "your-token"
}
}
}
}Replace your-token with a Sentry User Auth Token from your Sentry account settings, then quit and reopen Claude Desktop. Everything else is optional. [7][4]
One command in your terminal:
claude mcp add sentry -e SENTRY_ACCESS_TOKEN=your-token -- npx -y @sentry/mcp-server
The -e flag hands the server one environment variable, and everything after the double dash is the exact command Claude Code will run. Swap your-token for your own Sentry User Auth Token. [8][4]
Add to ~/.cursor/mcp.json for every project, or to .cursor/mcp.json inside one project:
{
"mcpServers": {
"sentry": {
"command": "npx",
"args": [
"-y",
"@sentry/mcp-server"
],
"env": {
"SENTRY_ACCESS_TOKEN": "your-token"
}
}
}
}No JSON file and no terminal. In Routines: Settings, then Assistant, then Connections, then Add MCP Server. Switch the form to Command (stdio) and enter:
Name Sentry Command npx Arguments -y @sentry/mcp-server Environment Variables SENTRY_ACCESS_TOKEN=your-token
The Environment Variables field takes one KEY=value per line, with no quotes around the token. Click Test Connection first: a working server answers with its tool count. [10]
No terminal needed
If you have never opened Terminal and never want to, this is your path. Routines is a Mac app that runs MCP servers for you: fill in a few fields once, and this server's tools are available to your AI in chat and in scheduled routines.
01
Download the app from getroutines.ai/download, drag it to Applications, and sign in.
02
Click your account at the bottom of the sidebar and choose Settings. Open the Assistant section, then the Connections tab, scroll to MCP Servers, and click Add MCP Server.
03
This server needs a credential, so fetch one first. In Sentry, open Settings, then Account, then API, then Auth Tokens, and create a User Auth Token with the scopes the project asks for: org:read, project:read, project:write, team:read, team:write and event:write. Copy it straight away, Sentry shows the value only once. If your account is on sentry.io, you can skip the token screen and run npx @sentry/mcp-server auth login instead, which signs you in with a device code.
04
Switch the form to Command (stdio): this server is a command your Mac runs, not a web address. Name: Sentry. Command: npx. Arguments: -y @sentry/mcp-server. Then in Environment Variables add one line, SENTRY_ACCESS_TOKEN=, followed by the token you just copied, with no quotes and no spaces around the equals sign.
05
Click Test Connection: Routines starts the server and reports how many tools it found, nine for this one. A wrong or expired token still connects and still counts nine tools, because the count comes from the handshake; you will only see the credential problem on the first real question you ask. Then click Add Server.
06
The tools work in chat right away. To let a scheduled routine use them, open the routine, find the Tools & connections card, and tick the server under Apps.
Routine ideas
Once the server is connected, a scheduled routine can use its tools while you are away. Copy a prompt, paste it into Routines, and pick a time.
Every weekday at 8:30, search my Sentry organization for unresolved issues first seen in the last 24 hours, and write me a short briefing that names the three affecting the most users and what each one looks like.
Every Friday at 17:00, list the unresolved Sentry issues in my main project sorted by how often they happened this week, note which ones are new since Monday, and save the list as sentry-week.md in my Documents folder.
Every Monday at 9:00, find the Sentry issues that have been unresolved and unassigned for more than 14 days, and give me one line on each with a suggestion: fix it, assign it, or ignore it.
Troubleshooting
Real errors captured during the verification run, printed exactly as the server returned them.
What you see
**Authorization Expired** Sentry rejected the stored access token for this session. Please re-authorize to continue.
The fix
This is the exact reply our run got, because we started the server with a placeholder token on purpose. Sentry refused the credential the server was launched with. Create a Sentry User Auth Token in your Sentry account settings, put it in the SENTRY_ACCESS_TOKEN environment variable (or pass --access-token on the command line), and restart the server. Tokens are also scoped, so a token that can read organizations can still be refused for writes: give it org:read, project:read, project:write, team:read, team:write and event:write. On sentry.io you can instead run npx @sentry/mcp-server auth login and sign in with the device code it prints.
What you see
SENTRY_HOST should only contain a hostname (e.g., sentry.example.com). Use SENTRY_URL if you want to provide a full URL.
The fix
We printed this line on a second run by setting SENTRY_HOST to a full web address. That setting is only for teams running Sentry on their own servers, and it wants a bare host name with no https:// in front. Either remove it, which points the server at sentry.io, or write just the host name as the message shows.
What you see
Warning: No LLM API key found (OPENAI_API_KEY, ANTHROPIC_API_KEY, or OPENROUTER_API_KEY). Agent-assisted search and use_sentry will be unavailable. Search tools still work with direct Sentry query syntax via the 'query' parameter.
The fix
Not a fault, and nothing is broken. The two search tools can call a language model of their own to turn a plain-English question into Sentry search syntax, and that extra step needs its own provider key. Without one the server says so and skips it, and everything else works. If you want it, add a provider key such as OPENAI_API_KEY or ANTHROPIC_API_KEY and set EMBEDDED_AGENT_PROVIDER to the matching provider name in the same Environment Variables field.
The fix
The npx command belongs to Node.js. If Node is not installed on your Mac, every client on this page fails at the spawn step before the server can say anything. Install Node from nodejs.org, restart your MCP client, and try again.
FAQ
It is Sentry's own connector for AI assistants. Once it is set up, an assistant such as Claude can search your Sentry organizations, projects, issues and events, read the detail behind a single error, and change an issue's status or owner, all in ordinary conversation. Sentry describes it as built mainly for human-in-the-loop coding agents and debugging work rather than as a general-purpose gateway to everything Sentry can do. [3][4]
The running server exposes 9 tools: finding things (find_organizations, find_projects), searching (search_events for counts and individual events, search_issues for grouped issue lists), reading one thing in detail (get_sentry_resource), acting on an issue (update_issue, analyze_issue_with_seer), and a two-step escape hatch for everything else (search_sentry_tools to look up an operation, execute_sentry_tool to run it). The table above is the live tools/list output, word for word.
It is only as narrow as the token you give it. The scopes Sentry's own docs ask for include project:write and team:write, so a token created that way can change issues, not merely read them, and update_issue is a real write tool that resolves, assigns and ignores. If you only want the assistant to look, create a read-only token with org:read, project:read, team:read and event:read, which the project documents as enough for reading. Nothing on this page proves what any token can do in your account: we deliberately ran with a placeholder, and Sentry rejected it. [4][5]
No. In Routines you fill in a few fields in Settings, paste the token into Environment Variables, and click Test Connection; the walkthrough above shows every click. Claude Desktop and Cursor each need one small JSON file edited once. Only Claude Code is terminal-first by nature. [10][7]
Yes. You need a Sentry account and a Sentry User Auth Token, which the project documents as the credential for running the server on your own machine. The token goes in the SENTRY_ACCESS_TOKEN environment variable or in an --access-token flag. Two search helpers can optionally use a language model of their own, and that is a separate key you can leave out entirely. [4][5]
Any MCP client that can launch a local command: Claude Desktop, Claude Code, Cursor, and Routines all can, and the exact config for each is above. The server itself is the same in every client; only the place you paste the config differs. [7][8][9][10]
Sentry runs the same server as a hosted service at mcp.sentry.dev, which its documentation treats as the main route and where signing in is handled for you in the browser. The version on this page is the other route: the npm package started on your own Mac, which Sentry calls a work in progress and recommends mainly for teams running Sentry on their own servers. We verified the one you run yourself, because that is the one you can inspect. [4]
Sources
Anything on this page we did not observe in the run is linked here, with the date we read it. The run itself is the receipt for the rest.
[1]
Latest version 0.37.0, published 2026-07-02; license FSL-1.1-ALv2; publisher sentry-bot at accounts@sentry.io; author field Sentry.
[2]
[3]
806 stars, 131 forks and a push dated 2026-08-01 at access time; the owner getsentry is a GitHub organization account.
[4]
The client config JSON, the environment variables, the auth token scopes, and the note that the hosted service at mcp.sentry.dev is the primary route while stdio is a work in progress.
[5]
Spells out the Sentry User Auth Token scopes for stdio, and the reduced read-only set of org:read, project:read, team:read and event:read.
[6]
The extensionless LICENSE path returns 404; the license itself lives at LICENSE.md, the Functional Source License 1.1 with an Apache 2.0 future license. The GitHub API reports it as Other with the SPDX id NOASSERTION, because the FSL is not on the SPDX license list, so the npm registry value, FSL-1.1-ALv2, is the one to cite.
[7]
Where the Claude Desktop config file lives and the shape it expects.
[8]
The claude mcp add syntax for local stdio servers, including environment variables.
[9]
[10]
How Routines runs one-click OAuth connectors and any MCP server.
This page describes Sentry as it behaved in one dated run on one Mac. Versions move: if something here no longer matches what you see, the capture date at the top says how old the reading is.
Behind this directory
Routines, the app behind this directory, runs MCP servers like this one without a terminal: see how connectors work. Your notes stay markdown files on your Mac, there is no cloud bill, and it works offline. Download Routines