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_call returns a call_id right away. The tool's own instructions tell the model to call get_call with wait_seconds=45 until status is ended and outcome is 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_call returns pending_question. The model answers with answer_question within about 45 seconds. Put names, numbers and pre-approved choices in details and if_asked to avoid it.
  • The first real call. A new key's first call to a real business may return needs_setup with a link for a person to add $10. Show it to a person: your code can't pay it.
  • Several calls at once. call_around finds and calls up to 100 places with the same questions, 10 at a time, and get_batch returns 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.

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.

https://callforme.tel/mcp

Install steps for your agentTry a free demo callPricing