contact.service_category, contact.quoted_Tier, and contact.ai_intent) so the agent writes to fixed options instead of an open-ended text note.
contact.ai_intent matches an allowed value (estimate, repair, human_handoff) and ai-opted-out is not present before sending a booking link or updating an opportunity.
ghl-tools (danielhallman.com/mcp), mint a location-specific Private Integration token limited to the required scopes (contacts.readonly, workflows.readonly, opportunities.write) instead of sharing an agency-wide key.
Harden AI agent state management and tool permissions in sub-account <YOUR_LOCATION_ID>: 1. In Settings > Custom Fields, create typed Dropdown and Number fields (contact.ai_intent, contact.service_category) instead of storing state in free-text notes. 2. In Automation > Workflows, add an If/Else validation branch after Conversation AI to check allowed field values before sending SMS or moving pipeline stages. 3. In Settings > Private Integrations, restrict MCP and API tokens to location-scoped least-privilege permissions.
# Inspect custom field types and workflow validation branches via ghl-crm ghl-crm custom-fields list --context <YOUR_CONTEXT> --location <YOUR_LOCATION_ID> ghl-crm workflows list --context <YOUR_CONTEXT> --location <YOUR_LOCATION_ID>
Official GHL MCP vs. ghl-tools: HighLevel’s official hosted MCP (services.leadconnectorhq.com/mcp) covers public v2 CRM records (contacts, opportunities, appointments, conversations). ghl-tools MCP complements it with workflow graph inspection & recipes, funnel/form builders, DNS/BIMI checks, and ghl-crm doctor audits.
ghl-tools) to a location-scoped Private Integration token with only the permissions that job requires.| Step | Menu Path in GHL | Action |
|---|---|---|
| Step 1 | Settings > Custom Fields | Replace free-text memory dumps with typed CRM fields: Click + Add Field and create explicit Dropdown (Single), Number, or Date fields (such as contact.service_category, contact.quoted_Tier, and contact.ai_intent) so the agent writes to fixed options instead of an open-ended text note. |
| Step 2 | Automation > Workflows | Validate fields with If/Else branches before running actions: After a Conversation AI or Inbound Webhook step, add an If/Else condition that verifies contact.ai_intent matches an allowed value (estimate, repair, human_handoff) and ai-opted-out is not present before sending a booking link or updating an opportunity. |
| Step 3 | Settings > Private Integrations | Scope external agent tokens to one sub-account: When connecting Claude Code, Cursor, or an MCP worker via ghl-tools (danielhallman.com/mcp), mint a location-specific Private Integration token limited to the required scopes (contacts.readonly, workflows.readonly, opportunities.write) instead of sharing an agency-wide key. |
Connect Claude Code, Cursor, or OpenAI Codex to our ghl-tools MCP Server & Rust CLI to build workflows, forms, and funnels from your editor, or start your GoHighLevel plan through our partner link to unlock $612+ in ready-to-import kits (including AI Agent & MCP Operator Pack) and weekly live clinics.