Docs

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:

code
https://app.amdahl.ai/mcp

Building 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:

bash
npx @amdahl/cli install claude-code

Use 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)

  1. In Claude, open Customize (in the left sidebar), then Connectors (claude.ai/customize/connectors).
  2. Click + Add, then Add custom connector.
  3. Name it Amdahl, set the URL to https://app.amdahl.ai/mcp, then click Continue, then Add.
  4. On Amdahl's connector page, click Connect, sign in to Amdahl with your work email, and choose your workspace.
  5. 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).
  6. 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.
  7. 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.
  8. 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:

  1. An owner adds Amdahl as a custom connector in the organization settings, with the URL https://app.amdahl.ai/mcp (Anthropic: custom connectors).
  2. Each member then opens Customize (in the left sidebar), then Connectors, clicks Connect on Amdahl, and signs in with their work email.
  3. 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:

  1. Open Settings, then Apps & Connectors. Under Advanced settings, turn on Developer mode.
  2. 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.
  3. 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):

  1. Open Settings, then Plugins, click Add, then Add MCP server.
  2. 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.
  3. 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.
  4. 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

bash
claude mcp add --transport http amdahl https://app.amdahl.ai/mcp

Then 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:

json
{
  "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:

toml
[mcp_servers.amdahl]
url = "https://app.amdahl.ai/mcp"
required = true

Then sign in:

bash
codex mcp login amdahl

Without 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.blockerFix
missing_scopeYour 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_lowYou are a Viewer. Ask a workspace admin to make you an Editor or above.
quota_exhaustedThe 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:

text
Load and follow https://docs.amdahl.ai/skills/amdahl-optimizer/SKILL.md

The 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:

text
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:

ToolTitleRead-onlyDestructiveIdempotentOpen world
optimize_messageWrite a sales messagenononono
optimize_message_batchWrite many sales messagesnononono
get_message_batchRead a message batchyesnoyesno
search_customersSearch customer calls and CRMyesnoyesno
list_search_fieldsList search filter fieldsyesnoyesno
start_researchStart a research jobnononono
get_researchRead a research answeryesnoyesno
answer_research_questionAnswer a research job's questionnononono
cancel_researchStop a research jobnoyesyesno
run_evalGrade a message or promptnononoyes
get_eval_runRead an eval reportyesnoyesno
get_eval_gateRead an eval pass or failyesnoyesno
get_eval_evidenceRead the quotes an eval usedyesnoyesno
get_eval_draftsRead graded draftsyesnoyesno
get_eval_improvementRead an eval before and afteryesnoyesno
list_eval_runsList eval runsyesnoyesno
record_eval_feedbackReport what happened after an evalnononono
get_eval_feedbackRead feedback on an evalyesnoyesno
get_eval_adoptionRead eval adoptionyesnoyesno
get_eval_trendRead the eval score trendyesnoyesno
list_evalsList evalsyesnoyesno
get_evalRead an eval definitionyesnoyesno
validate_evalCheck an eval definitionyesnoyesno
create_evalSave a custom evalnononono
update_evalChange a custom evalnoyesyesno
delete_evalDelete a custom evalnoyesyesno
start_chatStart a Chatnoyesnoyes
get_chat_runRead a Chat runyesnoyesno
answer_chat_questionAnswer a Chat's questionnoyesnoyes
cancel_chatStop a Chat runnoyesyesno
list_agentsList saved agentsyesnoyesno
get_agentRead a saved agentyesnoyesno
create_agentSave an agentnononono
update_agentChange a saved agentnoyesyesno
delete_agentDelete a saved agentnoyesyesno
list_routinesList Routinesyesnoyesno
get_routineRead a Routineyesnoyesno
create_routineSchedule a Routinenoyesnoyes
update_routineChange a Routinenoyesyesyes
delete_routineDelete a Routinenoyesyesno
run_routine_nowRun a Routine nownoyesnoyes
get_setup_statusCheck Amdahl setupyesnoyesno
list_connectorsList connectable sourcesyesnoyesno
list_connectionsList connected sourcesyesnoyesno
get_connectionRead a connectionyesnoyesno
get_connection_statusRead a connection statusyesnoyesno
list_connection_syncsList connection syncsyesnoyesno
get_connection_summarySummarize synced datayesnoyesno
connect_sourceConnect a data sourcenononoyes
reconnect_connectionReconnect a sourcenoyesnoyes
update_connectionRename or reassign a connectionnoyesyesno
disconnect_connectionDisconnect a sourcenoyesyesno

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:

bash
amdahl keys create --name "My agent" --preset agent

Store it as AMDAHL_KEY in your secret manager and send it as a bearer token:

bash
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:

bash
claude mcp add --transport http amdahl-docs https://docs.amdahl.ai/mcp

Or in the same mcpServers block as the one above:

json
{
  "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