GHL Workflow MCP
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@GHL Workflow MCP connect to GoHighLevel and list my workflows"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
GHL Workflow MCP
An open-source Model Context Protocol server that lets Claude (or any MCP client) read, create and edit GoHighLevel workflows through your own logged-in Chrome session.
It needs no API key and no marketplace app install. The server attaches to a Chrome window over the DevTools protocol, picks up the session token GoHighLevel already holds, and calls the same endpoints the workflow builder uses.
Status: 0.1.0, early release. The write tools check every step against a strict shape validator before anything is saved, but always review a workflow in the GHL builder before you publish it.
What you get
30 tools, all free:
Area | Tools |
Connection |
|
Read |
|
Write |
|
Folders |
|
Location data |
|
patch_workflow applies small edits (insert, update, move or delete one step, or rewire a pointer) without resending the whole workflow. It rewires the step pointers on the server side, and it refuses the write if the workflow changed since you last read it.
Related MCP server: GoHighLevel MCP Server
Requirements
Node.js 20 or newer
Google Chrome (or Chromium)
A GoHighLevel account with access to the sub-account you want to work in
Install
Install from GitHub for now; the npm package follows.
Claude Code
claude mcp add ghl-workflow -- npx -y github:ampware-io/ghl-workflow-mcp-oss#v0.1.1Claude Desktop, Cursor and other MCP clients
Add this to your client's MCP config (for Claude Desktop that is claude_desktop_config.json):
{
"mcpServers": {
"ghl-workflow": {
"command": "npx",
"args": ["-y", "github:ampware-io/ghl-workflow-mcp-oss#v0.1.1"]
}
}
}From source
git clone https://github.com/ampware-io/ghl-workflow-mcp-oss.git
cd ghl-workflow-mcp-oss
npm install
npm test
node src/index.js --versionThen point your MCP client at node /path/to/ghl-workflow-mcp/src/index.js.
Connecting to GoHighLevel
Ask Claude to connect to GoHighLevel. It calls
launch_chrome, which opens a dedicated Chrome window. The window uses its own profile in~/.ghl-wkfl-mcp/chrome-profile, so your everyday browser is untouched.Log in to GoHighLevel in that window and open the sub-account you want.
The server detects the sub-account and connects.
test_connectionconfirms it.
To switch sub-accounts, change sub-account in that window, or call reconnect to pick a different tab.
If you would rather start Chrome yourself, launch it with the debug port:
google-chrome --remote-debugging-port=49222 --user-data-dir="$HOME/.ghl-wkfl-mcp/chrome-profile"Options
Flag / env var | Default | Purpose |
|
| Chrome DevTools debug port |
| off | Leave the Chrome window open when the server stops |
| off | Debug logging to stderr |
|
| Local cache of workflows read by |
| Print the version and exit |
How writes are validated
Every action and trigger in a create, update or patch goes through a strict shape validator (src/utils/action-shape-validator.js). It checks each step against the registry in src/registry/action-shapes.json:
Unknown step types are dropped, never sent.
Steps whose attributes don't match the expected shape are dropped.
Anything dropped is listed in
skippedActions[], with a reason, and advisory notes go inwarnings[].If anything was dropped, the workflow is saved as a draft, so a half-built workflow is never published.
The validator tells you a step is wrong. It does not tell you what every field means.
The step reference: GHL Workflow Docs MCP
Building a correct workflow needs more than access. You need to know each trigger and action type's JSON shape, its required and optional fields, the allowed values, and how steps link together (next, if/else branches, waits, goto). That reference is published separately as the hosted GHL Workflow Docs MCP (https://workflow-docs.ampware.io/mcp): a step reference, captured from 1,600+ real workflows and being live-verified, with worked examples that your assistant can query while it builds. Connect both servers and Claude gets access plus the knowledge to use it well.
Privacy and safety
Everything runs on your machine. The server talks only to Chrome on
127.0.0.1and to GoHighLevel's own endpoints, as you.No telemetry, no licence check and no phone-home.
The session token is read from your browser and is never written to disk. The only local files are the dedicated Chrome profile and the workflow cache described above.
The server can do anything your GHL user can do in the workflow builder, including deleting workflows. Use a user with the permissions you're comfortable giving an assistant.
Development
npm install
npm test # node --test 'src/**/*.test.js'The tests run offline. GoHighLevel and Chrome are mocked, and all fixtures are synthetic.
Disclaimer
This is an independent project. It is not affiliated with, endorsed by or supported by HighLevel Inc. It uses the endpoints GoHighLevel's own web app uses, and those can change without notice.
License
Available Tools
30 toolsaudit_workflowARead-only
Audit a workflow for broken entity references. Scans all actions and triggers for pipeline, stage, user, custom field, and custom value IDs, then validates each against the location data. Returns which references are valid, which are broken, and suggests replacements.
Inputs: workflowId (required).
clone_workflowADestructive
Clone an existing workflow, creating an independent copy on the same location. GHL handles all UUID remapping and action chain wiring server-side. By default the clone is named "Copy - {original name}" — pass a custom name to override. Returns the full cloned workflow object.
Inputs: workflowId (required), name.
create_folderBDestructive
Create a new workflow folder in the current GHL location. Returns the created folder object.
Inputs: name (required).
create_tagCDestructive
Create a new tag in the current GoHighLevel location.
Inputs: tagName (required).
create_workflowADestructive
Create a new workflow. Action and trigger types must come from the enums in this schema. Use the then/else scaffold for if_else conditions; the verbose three-sibling form is also accepted. Salvage decisions surface in skippedActions[] (HARD drops) and warnings[] (advisory). When any HARD drop occurs, status is forced to draft. For field meanings, allowed values and worked examples for every step type, use the GHL Workflow Docs MCP.
Inputs: name (required), status, actions, timezone, +6 more.
delete_folderADestructive
Delete a workflow folder. Any workflows inside the folder are automatically moved to root level by GHL. Cannot be undone.
Inputs: folderId (required).
delete_workflowADestructive
Delete a workflow permanently. Returns the deleted workflow name for confirmation. No undo — the workflow is removed from GHL immediately.
Inputs: workflowId (required).
get_workflowARead-only
Get a GoHighLevel workflow's structure including actions and triggers. By default returns a summary with action names, types, and ordering (compact). Set includeActionDetails=true for full action attributes (warning: responses can be very large). Call list_workflows first to find workflow IDs.
Inputs: workflowId (required), includeActionDetails.
launch_chromeA
Launch a dedicated Chrome window with GoHighLevel. Call this when test_connection fails because Chrome is not running. First call without confirm returns instructions for the user. Call again with confirm=true after the user agrees to proceed.
Inputs: confirm.
list_associationsARead-only
List object associations for contacts in the current GoHighLevel location. Returns association types and cardinality between objects.
Inputs: no named parameters.
list_business_fieldsBRead-only
List the business object definition and its fields in the current GoHighLevel location. Returns the object metadata and all custom/standard fields.
Inputs: no named parameters.
list_custom_fieldsARead-only
List custom fields in the current GoHighLevel location. Requires a model parameter to specify which entity type (contact or opportunity). Contact and opportunity custom fields use different API endpoints internally.
Inputs: model (required).
list_custom_valuesARead-only
List custom values (template variables) for conversations in the current GoHighLevel location. Returns system-defined static variables and location-specific custom values.
Inputs: no named parameters.
list_email_templatesARead-only
List all email templates in the current GoHighLevel location. Returns template names and IDs for use in workflow email actions.
Inputs: no named parameters.
list_foldersARead-only
List all workflow folders in the current GHL location. Returns folder names and IDs. Use folder IDs with move_workflow or list_workflows (folderId param).
Inputs: no named parameters.
list_formsARead-only
List all forms in the current GoHighLevel location. Returns form names and IDs.
Inputs: no named parameters.
list_pipelinesARead-only
List all opportunity pipelines in the current GoHighLevel location. Returns pipeline names with their stages (name, position).
Inputs: no named parameters.
list_tagsARead-only
List all tags in the current GoHighLevel location. Returns tag names and IDs.
Inputs: no named parameters.
list_trigger_linksBRead-only
List all trigger links (one-click action links) in the current GoHighLevel location. Returns link names and IDs.
Inputs: no named parameters.
list_usersARead-only
List all users with access to the current GoHighLevel location. Returns user names, emails, roles, and permissions.
Inputs: no named parameters.
list_workflowsARead-only
List all workflows in the current GoHighLevel location. Returns workflow summaries including name, ID, status, and dates. Auto-fetches all pages by default. Optionally pass limit/offset to get a specific page, or sortBy/sortOrder to control ordering.
Inputs: limit, offset, sortBy, folderId, +1 more.
move_workflowA
Move a workflow into a folder, or back to root level. To move to root, omit folderId or pass null.
Inputs: workflowId (required), folderId.
patch_workflowADestructive
Apply an ordered list of patch operations to a workflow with deterministic server-side pointer rewiring. Ops: insert_after / update_step / delete_step / move / rewire_step (plus add_trigger / update_trigger / remove_trigger). Param roles — step_id = the SUBJECT the op acts on (update_step/delete_step/move/rewire_step); after_step_id = the ANCHOR to position after (insert_after/move); next = the target pointer for rewire_step (a step ID or null to terminate); trigger_id = the subject trigger. insert_after also accepts step_id as an alias for after_step_id. rewire_step overwrites a non-branched step scalar next in place (no splice, no reorder) — it does NOT validate for cycles or orphaned downstream steps; the caller owns flow correctness. All-or-nothing: any op failure aborts before any GHL write. Detects external workflow changes via the version field. Use after read_workflow_outline + read_workflow_step. For whole-workflow rewrites or branched-step splices, fall back to update_workflow. For field meanings, allowed values and worked examples for every step type, use the GHL Workflow Docs MCP.
Inputs: operations (required), workflowId (required).
publish_workflowADestructive
Publish a draft workflow, changing its status to published. The workflow will become active and start processing contacts when triggered. Returns the full workflow object after publishing.
Inputs: workflowId (required).
read_workflow_outlineARead-only
(FREE) Cheap targeted read — returns workflow metadata + step IDs/types/names/order/next/parentKey only (no attributes). Prefer this as the FIRST read when editing a workflow; follow with read_workflow_step for any step you intend to mutate.
Inputs: workflowId (required).
read_workflow_stepARead-only
(FREE) Returns one step's full JSON for a given workflow + step ID. Use after read_workflow_outline to inspect a specific step before patching it. Returns a structured step_not_found error with valid_step_ids when the step does not exist.
Inputs: stepId (required), workflowId (required).
reconnectA
Re-scan Chrome for GoHighLevel tabs and switch to a different tab or location. Use this to change locations without restarting the server. If called with no targetId, lists available GHL tabs. If called with a targetId, switches to that tab.
Inputs: targetId.
rename_folderA
Rename an existing workflow folder.
Inputs: name (required), folderId (required).
test_connectionARead-only
Verify Chrome is reachable, GHL tab is found, and Firebase token is extractable. Call this first to confirm the MCP server can communicate with GoHighLevel.
Inputs: no named parameters.
update_workflowADestructive
Update an existing workflow with partial changes. Action and trigger types must come from the enums in this schema. Use the then/else scaffold for if_else; verbose three-sibling form also accepted. Pass only fields you want to change. Salvage decisions surface in skippedActions[] and warnings[]. When any HARD drop occurs, status is forced to draft. For field meanings, allowed values and worked examples for every step type, use the GHL Workflow Docs MCP.
Inputs: workflowId (required), name, status, actions, +7 more.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 30 tools
Each tool has a clearly distinct purpose, with descriptions explicitly guiding when to use which tool (e.g., get_workflow vs read_workflow_outline vs read_workflow_step, and update_workflow vs patch_workflow). The list_* tools are separated by entity type, and connection tools are unique. No two tools appear to do the same thing.
All tool names follow a consistent snake_case verb_noun pattern (e.g., list_tags, create_workflow, read_workflow_step, patch_workflow). The few single-verb names like reconnect and launch_chrome are still clear and consistent with the overall style.
With 30 tools, the set is heavy, but the server covers a broad GoHighLevel domain including many entity types needed for workflow construction. Each tool serves a distinct purpose, though some consolidation (e.g., a generic list tool with a type parameter) could reduce the count without losing functionality.
The server provides comprehensive CRUD and lifecycle coverage for workflows (create, read, update, delete, publish, clone, patch) and folders, plus all the list operations needed to reference GHL entities. Minor gaps exist, such as no update or delete for tags, but these are not critical for core workflow management.
Maintenance
Related MCP Connectors
GoHighLevel MCP server for ChatGPT, Claude and any AI agent: create workflow, add trigger, add action, publish workflow, read workflow stats and edit funnel page SEO in your own GoHighLevel account. Cotlet works in the account through your Cloud Browser, a real Chrome where you sign in to GoHighLevel yourself; Cotlet does not store your password and you need no GoHighLevel API key. About the official GoHighLevel API: Yes. HighLevel has a public REST API and official MCP servers with more than 550 read, create, update and delete operations (checked 27 Oct 2026). Setup and FAQ: https://cotlet.dev/integrations/gohighlevel-api-mcp-server
Connect Claude or any MCP client to Wireflow, the AI canvas for image, video and audio workflows. List, build, inspect and run your workflows and published apps, browse templates, check models, prices and credits, edit a video node's timeline, and plan or schedule social posts. Drafts and edits cost no credits; run tools spend the user's credits.
Read and edit GA4, Search Console and Google Tag Manager from any MCP client. 29 tools.
Systeme.io MCP server for ChatGPT, Claude and any AI agent: update funnel page, edit email campaign, list orders and get sales report in your own Systeme.io account. Cotlet works in the account through your Cloud Browser, a real Chrome where you sign in to Systeme.io yourself; Cotlet does not store your password and you need no Systeme.io API key. About the official Systeme.io API: Yes, Systeme.io has a public API and an official MCP server, covering contacts, tags, newsletters, email campaigns, funnels, price plans, coupons, products, courses and subscriptions (checked 11 Oct 2026). Neither one lists transactions, refunds sales, sends invoices, manages blog posts or edits text on an existing funnel page. Setup and FAQ: https://cotlet.dev/integrations/systeme-io-api-mcp-server
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceConnects Claude Desktop to GoHighLevel CRM, providing 269+ tools across 19 categories for complete contact management, messaging, sales, marketing, e-commerce, and business operations through AI automation.14 npm196ISC
- AlicenseNot gradedqualityDmaintenanceConnects Claude Desktop to GoHighLevel CRM with 269+ tools for comprehensive contact management, messaging, sales pipelines, appointments, marketing automation, and e-commerce operations through natural language.14 npmISC
- AlicenseAqualityCmaintenanceGoHighLevel MCP server for Claude. 212 tools across 43 modules, including the only programmatic GHL workflow builder (private API, reverse-engineered), funnel + page editor, form builder, pipeline builder, pre-deploy validator, multi-sub-account switching, bulk operations, and full account export. $97 one-time, lifetime updates.41MIT
- AlicenseNot gradedqualityDmaintenanceEnables Claude to manage GoHighLevel CRM contacts, pipelines, and workflows through natural language commands.112 npmMIT