{"id":8793,"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).","card_url":"https://cooperemail.com/.well-known/agent-card.json","endpoint":"https://cooperemail.com","protocol_version":"0.3.0","first_seen":"2026-10-10T07:48:49.466430+00:00","last_verified":"2026-10-10T07:59:17.803008+00:00","card":{"url":"https://cooperemail.com","name":"Cooper Email","skills":[{"id":"create-inbox","name":"Create an email inbox","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."],"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}."},{"id":"send-email","name":"Send email","tags":["email","send","smtp","attachments"],"examples":["Email ada@example.com from my Cooper inbox that Tuesday works."],"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."},{"id":"read-and-search-email","name":"Read and search email","tags":["email","inbox","search","read"],"examples":["Did anyone reply to my last email?","Find the invoice email from ada@example.com."],"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. 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. MCP: cooper_list_messages (labels, unread, filters, page_token), cooper_get_message, cooper_update_message, 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, 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."},{"id":"inbound-webhooks","name":"Inbound email webhooks","tags":["webhooks","events","inbound","email"],"examples":["Notify https://example.com/hooks/mail whenever my agent inbox receives email."],"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."},{"id":"human-in-the-loop","name":"Human in the loop by email","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."],"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."},{"id":"custom-domain","name":"Add a custom domain","tags":["email","domains","dns"],"examples":["Add agents.example.com and tell me which DNS records to publish."],"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}."},{"id":"billing","name":"Plan and usage","tags":["billing","usage","limits"],"examples":["How many emails have I sent this month?"],"description":"Check the account's plan, monthly usage, and limits, and create a Stripe Checkout link for the human to upgrade. MCP: cooper_billing_status, cooper_upgrade_link. REST: GET /api/v1/billing, POST /api/v1/billing/checkout."}],"iconUrl":"https://cooperemail.com/cooper-logo-512.png","version":"1.1.0","provider":{"url":"https://cooperemail.com","organization":"Avatar 8 LLC"},"security":[{"oauth2":["email"]},{"apiKey":[]}],"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).","capabilities":{"streaming":false,"pushNotifications":false,"stateTransitionHistory":false},"protocolVersion":"0.3.0","securitySchemes":{"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."},"oauth2":{"type":"oauth2","flows":{"authorizationCode":{"scopes":{"email":"Create and manage Cooper inboxes; send, read, and search mail; manage webhooks and owners."},"tokenUrl":"https://cooperemail.com/oauth/token","refreshUrl":"https://cooperemail.com/oauth/token","authorizationUrl":"https://cooperemail.com/oauth/authorize"}},"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"}},"documentationUrl":"https://cooperemail.com/docs","defaultInputModes":["application/json","text/plain"],"defaultOutputModes":["application/json","text/plain"],"supportsAuthenticatedExtendedCard":false},"signature_status":"unsigned","signature_detail":"No card signature supplied","signature_key_url":null,"signature_checked_at":"2026-10-10T07:59:17.803008+00:00","domain_claimed_at":null,"domain_proof_checked_at":null,"source_name":"Agenstry federation","source_url":"https://agenstry.com/docs","last_check":{"checked_at":"2026-10-10T07:59:17.803008+00:00","success":true,"http_status":200,"detail":"Agent Card validated"},"also_published_at":[],"history_urls":["https://cooperemail.com/.well-known/agent-card.json"],"skills":[{"skill_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"],"quality_warning":false},{"skill_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"],"quality_warning":false},{"skill_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"],"quality_warning":false},{"skill_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"],"quality_warning":false},{"skill_id":"billing","name":"Plan and usage","description":"Check the account's plan, monthly usage, and limits, and create a Stripe Checkout link for the human to upgrade. MCP: cooper_billing_status, cooper_upgrade_link. REST: GET /api/v1/billing, POST /api/v1/billing/checkout.","tags":["billing","usage","limits"],"quality_warning":false},{"skill_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. 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. MCP: cooper_list_messages (labels, unread, filters, page_token), cooper_get_message, cooper_update_message, 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, 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"],"quality_warning":false},{"skill_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"],"quality_warning":false}],"quality_flags":[],"check_history":{"checks":2,"passed":2},"recent_checks":[{"card_url":"https://cooperemail.com/.well-known/agent-card.json","checked_at":"2026-10-10T07:59:17.803008+00:00","success":true,"http_status":200,"detail":"Agent Card validated"},{"card_url":"https://cooperemail.com/.well-known/agent-card.json","checked_at":"2026-10-10T07:48:49.466430+00:00","success":true,"http_status":200,"detail":"Agent Card validated"}],"endpoint_tls_check":{"checked_at":"2026-10-10T07:59:17.803008+00:00","success":true,"detail":"Valid TLS connection to advertised endpoint host; no A2A request sent"},"protocol_check":{"checked_at":"2026-10-10T07:48:49.466430+00:00","state":"unconfirmed","http_status":405,"detail":"Endpoint did not return a JSON protocol response"},"events":[],"relationships":[],"verification":{"agent_card_url":"https://cooperemail.com/.well-known/agent-card.json","last_successful_card_check":"2026-10-10T07:59:17.803008+00:00","latest_card_check":{"checked_at":"2026-10-10T07:59:17.803008+00:00","success":true,"http_status":200,"detail":"Agent Card validated"},"signature_status":"unsigned","signature_checked_at":"2026-10-10T07:59:17.803008+00:00","task_endpoint_tested":true,"task_execution_tested":false,"endpoint_tls_checked_at":"2026-10-10T07:59:17.803008+00:00","endpoint_tls_reachable":true,"protocol_check_state":"unconfirmed","protocol_checked_at":"2026-10-10T07:48:49.466430+00:00","provider_identity_verified":false,"domain_claimed_at":null,"domain_proof_checked_at":null}}