Developers · Model Context Protocol

Ask your AI assistant about your clients' sites

Our MCP server gives Claude, Gemini CLI, Cursor, VS Code and other MCP clients read access to your portfolio, and lets them add sites on paid plans.

01 — What you need

What you need

An API key from Integrations → API keys (the same keys as the REST API), and the server URL:

https://expiryowl.com/api/mcp

Transport: Streamable HTTP, stateless, JSON responses. Auth: Authorization: Bearer eo_live_…. Same limits as the API: 120 requests a minute per key, and the Free plan is read-only.

02 — Claude Code

Claude Code

terminal
claude mcp add --transport http expiryowl https://expiryowl.com/api/mcp \
  --header "Authorization: Bearer eo_live_…"

Then ask: “Which of my client certificates expire in the next 30 days?” or “Add shop.northwind.example for Northwind Bakery.”

03 — Gemini CLI

Gemini CLI

terminal
gemini mcp add --transport http --scope user \
  --header "Authorization: Bearer eo_live_…" expiryowl https://expiryowl.com/api/mcp

Or add it by hand to ~/.gemini/settings.json. Gemini CLI calls the Streamable HTTP address httpUrl, not url.

~/.gemini/settings.json
{
  "mcpServers": {
    "expiryowl": {
      "httpUrl": "https://expiryowl.com/api/mcp",
      "headers": {
        "Authorization": "Bearer eo_live_…"
      }
    }
  }
}

04 — Cursor

Cursor

Add this to ~/.cursor/mcp.json (or .cursor/mcp.json inside one project).

~/.cursor/mcp.json
{
  "mcpServers": {
    "expiryowl": {
      "url": "https://expiryowl.com/api/mcp",
      "headers": {
        "Authorization": "Bearer eo_live_…"
      }
    }
  }
}

05 — VS Code

VS Code

Add this to .vscode/mcp.json (or run MCP: Open User Configuration to add it for every workspace).

.vscode/mcp.json
{
  "servers": {
    "expiryowl": {
      "type": "http",
      "url": "https://expiryowl.com/api/mcp",
      "headers": {
        "Authorization": "Bearer eo_live_…"
      }
    }
  }
}

06 — Claude Desktop

Claude Desktop

Claude Desktop talks to remote servers through the mcp-remote bridge. Add this to claude_desktop_config.json (Settings → Developer → Edit config) and restart Claude. The header value sits in env because some systems split arguments on spaces.

claude_desktop_config.json
{
  "mcpServers": {
    "expiryowl": {
      "command": "npx",
      "args": [
        "-y",
        "mcp-remote",
        "https://expiryowl.com/api/mcp",
        "--header",
        "Authorization:${AUTH_HEADER}"
      ],
      "env": {
        "AUTH_HEADER": "Bearer eo_live_…"
      }
    }
  }
}

07 — ChatGPT and the web apps

ChatGPT and the web apps

ChatGPT, claude.ai on the web and the Gemini app only connect to servers that use a sign-in (OAuth) flow. ExpiryOwl uses API keys, so they can’t connect yet. Use one of the clients above, or the REST API.

08 — Tools

Tools

ToolArgumentsReturns
portfolio_summarynoneCounts by status, what expires within 30 days, overdue renewals, 47-day readiness, open incidents.
list_monitorsstatus?, client?Every site with certificate days left, domain days left and uptime.
get_monitoridOne site in full: certificate chain details, registration, DNS snapshot, open incidents.
list_expiringdays (1 to 365, default 30)Certificates and domains expiring within the window, soonest first.
list_incidentsstatus: open | resolved | allIncidents, newest first.
add_monitorhostname, client?Start watching a site. Not on the Free plan (read-only).

09 — Testing with curl

Testing with curl

list the tools
curl -s -X POST https://expiryowl.com/api/mcp \
  -H "Authorization: Bearer $EXPIRYOWL_KEY" \
  -H "Content-Type: application/json" \
  -H "Accept: application/json, text/event-stream" \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'
call a tool
curl -s -X POST https://expiryowl.com/api/mcp \
  -H "Authorization: Bearer $EXPIRYOWL_KEY" \
  -H "Content-Type: application/json" \
  -H "Accept: application/json, text/event-stream" \
  -d '{"jsonrpc":"2.0","id":2,"method":"tools/call","params":{"name":"list_expiring","arguments":{"days":30}}}'