MCP
Connect Claude Code, Codex, Cursor, VS Code, or another AI client to Elmo.
Elmo serves a Model Context Protocol endpoint at /api/mcp, so an
AI client can read your visibility data and manage prompts without you copying numbers between
windows.
On cloud that is https://app.elmohq.com/api/mcp. A self-hosted instance serves the same endpoint on
its own address, so swap app.elmohq.com for yours in everything below.
Every deployment also documents its own connection at Settings → MCP in the organization's settings sidebar: the endpoint on that instance's own address, snippets for the common clients, and the tools it registers.
There are two ways to connect. Signing in from the client is the quickest, and the connection then acts as you, in the workspaces you belong to. An API key is for a client that can't open a browser — a container, a scheduled job — and is also how you grant a client less than your own access.
Sign in from the client
Give the client the URL and it opens a browser for you to sign in. There is no application to register first, on cloud or on your own instance.
Claude Code
claude mcp add --transport http elmo https://app.elmohq.com/api/mcpThen run /mcp and choose Authenticate.
VS Code
code --add-mcp '{"name":"elmo","type":"http","url":"https://app.elmohq.com/api/mcp"}'Or put it under servers in mcp.json:
{
"servers": {
"elmo": { "type": "http", "url": "https://app.elmohq.com/api/mcp" }
}
}VS Code asks you to sign in the first time it starts the server.
OpenCode
In opencode.json:
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"elmo": {
"type": "remote",
"url": "https://app.elmohq.com/api/mcp",
"enabled": true
}
}
}Then opencode mcp auth elmo.
Cursor
In ~/.cursor/mcp.json:
{
"mcpServers": {
"elmo": { "url": "https://app.elmohq.com/api/mcp" }
}
}Cursor shows the server as needing login; sign in from there. Older Cursor releases send a callback Elmo can't accept, so if signing in fails, use an API key instead.
Codex
codex mcp add elmo --url https://app.elmohq.com/api/mcp
codex mcp login elmoOr use an API key
Issue one from Settings → API Keys in the organization's settings sidebar — keys belong to the organization, so they are not found under a brand. Issue it read-only and optionally narrow it to selected brands.
Send it as a bearer token.
Claude Code:
claude mcp add --transport http elmo https://app.elmohq.com/api/mcp \
--header "Authorization: Bearer elmo_..."Codex, which reads the key from the environment rather than the config file:
codex mcp add elmo --url https://app.elmohq.com/api/mcp \
--bearer-token-env-var ELMO_API_KEYCursor, in ~/.cursor/mcp.json:
{
"mcpServers": {
"elmo": {
"url": "https://app.elmohq.com/api/mcp",
"headers": { "Authorization": "Bearer elmo_..." }
}
}
}VS Code, in mcp.json:
{
"servers": {
"elmo": {
"type": "http",
"url": "https://app.elmohq.com/api/mcp",
"headers": { "Authorization": "Bearer elmo_..." }
}
}
}OpenCode, in opencode.json:
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"elmo": {
"type": "remote",
"url": "https://app.elmohq.com/api/mcp",
"enabled": true,
"headers": { "Authorization": "Bearer elmo_..." }
}
}
}Self-hosting
Nothing has to be turned on — the endpoint is there as soon as the instance is, and signing in from a client works against your instance the same way it does against cloud.
The one thing that has to be right is APP_URL: it must be the address clients actually reach you on,
because that is where the sign-in flow is advertised from and what the tokens it issues are bound to.
It has to be an HTTPS URL, or localhost — the app refuses to start otherwise, since a token bound to
anything else is one no MCP client will accept.
Keys come from the same organization settings page as on cloud, and instance-wide admin keys can also
be configured server-side through the ADMIN_API_KEYS environment variable.
Try
What is the visibility and share of voice for each tagged prompt in Elmo for
<brand>?
What are some AEO opportunities for my
<brand>?
Give me an example run for my
<description>prompt.
Scopes
A connection is only offered the tools its scopes allow, so a client is never shown something it would then be refused:
| Scope | MCP tool |
|---|---|
| (none) | whoami, list_models |
read | list_brands, get_brand, list_competitors, list_prompts, list_prompt_tags, get_analytics, get_prompt_performance, get_citations, get_query_fanout, get_opportunities, list_runs, get_run, get_billing |
write | create_prompts, update_prompt |
A read-write key can create and edit prompts over MCP, but no tool deletes data and no tool changes billing — those are REST API concerns or reserved for an instance admin key entirely.
A connection you signed in from acts as you and reaches everything you can, so scopes are a property of a key rather than of the sign-in.
Was this page helpful?