docs

MCP server

Connect Claude, Cursor and other MCP clients to Unhandled over OAuth and let them query and act on your telemetry.

unhandled runs a Model Context Protocol server. Connect an AI assistant to it and the assistant can read your issues, traces, logs, metrics, monitors and alerts, and, if you grant it, change some of them. You sign in through OAuth in the browser, so there is no API key to copy into a config file.

Connect a client

Every client below uses the same server URL, /mcp on your Unhandled domain. Replace https://unhandled.example.com with yours.

  1. Sign in to unhandled

    Open Unhandled in your default browser and sign in. The client sends you to a consent page that only signed-in users can open.

  2. Add the server to your client

    Terminal
    claude mcp add --transport http unhandled https://unhandled.example.com/mcp

    Then run /mcp inside Claude Code and pick unhandled to sign in.

  3. Approve access

    The client opens Unhandled's consent page. Pick the organization this connection may use. If the client asks for write access, you can choose Read only instead of Read and write. Then click Allow access.

  4. Ask a question

    Try "which issues regressed in production since yesterday?" or "why did the checkout monitor go down?".

POST/mcpMCP requests

The server speaks the Streamable HTTP transport in stateless mode. Each JSON-RPC message is its own POST /mcp, answered with a JSON response. The server offers tools only, with no resources or prompts.

authorizationstringrequired

Bearer <access token>. A missing, expired or revoked token returns 401 with a www-authenticate header that points at the protected resource metadata.

content-typestringrequired

application/json. A body that is not valid JSON returns 400 with the JSON-RPC parse error -32700.

GET /mcp and DELETE /mcp return 405 with an allow: POST header, since the server keeps no sessions.

A request with an Origin header must come from the Unhandled app URL, a loopback address, or an origin listed in the MCP_ALLOWED_ORIGINS environment variable (comma-separated). Any other origin gets 403. Requests without an Origin header, which is how most MCP clients connect, are not affected.

Limits

LimitValueOver the limit
Requests per access token120 a minute429 with a Retry-After header
Tool calls per organization600 a minute, across all connections that reach it; only calls that pass every check countThe call returns an error result: "Too many calls right now; retry after N s"
Tool calls per member in an organization200 a minute, across all of that member's connectionsThe call returns an error result: "Too many calls right now; retry after N s"
create_organization per user5 an hour, shared with organizations created in the appThe call returns an error result: "Too many calls right now; retry after N s"
Organizations a user administers, for create_organization and the app10, set with ORGANIZATIONS_PER_USER (MCP_ORGANIZATIONS_PER_USER still works as a fallback)The call returns an error result that names the limit
create_invitation per user20 an hour, shared with invitations sent from the app; at most 3 a day to one address and 100 a day from one organizationThe call returns an error result: "Too many calls right now; retry after N s"
Live connections per user and app5, set with MCP_CONNECTIONS_PER_APPA new consent revokes the oldest connection
test_monitor and test_notification_channel per user10 a minute each, shared by all your connectionsThe call returns an error result: "Too many calls right now; retry after N s"
Status page subscriber emails per organization10 an hour across all connections, set with MCP_SUBSCRIBER_NOTIFICATIONS_PER_HOURThe call returns an error result: "Too many calls right now; retry after N s"
accept_invitation per user10 every 15 minutes, shared with the browserThe call returns an error result: "Too many calls right now; retry after N s"
submit_doc_feedback per user30 an hour, shared with the browserThe call returns an error result: "Too many calls right now; retry after N s"
Requests per IP address600 a minute429 with a Retry-After header
Tool calls running at once, per access token4, plus 4 waitingThe call returns an error result: "Too many calls right now; retry after 2 s"
Time per tool call25 secondsThe query is cancelled and the call returns "Query timed out; narrow the range or add filters"

When a tool fails for a reason the caller cannot fix, the result says the tool failed unexpectedly and the server logs the details. It never returns the database error. Calling a tool that does not exist returns the JSON-RPC error -32602.

OAuth endpoints

Unhandled is its own OAuth 2.1 authorization server. MCP clients discover and call these endpoints on their own. You only need them when you write a client yourself.

GET/.well-known/oauth-protected-resource/mcpProtected resource metadata

RFC 9728 metadata for the /mcp resource. /.well-known/oauth-protected-resource returns the same document.

GET/.well-known/oauth-authorization-serverAuthorization server metadata

RFC 8414 metadata: the endpoints below, the supported scopes, and S256 as the only PKCE method.

POST/oauth/registerRegister a client

RFC 7591 dynamic client registration. Send 1 to 10 redirect_uris and an optional client_name. Each redirect URI must use https, a loopback http address or an app scheme. One IP address can register 10 clients an hour.

GET/oauth/authorizeConsent page

Shows the consent page to a signed-in user. The request needs response_type=code, a code_challenge and code_challenge_method=S256. The user's decision posts back to POST /oauth/authorize.

POST/oauth/tokenExchange or refresh a token

Accepts the authorization_code grant with the PKCE code_verifier, and the refresh_token grant. Each client_id can call it 60 times a minute and each IP address 120 times a minute. Over the limit it answers 429 with a Retry-After header.

POST/oauth/revokeRevoke a token

RFC 7009 revocation. Send the access or refresh token as token, and optionally your client_id.

Clients are public: they get no client secret and must use PKCE.

CredentialLifetime
Authorization code10 minutes
Access token1 hour
Refresh token30 days, replaced on every refresh

A refresh token works once. If a client sends any refresh token the grant has already rotated away from, Unhandled revokes the whole grant and the client has to ask for consent again. An authorization code also works once; redeeming it a second time revokes the tokens the first exchange issued.

Scopes and access

A connection belongs to you, not to one organization. Every app registers itself, so the consent page marks it Unverified app, notes that the app chose its own name, and shows the address it sends you back to and the day it registered. On the consent page you pick two things:

  • What it can do. Check scopes one by one, or start from the Read only, Triage or Full preset. Only read scopes start ticked, even when the client asks for more; you tick each write scope yourself. You can drop scopes the client asked for, but you cannot add any. Triage is every read scope plus issues:write and alerts:write. It leaves out status:write, which posts on your public status page and emails subscribers.
  • Where. Either All organizations, including ones I join later, or only the organizations you tick. The page starts with only the organization you are working in ticked (your first one if you have not opened one yet). With no organization, nothing is ticked, so reaching the ones you create or join later is a choice you make.
ScopeGrants
org:read / org:writewhoami, get_ingest_domain, get_organization and get_retention_settings / rename, re-slug and delete the organization, set its avatar and change data retention
members:read / members:writeMembers, invitations and teams / invite, change roles, remove members, manage teams and leave the organization
projects:readlist_apps, list_environments, get_project, list_services
projects:writeCreate, change and delete projects and services, and change exception scrubbing
keys:writeIssue, reveal, rotate and revoke DSNs, deploy keys, heartbeat URLs and webhook signing secrets: setup_service, rotate_service_key, revoke_service_key, create_deploy_key, revoke_deploy_key and get_heartbeat_url, which issue, show or revoke secrets. Revealing or rotating a webhook channel's signing secret needs channels:write too
telemetry:readTraces, logs, metrics, exceptions, occurrences, performance tools and the service map, including the names and emails of the end users your apps track
issues:read / issues:writeRead issues / triage, assign, merge, comment on and link them, edit ownership rules and auto-resolve, and create Linear or GitHub tickets with any text
alerts:read / alerts:writeRead and preview alerts and channels / create, change, pause, resume and delete alerts, respond to incidents, manage exception rules and mute exception notifications per channel kind
channels:writeAdd, change and delete the Slack, Discord and webhook channels alerts are sent to, and send test messages to any URL, not only saved channels
uptime:readMonitors, checks and outages
uptime:writeCreate, change, retarget and delete monitors. The server sends HTTP, TCP and DNS requests, with the headers you set, to any public host
status:read / status:writeStatus pages and incidents / report and update incidents, create, change and delete the status page, and list and remove its subscribers
billing:readget_billing and get_usage_report
dashboards:read / dashboards:writeRead / create, change and delete dashboards and widgets
deployments:read / deployments:writeDeployments, running versions, deploy keys and source maps / delete source maps
integrations:read / integrations:writeGitHub and Linear connections and their targets / map projects to targets and disconnect
feedback:read / feedback:writeRead feedback threads / send, reply to and triage them and rate docs pages
account:read / account:writeYour profile, notification preferences, inbox and received invitations / change them
organizations:createcreate_organization
invitations:acceptaccept_invitation: join organizations you are invited to, at the invited role. Never ticked by default and only in the Full preset

The consent page only offers scopes that some tool uses. Clients that still request the old scopes get the scopes of the tools those covered. mcp:read becomes org:read, projects:read, telemetry:read, issues:read, alerts:read, uptime:read, status:read, dashboards:read and deployments:read. mcp:write becomes issues:write, alerts:write, status:write and dashboards:write, so it no longer reaches setup_service. A client that requests no scope is offered every scope, with Read only ticked.

Every call has to pass three checks. A call runs only when all three allow it:

  1. The connection was granted the tool's scope.
  2. The organization's MCP policy allows that scope. Admins set it in Settings, MCP: MCP access on or off, and optionally a list of the most an app may do there. Changes apply to the next call. The account:* scopes are yours, so a policy's list of scopes does not cover them, but turning MCP off for an organization also stops the inbox and notification preference tools there.
  3. Your role allows the action. Each tool uses the same permission check as the page it mirrors, so a member can triage issues, preview alerts and create dashboards, while creating alerts, projects or services needs an admin.

A refused call returns an error result that names the reason, for example Organization "acme" does not allow the issues:write scope over MCP. While an organization is suspended, every tool that changes something returns an error there.

Tools that act inside an organization take an organization argument (its slug). It is required only when the connection reaches more than one organization; whoami lists them. whoami and list_apps cover every organization the connection reaches. Leave an organization and the connection stops reaching it on the next call. An admin can also cut a connection off from their organization; editing the connection or leaving and rejoining does not undo that.

A connection that covers only the organizations you ticked never grows by itself. create_organization adds the organization it creates. accept_invitation does not. After joining, a connection for all organizations reaches the new one, and any other needs you to add it under Connected apps.

Changes made through MCP appear under your user, for example in an issue's activity. They notify people the same way the app does, so assignees get the usual emails.

Calling tools

Most tools accept these optional arguments:

projectstring

Project slug. Required when the organization has more than one project.

environmentstringdefault production

production, staging or development.

servicestring

Telemetry name of one service.

rangestringdefault 24h

15m, 1h, 6h, 24h, 7d or 30d.

fromstring

ISO timestamp that starts a custom window. With to, the window can span up to 90 days.

tostring

ISO timestamp that ends a custom window.

cursorstring

The nextCursor of the previous page. List tools return up to 50 items per page. A cursor that the server cannot read returns the JSON-RPC error -32602.

Every response repeats the project, environment, service and window it used, so the assistant knows exactly what it looked at. Results come back as JSON in a single text block. When the caller can fix the problem, such as an unknown project or service, the error names the valid choices.

A result is at most 256 KiB. A list page that would pass the limit returns fewer items, truncated: true and a nextCursor for the rest. Other results that are too large have their long strings cut to 2,048 characters, then 256, and carry a truncationNotice. If the result still does not fit, the tool asks the caller to narrow the request.

Human approval for sensitive actions

Each organization has the setting Require human approval for sensitive agent actions under Settings, MCP. It is on by default, only admins can change it, and every change appears in the organization's MCP Activity list.

While it is on, a sensitive call does not run, even with confirm: true. It returns a result like this instead:

json
{
  "status": "approval_required",
  "approvalId": "6f0c…",
  "approvalUrl": "https://unhandled.net/mcp/approvals/6f0c…",
  "expiresAt": "2026-10-24T15:15:00.000Z",
  "action": { "tool": "create_invitation", "organization": "acme", "description": "grants [email protected] admin access" },
  "next": "Nothing ran. Ask the user to open … then call create_invitation again with exactly the same arguments plus approvalId."
}

The person who connected the app, or anyone in the organization with at least their role, opens the link while signed in. The page shows the tool, the app, the requester and the exact arguments, with secret values hidden: channel and monitor URLs show only their origin, and custom header values show as (hidden). Approving needs a sign-in from the last 15 minutes or the account password; denying does not. The agent then repeats the call with the same arguments plus approvalId. The approval is bound to the connection, the user, the organization, the tool and a keyed hash of the full arguments, hidden values included, expires after two hours (on a self-hosted server, MCP_APPROVAL_TTL_MINUTES sets another length), and runs once. It is used up only when the call succeeds: a call that fails leaves it ready for a retry, and parallel calls with one approval run the action once. A call with any other argument, from another connection, or after it was used, denied or expired is refused. Stored arguments are redacted and encrypted with the app key. Admins see every approval under Settings, MCP, Approvals until an hour after it expires; the hourly mcp.prune job then deletes it.

These calls are sensitive:

  • create_invitation with role admin, update_member promoting to admin, remove_member;
  • update_monitor moving a monitor that sends custom headers to another origin, or leaving it with no channel;
  • create_notification_channel, update_notification_channel with a new URL, delete_notification_channel, reveal_notification_channel_secret, rotate_notification_channel_secret;
  • silencing alerting: pause_monitor, delete_monitor, pause_alert, snooze_alert, delete_alert, update_alert leaving an alert with no destination or changing the condition of a firing alert, create_exception_rule with muteKind;
  • delete_organization, delete_project, delete_service, delete_team, delete_status_page, disconnect_integration, remove_ingest_domain;
  • issuing or revoking credentials: setup_service, create_deploy_key, get_heartbeat_url, rotate_service_key, revoke_service_key, revoke_deploy_key;
  • update_retention_settings lowering any category;
  • every call that publishes text outside the organization: create_status_page with public: true, update_status_page publishing a page or changing the text of a public one, create_status_incident or update_status_incident writing to a public incident on a public page or with notifySubscribers: true, create_monitor or update_monitor changing a monitor shown on a public page, and link_issue with your own team, title or body;
  • accept_invitation and create_organization. These belong to no organization, so they wait for approval unless every organization you belong to turned the setting off.

When the setting is off, these calls need confirm: true as before.

Untrusted text in results

Much of what a result carries was written by someone other than Unhandled or you: exception messages, log lines, span attributes, AI conversations and analytics events reported by your apps and their users, plus names, comments and descriptions written by members. Anyone with a public DSN can put text there, so an assistant must never follow it as an instruction.

A result is always one JSON text block. When it holds such text, the result's _meta lists those fields under unhandled.net/untrustedFields. Each entry is a path into the JSON, with [] for every item of a list, such as items[].message. A path that ends at an object, such as items[].attributes, covers everything inside it. Only text the server formats itself, such as timestamps, cursors and truncation notices, is left off the list. The server's instructions and every tool description repeat that this text is data, never instructions.

json
{
  "content": [{ "type": "text", "text": "{\"project\":\"default\",\"items\":[{\"id\":\"1f0…\",\"name\":\"api-health\"}],\"nextCursor\":null}" }],
  "_meta": { "unhandled.net/untrustedFields": ["items[].id", "items[].name", "project"] }
}

Values keep exactly what was stored, so an agent can pass them back unchanged. Characters that hide or reorder text for a person reading along arrive as \u escapes inside the JSON instead of raw: bidirectional controls, zero-width spaces, word joiners, line and paragraph separators, byte order marks, C1 controls and Unicode tag characters. Decoding the JSON gives back the original value. Zero-width joiners stay raw, since emoji and many scripts need them.

Safe retries

The tools that create something accept an optional requestKey of 1 to 200 characters: create_organization, create_project, create_alert, create_dashboard, add_widget, add_issue_comment, create_status_incident, update_status_incident, add_ingest_domain, create_invitation, create_team, create_feedback_thread, reply_feedback_thread and submit_doc_feedback. Repeat a call with the same key within 24 hours and the server returns the first result instead of acting twice. Reusing a key for a different call returns an error. setup_service, rotate_service_key and create_deploy_key take no key, because a replay would have to store the secret they issued, so each call issues a new one. A replay goes through every check again first, so a call your connection may no longer make is refused rather than answered from the earlier result. Secrets in a result, such as a heartbeat URL from create_monitor, are never stored; a replay returns a note to fetch them with get_heartbeat_url.

Every tool in tools/list carries the MCP annotations readOnlyHint, destructiveHint, idempotentHint and openWorldHint, so clients can decide which calls to confirm with you. Tools that delete, revoke, disconnect or stop something, such as delete_project, revoke_service_key or pause_alert, are marked destructive and run only when the call passes confirm: true. Some tools need confirm: true only for certain arguments, and say so in the error when it is missing: rotate_service_key with grace none, update_member demoting an admin, update_team or update_project removing entries from a list, bulk_update_issues on more than 25 issues, update_issue_settings lowering autoResolveDays, update_retention_settings lowering any category, update_exception_settings turning scrubbing off or weakening it, rotate_notification_channel_secret, and create_status_incident or update_status_incident writing to a public incident on a public page or with notifySubscribers true. create_invitation with role admin and update_member promoting to admin need it, and both email the organization's other admins. Calls that silence or reroute notifications need it too: update_alert leaving an alert with no destination or changing the condition of a firing alert, create_exception_rule with muteKind, update_monitor closing an ongoing outage or leaving a monitor with no channel, and create_notification_channel or update_notification_channel with a URL no channel of the organization uses yet. So do calls that change what anyone can read: create_status_page or update_status_page publishing a page or changing the slug, title, description or logo of a public one, create_monitor or update_monitor changing a monitor shown on a public page, link_issue with your own team, title or body, and add_issue_comment when members of the issue's project cannot see some projects you can. test_monitor, create_monitor and update_monitor need it for a host none of the organization's monitors checks yet, and test_notification_channel for a URL no saved channel uses. For 10 minutes after a connection receives a secret, such as a key from setup_service or a signing secret, those calls to a new destination, and every call that publishes text outside the organization, are refused even with confirm: true. pause_monitor and accept_invitation always need it.

update_monitor never carries saved custom header values to another origin. Changing the URL of a monitor with saved headers requires customHeaders in the same call: pass them again, or [] to drop them. test_monitor reports the outcome, status code, timings, error type, response header names and response size, never the response body or header values. Joining an organization with accept_invitation never extends the connection that accepted it, even one approved for all organizations; reconnect the app to work there. delete_project also needs the project's exact name as confirmation, as the app asks you to type it. link_issue is marked open world, since it can create a ticket in Linear or GitHub.

Trace and log searches use the query grammar of the Traces and Logs pages, for example duration>=500ms status:error http.route^/api service:billing-api. Issue tools accept an issue ID, a pasted issue URL or a canonical fingerprint.

Tools

The server registers over 200 tools, listed below by area. tools/list shows only the tools your connection's scopes allow.

Workspace

ToolAccessWhat it does
whoamireadCurrent user, granted scopes, and every organization the connection reaches with your role, the scopes it allows over MCP, and its projects and services
list_appsreadProjects with their services in every organization the connection reaches
create_organizationwriteCreate an organization with you as admin, a default team and a default project. The connection reaches it right away
create_projectwriteCreate a project. Needs an organization admin
list_environmentsreadA project's environments with their request counts in the window
setup_servicewriteCreate a service, or reuse the one with the same name, and return a fresh DSN with install steps for the AdonisJS agent, OTLP settings for any OpenTelemetry SDK and a link to the setup for other stacks

Projects, services and keys

These tools need an organization admin, except list_services, which any member who can see the project may call.

ToolAccessWhat it does
get_projectreadName, slug, team access, what deleting the project would remove, and its exception settings
update_projectwriteRename a project, change its slug or the teams that can see it. Fields you leave out stay as they are
delete_projectwriteDelete a project and everything in it
update_exception_settingswriteTurn secret scrubbing on or off and set the fields to always or never scrub
create_sample_projectwriteOpen the Sample project with simulated data, creating it the first time
list_servicesreadServices with the last four characters of their keys, the rules watching them and the ingest endpoint
update_servicewriteChange a service's display name
delete_servicewriteDelete a service, revoke its keys and pause its alerts
rotate_service_keywriteIssue a new DSN; the old key keeps working for the grace period
revoke_service_keywriteStop the previous key, or every key of a service
get_service_mapreadServices, databases and external hosts with the calls between them, and per-service series on request
get_ingest_domainreadThe organization's custom ingest domain, its state and DNS records
add_ingest_domainwriteAdd a custom ingest domain and return the DNS records to create
check_ingest_domainwriteCheck the ingest domain's DNS now
remove_ingest_domainwriteRemove the custom ingest domain

Issues and exceptions

ToolAccessWhat it does
list_issuesreadIssues with status, priority, assignees, teams, stats, trend and archive progress, plus per-status counts and the For review total. Filters by status, view (app tab, saved view or triage shortcut), priority, assignee, service, text and token query
list_issue_viewsreadThe built-in issue tabs and the saved views you can see, with their query, status and sort
list_issue_filter_valuesreadValues of an issue search field in the window, to build queries
list_issue_assigneesreadPeople with access to the project and the organization teams an issue can be assigned to
get_issuereadOne issue with counts, services, stack location, first and latest release, regression context, archive progress, suggested owners, linked tickets and its app URL; the latest occurrence, tag distribution, comments and activity on request
list_similar_issuesreadUp to 8 issues that look like the same failure, as merge candidates
get_issue_activityreadAn issue's history, newest first, with actor and time
get_issue_settingsreadAuto-assign and auto-resolve settings and the ordered ownership rules
update_issuewriteResolve (now, in the next release or in a release), archive or reopen an issue, set priority, assignees and teams, mark it reviewed and add a comment
bulk_update_issueswriteThe same changes on up to 100 issues at once, each change in one transaction
add_issue_commentwriteComment on an issue
link_issuewriteCreate a Linear or GitHub ticket (title, body and Linear options) or attach an existing one. Returns the existing link if the issue already has one for that provider, unless another is true. A GitHub repository or Linear team other than the project's mapped one needs an organization admin
search_external_issuesreadSearch the project's mapped repository or Linear team for tickets to attach. Needs integrations:read
unlink_issuewriteRemove a linked ticket from an issue; the ticket itself is untouched
merge_issueswriteMerge up to 50 issues into a target issue; undo with unmerge_issue
unmerge_issuewriteGive a merged issue back the grouping keys it brought in, and reopen it
create_issue_viewwriteSave a search as a personal or shared issue tab
delete_issue_viewwriteDelete a saved issue tab
update_issue_settingswriteChange auto-assign and auto-resolve; omitted fields stay. Organization admins only
create_ownership_rulewriteAppend an ownership rule matching a service, path or route to a person or team. Organization admins only
delete_ownership_rulewriteDelete an ownership rule. Organization admins only
list_exceptionsreadException groups with occurrences, users, services, entry points, handled, trend, and the issue that groups them with its status. Hides groups whose issue is resolved or archived unless status asks for them
get_exceptionreadOne exception group and one occurrence (latest or by id) with its cause chain, frames, tags, extra and release deployment
list_occurrencesreadOccurrences of an issue or of a fingerprint, newest first
get_occurrencereadInspect an issue occurrence (best, latest, by id, older or newer) with its cause chain, related exceptions in the trace and, on request, the hour of logs and spans before the throw
list_issue_usersreadEnd users an issue affected, with occurrence counts

Traces and logs

ToolAccessWhat it does
get_overviewreadA project's overview: health cards with deltas against the previous period or a compare window, trends, traffic and the attention tables. Top exceptions skip resolved and archived issues unless exceptionStatus asks for them
get_project_statusreadThe overview status strip for one environment (alerts, uptime, incidents, new and regressed issues) and the setup checklist
list_tracesreadTraces newest or slowest first with duration, status, span and error counts; can hide background work
get_trace_statsreadTrace counts per root status and the per-bucket chart, optionally grouped by a field
tail_tracesreadNew traces since a cursor, like live mode
get_tracereadThe spans of one trace in start order with timings, status and category, 200 per page. Attributes only with includeAttributes or attributeKeys, and long values are cut to 2,048 characters. includeLogsAndExceptions adds the trace's logs and exceptions
get_spanreadOne span with every attribute, event and link, and on request its duration rank and the instance metrics around it
list_search_fieldsreadSearchable fields of spans or logs with their common values
list_logsreadLog records filtered by level, service, window and trace ID
search_logsreadFull-text search over log messages
get_log_volumereadLog counts per bucket and level, with totals per level
list_log_patternsreadLog messages clustered into up to 30 templates
get_log_contextreadA log's full body, the other logs of its trace and the logs around it from the same service
tail_logsreadNew log records since a cursor, like live mode

Every tool that takes a time window also accepts services (several service names), interval (1m to 1d) and compare (previous, 1d or 1w).

Performance

ToolAccessWhat it does
list_endpointsreadHTTP endpoints with request count, average and p95 duration, and error rate
get_endpoint_statsreadOne endpoint's latency percentiles, error rate, throughput and time series
list_db_queriesreadNormalized statements with executions, durations, errors and executions slower than 100 ms
get_db_query_detailreadOne statement's percentiles and its 20 most recent executions
list_jobsreadBackground jobs with processed count, error rate and processing time
get_job_detailreadOne job's percentiles and its 20 most recent executions
list_cache_statsreadCache keys with operations, hits, misses, hit rate and latency
get_cache_key_detailreadOne cache key's hits, misses, percentiles and hit and miss series
list_external_callsreadOutgoing HTTP calls by domain with latency, error rate and 4xx and 5xx counts
get_external_call_detailreadOne domain's URL patterns and its 20 most recent requests
get_performance_dashboardreadAny built-in dashboard (requests, queries, external calls, jobs, cache, emails, commands) as its page shows it: summary, series, queue flow and rows, with the page's sorts and filters and compare deltas
get_performance_detailreadOne operation of a built-in dashboard: summary, series, samples by status and order, breakdown, callers and time breakdown
get_latency_heatmapreadThe latency heatmap of a request, query or external call, narrowed by attribute values
compare_latency_outliersreadWhat the executions in a heatmap box share compared with the rest of the window
get_system_metricsreadThe system metrics panels and series of one instance

Metrics

ToolAccessWhat it does
list_instancesreadInstances that reported runtime metrics in the window, with runtime and a live flag for the last 15 minutes
list_metricsreadThe metrics page catalog: gauge, sum, histogram and summary metrics seen in the 90 days before the window end, with unit, description, services, last value and trend. Search matches name or description; type keeps one kind. conflict marks a name reported with several types or units, overflowed one that hit the per-metric series limit
get_metricreadA metric series aggregated with avg, sum, min, max, count, rate, p50, p75, p90, p95 or p99, kept or excluded by attribute values and grouped by one attribute, up to 10 groups, as the metric explorer charts it. Counters and cumulative histograms report the increase per bucket, with counter resets handled
get_metric_attributesreadA metric's attribute keys, including service.name and service.instance.id, with up to 50 values each

Deployments

ToolAccessWhat it does
list_deploymentsreadDeployments newest first, filtered by service, source (detected, api, cli), version, commit SHA prefix and environment, with the 5xx impact and new issue counts on request
get_deploymentreadOne deployment's timeline, CI links, previous deployment and nearby versions, with the before and after impact and its issues on request
get_running_versionsreadThe versions each service reported in the last 15 minutes
list_deploy_keysreadDeploy keys with their last four characters and last use. Needs an organization admin
create_deploy_keywriteCreate a deploy key and return its token once. Needs an organization admin
revoke_deploy_keywriteRevoke a deploy key. Needs an organization admin
list_source_mapsreadSource maps by service and release with size and quota. Needs an organization admin
delete_source_mapswriteDelete the source maps of one release. Needs an organization admin

Uptime and status pages

ToolAccessWhat it does
list_monitorsreadUptime monitors with state, 24-hour uptime and median response time
get_monitorreadOne monitor over 24h, 7d or 30d with its 10 latest outages and 10 latest isolated failed checks
get_checkreadOne check with its HTTP response, health report, neighbouring checks, outage and trace ID
list_outagesreadOngoing and recent outages with their incidents. maxAgeDays defaults to 7, at most 90
get_outagereadOne outage with its failed checks grouped by reason
list_status_incidentsreadIncidents and maintenance newest first. Closed ones only with includeClosed
get_status_incidentreadOne incident's updates, affected monitors and covered outages
create_status_incidentwriteDeclare an incident from outages or monitors, or schedule maintenance
update_status_incidentwritePost an update, change status with a required message, resolve, cancel or reschedule maintenance, edit title, visibility and monitors
create_monitorwriteCreate an HTTP, TCP, DNS or heartbeat monitor, checked every minute. Private and local targets are refused. Needs a project manager
update_monitorwriteChange only the fields you pass. Changing the target or a check setting closes an ongoing outage and restarts the monitor. Needs a project manager
pause_monitorwriteStop checks. An ongoing outage closes without a recovery notification. Needs a project manager
resume_monitorwriteResume a paused monitor, checked again within a minute. Needs a project manager
delete_monitorwriteDelete a monitor with its outages and check history. Needs a project manager
get_heartbeat_urlwriteReturn a heartbeat monitor's secret ping URL
get_status_pagereadThe environment's status page: settings, public URL, listable monitors and subscriber counts, with what the public page shows on request
create_status_pagewriteCreate the environment's status page, private unless public: true. Needs a project manager
update_status_pagewriteChange only the fields you pass, publish the page or take it offline. Needs a project manager
delete_status_pagewriteDelete the status page with its incidents, subscribers and custom domain. Monitors are kept. Needs a project manager
list_status_subscribersreadThe page's email subscribers, newest first, with the monitors they follow. Needs status:write
remove_status_subscriberwriteRemove a subscriber without telling them. Needs a project manager

Alerts

ToolAccessWhat it does
list_alertsreadEndpoint alerts with condition, destinations, status and last value
get_alertreadOne alert's evaluations in the window, its incidents and its latest incident
list_notification_channelsreadSlack, Discord and webhook channels with their IDs. URLs and secrets are never returned
preview_alertwriteReplay an alert condition on recent data and suggest a threshold. Saves nothing
create_alertwriteCreate an endpoint alert, paused until you pass enabled: true
update_alertwriteChange only the fields you pass
pause_alertwritePause an alert. A firing alert resolves
resume_alertwriteResume a paused alert, within the active-alert limit
delete_alertwriteDelete an alert and its incident history. A firing alert sends its resolved notification first. Needs a project manager
snooze_alert / unsnooze_alertwriteHold an alert's notifications for 1h, 4h, until tomorrow morning or until the firing incident resolved, or end the snooze. Any project member
get_incidentreadWho acknowledged an alert incident or monitor outage, its assignee, its comments and the members it can be assigned to
acknowledge_incidentwriteAcknowledge an alert incident or monitor outage as you, which stops its reminders. Any project member
assign_incidentwriteAssign an alert incident or monitor outage to a member, or unassign it. Sends no notification. Any project member
add_incident_commentwriteComment on an alert incident or monitor outage. Sends no notification
get_notification_channelreadOne channel's settings, health and 100 latest deliveries, and what would be left with no destination without it
create_notification_channelwriteAdd a Slack, Discord or webhook channel. The URL is stored encrypted and never returned. Needs an organization admin
update_notification_channelwriteChange a channel's name, URL or defaults. A new URL re-enables a disabled channel. Needs an organization admin
delete_notification_channelwriteDelete a channel. Alerts, monitors and exception rules stop posting to it. Needs an organization admin
test_notification_channelwritePost a test message to a saved channel or to a URL before you save it, and report whether it arrived. Needs an organization admin
reveal_notification_channel_secret / rotate_notification_channel_secretwriteShow a webhook channel's signing secret, or replace it and return the new one. Needs an organization admin
list_exception_rulesreadThe project's exception notification rules, the fallback channels and how new exceptions are batched into digests
create_exception_rule / delete_exception_rulewritePost a service's or environment's new exceptions to a channel, or mute a channel kind, and delete a rule. Needs a project manager

Analytics and end users

ToolAccessWhat it does
list_analytics_sitesreadSites that sent web analytics in the window
get_analytics_overviewreadTotals, series against the previous period, top lists and event properties, with the page, entry, exit, referrer, UTM and event filters
list_analytics_pagesreadPages by route or URL with pageviews and visitors
list_analytics_eventsreadCustom events with counts and visitors
list_analytics_sessionsreadVisits, a page at a time, or the visits that dropped off at a funnel step
get_analytics_sessionreadOne visit's journey and the services it touched
get_analytics_funnelreadA 2 to 8 step funnel with reach and drop-off per step
list_tracked_usersreadEnd users your application identified, with requests and errors
get_tracked_userreadOne end user's profile, series and recent requests

The analytics tools need the analytics:read scope; the end-user tools need telemetry:read.

AI agents and MCP monitoring

ToolAccessWhat it does
get_ai_overviewreadAI calls, tokens, cost, errors and latency with series and top conversations
list_ai_modelsreadCalls, tokens, cost and latency per model
list_ai_toolsreadTool calls of your agents with errors and latency
list_ai_scorersreadEvaluation scorer results
list_ai_conversationsreadThe 100 most recent conversations
get_ai_conversationreadOne conversation's steps, tokens, cost, evaluations and trace ids
get_mcp_monitoring_overviewreadCalls, clients, users, tools and methods of your own MCP server
get_mcp_monitoring_toolreadOne tool of your own MCP server with its recent calls

These need the ai:read scope.

Dashboards

ToolAccessWhat it does
list_dashboardsreadCustom dashboards with widget counts, variables, creator and whether you can edit them
get_dashboardreadOne dashboard's variables and widgets with every query, formulas, display and layout
get_dashboard_datareadEvery widget of a dashboard run for the window, with dashboard variables selected by name
preview_widgetreadRun a widget definition without saving it
create_dashboardwriteCreate a dashboard, optionally with its first widget in one step
update_dashboardwriteRename a dashboard or change its description, icon or variables
duplicate_dashboardwriteCopy any dashboard you can see, widgets included, as your own
delete_dashboardwriteDelete a dashboard; restore_dashboard brings it back
restore_dashboardwriteBring back a deleted dashboard with its widgets
add_widgetwriteAdd a chart, stat, table, sparkline, pie or bar_gauge widget with up to six queries and four formulas
update_widgetwriteChange a widget's queries, formulas, display or layout
save_dashboard_layoutwriteMove and resize several widgets in one save
remove_widgetwriteRemove a widget

As in the app, anyone who can see a project may create and duplicate dashboards, while editing, deleting and restoring one needs its creator or an organization admin.

Integrations

ToolAccessWhat it does
list_integrationsreadGitHub and Linear connections; admins also see each project's repository or team
list_integration_targetsreadThe GitHub repositories or Linear teams a connection can file tickets to. Needs an organization admin
set_project_integration_targetwriteChoose the repository or team a project files tickets to. Needs an organization admin
clear_project_integration_targetwriteStop a project filing tickets. Needs an organization admin
disconnect_integrationwriteDisconnect GitHub or Linear. Needs an organization admin

Connecting GitHub or Linear stays in the app, since it needs you to approve it with the provider.

Billing

ToolAccessWhat it does
get_billingreadThe plan, trial state, the plans on sale and the data ingested this billing period against the plan's included bytes
get_usage_reportreadIngest usage for one of the last 25 billing periods by signal, project, environment and service, with the projection and overage for the current one

These need the billing:read scope.

Organization, members and teams

ToolAccessWhat it does
get_organizationreadName, slug, avatar, suspension, your role and the counts of projects, live services and members
update_organizationwriteRename the organization or change its slug. Old slugs keep redirecting in the browser
set_organization_avatar / remove_organization_avatarwriteUpload a base64 image under about 700 KB, or delete the avatar
get_retention_settings / update_retention_settingsread / writeHow many days each kind of data is kept, and changing it. Omitted categories stay as they are; lowering any category needs confirm: true, since older data is then deleted
leave_organizationwriteLeave the organization. The only admin cannot leave
delete_organizationwriteErase the organization and all its data. Pass its slug as confirmation. Cannot be undone
list_members / list_invitationsreadMembers with their roles, and open invitations including expired ones
update_member / remove_memberwriteChange a member's role or remove them, by email. The last admin stays
create_invitation / revoke_invitationwriteEmail an invitation, which also resends one, or revoke the open invitation to an address
list_teamsreadTeams with their members' emails and project slugs
create_team / update_team / delete_teamwriteManage teams. update_team replaces only the lists you pass

Changing the organization, its members and its teams needs an organization admin, as in the app.

Account and inbox

ToolAccessWhat it does
get_account / update_accountread / writeYour name, timezone, theme, avatar and verification state; change the name, timezone or theme
set_account_avatar / remove_account_avatarwriteUpload a base64 image under about 700 KB, or delete your avatar
get_notification_preferences / update_notification_preferencesread / writeWhich emails you get and which inbox categories you muted, per organization
list_inboxreadYour 50 newest notifications with the unseen count, filtered by unread or category
mark_inbox_seen / mark_inbox_readwriteClear the unseen badge, or mark one notification or all of them read
open_notificationwriteMark a notification read and say whether its target is live, moved or deleted
list_received_invitations / accept_invitationread / writeInvitations sent to your verified email, and joining one with invitations:accept and confirm: true. The connection that accepts does not reach the new organization; reconnect the app to work there

No tool changes your email address, password or passkeys, or deletes your account. Do those in the app.

Feedback

ToolAccessWhat it does
list_feedback_threads / get_feedback_threadreadYour feedback threads, or every thread for organization admins, and one thread's messages
create_feedback_thread / reply_feedback_threadwriteSend an idea, bug or help request, or reply. An admin's reply on someone else's thread emails its author
update_feedback_threadwriteSet a thread's status. Needs an organization admin
submit_doc_feedbackwriteRate a docs page helpful or not

Revoking access

Open Settings, choose Profile under Account, then the Connected apps tab. It lists every app you allowed, with its organizations, scopes and when it was last used.

  • Edit changes the scopes and organizations. The change applies to the app's next call.
  • Revoke stops its token right away. You can also post the token to POST /oauth/revoke.

Organization admins see every app that reaches their organization in Settings, MCP. Revoke there cuts that app off from the organization only; it keeps working in the member's other organizations. Reconnecting the same app does not bring it back: it stays under Revoked apps until an admin chooses Allow again. The Activity list on the same page shows the latest changes apps made in the organization: the tool, the app, the member, what it acted on and the names of the fields it set, never their values. Tokens also stop working when they expire.

An app can never change its own access: editing connections and the organization MCP policy is only possible in the browser.

FAQ