Arize Phoenix MCP server: 27 tools for traces
Phoenix exposes traces and evaluations for your own agents, and it reaches the traces themselves, which most evaluation connectors do not.
Last verified 1 September 2026 · from Arize's repository, its documentation and the server's own tools/list response
This page is one of 90 in a directory of monitoring and developer tools. Each page checks what an AI coding agent can get out of the tool through its MCP server, the connector that lets the agent query the tool directly.
Summary
Arize Phoenix publishes an official MCP server with 27 tools, and unlike most evaluation connectors it reaches the traces themselves: get-trace, get-spans, list-sessions are all first-class.
It ships inside the Arize-ai/phoenix monorepo rather than as a standalone repository, so its activity signal is the platform's rather than a small side project's.
It works against Phoenix Cloud or a self-hosted Phoenix. Phoenix is open source, so this is one of the few agent-observability connectors you can point at infrastructure you run yourself.
What is the Arize Phoenix MCP server?
It is Arize's server for the Model Context Protocol. Phoenix records what your own LLM applications did, so the agent gains tools for reading those traces, spans and sessions back.
The 27 tools group into four areas: prompts and their versions, projects with traces and spans, datasets and experiments, and annotation configuration. The trace tools are what distinguish it from evaluation-only connectors.
Phoenix is open source and self-hostable, and the same server points at either a self-hosted instance or Phoenix Cloud through PHOENIX_ENDPOINT.
Phoenix covers agent observability broadly, reaches part of the way into release through prompt versioning, and reaches nothing in code review, production observability or cost.
| Part of the work | What Arize Phoenix has here | Can an agent reach it |
|---|---|---|
| Code, tests & review | None | No code-review product |
| CI & release | Prompt versions and tags | Partial. No CI product. Prompt versions carry tags, and promoting a tag is how a prompt change ships |
| Production observability | None | No infrastructure telemetry. Phoenix traces your LLM application, not its hosts |
| Agent observability & evals | Traces, spans, sessions, datasets, experiments, annotations | Yes. Core strength, and the product's whole purpose |
| AI cost management | None | No token or model spend data |
In practice, Phoenix answers questions about what your LLM application did, step by step, and nothing about the systems it ran on. An agent connected here can pull the trace behind a bad answer, read every span in it, and check how it scored. It cannot tell you the retrieval service was slow, so this connector pairs with an infrastructure one.
What can an AI agent do with Arize Phoenix?
| Task | Tools | Works | Watch out for |
|---|---|---|---|
| Read the trace behind a bad answer | get-trace get-spans list-traces | Yes | Traces are scoped to a project; set PHOENIX_PROJECT or name it per call |
| Follow a multi-turn conversation | list-sessions get-session | Yes | Sessions exist only if the code you instrumented sets a session identifier |
| Check how a run was scored | get-span-annotations list-annotation-configs | Yes | Annotations are what an evaluator or a human wrote, not a live evaluation |
| Find which prompt version is live | list-prompts get-latest-prompt get-prompt-version-by-tag | Yes | Tags are how versions are promoted, so read the tag rather than the latest version |
| Ship a prompt change | upsert-prompt add-prompt-version-tag | Yes | Writes, on by default, and tagging a version can change what production uses |
| Build a dataset from real traces | list-datasets add-dataset-examples get-dataset-experiments | Yes | Dataset writes are on by default; there is no read-only mode |
| Investigate a production incident | No | No metrics, logs or traces from your infrastructure |
27 tools registered, all on by default
- Prompts8
list-promptsget-promptget-prompt-by-identifierget-latest-promptget-prompt-versionget-prompt-version-by-taglist-prompt-versionslist-prompt-version-tags- Prompts, write2
upsert-promptadd-prompt-version-tag- Support1
phoenix-support- Traces and spans4
list-tracesget-traceget-spansget-span-annotations- Sessions2
list-sessionsget-session- Projects2
list-projectsget-project- Datasets3
list-datasetsget-datasetget-dataset-examples- Datasets, write1
add-dataset-examples- Experiments3
list-experiments-for-datasetget-experiment-by-idget-dataset-experiments- Annotations1
list-annotation-configs
Counted from the server's own tools/list response on the published npm package, 21 August 2026. There is no read-only mode, so the write groups are gated only by your client.
What connecting costs before the first question
A context window is the amount of text a model can hold at once, and connecting uses some of it before the agent asks anything. Every tool the server registers sends its name, description and input schema to the model when the session starts. The tool list is charged whether or not a single tool is called.
Phoenix is efficient for its reach: 27 tools for about 4,769 tokens, which is less than LangSmith's 15 tools cost and less than Helicone's 2 cost. Its descriptions average 417 characters, short enough that the tool count, not the description length, drives the figure.
| Tool set | Tools | Tokens (GPT-5.6, GPT-5.5) | Tokens (GPT-4, GPT-3.5) | Tokens (Claude Haiku 4.5 to Opus 5) | Share of a 200,000-token window |
|---|---|---|---|---|---|
| Every tool, as registered | 27 | 4,769 to 6,355 | 4,716 to 6,360 | 6,732 to 8,667 | 2.4% to 4.3% |
Encodings: GPT-5.6, GPT-5.5 o200k_base; GPT-4, GPT-3.5 cl100k_base; Claude Haiku 4.5 to Opus 5 count_tokens. Counted 21 August 2026 from tools/list on the published @arizeai/phoenix-mcp package. It was run locally with a placeholder URL and key.
Registration is static, so no Phoenix instance was involved. Figures cover name, description and input schema. The two models in column one share the o200k_base encoding, so they get one count. The spread is formatting, about 33%. Reasoning tokens are output, spent per request. This count is input, charged once at connection.
The Claude figures are measured rather than encoded. Anthropic publishes no local tokenizer. The definitions were sent to the API's count_tokens endpoint, and a no-tools baseline was subtracted. The range covers two tokenizer generations rather than two serializations. Haiku 4.5 and Opus 4.6 sit at the low end. Opus 5 and Sonnet 5 sit at the high end. The gap between them is about a third.
Can Arize Phoenix watch your own AI agents?
Phoenix is an agent-observability product, so this table asks how much of that surface the connector actually reaches. Counted from the server's own tools/list response on 21 August 2026.
| Signal | Covered | Notes |
|---|---|---|
| Trace and session tracking | Yes | get-spans, get-trace and list-traces reach spans and whole traces, and list-sessions groups them |
| Eval scores on recorded traffic | Partial | get-span-annotations and list-annotation-configs read the annotations that evaluation labels are written into. No tool runs an evaluation |
| Prompt version tracking | Yes | Eight tools cover prompts and versions, including list-prompt-versions, get-prompt-version-by-tag and add-prompt-version-tag |
| Offline experiments | Yes | list-experiments-for-dataset, get-experiment-by-id and add-dataset-examples cover dataset-backed runs |
| Token and cost tracking | No | No tool in the 27 returns a token count or a cost figure |
Arize Phoenix MCP server limits: where answers come back incomplete
The limits below follow from how Phoenix scopes data rather than from anything failing.
The agent says: “There are no traces.” It looked in the wrong project.
Trace and span tools are scoped to a Phoenix project. PHOENIX_PROJECT sets a default, and without it the agent must name the project in each call. A query against the wrong project returns a real, empty result with nothing to distinguish it from an idle period.
Guard: Set PHOENIX_PROJECT, and have the agent state which project it queried alongside any negative answer.
The agent says: “I tagged that prompt version.” That may be what production reads.
Phoenix permits upsert-prompt and add-prompt-version-tag without a read-only mode. If your application resolves prompts by tag at run time, moving a tag is a production change made from a chat window.
Guard: Allowlist read tools only. In Claude Code, run /permissions and leave upsert-prompt and the tag tools unapproved.
The agent says: “This span has no evaluation.” Nothing has written one yet.
get-span-annotations reads annotations that an evaluator or a human has already recorded. The connector does not run evaluations, so a span that has not been scored returns nothing, and that is not the same as scoring badly.
Guard: Treat an absent annotation as unscored rather than as a poor score, and check that your evaluators are running.
How to configure Arize Phoenix MCP for agents
- 1
Set a default project
PHOENIX_PROJECTscopes the trace and span tools. Without it the agent must name a project in every call, and a wrong name returns an empty result rather than an error. - 2
Point at the right Phoenix
PHOENIX_ENDPOINTselects Phoenix Cloud or your self-hosted instance, which is what makes this connector usable where hosted-only tools are not. - 3
Allowlist read tools
Three of the twenty-seven write, and moving a prompt tag changes which prompt version production resolves, if your application looks prompts up by tag.
- 4
Budget the context
Twenty-seven tools cost about 4,769 tokens, roughly 2.4% of a 200,000-token window, which is cheap for the reach.
Paste this into your agent’s instructions
Phoenix scopes almost everything to a project, so its silent failure is a query against the wrong one. The block makes the agent name the project alongside any negative answer.
When you answer using Phoenix MCP tools, state: - The project you queried, and the time range. - How many traces or spans you retrieved against the limit you asked for. - Whether a span carried annotations. An unannotated span has not been scored, which is not the same as scoring badly. Never state that data does not exist. State that none was returned under the constraints above. Write your answer in ASD-STE100 Simplified Technical English. Use short sentences with one idea in each.
Do you need the MCP server at all?
Not always. Phoenix has a documented REST API and Python client, and a coding agent can call either with the same key.
The connector's advantage is trace navigation. The agent calls list-projects to fix the scope, then list-traces, then get-spans, then get-span-annotations. Tool descriptions let it make those calls in the right order without being told the shape of the data.
Because Phoenix is self-hostable, the connector is also usable where a hosted-only agent-observability tool would not be an option at all.
Connect the server for open-ended trace investigation. Use the client library for scripted evaluation runs.
Arize Phoenix MCP server setup
The package runs with npx and needs PHOENIX_ENDPOINT plus an API key in PHOENIX_API_KEY. PHOENIX_PROJECT sets a default project for the project-scoped tools.
The same package works against Phoenix Cloud or a self-hosted Phoenix; only the base URL changes.
Claude Code
Setting PHOENIX_PROJECT avoids the commonest empty-result mistake.
claude mcp add-json "phoenix" '{"command":"npx",
"args":["-y","@arizeai/phoenix-mcp"],
"env":{"PHOENIX_ENDPOINT":"https://app.phoenix.arize.com",
"PHOENIX_API_KEY":"<your-key>",
"PHOENIX_PROJECT":"<your-project>"}}'Cursor
In ~/.cursor/mcp.json for all projects, or .cursor/mcp.json in one.
{"mcpServers":{"phoenix":{"command":"npx",
"args":["-y","@arizeai/phoenix-mcp"],
"env":{"PHOENIX_ENDPOINT":"https://app.phoenix.arize.com",
"PHOENIX_API_KEY":"<your-key>"}}}}Codex CLI
Codex reads TOML, so the JSON blocks above will not transfer.
[mcp_servers.phoenix]
command = "npx"
args = ["-y", "@arizeai/phoenix-mcp"]
env = { PHOENIX_ENDPOINT = "https://app.phoenix.arize.com", PHOENIX_API_KEY = "<your-key>" }Every other client
Each block below is the configuration for one client, with the file path and the key that client expects.
Claude Desktop
macOS ~/Library/Application Support/Claude/claude_desktop_config.json. Windows %APPDATA%\Claude\claude_desktop_config.json. There is no CLI. Edit through Settings, Developer, Edit Config.
Quit and restart fully for changes to load. Paths in args must be absolute. Logs at ~/Library/Logs/Claude/mcp.log.
{"mcpServers":{"phoenix":{"command":"npx",
"args":["-y","@arizeai/phoenix-mcp"],
"env":{"PHOENIX_ENDPOINT":"https://app.phoenix.arize.com","PHOENIX_API_KEY":"<your-key>"}}}}Gemini CLI
~/.gemini/settings.json globally, or .gemini/settings.json per project. Key mcpServers. CLI: gemini mcp add.
{"mcpServers":{"phoenix":{"command":"npx",
"args":["-y","@arizeai/phoenix-mcp"],
"env":{"PHOENIX_ENDPOINT":"https://app.phoenix.arize.com","PHOENIX_API_KEY":"<your-key>"}}}}VS Code Copilot
.vscode/mcp.json per workspace, or your user profile. CLI: code --add-mcp.
{"servers":{"phoenix":{"command":"npx",
"args":["-y","@arizeai/phoenix-mcp"],
"env":{"PHOENIX_ENDPOINT":"https://app.phoenix.arize.com","PHOENIX_API_KEY":"<your-key>"}}}}The key is `servers`, not `mcpServers`. VS Code is the only client that uses that name, and copying a config from anywhere else fails silently.
Windsurf
~/.codeium/windsurf/mcp_config.json, which is the path Windsurf documents. Key mcpServers, the same JSON shape as Cursor, carrying the same API key.
Zed
~/.config/zed/settings.json, carrying the same API key as the blocks above.
The key is `context_servers`. Zed does not call them MCP servers in config, so searching its settings for mcp finds nothing.
Google Antigravity
~/.gemini/config/mcp_config.json globally, or .agents/mcp_config.json per project. Key mcpServers. There is no CLI. Use the /mcp overlay in the editor. Supports stdio, streamable HTTP, SSE and websocket.
{"mcpServers":{"phoenix":{"command":"npx",
"args":["-y","@arizeai/phoenix-mcp"],
"env":{"PHOENIX_ENDPOINT":"https://app.phoenix.arize.com","PHOENIX_API_KEY":"<your-key>"}}}}Amp (Sourcegraph)
~/.config/amp/settings.json or .amp/settings.json, carrying the same API key. The amp mcp CLI covers approve, doctor and oauth.
The key is `amp.mcpServers`, namespaced. A bare mcpServers block is ignored.
Cline
~/.cline/mcp.json per the docs. The source also reads ~/.cline/data/settings/cline_mcp_settings.json. Key mcpServers, standard JSON shape, carrying the same API key. Supports stdio, streamable HTTP and SSE.
Goose (Block)
~/.config/goose/config.yaml, carrying the same API key.
YAML, and servers are called `extensions`. Goose does not use the MCP vocabulary in config at all. Add one interactively with goose configure, or per session with goose session --with-extension.
Kiro (AWS)
.kiro/settings/mcp.json per workspace, or ~/.kiro/settings/mcp.json globally. Key mcpServers, standard JSON shape, carrying the same API key.
Warp
~/.warp/.mcp.json or .warp/.mcp.json. Key mcpServers, standard shape, carrying the same API key. Also addable through the /agent-add-mcp skill.
JetBrains Junie
.junie/mcp/mcp.json per project, or ~/.junie/mcp/mcp.json. Key mcpServers, carrying the same API key. Use /mcp in the CLI to manage.
Roo Code
.roo/mcp.json per project. The global file is mcp_settings.json, opened from the Roo Code MCP settings view with Edit Global MCP. Key mcpServers, carrying the same API key.
Continue
.continue/mcpServers/*.yaml, one file per server, carrying the same API key.
YAML, and `mcpServers` is a list, not an object. Every JSON client keys servers by name. Continue takes an array, so a converted config will not parse.
Trae
.trae/mcp.json per project, or paste into the UI under Raw Config (JSON). Key mcpServers, standard shape, carrying the same API key.
Devin
Devin has no config file to edit. Servers are added through a web form in the settings UI, and Devin's documentation states you do not need to write or paste JSON. The block below is the shape those fields describe, shown for reference. Either route uses the same API key.
Self-hosted Phoenix
Point the base URL at your own instance. Everything else is the same.
PHOENIX_ENDPOINT=http://phoenix.internal:6006 \ PHOENIX_API_KEY=<your-key> \ npx -y @arizeai/phoenix-mcp
Read-only access, permissions and security
Three of twenty-seven tools write
upsert-prompt,add-prompt-version-tagandadd-dataset-exampleschange Phoenix state, and there is no server-side read-only mode.Tagging a prompt version can be a production change
If your application resolves prompts by tag at run time, moving a tag changes behavior without a deploy.
Traces contain your users' inputs
Phoenix stores prompts and completions, so an agent reading spans is reading whatever your application processed.
Self-hosting keeps that data in your infrastructure
That is the practical reason to prefer it over the hosted option for sensitive workloads.
Troubleshooting
- No traces found for a project with traffic
- Trace tools are project-scoped. Set
PHOENIX_PROJECT, or have the agent name the project in each call and state which one it used. - A span has no annotations
- That span has not been scored. The connector reads annotations rather than running evaluations, so an absent annotation is unscored, not a poor score.
- 401 or 403 on connect
PHOENIX_API_KEYis missing or scoped to another instance. CheckPHOENIX_ENDPOINTpoints at the Phoenix that issued the key.- A prompt change appeared in production
upsert-promptandadd-prompt-version-tagare writes with no read-only mode. Remove them from your client's allowlist.
Arize Phoenix MCP server: Reference
| Item | Value |
|---|---|
| Status | Arize-ai/phoenix pushed 1 September 2026 · @arizeai/phoenix-mcp 4.3.5 on npm |
| Adoption | 11,272 stars on the monorepo |
| Package | @arizeai/phoenix-mcp on npm, published from the Phoenix monorepo |
| Auth | PHOENIX_API_KEY with PHOENIX_ENDPOINT; PHOENIX_PROJECT sets a default scope |
| Deployment | Phoenix Cloud or self-hosted, same package |
| Tools | 27, all on by default, of which 3 write |
| Read-only | None. Gate the write tools in the client |
What engineers report
Phoenix's connector ships inside the main project, so its signals are the platform's rather than a standalone repository's.
| What was checked | What it shows |
|---|---|
Stars, Arize-ai/phoenix | 11,267 |
| Last push | 21 August 2026 |
| Package | @arizeai/phoenix-mcp, published from the monorepo |
| Tools | 27, all on by default |
| Deployment | Phoenix Cloud or self-hosted, same server |
Repository facts from the GitHub API, retrieved 21 August 2026. Tool counts come from the server's own tools/list response on the published npm package.
Should you connect an agent to Arize Phoenix?
Yes. Best for phoenix teams allowlisting read tools and setting a default project.
- Strongest fit
- Teams on Phoenix who want an agent following a trace to its spans and annotations, especially where Phoenix is self-hosted.
- Main advantage
- It reaches the traces themselves rather than stopping at evaluations, at a lower context cost than smaller connectors.
- Main weakness
- No infrastructure telemetry, and everything is scoped to a project the agent has to name correctly.
- Operational risk
- Prompt and dataset writes are on by default, and moving a prompt tag can change production behavior.
From Oodle
One platform for agent traces and infrastructure
Agent traces usually sit in a different product from the rest of your telemetry, so when a slow database makes an agent slow the symptom is in one tool and the cause is in another. Oodle keeps both in one query surface, from $10 per million spans.
See agent observabilityFrequently asked questions
How many tools does the Arize Phoenix MCP server have?
27, all enabled on connection, covering prompts, projects, traces, spans, sessions, datasets, experiments and annotation configuration. Counted from the server's own tools/list response, 21 August 2026.
Does it work with self-hosted Phoenix?
Yes. The same server points at Phoenix Cloud or a self-hosted instance through PHOENIX_ENDPOINT, which is unusual among agent-observability connectors.
Can an agent read individual spans?
Yes. get-trace, get-spans and list-sessions are first-class tools, so the agent can follow a trace step by step rather than reading a summary.
Can it change my prompts?
Yes. upsert-prompt and add-prompt-version-tag are writes and there is no read-only mode. If your application resolves prompts by tag, tagging is a production change.
Does it monitor infrastructure?
No. Phoenix traces LLM applications. Pair it with an observability connector for hosts, containers and databases.