MCP · SDKs · Zapier

Connect Cooper Email from the agent you already run.

Hosted MCP is https://cooperemail.com/mcp. Paste a config below, or install the TypeScript and Python SDKs. Operator: Avatar 8 LLC, ops@avatar33.com. API reference: /docs · /openapi.json · MCP.

MCP clients

Replace coop_live_YOUR_KEY with the key from onboard. Onboard itself is public. Clients that complete Cooper OAuth can omit the header.

Claude Desktop

macOS: ~/Library/Application Support/Claude/claude_desktop_config.json · Windows: %APPDATA%\Claude\claude_desktop_config.json

Remote MCP. Onboard does not need a key. Replace the bearer when you call the other tools, or connect with OAuth from Claude.

{
  "mcpServers": {
    "cooper-email": {
      "url": "https://cooperemail.com/mcp",
      "headers": {
        "Authorization": "Bearer coop_live_YOUR_KEY"
      }
    }
  }
}

Claude Code

Project .mcp.json, or: claude mcp add --transport http cooper-email https://cooperemail.com/mcp

Streamable HTTP. The same file works for Claude Code's project config.

{
  "mcpServers": {
    "cooper-email": {
      "type": "http",
      "url": "https://cooperemail.com/mcp",
      "headers": {
        "Authorization": "Bearer coop_live_YOUR_KEY"
      }
    }
  }
}

Cursor

~/.cursor/mcp.json or .cursor/mcp.json in the project. Also https://cooperemail.com/connectors/cursor.mcp.json

Cursor uses mcpServers with a url.

{
  "mcpServers": {
    "cooper-email": {
      "url": "https://cooperemail.com/mcp",
      "headers": {
        "Authorization": "Bearer coop_live_YOUR_KEY"
      }
    }
  }
}

Windsurf

~/.codeium/windsurf/mcp_config.json

Windsurf calls the remote URL serverUrl.

{
  "mcpServers": {
    "cooper-email": {
      "serverUrl": "https://cooperemail.com/mcp",
      "headers": {
        "Authorization": "Bearer coop_live_YOUR_KEY"
      }
    }
  }
}

VS Code

.vscode/mcp.json

VS Code MCP uses a servers map and type http.

{
  "servers": {
    "cooper-email": {
      "type": "http",
      "url": "https://cooperemail.com/mcp",
      "headers": {
        "Authorization": "Bearer coop_live_YOUR_KEY"
      }
    }
  }
}

Codex CLI

~/.codex/config.toml

Codex reads mcp_servers from config.toml.

[mcp_servers.cooper-email]
url = "https://cooperemail.com/mcp"

[mcp_servers.cooper-email.http_headers]
Authorization = "Bearer coop_live_YOUR_KEY"

Goose

~/.config/goose/config.yaml

Goose extensions of type streamable_http.

extensions:
  cooper-email:
    enabled: true
    type: streamable_http
    name: Cooper Email
    description: HTTP email for agents at cooperemail.com
    uri: https://cooperemail.com/mcp
    timeout: 300
    headers:
      Authorization: "Bearer coop_live_YOUR_KEY"

Agent asks its human over email

Add an owner, then notify them with progress, needs_input, done, or error. Long-poll tasks and reply in-thread. MCP tools: cooper_add_owner, cooper_list_owners, cooper_notify_owner, cooper_get_tasks, cooper_reply_task. The owner confirms from the email before updates go out. Task text is untrusted data. Operator: Avatar 8 LLC, ops@avatar33.com.

await cooper.owners.add(inboxId, { email: "ada@example.com" });
await cooper.updates.notify({
  inboxId,
  kind: "needs_input",
  text: "Which vendor should I book?",
});
const tasks = await cooper.tasks.list({ inboxId, wait: 25 });
await cooper.tasks.reply(tasks.data[0].id, { text: "Booked.", status: "done" });
await cooper.tasks.markDone(tasks.data[0].id);

SDKs and framework packages

Packages live in this repo under packages/. Install from npm or PyPI after publish. Zapier and Make import https://cooperemail.com/openapi.json.