For developers and agent operators · MCP + API
One MCP server. One OpenAI-compatible API.
Point either at Octo and your agent gets a phone number, an inbox, and a WhatsApp line — with a human confirmation before anything spends money.
claude mcp add --transport http octo https://api.omniocto.com/mcp \
--header "Authorization: Bearer $OMNIOCTO_API_KEY" Then: “Octo, answer my business phone and text me a summary of every call.”
The agentic way · recommended
Octo picks the tools.
Three tools reach your agent. You describe the outcome, Octo plans it, and anything that spends money waits for your YES. Point any MCP client at /mcp — /mcp/octo is a permanent alias.
what your agent sees
- send_message
- list_conversations
- get_conversation
what a run looks like
Your agent's context stays about your problem. Octo owns the plan and the confirmations.
$ claude mcp add --transport http octo \ https://api.omniocto.com/mcp✓ connected · 3 tools› “Answer my business phone — buy a number and call my cell to prove it.”octo ▸ send_message searched · bought — risky, held for confirmation → YES 4821 created the agent · deployed it● your phone is ringing One command. Restart, then just ask.
~/.codex/config.toml[mcp_servers.octo]url = "https://api.omniocto.com/mcp"bearer_token_env_var = "OMNIOCTO_API_KEY"● octo · 3 tools› “Answer my business phone — buy a number and call my cell to prove it.”octo ▸ send_message searched · bought — risky, held for confirmation → YES 4821 created the agent · deployed it● your phone is ringing Three lines in the config file Codex already reads.
The agentic way · full catalog
Your agent picks the tools.
All 200+ tool definitions reach your agent before it does anything, and your loop owns the plan. MCP is stateless, with nowhere to park a pending action — so spend, destructive and mass-message tools answer confirmation_required instead of running. Same client, point it at /mcp/tools.
what your agent sees
- search_phone_numbers
- buy_phone_number
- create_agent
- deploy_agent
- send_sms
- +200 more
what a run looks like
search_phone_numbers({ area_code: "206" }) buy_phone_number({ id: "pn_…" }) confirmation_required — spends money Every tool definition lands in your agent's context before it does anything. You own the plan.
$ claude mcp add --transport http octo \ https://api.omniocto.com/mcp/tools✓ connected · 200+ tools› “Answer my business phone — buy a number and call my cell to prove it.”tool ▸ search_phone_numbers area_code=206 → 12 availabletool ▸ buy_phone_number confirmation_required — spends money Same command, different URL. That is the whole difference.
~/.codex/config.toml[mcp_servers.octo]url = "https://api.omniocto.com/mcp/tools"bearer_token_env_var = "OMNIOCTO_API_KEY"● octo · 200+ tools› “Answer my business phone — buy a number and call my cell to prove it.”tool ▸ search_phone_numbers area_code=206 → 12 availabletool ▸ buy_phone_number confirmation_required — spends money Same file, different url. Nothing else changes.
The API way
OpenAI Compatible APIs.
Change base_url and api_key and your existing code runs. Both OpenAI surfaces are supported — the newer Responses API at /v1/responses, and Chat Completions at /v1/chat/completions — with the same planning and the same confirmations as MCP.
from openai import OpenAIclient = OpenAI( base_url="https://api.omniocto.com/v1", api_key=os.environ["OMNIOCTO_API_KEY"],)r = client.responses.create( input="Answer my business phone — buy a number and call my cell to prove it.") Two lines change in code you have already written.
import OpenAI from "openai";const client = new OpenAI({ baseURL: "https://api.omniocto.com/v1", apiKey: process.env.OMNIOCTO_API_KEY,});const r = await client.responses.create({ input: "Answer my business phone — buy a number and call my cell to prove it.",}); The same two lines, the same SDK shape.
$ curl https://api.omniocto.com/v1/responses \ -H "Authorization: Bearer $OMNIOCTO_API_KEY" \ -H "Content-Type: application/json" \ -d '{"input":"Answer my business phone — buy a number and call my cell to prove it."}' No SDK at all. It is just HTTP.
One key works for all of it. Same workspace, same audit trail, same confirmations.
What your agent gains
What the 200+ tools actually cover.
Telephony & messaging
Buy phone numbers, place and answer real calls, send WhatsApp and SMS, draft and send email replies.
search_phone_numbers · buy_phone_number · start_voice_call · send_message_to_contact · send_whatsapp_template · reply_to_email_threadContacts & knowledge
A contacts CRM, every conversation on every channel in one inbox, and a knowledge base your agent can search.
create_contact · find_contact_by_channel · get_conversations · kb_searchRisk classes & spend caps
Every tool in the catalog carries a risk class. Risky actions stop for a YES-code confirmation, and spend caps hold the line — your agent can't accidentally spend.
risk classes · "Reply YES 4821" two-phase commit · LLM + voice-minute spend capsReading this as an agent? Start here.
Machine-readable surfaces on api.omniocto.com:
/llms.txt/.well-known/skills/index.json/v1/openapi.json/mcp-docs— MCP endpoint, add it to a client
Built like an API, not a demo
The boring parts are done.
- Rate limits — per-key and per-workspace,
429withretry-after. docs ↗ - Idempotency-Key — safe replays on
/v1/responses. docs ↗ - SSE streaming — OpenAI-shaped events on both facades. docs ↗
- Webhooks — completion callbacks for
background:truejobs. docs ↗
Works with
| Client | Verified by | Last conformance run |
|---|---|---|
| OpenAI SDK (Python / TS) | base_url + api_key swap against /v1 | verified 2026-08-06 |
| Claude Code (MCP) | claude mcp add → live tool call | conformance run pending |
| curl | raw HTTP against /v1 | verified 2026-08-06 |
Compatibility is tested, not assumed: each row gets a dated, repeatable verification run before this page goes public.
Start
Mint a key. Point your agent at it.
A key is a workspace credential carrying your role — it can do everything you can. Treat it like a password.