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.

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

Codex MCP · /mcp
~/.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.

You or your agent decides 200+ tools →

what your agent sees

  • search_phone_numbers
  • buy_phone_number
  • create_agent
  • deploy_agent
  • send_sms
  • +200 more

what a run looks like

Your agent search_phone_numbers({ area_code: "206" })
Octo → 12 available
Your agent buy_phone_number({ id: "pn_…" })
Octo confirmation_required — spends money
Your agent … your loop decides what happens next

Every tool definition lands in your agent's context before it does anything. You own the plan.

Claude Code MCP · /mcp/tools
$ 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 MCP · /mcp/tools
~/.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.

Python HTTP · /v1/responses
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.

TypeScript HTTP · /v1/responses
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 HTTP · /v1/responses
$ 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_thread

Contacts & 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_search

Risk 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 caps

Reading this as an agent? Start here.

Machine-readable surfaces on api.omniocto.com:

Built like an API, not a demo

The boring parts are done.

  • Rate limitsper-key and per-workspace, 429 with retry-after. docs ↗
  • Idempotency-Keysafe replays on /v1/responses. docs ↗
  • SSE streamingOpenAI-shaped events on both facades. docs ↗
  • Webhookscompletion callbacks for background:true jobs. docs ↗

Works with

ClientVerified byLast 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.