Highlevel Mcp Server — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited Highlevel Mcp Server (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Multi-account HighLevel CRM MCP server with OAuth integration for managing 30+ sub-accounts through a unified interface.
This MCP (Model Context Protocol) server enables AI agents like TypingMind, ClickUp Brain, and other MCP clients to interact with multiple HighLevel CRM sub-accounts through a single unified interface. Instead of managing 30+ Private Integration Tokens (PITs), this server leverages your existing OAuth tokens stored in Supabase.
POST /mcp) for modern clients + legacy SSE (GET /sse) for TypingMindget-calendars / calendars_get-calendars tools plus auto-discovery in calendars_get-calendar-eventsHighLevel's official MCP server requires one Private Integration Token (PIT) per sub-account. For agencies managing 30+ clients, this means:
Our solution:
┌──────────────────────────────┐
│ AI Clients │
│ (TypingMind, ClickUp, etc.) │
└──────────────┬───────────────┘
│ MCP Protocol
│ • Streamable HTTP → POST /mcp
│ • Legacy SSE → GET /sse
│
┌──────────────▼────────────────────────┐
│ Cloudflare Worker │
│ ┌───────────────────────────────────┐ │
│ │ Token Manager (5min cache) │ │
│ └───────────────┬───────────────────┘ │
│ │ │
│ ┌───────────────▼───────────────────┐ │
│ │ 18 Read-Only API Tools │ │
│ └───────────────┬───────────────────┘ │
└─────────────────┼─────────────────────┘
│
┌───────▼────────┐
│ Supabase │
│ ┌────────────┐ │
│ │ locations │ │
│ │ - access_ │ │
│ │ token │ │
│ └────────────┘ │
└────────────────┘
│
┌───────▼──────────────┐
│ HighLevel REST API │
│ 30+ Sub-Accounts │
└──────────────────────┘| Endpoint | Method | Purpose |
|---|---|---|
/ | GET | Health check (no API key required) |
/mcp | POST | Streamable HTTP MCP transport (ClickUp, modern clients) |
/mcp | DELETE | Terminate MCP session |
/sse | GET | Legacy SSE connection (TypingMind) |
/sse | POST | Direct MCP message (no session) |
/sse/message | POST | MCP message with SSE session |
Health check response includes version, toolCount, calendarTools, and available endpoints.
MCP protocol version: 2025-03-26 (previously 2024-11-05)
Authentication: All endpoints except / require an API key via the X-API-Key header.
Session handling: Streamable HTTP uses stateless Mcp-Session-Id headers (no in-memory session store), which is required for Cloudflare Workers where requests may hit different isolates.
Note: Write/update/delete operations are disabled by default for safety. To enable them, uncomment the relevant tools in src/index.ts.contacts_get-contact - Fetch contact detailscontacts_get-contacts - List all contactscontacts_get-all-tasks - Get contact taskscontacts_create-contact~~ - Create new contact (disabled)contacts_update-contact~~ - Update contact (disabled)contacts_upsert-contact~~ - Create or update contact (disabled)contacts_add-tags~~ - Add tags to contact (disabled)contacts_remove-tags~~ - Remove tags from contact (disabled)conversations_search-conversation - Search conversationsconversations_get-messages - Get conversation messagesconversations_send-a-new-message~~ - Send SMS/Email/WhatsApp (disabled)opportunities_search-opportunity - Search opportunitiesopportunities_get-opportunity - Get opportunity detailsopportunities_get-pipelines - Get all pipelinesopportunities_update-opportunity~~ - Update opportunity (disabled)get-calendars - List all calendars for a location (discover calendar IDs)calendars_get-calendars - Same as get-calendars (canonical name)calendars_get-calendar-events - Get calendar events; auto-discovers all calendars when no calendarId/userId/groupId is providedcalendars_get-appointment-notes - Get appointment noteslocations_get-location - Get location detailslocations_get-custom-fields - Get custom fieldspayments_get-order-by-id - Get payment orderpayments_list-transactions - List transactionscache_get-stats - Get cache statistics for debugginglist_clients - List all available client namesYour Supabase database must have these tables:
`locations` table:
CREATE TABLE locations (
location_id TEXT PRIMARY KEY,
access_token TEXT NOT NULL,
refresh_token TEXT,
company_id TEXT,
location_name TEXT,
created_at TIMESTAMP DEFAULT NOW(),
updated_at TIMESTAMP DEFAULT NOW()
);`master_clients` table (optional, for client name lookup):
CREATE TABLE master_clients (
id SERIAL PRIMARY KEY,
client_name TEXT UNIQUE NOT NULL,
location_id TEXT REFERENCES locations(location_id),
created_at TIMESTAMP DEFAULT NOW()
);git clone https://github.com/isaganiesteron/highlevel-mcp-server.git
cd highlevel-mcp-servernpm installCopy wrangler.jsonc.example to wrangler.jsonc and create a .dev.vars file for local development:
API_KEY=your-secure-api-key
SUPABASE_URL=https://your-project.supabase.co
SUPABASE_SERVICE_KEY=eyJhbGc...your-service-key
HIGHLEVEL_API_BASE=https://services.leadconnectorhq.com
TOKEN_CACHE_TTL=300000
CLIENT_CACHE_TTL=600000For production, set secrets via Wrangler (do not commit secrets to wrangler.jsonc):
wrangler secret put API_KEY
wrangler secret put SUPABASE_URL
wrangler secret put SUPABASE_SERVICE_KEYnpm run devThe server will start on http://localhost:8787
npx @modelcontextprotocol/inspector node dist/index.jsnpm test# Production deployment
npm run deploy
# Or using wrangler directly
wrangler deploywrangler secret put API_KEY
wrangler secret put SUPABASE_URL
wrangler secret put SUPABASE_SERVICE_KEYcurl https://your-worker.workers.dev/Expected response:
{
"name": "HighLevel CRM Multi-Account MCP Server",
"version": "1.0.2",
"status": "running",
"toolCount": 18,
"calendarTools": ["calendars_get-calendars", "get-calendars", "calendars_get-calendar-events", "calendars_get-appointment-notes"],
"endpoints": { "sse": "/sse", "mcp": "/mcp" }
}https://your-worker.workers.dev/mcpX-API-Key header with your API keyAfter connecting, disconnect and reconnect if tools don't appear — clients cache the tool list from tools/list.
Add to your TypingMind MCP configuration:
{
"mcpServers": {
"highlevel": {
"url": "https://your-worker.workers.dev/sse",
"transport": "sse",
"name": "HighLevel CRM (All Clients)"
}
}
}List available clients:
User: "What HighLevel clients are available?"Discover calendars, then fetch events:
User: "Pull Bear Construction's calendar events for this week"The AI will call get-calendars (or calendars_get-calendar-events with auto-discovery) and then fetch events for the date range.
Multi-account audit:
User: "Check all GHL clients with no bookings this month"The AI iterates clients, discovers calendars, and aggregates booking counts across accounts.
Using Client Name:
User: "Get all contacts for ABC Remodeling"Using Location ID:
User: "Get location details for LN27DIXpeAMiwdjXhDZw"Token Cache:
Client Name Mapping:
clientName → locationId cached for 10 minutesThe server provides user-friendly error messages:
"Client 'ABC Remodeling' not found" - Invalid client name"No access token for location LN27DIXpeAMiwdjXhDZw" - Missing/invalid token"Contact not found" - Invalid contact ID"HighLevel API rate limit exceeded" - Rate limit hit"HighLevel API temporarily unavailable" - API downStructured JSON logs are emitted for wrangler tail:
wrangler tailKey log events: request.received, route.matched, mcp.method.parsed, mcp.tools.call, mcp.response.sent, mcp.session.created, auth.failed.
Cause: Client is using a stale tool list or an old server build.
Fix:
version and toolCountPOST /mcp, not /sseFix:
get-calendars or calendars_get-calendars to list calendar IDscalendars_get-calendar-events with only startTime/endTime — it auto-discovers all calendarsCheck:
locations tablelocation_id matches exactlyFix:
Check:
Fix:
Check:
master_clients tableclient_name spelling is exact (case-sensitive)Fix:
master_clients tablelocationId directly insteadCheck:
Fix:
TOKEN_CACHE_TTL if neededhighlevel-mcp-server/
├── src/
│ ├── index.ts # MCP server, tool definitions, routing
│ └── lib/
│ ├── supabase.ts # Supabase client
│ ├── token-manager.ts # Token caching logic
│ ├── highlevel-client.ts # HighLevel API client
│ ├── client-resolver.ts # Client name → location ID
│ └── response-formatter.ts # Human-readable tool output
├── test/
│ └── index.spec.ts
├── postman/ # API test collections
├── wrangler.jsonc.example # Cloudflare Workers config template
├── package.json
├── tsconfig.json
└── README.mdContributions are welcome! Please follow these guidelines:
git checkout -b feature/amazing-feature)git commit -m 'Add amazing feature')git push origin feature/amazing-feature)get-calendars, auto-discovery in events)POST /mcp)/sse)wrangler tail loggingMIT License - see LICENSE file for details
Built with ❤️ by [Isagani Esteron](https://github.com/isaganiesteron) at [Contractor Scale](https://contractorscale.com)
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.