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
推荐服务器
Baidu Map
百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。
Playwright MCP Server
一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。
Magic Component Platform (MCP)
一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。
Audiense Insights MCP Server
通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。
VeyraX
一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。
graphlit-mcp-server
模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。
Kagi MCP Server
一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。
e2b-mcp-server
使用 MCP 通过 e2b 运行代码。
Neon MCP Server
用于与 Neon 管理 API 和数据库交互的 MCP 服务器
Exa MCP Server
模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。