Add phone calls to an agent built with an SDK
Short answer: Connect https://callforme.tel/mcp as a remote MCP server with an Authorization: Bearer cfm_ key header. Your framework's agent then gets find_business, plan_call, place_call and get_call. Raise the step limit: a call takes a few minutes of get_call polling. No key yet? Use https://callforme.tel/mcp/open; the first real call returns a setup link.
If your agent runs in your own code, it can still make phone calls. Every major agent framework can use a remote MCP server, and CallForMe is one URL plus a key. Code below is from each SDK's MCP docs, checked October 30, 2026.
Set your key once:
export CALLFORME_KEY=cfm_... # from https://callforme.tel/account
OpenAI Agents SDK (Python)
MCPServerStreamableHttp connects the server; the agent gets its tools (OpenAI Agents SDK MCP docs).
import asyncio, os
from agents import Agent, Runner
from agents.mcp import MCPServerStreamableHttp
async def main():
async with MCPServerStreamableHttp(
name="callforme",
params={
"url": "https://callforme.tel/mcp",
"headers": {"Authorization": f"Bearer {os.environ['CALLFORME_KEY']}"},
"timeout": 60,
},
cache_tools_list=True,
) as callforme:
agent = Agent(
name="Assistant",
instructions="Use CallForMe to phone businesses. Follow each call with get_call until it ends.",
mcp_servers=[callforme],
)
result = await Runner.run(agent, "Call Maple Street Pizza at (469) 770-7412 and ask what time they close tonight.", max_turns=30)
print(result.final_output)
asyncio.run(main())
Claude Agent SDK (TypeScript)
Pass CallForMe in mcpServers and allow its tools.
import { query } from "@anthropic-ai/claude-agent-sdk";
for await (const msg of query({
prompt: "Call Maple Street Pizza at (469) 770-7412 and ask what time they close tonight.",
options: {
mcpServers: {
callforme: {
type: "http",
url: "https://callforme.tel/mcp",
headers: { Authorization: `Bearer ${process.env.CALLFORME_KEY}` },
},
},
allowedTools: ["mcp__callforme__*"],
maxTurns: 30,
},
})) {
if (msg.type === "result" && msg.subtype === "success") console.log(msg.result);
}
Vercel AI SDK (TypeScript)
createMCPClient from @ai-sdk/mcp turns the server into tools (AI SDK MCP docs). stopWhen lets the model keep calling tools until the call is done.
import { createMCPClient } from "@ai-sdk/mcp";
import { generateText, stepCountIs } from "ai";
const callforme = await createMCPClient({
transport: {
type: "http",
url: "https://callforme.tel/mcp",
headers: { Authorization: `Bearer ${process.env.CALLFORME_KEY}` },
},
});
try {
const { text } = await generateText({
model: "anthropic/claude-sonnet-5.5",
tools: await callforme.tools(),
stopWhen: stepCountIs(30),
prompt: "Call Maple Street Pizza at (469) 770-7412 and ask what time they close tonight.",
});
console.log(text);
} finally {
await callforme.close();
}
LangChain (Python)
MultiServerMCPClient from langchain-mcp-adapters loads the tools for create_agent (langchain-mcp-adapters).
import asyncio, os
from langchain_mcp_adapters.client import MultiServerMCPClient
from langchain.agents import create_agent
async def main():
client = MultiServerMCPClient({
"callforme": {
"transport": "http",
"url": "https://callforme.tel/mcp",
"headers": {"Authorization": f"Bearer {os.environ['CALLFORME_KEY']}"},
}
})
agent = create_agent("anthropic:claude-sonnet-5-5", await client.get_tools())
result = await agent.ainvoke(
{"messages": "Call Maple Street Pizza at (469) 770-7412 and ask what time they close tonight."},
{"recursion_limit": 60},
)
print(result["messages"][-1].content)
asyncio.run(main())
Things to get right
- Follow the call.
place_callreturns acall_idright away. The tool's own instructions tell the model to callget_callwithwait_seconds=45untilstatusisendedandoutcomeis present. That's why each example raises the step or turn limit. - Mid-call questions. If the business asks something the request didn't cover,
get_callreturnspending_question. The model answers withanswer_questionwithin about 45 seconds. Put names, numbers and pre-approved choices indetailsandif_askedto avoid it. - The first real call. A new key's first call to a real business may return
needs_setupwith a link for a person to add $10. Show it to a person: your code can't pay it. - Several calls at once.
call_aroundfinds and calls up to 100 places with the same questions, 10 at a time, andget_batchreturns one table.
What it costs
Demo lines are free. Real calls are $1 if answered, including the first 2 minutes, then $0.40 a minute. Calls nobody answers are free.
Related
- REST API, for code that places calls without a model
- MCP tools
- n8n, Zapier and Make
- Add phone calls to your AI agent
Questions
Where do I get a key?
Sign in on the account page and create one; it starts with cfm_. Or connect to https://callforme.tel/mcp/open with no key: the first real call returns a setup link for the person, and an account_key your code can save.
Why raise the step limit?
place_call returns right away, and the agent then calls get_call with wait_seconds=45 until the call ends, usually 2 to 5 rounds. Frameworks that stop after a few steps would end the run mid-call.
Should I use MCP or the REST API?
MCP when a model decides who to call and what to ask. The REST API when your own code places the call and reads the answers, with no model in the loop.
Can I test without paying?
Yes. The demo lines are fictional businesses that answer for real, free and without a key, 6 a day (30 a day once your account has added credit): Maple Street Pizza at (469) 770-7412 is the usual first test.
Add CallForMe to your agent
One URL for any MCP agent. Connecting asks for nothing.