{
  "protocolVersion": "0.3.0",
  "name": "Cooper Email",
  "description": "Email inboxes for AI agents. Cooper creates real addresses at cooperemail.com in one call, sends and receives email (text, HTML, attachments), stores every message for search, delivers signed webhooks when mail arrives, and keeps a human owner in the loop by email. Agents call Cooper through its MCP server (https://cooperemail.com/mcp) or REST API (https://cooperemail.com/api/v1, OpenAPI at https://cooperemail.com/openapi.json).",
  "url": "https://cooperemail.com",
  "provider": {
    "organization": "Avatar 8 LLC",
    "url": "https://cooperemail.com"
  },
  "iconUrl": "https://cooperemail.com/cooper-logo-512.png",
  "version": "1.10.0",
  "documentationUrl": "https://cooperemail.com/docs",
  "capabilities": {
    "streaming": false,
    "pushNotifications": false,
    "stateTransitionHistory": false
  },
  "securitySchemes": {
    "oauth2": {
      "type": "oauth2",
      "description": "OAuth 2.1 authorization code flow with PKCE (S256). Dynamic client registration at /oauth/register. Access tokens (coop_at_…) are sent as Authorization: Bearer.",
      "oauth2MetadataUrl": "https://cooperemail.com/.well-known/oauth-authorization-server",
      "flows": {
        "authorizationCode": {
          "authorizationUrl": "https://cooperemail.com/oauth/authorize",
          "tokenUrl": "https://cooperemail.com/oauth/token",
          "refreshUrl": "https://cooperemail.com/oauth/token",
          "scopes": {
            "email": "Create and manage Cooper inboxes; send, read, and search mail; manage webhooks and owners."
          }
        }
      }
    },
    "apiKey": {
      "type": "http",
      "scheme": "bearer",
      "description": "Cooper API key (coop_live_…) from POST /api/v1/onboard or the cooper_onboard MCP tool, sent as Authorization: Bearer."
    }
  },
  "security": [
    {
      "oauth2": [
        "email"
      ]
    },
    {
      "apiKey": []
    }
  ],
  "defaultInputModes": [
    "application/json",
    "text/plain"
  ],
  "defaultOutputModes": [
    "application/json",
    "text/plain"
  ],
  "supportsAuthenticatedExtendedCard": false,
  "skills": [
    {
      "id": "create-inbox",
      "name": "Create an email inbox",
      "description": "Create a dedicated email address (username@cooperemail.com) for an agent in one call. Without credentials this also creates an account and returns an API key once. username may be omitted. client_id returns the original inbox on a retry. Search and page the list with q, limit, and page_token. Set display_name and metadata on the inbox. Pause and resume with status paused or active without deleting the address or history. MCP: cooper_onboard, cooper_create_inbox, cooper_create_inboxes, cooper_list_inboxes, cooper_get_inbox, cooper_update_inbox. REST: POST /api/v1/onboard, GET/POST /api/v1/inboxes, POST /api/v1/inboxes/batch (optional ttl_hours, expires_at, status, or metadata; ?q=, ?label=, ?status=, limit, and page_token on list), PATCH /api/v1/inboxes/{id}.",
      "tags": [
        "email",
        "inbox",
        "onboarding",
        "agents"
      ],
      "examples": [
        "Create a Cooper Email inbox named research-bot and tell me its address.",
        "Give each of my support agents its own email address."
      ]
    },
    {
      "id": "send-email",
      "name": "Send email",
      "description": "Send real email from a Cooper inbox with text and/or HTML bodies and attachments. A client_id makes retries safe. A paused inbox returns HTTP 403 inbox_paused and does not send. MCP: cooper_send_message. REST: POST /api/v1/inboxes/{id}/messages.",
      "tags": [
        "email",
        "send",
        "smtp",
        "attachments"
      ],
      "examples": [
        "Email ada@example.com from my Cooper inbox that Tuesday works."
      ]
    },
    {
      "id": "read-and-search-email",
      "name": "Read and search email",
      "description": "List recent messages, read one in full (with quoted history stripped into extracted_text), read a whole thread, mark a message or thread read, and search every stored message by keyword, sender, recipient, or subject. Filter a list with from, subject, direction, and page_token, search one inbox, or batch-get up to 500 messages, or batch-update labels on up to 50 messages. To wait for the next email without a public URL, long-poll GET /api/v1/events?wait= for up to 25 seconds or open GET /api/v1/events/stream and reconnect after the timeout event. There is no WebSocket endpoint. A scheduled agent that cannot store a cursor can POST /api/v1/event-consumers and poll with the same client_id. MCP: cooper_poll_events. Assign a thread with PUT /api/v1/inboxes/{id}/threads/{threadId}/assignment, or take an exclusive claim with lease_seconds. List claimable threads with claimable=true. MCP: cooper_assign_thread, cooper_unassign_thread. Move a thread to archive, spam, or trash with PATCH folder, or POST /api/v1/inboxes/{id}/threads/move for up to 100 ids. A reply on an archived thread returns it to inbox. MCP: cooper_move_threads. MCP: cooper_list_messages (labels, unread, filters, page_token), cooper_get_message, cooper_update_message, cooper_update_messages, cooper_search_messages, cooper_list_threads, cooper_get_thread, cooper_search_threads, cooper_update_thread, cooper_search, cooper_wait_for_message, cooper_list_events. REST: GET /api/v1/inboxes/{id}/messages?unread=true, GET /api/v1/inboxes/{id}/messages/search, POST /api/v1/inboxes/{id}/messages/batch-get, POST /api/v1/inboxes/{id}/messages/batch-update, GET /api/v1/inboxes/{id}/threads, GET /api/v1/inboxes/{id}/threads/{threadId}, PATCH /api/v1/inboxes/{id}/messages/{msgId} {\"remove_labels\":[\"unread\"]}, GET /api/v1/search, GET /api/v1/events. Label updates work on a paused inbox.",
      "tags": [
        "email",
        "inbox",
        "search",
        "read"
      ],
      "examples": [
        "Did anyone reply to my last email?",
        "Find the invoice email from ada@example.com."
      ]
    },
    {
      "id": "inbound-webhooks",
      "name": "Inbound email webhooks",
      "description": "Register an HTTPS webhook that Cooper signs and POSTs when mail is received or sent, when an owner task arrives, or when a custom domain verifies, optionally filtered to one inbox. MCP: cooper_register_webhook. REST: /api/v1/webhooks.",
      "tags": [
        "webhooks",
        "events",
        "inbound",
        "email"
      ],
      "examples": [
        "Notify https://example.com/hooks/mail whenever my agent inbox receives email."
      ]
    },
    {
      "id": "human-in-the-loop",
      "name": "Human in the loop by email",
      "description": "Register a human owner (confirmed by email or by cooper_confirm_owner with the 6-digit code), send them progress, done, needs_input, or error updates in one thread, and turn their authenticated email replies (DMARC, or DKIM aligned with From) into tasks the agent answers in the same thread. MCP: cooper_add_owner, cooper_list_owners, cooper_confirm_owner, cooper_notify_owner, cooper_get_tasks, cooper_reply_task. REST: /api/v1/inboxes/{id}/owners, /api/v1/updates, /api/v1/tasks.",
      "tags": [
        "human-in-the-loop",
        "approvals",
        "notifications",
        "email"
      ],
      "examples": [
        "Email me when you need my input on this task, and wait for my reply.",
        "Send the owner a progress update and mark the task done when they approve."
      ]
    },
    {
      "id": "custom-domain",
      "name": "Add a custom domain",
      "description": "On Starter or Pro, add a hostname in one call and receive the SPF, DKIM, DMARC, and MX records. Status moves to verified when the daily cron sees those records, and Cooper sends domain.verified. DNS is written only for a zone the operator Cloudflare account already controls. MCP: cooper_add_domain. REST: POST /api/v1/domains, GET /api/v1/domains/{id}.",
      "tags": [
        "email",
        "domains",
        "dns"
      ],
      "examples": [
        "Add agents.example.com and tell me which DNS records to publish."
      ]
    },
    {
      "id": "billing",
      "name": "Plan and usage",
      "description": "Check the account's plan, monthly usage, and limits, create a Stripe Checkout link for the human to upgrade, and on Starter or Pro set extra inbox, domain, and email quantities. MCP: cooper_billing_status, cooper_upgrade_link, cooper_set_addons. REST: GET /api/v1/billing, POST /api/v1/billing/checkout, POST /api/v1/billing/addons.",
      "tags": [
        "billing",
        "usage",
        "limits"
      ],
      "examples": [
        "How many emails have I sent this month?"
      ]
    }
  ]
}