HighLevel MCP Server
Multi-account HighLevel CRM MCP server with OAuth integration for managing 30+ sub-accounts through a unified interface.
README
HighLevel MCP Server
Multi-account HighLevel CRM MCP server with OAuth integration for managing 30+ sub-accounts through a unified interface.
Overview
This MCP (Model Context Protocol) server enables AI agents like TypingMind 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.
Key Features
- š OAuth Integration - Uses existing access tokens from Supabase
- š¢ Multi-Account Support - Manage 30+ HighLevel sub-accounts through one connection
- ā” 26 Read-Only API Tools - Coverage of contacts, conversations, opportunities, calendars, payments, blogs, emails, and social media (write operations disabled by default)
- š Cloudflare Workers - Serverless, auto-scaling, edge deployment
- š¾ Smart Caching - 5-minute token cache for optimal performance
- šÆ Client-Friendly - Use client names or location IDs interchangeably
Why This Exists
HighLevel's official MCP server requires one Private Integration Token (PIT) per sub-account. For agencies managing 30+ clients, this means:
- ā Manually creating 30+ PITs through the UI
- ā Managing 30+ separate MCP connections
- ā No programmatic token management
Our solution:
- ā Reuse existing OAuth tokens from your Supabase database
- ā One MCP connection for all clients
- ā Automatic token management with caching
Architecture
āāāāāāāāāāāāāāā
ā TypingMind ā
ā (AI Agent) ā
āāāāāāāā¬āāāāāāā
ā MCP Protocol (SSE)
ā
āāāāāāāā¼āāāāāāāāāāāāāāāāāāāāāāāāā
ā Cloudflare Worker ā
ā āāāāāāāāāāāāāāāāāāāāāāāāāāāāā ā
ā ā Token Manager (5min cache)ā ā
ā āāāāāāāāāāāāā¬āāāāāāāāāāāāāāāā ā
ā ā ā
ā āāāāāāāāāāāāā¼āāāāāāāāāāāāāāāā ā
ā ā 26 Read-Only API Tools ā ā
ā āāāāāāāāāāāāā¬āāāāāāāāāāāāāāāā ā
āāāāāāāāāāāāāāā¼āāāāāāāāāāāāāāāāāā
ā
āāāāāāāāā¼āāāāāāāāā
ā Supabase ā
ā āāāāāāāāāāāāāā ā
ā ā locations ā ā
ā ā - access_ ā ā
ā ā token ā ā
ā āāāāāāāāāāāāāā ā
āāāāāāāāāāāāāāāāāā
ā
āāāāāāāāā¼āāāāāāāāāāāāāāā
ā HighLevel REST API ā
ā 32 Sub-Accounts ā
āāāāāāāāāāāāāāāāāāāāāāāā
Available Tools (26 Read-Only)
Note: Write/update/delete operations are disabled by default for safety. To enable them, uncomment the relevant tools in
src/index.ts.
Contacts (3 active, 5 disabled)
contacts_get-contact- Fetch contact detailscontacts_get-contacts- List all contactscontacts_get-all-tasks- Get contact tasks- Create new contact (disabled)contacts_create-contact- Update contact (disabled)contacts_update-contact- Create or update contact (disabled)contacts_upsert-contact- Add tags to contact (disabled)contacts_add-tags- Remove tags from contact (disabled)contacts_remove-tags
Conversations (2 active, 1 disabled)
conversations_search-conversation- Search conversationsconversations_get-messages- Get conversation messages- Send SMS/Email/WhatsApp (disabled)conversations_send-a-new-message
Opportunities (3 active, 1 disabled)
opportunities_search-opportunity- Search opportunitiesopportunities_get-opportunity- Get opportunity detailsopportunities_get-pipelines- Get all pipelines- Update opportunity (disabled)opportunities_update-opportunity
Calendars (2 tools)
calendars_get-calendar-events- Get calendar eventscalendars_get-appointment-notes- Get appointment notes
Locations (2 tools)
locations_get-location- Get location detailslocations_get-custom-fields- Get custom fields
Payments (2 tools)
payments_get-order-by-id- Get payment orderpayments_list-transactions- List transactions
Blogs (5 active, 2 disabled)
blogs_get-blogs- Get all blogsblogs_get-blog-post- Get blog postsblogs_check-url-slug-exists- Check URL slugblogs_get-all-blog-authors-by-location- Get authorsblogs_get-all-categories-by-location- Get categories- Create blog post (disabled)blogs_create-blog-post- Update blog post (disabled)blogs_update-blog-post
Emails (1 active, 1 disabled)
emails_fetch-template- Get email templates- Create email template (disabled)emails_create-template
Social Media (4 active, 2 disabled)
socialmediaposting_get-account- Get social accountssocialmediaposting_get-social-media-statistics- Get analyticssocialmediaposting_get-post- Get post by IDsocialmediaposting_get-posts- List all posts- Create post (disabled)socialmediaposting_create-post- Edit post (disabled)socialmediaposting_edit-post
Utility (2 tools)
cache_get-stats- Get cache statistics for debugginglist_clients- List all available client names
Prerequisites
- Node.js 18+ (for local development)
- Cloudflare Workers account
- Supabase account with HighLevel OAuth tokens
- TypingMind or another MCP-compatible client
Database Schema
Your 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()
);
Installation
1. Clone the Repository
git clone https://github.com/isaganiesteron/highlevel-mcp-server.git
cd highlevel-mcp-server
2. Install Dependencies
npm install
3. Configure Environment Variables
Create a .dev.vars file for local development:
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
For production, set these as Cloudflare Worker secrets:
wrangler secret put SUPABASE_URL
wrangler secret put SUPABASE_SERVICE_KEY
4. Update wrangler.toml
name = "highlevel-mcp-server"
main = "src/index.ts"
compatibility_date = "2024-01-01"
[vars]
HIGHLEVEL_API_BASE = "https://services.leadconnectorhq.com"
TOKEN_CACHE_TTL = "300000"
Development
Local Development
npm run dev
The server will start on http://localhost:8787
Testing with MCP Inspector
npx @modelcontextprotocol/inspector node dist/index.js
Run Tests
npm test
Deployment
Deploy to Cloudflare Workers
# Production deployment
npm run deploy
# Or using wrangler directly
wrangler deploy
Configure Secrets
wrangler secret put SUPABASE_URL
wrangler secret put SUPABASE_SERVICE_KEY
Usage
Configure in TypingMind
Add to your TypingMind MCP configuration:
{
"mcpServers": {
"highlevel": {
"url": "https://your-worker.workers.dev/mcp",
"transport": "sse",
"name": "HighLevel CRM (All Clients)"
}
}
}
Example Queries
Using Client Name:
User: "Get all contacts for ABC Remodeling"
The AI will call:
{
"tool": "contacts_get-contacts",
"arguments": {
"clientName": "ABC Remodeling"
}
}
Using Location ID:
User: "Send a text message to contact_123 in location LN27DIXpeAMiwdjXhDZw"
The AI will call:
{
"tool": "conversations_send-a-new-message",
"arguments": {
"locationId": "LN27DIXpeAMiwdjXhDZw",
"contactId": "contact_123",
"type": "SMS",
"message": "Your message here"
}
}
Complex Workflow:
User: "Find all opportunities in 'Follow Up' stage for XYZ Construction and send them a reminder email"
The AI will:
- Search opportunities with
clientName="XYZ Construction",status="Follow Up" - Get contact details for each opportunity
- Send email via
conversations_send-a-new-message
Performance
- Average Response Time: < 800ms (with cache hits < 500ms)
- Cache Hit Rate: > 80% after warm-up
- Token Cache TTL: 5 minutes
- Client Mapping Cache: 10 minutes
- Concurrent Requests: Supports 100+ requests/minute
Caching Strategy
Token Cache:
- Access tokens cached in-memory for 5 minutes
- Reduces Supabase queries by 80%+
- Cache is per-worker instance (Cloudflare auto-scales)
Client Name Mapping:
clientName ā locationIdcached for 10 minutes- Small dataset (32 clients), safe to cache longer
Error Handling
The 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 down
Troubleshooting
Issue: "No access token for location"
Check:
- Token exists in Supabase
locationstable - Token is not empty string
location_idmatches exactly
Fix:
- Re-authenticate client through HighLevel OAuth flow
- Verify token in Supabase
Issue: "401 Unauthorized from HighLevel API"
Check:
- Access token is valid (not expired)
Fix:
- Refresh token using your existing OAuth infrastructure
- Note: This MCP server does not refresh tokens (read-only access to Supabase)
Issue: "Client not found"
Check:
- Client exists in
master_clientstable client_namespelling is exact (case-sensitive)
Fix:
- Add client to
master_clientstable - Use
locationIddirectly instead
Issue: Slow response times
Check:
- Cache hit rate (should be >80% after warm-up)
- HighLevel API latency (external dependency)
- Supabase query performance
Fix:
- Increase
TOKEN_CACHE_TTLif needed - Check Cloudflare Workers analytics
- Monitor Supabase performance
Security
Authentication
- OAuth 2.0 access tokens for HighLevel API
- Supabase service key stored as Cloudflare secret
- No tokens exposed in logs or error messages
Data Privacy
- No data stored by MCP server (pass-through only)
- Token cache is in-memory only (5-minute TTL)
- Logs do not contain PII
Compliance
- GDPR: Data minimization (no unnecessary storage)
- CCPA: User data rights respected
- SOC 2: Cloudflare and Supabase are SOC 2 compliant
Monitoring
Cloudflare Workers Analytics
- Request count and latency
- Error rates
- Geographic distribution
Recommended Additional Monitoring
- Sentry for error tracking
- Custom metrics for cache hit rates
- Alert on error rate spikes
Project Structure
highlevel-mcp-server/
āāā src/
ā āāā index.ts # Main MCP server entry point
ā āāā tools/
ā ā āāā contacts.ts # Contact tools (10)
ā ā āāā conversations.ts # Conversation tools (3)
ā ā āāā opportunities.ts # Opportunity tools (4)
ā ā āāā calendars.ts # Calendar tools (2)
ā ā āāā locations.ts # Location tools (2)
ā ā āāā payments.ts # Payment tools (2)
ā ā āāā blogs.ts # Blog tools (7)
ā ā āāā emails.ts # Email tools (2)
ā ā āāā social-media.ts # Social media tools (6)
ā āāā lib/
ā ā āāā supabase.ts # Supabase client
ā ā āāā token-manager.ts # Token caching logic
ā ā āāā highlevel-client.ts # HighLevel API client
ā ā āāā client-resolver.ts # Client name ā location ID
ā āāā types/
ā āāā index.ts # TypeScript types
āāā tests/
ā āāā tools/ # Tool tests
ā āāā lib/ # Library tests
āāā wrangler.toml # Cloudflare Workers config
āāā package.json
āāā tsconfig.json
āāā README.md
Contributing
Contributions are welcome! Please follow these guidelines:
- Fork the repository
- Create a feature branch (
git checkout -b feature/amazing-feature) - Commit your changes (
git commit -m 'Add amazing feature') - Push to the branch (
git push origin feature/amazing-feature) - Open a Pull Request
Development Roadmap
Phase 1: Foundation ā
- [x] Project setup and architecture
- [x] Token management with caching
- [x] Client identifier resolver
- [x] Error handling framework
Phase 2: Tools Implementation ā
- [x] Implement all 38 tool schemas (26 read-only active, 12 write ops disabled)
- [x] HighLevel API endpoint mappings
- [x] Request/response formatting
- [ ] Individual tool testing
Phase 3: Polish (In Progress)
- [ ] Comprehensive error handling
- [ ] Performance optimization
- [ ] Documentation
- [ ] Integration testing
Phase 4: Production
- [ ] Production deployment
- [ ] Team training
- [ ] Monitoring setup
- [ ] User acceptance testing
Future Enhancements
- [ ] Automatic token refresh within MCP server
- [ ] HighLevel webhook support (real-time events)
- [ ] Response caching for read operations
- [ ] Request batching for bulk operations
- [ ] Admin UI for cache inspection
- [ ] Workflow automation templates
License
MIT License - see LICENSE file for details
Support
- Issues: GitHub Issues
- Discussions: GitHub Discussions
- Email: isagani@contractorscale.com
Acknowledgments
- Built with Model Context Protocol
- Powered by Cloudflare Workers
- Database by Supabase
- Integrates with HighLevel
- Template based on typingmind-mcp-cloudflare-starter
Related Projects
- Google Ads MCP Server - MCP server for Google Ads
- Meta Ads MCP Server - MCP server for Meta Ads
- TypingMind - AI chat interface with MCP support
Built with ā¤ļø by Isagani Esteron at Contractor Scale
Recommended Servers
playwright-mcp
A Model Context Protocol server that enables LLMs to interact with web pages through structured accessibility snapshots without requiring vision models or screenshots.
Magic Component Platform (MCP)
An AI-powered tool that generates modern UI components from natural language descriptions, integrating with popular IDEs to streamline UI development workflow.
Audiense Insights MCP Server
Enables interaction with Audiense Insights accounts via the Model Context Protocol, facilitating the extraction and analysis of marketing insights and audience data including demographics, behavior, and influencer engagement.
VeyraX MCP
Single MCP tool to connect all your favorite tools: Gmail, Calendar and 40 more.
graphlit-mcp-server
The Model Context Protocol (MCP) Server enables integration between MCP clients and the Graphlit service. Ingest anything from Slack to Gmail to podcast feeds, in addition to web crawling, into a Graphlit project - and then retrieve relevant contents from the MCP client.
Kagi MCP Server
An MCP server that integrates Kagi search capabilities with Claude AI, enabling Claude to perform real-time web searches when answering questions that require up-to-date information.
E2B
Using MCP to run code via e2b.
Neon Database
MCP server for interacting with Neon Management API and databases
Exa Search
A Model Context Protocol (MCP) server lets AI assistants like Claude use the Exa AI Search API for web searches. This setup allows AI models to get real-time web information in a safe and controlled way.
Qdrant Server
This repository is an example of how to create a MCP server for Qdrant, a vector search engine.