Gary Club
MCP

Remote MCP server

Drop a JSON config into Claude Desktop or any MCP-aware client and the entire gary.club Public API becomes 60+ native tools — same auth, same tenancy as REST.

Endpoint#

One URL. POST your JSON-RPC over HTTP. Stateless mode — every request is self-contained, no session id required.

MCP endpoint
POST https://agency.gary.club/api/public/v1/mcp
Authorization: Bearer gc_live_EXAMPLE_AbCdEfGhIj0123456789
Content-Type: application/json
Accept: application/json, text/event-stream

Claude Desktop#

claude_desktop_config.json
{
  "mcpServers": {
    "gary-club": {
      "url": "https://agency.gary.club/api/public/v1/mcp",
      "headers": {
        "Authorization": "Bearer gc_live_EXAMPLE_AbCdEfGhIj0123456789"
      }
    }
  }
}

Restart Claude Desktop. The tools appear automatically — start typing in any chat to see them.

Claude Code#

Add to ~/.claude/settings.json with the same shape:

~/.claude/settings.json
{
  "mcpServers": {
    "gary-club": {
      "url": "https://agency.gary.club/api/public/v1/mcp",
      "headers": {
        "Authorization": "Bearer gc_live_EXAMPLE_AbCdEfGhIj0123456789"
      }
    }
  }
}
Pair with the Skill
For curated, named workflows on top of these tools, install @gary-club/agency. The tools alone work fine in any MCP client; the skill teaches Claude how to use them well.

Raw JSON-RPC#

For testing, scripting, or non-Claude MCP clients. Stateless mode means you can call any method without prior initialize:

List tools
curl -X POST https://agency.gary.club/api/public/v1/mcp \
  -H "Authorization: Bearer gc_live_EXAMPLE_AbCdEfGhIj0123456789" \
  -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 -X POST https://agency.gary.club/api/public/v1/mcp \
  -H "Authorization: Bearer gc_live_EXAMPLE_AbCdEfGhIj0123456789" \
  -H "Content-Type: application/json" \
  -H "Accept: application/json, text/event-stream" \
  -d '{
    "jsonrpc": "2.0",
    "id": 2,
    "method": "tools/call",
    "params": { "name": "crm.contacts.list", "arguments": { "limit": 5 } }
  }'

Auth model#

Every tool call re-validates the bearer token against our REST middleware — same revocation and expiry checks. The MCP layer is a thin protocol adapter; nothing bypasses our normal auth.

  • gc_live_ + no header → agency tenancy. Pass X-Gary-Client-Id per-request to act as a specific client.
  • cl_live_ → bound to one client. Same rule as REST.

Tool catalog#

Each tool wraps one REST endpoint 1:1. Source-of-truth is the OpenAPI spec at /openapi.json; this list shows the currently registered tools.

me.introspectMeta
Inspect the API key making the call.
crm.contacts.listCRM
List contacts with filters.
crm.contacts.createCRM
Idempotent upsert by email or phone.
crm.contacts.getCRM
Read a single contact.
crm.contacts.updateCRM
Patch mutable fields.
crm.companies.listCRM
crm.companies.createCRM
Upsert by domain.
crm.deals.listCRM
crm.deals.createCRM
crm.deals.updateCRM
Move stage / set status / patch fields.
crm.activities.listCRM
Read the timeline.
crm.activities.logCRM
Log a call/note/email/sms/meeting/task.
crm.tasks.listCRM
crm.tasks.createCRM
crm.tasks.completeCRM
Shortcut for status=completed + completed_at=now.
crm.lists.listCRM
crm.lists.add_membersCRM
Bulk add (chunked).
crm.pipelines.listCRM
Pipelines + stages.
sms.sendSMS
1:1 outbound SMS.
sms.conversations.listSMS
sms.conversations.messagesSMS
Read messages in a thread.
sms_broadcasts.listBroadcasts
sms_broadcasts.createBroadcasts
Create draft / scheduled / recurring.
sms_broadcasts.getBroadcasts
sms_broadcasts.updateBroadcasts
sms_broadcasts.approveBroadcasts
sms_broadcasts.send_nowBroadcasts
Force-send the next tick.
sms_broadcasts.recipientsBroadcasts
Per-recipient delivery state.
calls.listCalls
calls.getCalls
Full detail with transcript.
calls.initiateCalls
One-off outbound dial via outbound voice agent.
sdr.campaigns.listSDR
Outbound voice campaigns.
sdr.campaigns.getSDR
sdr.campaigns.createSDR
Schedule a dialing campaign.
sdr.campaigns.updateSDR
Pause / resume / adjust window.
agents.listAgents
AI phone / SMS agents.
agents.getAgents
Single agent (slug or UUID).
agents.updateAgents
Rename, change purpose / labels / state.
sequences.listSequences
Message sequences with steps.
sequences.getSequences
sequences.enrollSequences
Idempotent enrollment for a contact.
sequences.enrollmentsSequences
Per-sequence enrollment state.
kb.listKB
kb.documentsKB
List documents in a KB.
kb.documents.createKB
Add manual / URL / uploaded doc.
kb.documents.deleteKB
Soft-delete + chunk cleanup.
kb.searchKB
Keyword search across all docs in a KB. Returns matching excerpts.
kb.readKB
Read the full extracted text of a document. Use after kb.search when excerpts are not enough.
ai.contact_gistAI
AI summary for a contact (1 FUEL on miss).
ai.company_gistAI
AI summary for a company.
ai.deal_gistAI
AI summary for a deal.
billing.balanceBilling
Current FUEL + subscription state.
billing.usageBilling
FUEL by service over a window.
billing.transactionsBilling
Ledger of debits/credits.
webhooks.listWebhooks
webhooks.createWebhooks
webhooks.testWebhooks
Fire a synthetic event for one subscription.
webhooks.deliveriesWebhooks
Recent deliveries with status + retry count.
docs.productsDocs
No-auth docs catalog.
docs.listDocs
docs.getDocs
Render a single doc page.
docs.searchDocs
Full-text search across pages + changelog.
docs.changelogDocs
Recent product changes.