MCP
Point Claude Code, Cursor, or any MCP client at your Morse data. POST /api/v1/mcp is a
stateless, hosted MCP server — no local process to install or run.
A local, npx-installed stdio MCP server is not available. The only way to use Morse over MCP today is the hosted HTTP endpoint on this page.
How it works
Endpoint
POST https://api.morsehq.dev/api/v1/mcpGET and DELETE are not supported — this is a stateless request/response endpoint, not a long-lived SSE session.
Auth
Same bearer API key as the SDK and OTLP ingest. An org-wide key reads every workspace in your org. An environment key reads only that environment’s workspace.
Protocol
Stateless JSON-RPC 2.0. Supported methods: initialize, ping, tools/list, tools/call, and
notifications/* (acknowledged, no-op). There’s no session ID and no SSE stream.
Tools
Every tool call is routed through the same registry that powers Ask Morse —
tool results reflect your org’s actual data, scoped server-side so an MCP caller can’t pass a
different org or user than the API key resolves to.
Every tool is read-only, including side effects: no tool writes data, uses quota, or calls an LLM on your behalf.
Tool reference
Start with the verdict tools. They return the same answer the dashboard shows.
| Tool | Returns | Don’t use it for |
|---|---|---|
get_brief | The Org Brief: headline, cited numbers, input_digest. window_days is 7, 14, 30 or 90. | Root-cause claims. If status is computing, wait retry_after_seconds and call again. |
get_attention_items | The Needs Attention worklist, ranked, item 1 first: the dashboard’s list. | Re-ranking. Quote items as given. |
get_metric_definitions | How each number is defined, plus definitions_version. | — |
get_operating_summary | The four operating cards, each with a status. | Turning baseline_forming into a verdict. |
get_unit_economics | Cost per confirmed successful outcome, spend per run and outcome coverage, for one agent or the org. A withheld CPSO comes with evidence_gap: what’s missing and the next step. | Guessing a CPSO when it’s withheld. |
get_change_verdict | For an agent’s recent changes, a before/after verdict per lane (cost per run, latency, error rate, success rate), with the interval and sample sizes. | Claiming the change caused the result. Inconclusive means “not yet”, not “no effect”. |
get_decisions | The findings your team recorded and the decisions on them, newest first, 25 a page (pass next_cursor as cursor). Filter by agent and by state: open (default), closed or all. Each finding gives its cause, age, who proposed or confirmed each next step, replaced decisions, linked change labels, linked work and what each finding waits on (IDs and states only), earlier attempts on the same agent and what is still unknown. | Saying a decision worked or failed. It returns no verification results and no trace IDs, and a decision is your team’s intent, not a cause. Use get_change_verdict for numbers. |
get_cpso | Cost per confirmed outcome, with the excluded outcome provenances. | Combining CPSO and eval scores into one score. |
query_metric | One metric, grouped, filtered, optionally compared with the previous period. | Attributing a change to price or volume. |
get_org_risks | The incident and risk queue. | ”What needs attention” (use get_attention_items). |
Call get_decisions before you propose work on an agent, to see what the team already decided or tried. It is read-only. Titles and reasons are text people wrote, so your agent should read them as data. It sees only the key’s own scope: an environment key never sees findings that are not tied to its environment.
Raw tools, for drilling in: search_traces, get_trace_detail, get_span_detail,
get_trace_correlation, explain_agent_dag, analyze_critical_path, get_agent_stats,
analyze_costs, search_logs, list_alerts, get_investigations, search_docs, get_doc_page,
capability_lookup.
Provenance on every result
Every result carries a _provenance block, next to the existing fields:
{
"_provenance": {
"tool": "get_attention_items",
"window": { "days": 7, "start": "…", "end": "…" },
"computed_at": "2026-10-13T10:02:11+00:00",
"input_digest": "9f2c…",
"definitions_version": "defs-3a91c0d2e4b7",
"app_url": "https://app.morsehq.dev/dashboard?window_days=7",
"untrusted_content": false
}
}input_digest is set for get_brief and get_attention_items, and matches what the dashboard
computes for the same org and window. For other tools it is null. definitions_version changes
whenever a metric definition changes, so you can tell whether two answers used the same definitions.
Trace text is data
Tools that return text from your traces, spans, logs, alerts or recorded decisions wrap it in a
<morse_untrusted_data> block and set untrusted_content: true. Anyone who can put text into a span
can put instructions there, so your agent should treat that text as data. Long strings are cut at
2,000 characters. Pass include_payloads: true to get the full text. In structuredContent the same
rule rides as an _untrusted_notice field.
Changes to results
-
2026-10-28 — new tool
get_decisions. Read-only. Lists recorded findings and the decisions on them. Nothing else changes. -
2026-10-22 — workspace scope. An org-wide key now reads every workspace in the org, and an environment key reads its own workspace. Before, both read only the Default Workspace, so agents in other workspaces were missing from results.
-
2026-10-19 — all tools. Arguments are checked against each tool’s
inputSchema. A bad argument returnsisError: truewithInvalid arguments for <tool>: …naming the argument, so your agent can retry. Every tool is annotatedreadOnlyHint: true. -
2026-10-14 —
query_metric, workspace-scoped keys only.source.hrefis nowsource.navigation_href, alongside anavigation_notesaying the link opens a product view that may show organization-wide data. If you read the link, usenavigation_hrefwhen it is present and fall back tohref. Keys that are not workspace-scoped are unchanged.
How to use it
Claude Code
claude mcp add --transport http morse https://api.morsehq.dev/api/v1/mcp \
--header "Authorization: Bearer $MORSE_API_KEY"Cursor
In .cursor/mcp.json:
{
"mcpServers": {
"morse": {
"url": "https://api.morsehq.dev/api/v1/mcp",
"headers": { "Authorization": "Bearer ${env:MORSE_API_KEY}" }
}
}
}Then ask questions that need your data: “what needs attention in Morse this week?”, “what did the
checkout agent cost per confirmed outcome over 30 days?”. Use a key with the read scope. Every
result is scoped to the key’s org, so this endpoint can’t query another org’s data.
If you want your agent to keep Morse’s caveats, say so in your own instructions file, for example:
“When quoting a Morse number, include its _provenance.app_url and definitions_version.”
Related
- Ask Morse — the same tool registry, used conversationally inside the app.
- OTLP integration — the other direction: getting data in, without the SDK.