OneLi with LangChain / LangGraph
How to let an agent built with LangChain / LangGraph place Hebrew phone calls through OneLi, follow the call, answer consultations and read the result.
Since langchain 1.4 the docs present the built-in MCPAdapter (beta) as the replacement for MultiServerMCPClient. Agents made with create_agent run on LangGraph.
Setup
- Create an API key at oneli.io/app/connect and store it on the server as
ONELI_API_KEY. - Install the packages:
pip install "langchain[mcp]" langchain-openai # or: npm i langchain @langchain/mcp-adapters @langchain/core @langchain/langgraph zodChecked against: langchain 1.4.7 (Python) · langchain 1.5.18 + @langchain/mcp-adapters 2.0.1 (JS)
Python: MCPAdapter
# Current (beta) API: FastMCP Client, auth=<str> sends "Authorization: Bearer <str>"
import asyncio, os
from fastmcp.client import Client
from langchain.agents import create_agent
from langchain.mcp import MCPAdapter
async def main():
async with MCPAdapter(Client("https://mcp.oneli.io/mcp", auth=os.environ["ONELI_API_KEY"])) as adapter:
agent = create_agent("openai:gpt-5", await adapter.list_tools())
r = await agent.ainvoke({"messages": [{"role": "user", "content": "Call +972… and book a table"}]})
print(r["messages"][-1].content)
asyncio.run(main())
# Legacy, still published and still working:
# from langchain_mcp_adapters.client import MultiServerMCPClient
# client = MultiServerMCPClient({"oneli": {"transport": "http", "url": "https://mcp.oneli.io/mcp",
# "headers": {"Authorization": f"Bearer {os.environ['ONELI_API_KEY']}"}}})
# tools = await client.get_tools()JavaScript: MCPAdapter and REST tool
import { MCPAdapter } from '@langchain/mcp-adapters';
import { createAgent, tool } from 'langchain';
import { z } from 'zod';
const adapter = new MCPAdapter({ servers: { oneli: { url: 'https://mcp.oneli.io/mcp',
headers: { Authorization: `Bearer ${process.env.ONELI_API_KEY}` } } } });
try {
const agent = createAgent({ model: 'openai:gpt-5', tools: await adapter.listTools() });
const res = await agent.invoke({ messages: [{ role: 'user', content: 'Call +972…' }] });
console.log(res.messages.at(-1)?.text);
} finally { await adapter.close(); }
const createCallTask = tool(async ({ to_number, goal, instructions }) => {
const r = await fetch('https://api.oneli.io/v1/call-tasks', { method: 'POST',
headers: { Authorization: `Bearer ${process.env.ONELI_API_KEY}`, 'Content-Type': 'application/json' },
body: JSON.stringify({ idempotency_key: crypto.randomUUID(), to_number, goal, instructions }) });
return JSON.stringify(await r.json());
}, { name: 'create_call_task', description: 'Place an AI phone call via OneLi',
schema: z.object({ to_number: z.string(), goal: z.string(), instructions: z.string().optional() }) });Notes
- langchain.mcp emits a LangChainBetaWarning.
- The transport is inferred from the URL.
- With the legacy client, use "transport": "http".
- Python REST tool: @tool from langchain.tools on a function that sends the same POST.
Phone numbers: OneLi accepts an Israeli number in any common format (050-1234567, +972501234567). Once the call starts, the agent follows it with get_call_events or GET /v1/call-tasks/:id/events to answer consultations and get the summary.
Next steps
Sources: docs.langchain.com/oss/python/langchain/mcp · docs.langchain.com/oss/python/langchain/mcp/auth · docs.langchain.com/oss/python/migrate/langchain-mcp-adapters · docs.langchain.com/oss/javascript/langchain/mcp