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/mcpTransport: 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
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
gemini mcp add --transport http --scope user \
--header "Authorization: Bearer eo_live_…" expiryowl https://expiryowl.com/api/mcpOr add it by hand to ~/.gemini/settings.json. Gemini CLI calls the Streamable HTTP address httpUrl, not url.
{
"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).
{
"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).
{
"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.
{
"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
| Tool | Arguments | Returns |
|---|---|---|
| portfolio_summary | none | Counts by status, what expires within 30 days, overdue renewals, 47-day readiness, open incidents. |
| list_monitors | status?, client? | Every site with certificate days left, domain days left and uptime. |
| get_monitor | id | One site in full: certificate chain details, registration, DNS snapshot, open incidents. |
| list_expiring | days (1 to 365, default 30) | Certificates and domains expiring within the window, soonest first. |
| list_incidents | status: open | resolved | all | Incidents, newest first. |
| add_monitor | hostname, client? | Start watching a site. Not on the Free plan (read-only). |
09 — Testing with curl
Testing with curl
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"}'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}}}'