Skip to Content

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/mcp

GET 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.

ToolReturnsDon’t use it for
get_briefThe 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_itemsThe Needs Attention worklist, ranked, item 1 first: the dashboard’s list.Re-ranking. Quote items as given.
get_metric_definitionsHow each number is defined, plus definitions_version.—
get_operating_summaryThe four operating cards, each with a status.Turning baseline_forming into a verdict.
get_unit_economicsCost 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_verdictFor 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_decisionsThe 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_cpsoCost per confirmed outcome, with the excluded outcome provenances.Combining CPSO and eval scores into one score.
query_metricOne metric, grouped, filtered, optionally compared with the previous period.Attributing a change to price or volume.
get_org_risksThe 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 returns isError: true with Invalid arguments for <tool>: … naming the argument, so your agent can retry. Every tool is annotated readOnlyHint: true.

  • 2026-10-14 — query_metric, workspace-scoped keys only. source.href is now source.navigation_href, alongside a navigation_note saying the link opens a product view that may show organization-wide data. If you read the link, use navigation_href when it is present and fall back to href. 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.”

  • Ask Morse — the same tool registry, used conversationally inside the app.
  • OTLP integration — the other direction: getting data in, without the SDK.
Last updated on