CosmoCMO
Developers

Your AI CMO, in your own tools

Cosmo has a REST API and an MCP server. Ask Claude, ChatGPT or Cursor what's waiting for approval, have Zapier or n8n queue a post when you ship, or pull results into your own dashboard. The rule stays the same: nothing goes out without a yes.

Scoped API keys

Create keys in the app with read, write and approve scopes. Shown once, stored as a fingerprint, revocable any time.

The approval rule

Write tools only queue approval cards. Approving needs the approve scope, which is off unless you turn it on for that key.

REST and MCP

JSON over HTTPS at https://cosmocmo.com/api/v1, and a Streamable HTTP MCP server at https://cosmocmo.com/mcp with the same keys.

Authentication and scopes

Sign in, open Developers in the app, and create a key. Send it on every request as Authorization: Bearer cosmo_live_…. Everything a key can see or do is limited to its own workspace. Missing or revoked keys get a 401, a missing scope a 403, and write actions without an active subscription a 402. Errors always look like {"error": {"code", "message"}}.

read

Status, approval cards, plan, activity, results, and Cosmo's read tools (performance, SEO, intel, calendars).

write

Queue approval cards with Cosmo's write tools, chat with Cosmo, and update what he remembers. Queuing never publishes anything.

approve

Approve or skip cards. Approving makes things go out: posts publish, ads go live, emails send. Off by default, and opt-in per key.

REST API

Base URL https://cosmocmo.com/api/v1. Full schema in the OpenAPI 3.1 document.

  • GET/meWorkspace, plan, this month's AI budget and the cards waiting for a yes
  • GET/approvals?status=pendingApproval cards, newest first
  • GET/approvals/{id}One card
  • POST/approvals/{id}/approveApprove a card (approve scope). It goes out.
  • POST/approvals/{id}/skipSkip a card (approve scope)
  • GET/toolsThe module tools this key can call
  • POST/tools/{name}Run a read tool, or queue a write tool's approval card
  • POST/chatTalk to Cosmo (write scope)
  • GET/planGoal, working style and the weekly plan
  • GET/activityThe action log
  • GET/resultsRevenue, shipped work and site health

MCP server

Streamable HTTP at https://cosmocmo.com/mcp, authenticated with the same keys. Tools depend on the key's scopes.

  • cosmo_statusPlan, subscription, AI budget and waiting cards
  • cosmo_chatTalk to Cosmo (write scope)
  • list_approvalsCards, filtered by status
  • approve_card / skip_cardOnly listed for keys with the approve scope
  • list_toolsCosmo's module tools, like MCP Ads' list_actions
  • run_toolRun a read tool, or queue a write tool's card
  • get_plan / get_resultsThe plan and the numbers

Connect your tools

Replace cosmo_live_YOUR_KEY with your key. In the app, the snippets come filled in.

Claude Desktopclaude_desktop_config.json

Settings → Developer → Edit Config, paste this, then restart Claude Desktop. Needs Node.js. mcp-remote bridges Claude Desktop to Cosmo's remote server; the header is passed through an env var because Claude Desktop on Windows mangles spaces in args.

{
  "mcpServers": {
    "cosmo": {
      "command": "npx",
      "args": [
        "-y",
        "mcp-remote",
        "https://cosmocmo.com/mcp",
        "--header",
        "Authorization:${COSMO_AUTH}"
      ],
      "env": {
        "COSMO_AUTH": "Bearer cosmo_live_YOUR_KEY"
      }
    }
  }
}

Claude.ai connector

Claude.ai and Claude Desktop custom connectors (Settings → Connectors → Add custom connector) sign in with OAuth, which Cosmo doesn't offer yet. Request-header auth is in beta for some organizations: if you see a Request headers section, add the header below. Otherwise use the Claude Desktop config above.

Server URL:  https://cosmocmo.com/mcp
Header:      Authorization
Value:       Bearer cosmo_live_YOUR_KEY

Claude Code

claude mcp add --transport http cosmo https://cosmocmo.com/mcp \
  --header "Authorization: Bearer cosmo_live_YOUR_KEY"

ChatGPT

ChatGPT developer mode (Settings → Apps & Connectors → Advanced → Developer mode, then Create) connects remote MCP servers. Its dialog offers OAuth or no auth, and in some releases an API key / bearer option. If you see one, paste the key there. OAuth for Cosmo is coming; until then, Zapier or n8n with the REST API works everywhere.

MCP server URL:  https://cosmocmo.com/mcp
Authentication:  API key / Bearer (if offered)
Key:             cosmo_live_YOUR_KEY

Cursor.cursor/mcp.json

Put this in .cursor/mcp.json in your project (or ~/.cursor/mcp.json for every project).

{
  "mcpServers": {
    "cosmo": {
      "url": "https://cosmocmo.com/mcp",
      "headers": {
        "Authorization": "Bearer cosmo_live_YOUR_KEY"
      }
    }
  }
}

curl

Write tools only queue a card. Approving needs a key with the approve scope.

# Status, plan and waiting cards
curl https://cosmocmo.com/api/v1/me -H "Authorization: Bearer cosmo_live_YOUR_KEY"

# Cards waiting for a yes
curl "https://cosmocmo.com/api/v1/approvals?status=pending" -H "Authorization: Bearer cosmo_live_YOUR_KEY"

# Run a read tool
curl -X POST https://cosmocmo.com/api/v1/tools/connection_status -H "Authorization: Bearer cosmo_live_YOUR_KEY" \
  -H "content-type: application/json" -d '{"input": {}}'

# Talk to Cosmo (write scope)
curl -X POST https://cosmocmo.com/api/v1/chat -H "Authorization: Bearer cosmo_live_YOUR_KEY" \
  -H "content-type: application/json" -d '{"message": "What should we post this week?"}'

# Approve a card (approve scope: it goes out)
curl -X POST https://cosmocmo.com/api/v1/approvals/CARD_ID/approve -H "Authorization: Bearer cosmo_live_YOUR_KEY"

Zapier / n8n

Use an HTTP request step (Zapier Webhooks, n8n HTTP Request) with the header below, or n8n's MCP Client Tool node pointed at the MCP URL with header auth.

URL:     https://cosmocmo.com/api/v1/chat   (or any endpoint in the OpenAPI spec)
Method:  POST
Headers: Authorization: Bearer cosmo_live_YOUR_KEY
         Content-Type: application/json
Body:    {"message": "Draft 3 LinkedIn posts about our launch"}

MCP URL: https://cosmocmo.com/mcp
FAQ

Developer questions

Can the API post or spend money without me?

Only with a key that has the approve scope. Write tools and chat only queue approval cards, which wait for your yes in the app or on your chat. Approving through the API uses the same path as the Approve button, including the one-claim-per-card guard, and every approval through a key is logged with the key's name.

How do I authenticate?

Create a key at /app/developers and send it as Authorization: Bearer cosmo_live_... on every request. Cosmo stores only a SHA-256 fingerprint of the key, so it is shown once. Revoke it any time; it stops working on the next request.

Does it work with Claude and ChatGPT?

Yes for Claude Desktop (through mcp-remote), Claude Code and Cursor today, with the snippets on this page. Claude.ai and ChatGPT connectors mainly sign in with OAuth, which Cosmo is adding; until then they work where the connector dialog lets you set a bearer token or header.

What are the limits?

120 requests a minute per key, and 120 chat messages an hour per workspace (shared with the web chat). Reads work on any plan; write actions need an active subscription or trial.

Is third-party text safe to pass to my own AI?

Tool results can include web pages, competitors' ads and other people's posts. Every MCP result says so, and your assistant should treat that text as data, never as instructions. Cosmo follows the same rule internally.

Stop doing marketing at midnight.

Paste your URL. In five minutes Cosmo texts you a plan.

Text Cosmo

7 days free · cancel any time · nothing goes out without your yes