---
title: "Add phone calls to an agent built with an SDK"
description: "Give an agent built with the OpenAI Agents SDK, Claude Agent SDK, Vercel AI SDK or LangChain a phone: connect the CallForMe MCP server and it calls businesses."
url: https://callforme.tel/agents/agent-sdks
published: 2026-10-30
updated: 2026-10-30
author: CallForMe team, Great Work LLC
---

# Add phone calls to an agent built with an SDK

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

```bash
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](https://openai.github.io/openai-agents-python/mcp/)).

```python
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.

```typescript
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](https://ai-sdk.dev/docs/ai-sdk-core/mcp-tools)). `stopWhen` lets the model keep calling tools until the call is done.

```typescript
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](https://github.com/langchain-ai/langchain-mcp-adapters)).

```python
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.

## Related

- [REST API](/docs/rest-api), for code that places calls without a model
- [MCP tools](/docs/mcp)
- [n8n, Zapier and Make](/agents/automations)
- [Add phone calls to your AI agent](/guides/add-phone-calls-to-your-ai-agent)

## FAQ

### 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.

## Related

- [Quickstart](https://callforme.tel/docs/quickstart.md)
- [Changelog: what's new, newest first](https://callforme.tel/docs/changelog.md)
- [Can AI call around to every business near me?](https://callforme.tel/guides/call-around.md)
