Oveyon

MCP server

The whole API, as tools for your agent.

MCP — Model Context Protocol — is the open standard AI clients use to call outside tools: the agent asks the server which tools it has and calls each one by name. Ours turns every route of the Oveyon API into a tool, within your key’s scopes, limits and record.

Included in every plan, the free one too · Claude Code, Claude Desktop, Cursor, VS Code, Codex CLI, Windsurf

Claude Codeterminal
# 1. connect, with the agent’s key
claude mcp add --transport http oveyon https://mcp.oveyon.com/v1 --header "Authorization: Bearer ov_YOUR_KEY"

# 2. ask, in plain words
> Which domains can I send from?
→ list_domains

The server

One address, and the key you already have.

No new account, no new password: the server answers to the account’s API key, through the same gate as the REST API.

Address
https://mcp.oveyon.com/v1 — the old address, https://api.oveyon.com/v1/mcp, also works and keeps working
Transport
Streamable HTTP, stateless: POST only
Authentication
Authorization: Bearer ov_YOUR_KEY — the account’s API key; 401, 403 and 429 exactly as in the REST API
Tools
One per route of the REST API — 76 — and the server lists only those the key’s scopes allow; whoami and check_disposable work with every key
whoami
The account, the key, and which tools are available or not, with the scope each one needs
Guide
The resource oveyon://guide holds the procedure for the agent
Same rules
Every tool call is an API call with the same key: scopes, quotas, policies, idempotency and the call log apply unchanged — in the API logs, the calls show up as the family oveyon-mcp
Errors
They reach the model whole: the error code, the message and Retry-After
Price
Included in every plan, Free too; what the agent sends counts against the plan quota as usual

Four steps

Connected in four steps.

1

Pick your client

Claude Code, Claude Desktop, Cursor, VS Code, Codex CLI or Windsurf — or any client that can send a header. Each one keeps its configuration in a different place.

2

Create a key for the agent

From the panel’s MCP screen (Sending → MCP): the suggested scopes come ticked, and so does «Require human approval for this key’s sends». The key is shown once.

3

Paste the configuration

Sending → MCP prints it for your client, and it is below too. Replace ov_YOUR_KEY with the key — in the client, never in a repository.

4

Ask your agent

In plain words. It picks and calls the tools; with the lock on, what it sends waits for a person under Messages → Approvals.

Configuration

Paste this into your client.

The same text the panel prints under Sending → MCP. Replace ov_YOUR_KEY with the agent’s key.

Claude Code

In the terminal:

terminal
claude mcp add --transport http oveyon https://mcp.oveyon.com/v1 --header "Authorization: Bearer ov_YOUR_KEY"

Claude Desktop

Under Settings → Developer → Edit Config. The mcp-remote bridge sends the header for Claude Desktop.

claude_desktop_config.json
{
  "mcpServers": {
    "oveyon": {
      "command": "npx",
      "args": [
        "-y",
        "mcp-remote@0.14.3",
        "https://mcp.oveyon.com/v1",
        "--transport",
        "http-only",
        "--header",
        "Authorization:${OVEYON_AUTH}"
      ],
      "env": {
        "OVEYON_AUTH": "Bearer ov_YOUR_KEY"
      }
    }
  }
}

Cursor

In ~/.cursor/mcp.json — not the project’s .cursor/mcp.json, which usually goes into the repository.

~/.cursor/mcp.json
{
  "mcpServers": {
    "oveyon": {
      "url": "https://mcp.oveyon.com/v1",
      "headers": {
        "Authorization": "Bearer ov_YOUR_KEY"
      }
    }
  }
}

VS Code

In .vscode/mcp.json. VS Code asks for the key once and stores it as a secret — it never sits in the file.

.vscode/mcp.json
{
  "servers": {
    "oveyon": {
      "type": "http",
      "url": "https://mcp.oveyon.com/v1",
      "headers": {
        "Authorization": "Bearer ${input:oveyon-key}"
      }
    }
  },
  "inputs": [
    {
      "type": "promptString",
      "id": "oveyon-key",
      "description": "Oveyon API key",
      "password": true
    }
  ]
}

Codex CLI

In ~/.codex/config.toml. Export OVEYON_API_KEY in the environment first.

~/.codex/config.toml
[mcp_servers.oveyon]
url = "https://mcp.oveyon.com/v1"
bearer_token_env_var = "OVEYON_API_KEY"

Windsurf

In mcp_config.json, opened from the editor: Cascade → MCP.

mcp_config.json
{
  "mcpServers": {
    "oveyon": {
      "serverUrl": "https://mcp.oveyon.com/v1",
      "headers": {
        "Authorization": "Bearer ov_YOUR_KEY"
      }
    }
  }
}

Any other client

The URL and the Authorization header, over Streamable HTTP. To check by hand — the answer arrives as an event, on the data: line:

terminaltools/list
curl -X POST https://mcp.oveyon.com/v1 \
  -H "Authorization: Bearer ov_YOUR_KEY" \
  -H "Content-Type: application/json" \
  -H "Accept: application/json, text/event-stream" \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/list","params":{}}'

Examples

What you type, and what the agent does.

No API to learn: the agent picks the tool and the arguments. A few requests, and the tools behind them.

You typeThe agent callsWhat happens
«Which domains can I send from?»list_domainsIt lists the account’s domains.
«Send the welcome email to ana@example.com from hello@yourdomain.com — hold it for my approval.»send_emailWith hold: true and an idempotencyKey: the email becomes a draft a person approves under Messages → Approvals, and a repeat never sends twice.
«What arrived in support@ today? Flag anything the safety verdict marks dangerous.»list_inbound
get_inbound
list_inbound with the agent_safety filter, then get_inbound on what it opens: every message carries the verdict — clean, suspicious or dangerous — with the score and the signals.
«Reply to the last message from joao@example.com saying we received it.»reply_inboundA plain-text reply from the mailbox that received the message. With the lock on, it waits for approval like any send.
«Which Oveyon account and key am I using, and what can it do?»whoamiThe account, the key, the tools it can call and the scope each of the others needs.

Safety

The agent works inside the key, not around it.

A received email can carry hidden orders. The brakes live in the key and in the platform — not in the prompt.

Scopes decide the tools

The server lists only what the key’s scopes allow: a read-only key only reads. The suggested key has no approve:holds — the key that sends is not the one that approves.

Human approval on every send

Created from the MCP screen, the key comes with «Require human approval for this key’s sends» ticked: a sending policy turns every email and every reply the agent sends into a draft a person approves under Messages → Approvals.

The verdict on every message

Every received message carries agentSafety: clean, suspicious or dangerous, a 0–100 score and the signals. An email can give the agent orders; approval is what stops it from obeying them.

The key stays out of the repository

The panel never prints the key: it is shown once, at creation. Keep it in the client’s configuration or in an environment variable — never in a repository.

403 stops, 429 waits

Errors reach the model whole — code, message, Retry-After: on a 429 the agent waits; on a 403 it stops and tells you.

Every call in the log

Each tool call is an API call with the same key — scopes, quotas, policies and idempotency apply — and shows up in the API logs as the family oveyon-mcp.

The tools

The tools, by scope.

Each tool is one route of the API and needs that route’s scope. The server lists only what the key allows.

ScopeTools
sendsend_email
read:messageslist_messages, get_message
read:statsget_stats
read:suppressionslist_suppressions
write:suppressionsadd_suppression, remove_suppression
read:domainslist_domains
write:domainsadd_domain, verify_domain
manage:webhookslist_webhooks, create_webhook, update_webhook, delete_webhook
read:inboundlist_inbound, get_inbound, get_inbound_content, list_threads, get_thread, get_inbound_stats
reply:inboundreply_inbound
write:inboundrelease_inbound, list_mailboxes, create_mailbox, get_mailbox, update_mailbox, delete_mailbox, detach_mailbox_channel
approve:holdslist_holds, approve_hold, reject_hold
read:templateslist_templates, get_template
write:templatescreate_template, update_template, publish_template, delete_template
read:send-policieslist_send_policies, get_send_policy, list_send_policy_decisions
write:send-policiescreate_send_policy, update_send_policy, pause_send_policy, unpause_send_policy, reorder_send_policies, delete_send_policy
read:inbound-policieslist_inbound_policies, get_inbound_policy, list_inbound_policy_decisions, simulate_inbound_policy
write:inbound-policiescreate_inbound_policy, update_inbound_policy, pause_inbound_policy, unpause_inbound_policy, reorder_inbound_policies, delete_inbound_policy
read:policieslist_allow_block, list_ip_rules
write:policiesadd_allow_block, remove_allow_block, add_ip_rule, remove_ip_rule, pause_ip_fence, unpause_ip_fence
read:surveyslist_surveys, get_survey, list_survey_responses
write:surveyscreate_survey, update_survey, delete_survey
send:surveyssend_survey
read:logslist_api_logs, get_api_log
no scope (public)check_disposable
every keywhoami

Suggested for an agent’s key, and ticked in the panel: send, read:messages, read:stats, read:suppressions, read:domains, read:inbound, reply:inbound, read:templates, read:inbound-policies — without approve:holds (the key that sends is not the one that approves) and without read:logs.

Questions

Short answers.

Does it cost extra?

No. The MCP server is included in every plan, Free included. It uses your API key, and what the agent sends counts against the plan quota as usual.

Which clients can connect?

Claude Code, Cursor, VS Code, Codex CLI and Windsurf connect directly; Claude Desktop connects through the mcp-remote bridge. Any other client that speaks Streamable HTTP and sends an Authorization header works too.

My client has no field for a header. Can it connect?

The connection on this page is by API key, sent in the Authorization: Bearer header. Claude Desktop connects through the mcp-remote bridge, which sends the header for it — the same works for any client that can start a local command.

Can the agent send without a person seeing it?

Only if you let it. With «Require human approval for this key’s sends» — ticked when the key is created from the MCP screen — every email and every reply becomes a draft a person approves under Messages → Approvals. Without approve:holds, the agent cannot approve its own drafts.

Can it read attachments and reply with files?

The agent reads the message with get_inbound_content; the raw .eml and the attachment bytes are not tools. reply_inbound sends a plain-text reply, without attachments, from the mailbox that received the message. send_email accepts attachments (base64) and templates.

Where do I see what the agent did?

In the API logs: every tool call is an API call made with the agent’s key, and shows up there as the family oveyon-mcp.

I already use https://api.oveyon.com/v1/mcp. Do I need to change it?

No. The old address also works and keeps working.

Connect your agent today. The approval lock comes with it.

MCP included in every plan, the free one too.