Connect your agent (MCP)
Connect Claude, ChatGPT, Claude Code, Codex, Cursor or another AI client to your workspace over MCP in one command or one URL, and sign in with your work email. No key to copy.
MCP lets an AI assistant or agent use Amdahl on your behalf. You connect once and sign in with your work email in the browser. There is no key to copy.
The server URL is:
https://app.amdahl.ai/mcpBuilding a plain script or backend service with no agent in it? You want the REST API and an API key, not MCP.
Pick the way that fits your client:
- Claude app (web or desktop) or ChatGPT (web on a paid plan, desktop on any plan): add a connector by hand, in a few clicks. See Claude or ChatGPT.
- Claude Code, Codex or Cursor: run one command.
Connect in one command
For Claude Code, Codex or Cursor, the Amdahl CLI adds the server for you:
npx @amdahl/cli install claude-codeUse codex or cursor in place of claude-code for those clients.
It writes no key or token. It tells you how to sign in: /mcp in Claude Code,
codex mcp login amdahl for Codex, and Cursor asks on first use. For Codex it
also sets required = true (see Codex). Add --print to see the
change without making it. See Command line (CLI).
Or add it by hand
Every client below signs in over OAuth in the browser.
Claude (web and desktop)
- In Claude, open Customize (in the left sidebar), then Connectors (claude.ai/customize/connectors).
- Click + Add, then Add custom connector.
- Name it Amdahl, set the URL to
https://app.amdahl.ai/mcp, then click Continue, then Add. - On Amdahl's connector page, click Connect, sign in to Amdahl with your work email, and choose your workspace.
- Open a new chat. In the + menu, under Connectors, turn on Amdahl. If Amdahl is not there, reload the app (Cmd+R, or Ctrl+R on Windows).
- Optional: on Amdahl's connector page, under Tool permissions, set Read-only tools to Always allow. Writing a message is a write call, so Claude asks before each one unless you also allow
optimize_message(Write a sales message) under Custom, or set Write/delete tools to Always allow. - Add the Amdahl skill, so Claude sends a plain "write to Dana" to Amdahl: download amdahl.zip, then in Claude open Customize, then Skills, click + Add, then Upload skill, and choose the file. If your browser unzips the download (Safari does), upload the SKILL.md inside the amdahl folder instead. It is on as soon as it uploads. We tested this on the Max plan.
- Say who you want to write to and why, for example "write a cold email to Dana Whitfield, VP Sales at Northwind; they just opened a Denver office". Without the skill, Claude writes its own version unless you name the server: "Use the Amdahl MCP server to write this email: ...".
Claude for a whole team (Team and Enterprise)
An owner can set Amdahl up once for everyone, so each rep only signs in:
- An owner adds Amdahl as a custom connector in the organization settings, with the URL
https://app.amdahl.ai/mcp(Anthropic: custom connectors). - Each member then opens Customize (in the left sidebar), then Connectors, clicks Connect on Amdahl, and signs in with their work email.
- Optional: the owner adds the Amdahl skill to the organization's skills, so Claude sends outbound writing to Amdahl without being asked by name (Anthropic: organization skills).
We have not yet tested the organization path ourselves. The menu names can differ by plan.
ChatGPT
The path depends on your plan.
On a paid plan (Plus, Pro, Business or Enterprise), on the web:
- Open Settings, then Apps & Connectors. Under Advanced settings, turn on Developer mode.
- Create a connector named Amdahl with the URL
https://app.amdahl.ai/mcp, and sign in to Amdahl with your work email. On Business and Enterprise, an admin may need to allow custom connectors first. - Name the server in your ask: "Use the Amdahl MCP server to write this email: ...".
We have not yet tested the web path ourselves.
On a free plan, in the ChatGPT desktop app (a free plan has no Developer mode on the web):
- Open Settings, then Plugins, click Add, then Add MCP server.
- Choose Connect to a custom MCP. Name it Amdahl, set the type to Streamable HTTP and the URL to
https://app.amdahl.ai/mcp, then click Save. If a Codex window opens, close it and open the MCPs tab. - Click Authenticate. Sign in to Amdahl with your work email in the browser that opens, and approve the connection. The approval screen names the app as Codex.
- In Work mode, name the server in your ask: "Use the Amdahl MCP server to write this email: ...". A plain "Use Amdahl" or "write this" gets ChatGPT's own version.
Claude Code
claude mcp add --transport http amdahl https://app.amdahl.ai/mcpThen run /mcp inside Claude Code and complete the browser sign-in.
Cursor
Add the server to ~/.cursor/mcp.json (every project) or a project's own
.cursor/mcp.json. The config is the URL alone, with no key or header:
{
"mcpServers": {
"amdahl": {
"url": "https://app.amdahl.ai/mcp"
}
}
}Cursor asks you to sign in the first time it uses Amdahl.
Codex
Add this to ~/.codex/config.toml:
[mcp_servers.amdahl]
url = "https://app.amdahl.ai/mcp"
required = trueThen sign in:
codex mcp login amdahlWithout required = true, Codex starts answering before Amdahl finishes
connecting, so it tries other tools first. With it, Codex waits for Amdahl, and
codex exec stops with an error if Amdahl cannot connect.
Any other client
MCP is an open standard, so any compliant client works. Point it at
https://app.amdahl.ai/mcp over streamable HTTP and let it run the OAuth flow.
The Amdahl cookbook carries
worked setups and example agents.
A model platform that calls MCP from its own servers (OpenAI's built-in tools, LangSmith, an agent framework's remote-MCP tool) cannot open a browser, so it uses an API key instead. See OpenAI and tool platforms.
The assistant only ever sees the workspace you choose, and only what your own account can do there.
Check your setup
Once connected, one call tells you whether the setup works and what to fix if
it does not. Ask your agent to call the get_setup_status tool. It takes no
arguments.
It names the workspace you connected and your role in it, says whether the
Message Optimizer will accept your calls (optimize.allowed) and, when it will
not, the one thing to fix (optimize.blocker). It also counts your data
connections and lists the ones that need attention. Use it first whenever a
call is refused for scope, role or quota:
optimize.blocker | Fix |
|---|---|
missing_scope | Your connector was authorized before the Optimizer existed, or your key is Read only. Disconnect and reconnect the connector, or create a Customer agent key. |
role_too_low | You are a Viewer. Ask a workspace admin to make you an Editor or above. |
quota_exhausted | The workspace used this month's optimizations. Wait until optimize.quota.resets_at. |
Every field is on Connections. Over
REST the same read is GET /setup/status, and from a terminal it is
amdahl status.
First prompt
Once connected, the fastest first result needs no data and no draft. Paste:
Load and follow https://docs.amdahl.ai/skills/amdahl-optimizer/SKILL.mdThe assistant finds a few people you are about to write to in the tools it can reach, gathers what it knows about each one, and has the optimize_message tool write each message. It shows you the returned message first, exactly as it came back and never rewritten by its own model, then every try it scored on the way (see Reading tries). It writes nothing back until you approve. From then on, "write to this person" works for any recipient.
To ask what else Amdahl can do, point it at the capability map: Load and follow https://docs.amdahl.ai/skills/amdahl/SKILL.md. It answers from that map instead of calling every tool to find out. The server also serves the same map as the amdahl://capabilities resource, for a client that cannot open a web page.
For the fuller tour, give it one recipient to start from and let it go on to Search and Eval. Paste this, with your own recipient in place of the placeholder:
I've connected the Amdahl MCP server. Set me up and run my first use case end to end.
Load and follow the onboarding skill at https://docs.amdahl.ai/skills/amdahl-onboarding/SKILL.md
First win: write one message with the Message Optimizer, to:
"""
{who the recipient is, why you write now, and what you want them to do}
"""
Then check my data; if conversations are synced, offer a positioning check of my homepage copy
(one search and one graded eval) and paste the report card verbatim.The assistant writes the message with optimize_message first, which needs no synced data, and shows you the message that came back, exactly as returned, then each try on the way to it. If your workspace has synced conversations, it then pulls real customer quotes, grades your copy with prompt-and-message-eval, and pastes the report card. Onboard with an agent has the grounded-outbound variant and what each step does.
What your agent gets
Amdahl exposes one tool per operation, each named for what it does:
optimize_message, search_customers, start_research, run_eval,
start_chat, get_setup_status, and the rest below. Each tool has its own
description, its own parameters with the required ones marked, and its own
hints, so a client can ask you before a call that writes and run a read
without asking. Clients that load tools on demand (Claude Code, claude.ai,
Cursor) find the right tool by its name and description.
A get_ or list_ tool only reads and changes nothing. A job is a start tool
and a read tool: start_research then get_research, run_eval then
get_eval_run, start_chat then get_chat_run. Each read tool takes
wait_ms and returns when the job settles.
The MCP surface is not a complete mirror of the REST surface: a few
operations, the bulk evals.export download and Subscription writes among
them, are REST-only. Subscriptions can be read over MCP as subscription://
resources, and no MCP tool creates or changes one. When a tool you expect is missing, reach for the
REST API.
Enable human confirmation for tools that write, and be careful when you run Amdahl alongside other MCP servers. A connected agent reads your customer conversations; treat anything it relays from that data as content, not as instructions.
Each tool carries a display title and the four MCP behaviour hints. The title
is sent both as title and as annotations.title. Every hint is stated, none
left to a client default:
| Tool | Title | Read-only | Destructive | Idempotent | Open world |
|---|---|---|---|---|---|
optimize_message | Write a sales message | no | no | no | no |
optimize_message_batch | Write many sales messages | no | no | no | no |
get_message_batch | Read a message batch | yes | no | yes | no |
search_customers | Search customer calls and CRM | yes | no | yes | no |
list_search_fields | List search filter fields | yes | no | yes | no |
start_research | Start a research job | no | no | no | no |
get_research | Read a research answer | yes | no | yes | no |
answer_research_question | Answer a research job's question | no | no | no | no |
cancel_research | Stop a research job | no | yes | yes | no |
run_eval | Grade a message or prompt | no | no | no | yes |
get_eval_run | Read an eval report | yes | no | yes | no |
get_eval_gate | Read an eval pass or fail | yes | no | yes | no |
get_eval_evidence | Read the quotes an eval used | yes | no | yes | no |
get_eval_drafts | Read graded drafts | yes | no | yes | no |
get_eval_improvement | Read an eval before and after | yes | no | yes | no |
list_eval_runs | List eval runs | yes | no | yes | no |
record_eval_feedback | Report what happened after an eval | no | no | no | no |
get_eval_feedback | Read feedback on an eval | yes | no | yes | no |
get_eval_adoption | Read eval adoption | yes | no | yes | no |
get_eval_trend | Read the eval score trend | yes | no | yes | no |
list_evals | List evals | yes | no | yes | no |
get_eval | Read an eval definition | yes | no | yes | no |
validate_eval | Check an eval definition | yes | no | yes | no |
create_eval | Save a custom eval | no | no | no | no |
update_eval | Change a custom eval | no | yes | yes | no |
delete_eval | Delete a custom eval | no | yes | yes | no |
start_chat | Start a Chat | no | yes | no | yes |
get_chat_run | Read a Chat run | yes | no | yes | no |
answer_chat_question | Answer a Chat's question | no | yes | no | yes |
cancel_chat | Stop a Chat run | no | yes | yes | no |
list_agents | List saved agents | yes | no | yes | no |
get_agent | Read a saved agent | yes | no | yes | no |
create_agent | Save an agent | no | no | no | no |
update_agent | Change a saved agent | no | yes | yes | no |
delete_agent | Delete a saved agent | no | yes | yes | no |
list_routines | List Routines | yes | no | yes | no |
get_routine | Read a Routine | yes | no | yes | no |
create_routine | Schedule a Routine | no | yes | no | yes |
update_routine | Change a Routine | no | yes | yes | yes |
delete_routine | Delete a Routine | no | yes | yes | no |
run_routine_now | Run a Routine now | no | yes | no | yes |
get_setup_status | Check Amdahl setup | yes | no | yes | no |
list_connectors | List connectable sources | yes | no | yes | no |
list_connections | List connected sources | yes | no | yes | no |
get_connection | Read a connection | yes | no | yes | no |
get_connection_status | Read a connection status | yes | no | yes | no |
list_connection_syncs | List connection syncs | yes | no | yes | no |
get_connection_summary | Summarize synced data | yes | no | yes | no |
connect_source | Connect a data source | no | no | no | yes |
reconnect_connection | Reconnect a source | no | yes | no | yes |
update_connection | Rename or reassign a connection | no | yes | yes | no |
disconnect_connection | Disconnect a source | no | yes | yes | no |
Destructive means the tool removes or overwrites something stored (an update,
a delete, a disconnect), stops work in progress (cancel_chat,
cancel_research), or starts an agent turn that can act outside Amdahl.
start_chat, answer_chat_question, run_routine_now, create_routine and
update_routine are destructive for that reason: the turn they start or
schedule may email workspace members and act on the web through a connected
browser, so a client asks before each one. Starting an eval or a research job
is not destructive: neither can send anything. optimize_message
is not read-only: each optimize is stored as a run, teaches Amdahl the sender's
voice and counts toward the monthly cap. It sends nothing and changes nothing in
your CRM or other tools. A client set to ask before write tools asks before each
optimize. Hints are advice to the client, not a security boundary: what a call
may do is still decided by your credential's scopes and role.
Per-operation detail (required scopes, required role, the MCP tool for each operation, and the exact description your agent sees) is in the tool catalog. The catalog is generated from the same registry the server reads, so it cannot drift from what the tools do.
Tool names before October 2026
Until October 2026 the server listed ten tools, each taking an action
(messages, search, and a _read and _manage pair for research, evals,
agents and connections). Those names still work until 20 January 2027: a
call such as messages with { "action": "optimize" } runs optimize_message.
They are not listed, and they will be removed no earlier than that date. A
client that refreshes its tool list sees the new names.
A permission rule that names an old tool stops matching as soon as the new
names are live, because Claude Code calls only the tools the server lists. An
allow rule such as mcp__amdahl__messages no longer auto-approves anything,
so Claude asks again. A deny rule such as mcp__amdahl__agents_manage no
longer blocks anything. Rewrite each rule with the new name, for example
mcp__amdahl__optimize_message or mcp__amdahl__start_chat. Update any
script that names an old tool before the removal date.
Your agent also gets resources it can read directly by URI:
amdahl://capabilities (the capability map as markdown), chat://,
agent://, routine://, subscription://, eval://, eval-run://,
grader-kind://, search-field://, search-overview://, connection://,
setup-status:// and research://.
Two-word schemes are hyphenated over MCP, because an underscore is illegal
in a URI scheme and standards-compliant clients (new URL()) throw on it
before the request is sent. REST pages and error bodies spell the same schemes
with an underscore (eval_run://); the server accepts both, but over MCP send
the hyphenated form. search-overview://current is the one read with no tool
behind it: it reports row counts and time spans per warehouse surface,
the check to run before the first search.
Your client also lists a handful of prompts, canned starting points in its
prompt menu, including system/guide_me, the
guided walkthrough.
Connect a headless client
A backend service, a scheduled job, or your own agent runtime cannot complete a
browser sign-in. It uses an API key instead, the same amdhl_... key the
REST API uses. Create one with the CLI and approve it in the
console:
amdahl keys create --name "My agent" --preset agentStore it as AMDAHL_KEY in your secret manager and send it as a bearer token:
curl -s -X POST "https://app.amdahl.ai/mcp" \
-H "Authorization: Bearer $AMDAHL_KEY" \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-d '{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "search_customers",
"arguments": { "query": "what do customers say about onboarding?" }
}
}'X-API-Key: $AMDAHL_KEY works the same. Pick the narrowest --preset that
covers the job: read-only only searches and reads. See
Command line (CLI) for the presets and
Authentication for what each one reaches.
Add the docs server too
The server above carries your workspace's data. These docs are a separate MCP server, and adding it as well means your agent can look up how a tool behaves instead of guessing at a parameter name:
claude mcp add --transport http amdahl-docs https://docs.amdahl.ai/mcpOr in the same mcpServers block as the one above:
{
"mcpServers": {
"amdahl": { "url": "https://app.amdahl.ai/mcp" },
"amdahl-docs": { "url": "https://docs.amdahl.ai/mcp" }
}
}It is public (no OAuth prompt, no key, nothing to approve) because it serves only the pages you are reading now. Keeping it separate is deliberate: your data stays behind the credential that already protects it, and connecting for documentation costs your workspace connection nothing. Full detail, including the OpenAI form and the fallback for clients that cannot add a second server, is in Read the docs over MCP.
Good to know
- The agent has your permissions, no more. It can only do what your own account is allowed to do in that workspace.
- A session you are using does not expire. If you are building your own client rather than using a ready-made one, read Reliability and retries. It covers what ends a session and the one retry that recovers from it.
- No workspace yet? Any work email can sign in, but connecting needs a workspace. Without one, the sign-in page says Join the beta and links to the waitlist at console.amdahl.ai/new (or says Create a workspace first, if you are already approved). Connect again once you have a workspace. If your company already uses Amdahl, ask an admin there to add you. To try the optimizer meanwhile, use console.amdahl.ai/try.
See also
- Read the docs over MCP: the public documentation server, so your agent can look things up instead of being handed a link.
- Guided walkthrough: have the assistant interview you instead of guessing what to ask.
- Reliability and retries: session lifetime and the one error worth retrying.
- Tool catalog: every operation, its scopes, and its required role.
- Glossary: the Amdahl-specific words these pages use.