Skip to main content
Glama
yeisonmbotero

ghl-mcp-server

ghl-mcp-server

An MCP server that lets AI agents (Claude Code, Claude Desktop, Cursor…) operate the parts of GoHighLevel that the official API doesn't expose: workflows, number pools, forms, funnels, custom fields, pipelines and A2P 10DLC status — by talking to GHL's internal web-app API.

Python MCP License

Unofficial. This project uses undocumented endpoints of the GoHighLevel web app. Read the Disclaimer before using it.


Why

GoHighLevel's public API (and the official LeadConnector MCP) is great for data — contacts, conversations, opportunities. But much of the day-to-day work of a marketing agency is configuration: creating workflows, forms, custom fields, pipelines, checking phone tracking and A2P registration for every new client sub-account. That lives behind the web app's internal API.

This server was built while working with a GoHighLevel marketing agency, to let an AI agent audit and set up client sub-accounts instead of clicking through the UI by hand.

Related MCP server: GoHighLevel MCP Server

Tools (21)

Every tool accepts an optional location_id (the GHL sub-account). If omitted, GHL_LOCATION_ID is used. Every tool returns the same shape: {"ok": bool, "status": int, "data": ..., "text": ..., "error": ...}.

Read

Tool

What it does

Internal endpoint

ghl_list_workflows

Workflows and folders of a sub-account

GET /workflow/{loc}/list

ghl_get_workflow

One workflow in full: triggers, actions, branches

GET /workflow/{loc}/{workflowId}

ghl_list_number_pools

Number pools (dynamic call tracking)

GET /phone-system/number-pools

ghl_list_phone_numbers

Phone numbers of the sub-account

GET /phone-system/numbers/v2/location/{loc}

ghl_a2p_status

Phone-system sub-account record incl. A2P state

GET /phone-system/sub-account/{loc}

ghl_a2p_registration_status

A2P 10DLC standard-registration settings (read-only)

GET /isv_service/compliance/{company}/standard-registration/{loc}/settings

ghl_list_forms

Forms

GET /forms/list

ghl_list_funnels

Funnels and websites

GET /funnels/funnel/list

ghl_list_custom_fields

Custom fields (contact + opportunity) with ids and fieldKeys

GET /locations/{loc}/customFields/search

ghl_list_pipelines

Opportunity pipelines and stages

GET /opportunities/pipelines

Write (contracts verified end-to-end on a test sub-account)

Tool

What it does

Internal endpoint

ghl_create_custom_field

Create a custom field (12 data types, contact/opportunity)

POST /locations/{loc}/customFields

ghl_update_custom_field

Rename a custom field

PUT /locations/{loc}/customFields/{id}

ghl_delete_custom_field

Delete a custom field

DELETE /locations/{loc}/customFields/{id}

ghl_create_custom_value

Create a custom value (reusable variable)

POST /locations/{loc}/customValues

ghl_create_tag

Create a tag

POST /locations/{loc}/tags

ghl_create_pipeline

Create a pipeline with ordered stages

POST /opportunities/pipelines

ghl_create_workflow

Create an empty draft workflow

POST /workflow/{loc}

ghl_delete_workflow

Delete a workflow

DELETE /workflow/{loc}/{workflowId}

ghl_create_form

Create an empty form

POST /forms/

ghl_create_contact

Create a contact

POST /contacts/

Generic

Tool

What it does

ghl_call

Passthrough to any endpoint in docs/ENDPOINTS.md (host restricted to GHL's two API hosts). Non-GET calls count as writes.

Set GHL_READ_ONLY=1 to disable every write tool and non-GET passthrough call — recommended while exploring a production account.

Architecture

flowchart LR
    A["AI client<br/>(Claude Code / Desktop / Cursor)"] -- "MCP (stdio)" --> S["ghl-mcp-server<br/>FastMCP · 21 tools"]
    S --> T{"Transport<br/>GHL_TRANSPORT"}
    T -- "browser (default)" --> B["Your Chrome, logged in<br/>via CDP :9222<br/>(or headless + your exported session)"]
    B -- "XHR inside the page<br/>+ live bearer captured from the app" --> API
    T -- "token" --> H["httpx<br/>Bearer GHL_API_TOKEN"]
    H --> API["GHL internal API<br/>backend.leadconnectorhq.com<br/>services.leadconnectorhq.com"]
  • src/ghl_mcp_server/server.py — tool definitions, validation, read-only guard.

  • src/ghl_mcp_server/transport.py — the two transports, with timeouts and normalized errors.

  • src/ghl_mcp_server/config.py — everything account-specific comes from environment variables.

Transports

browser (recommended). GHL's internal API sits behind defenses that plain HTTP clients struggle with (see below), so by default the server rides on a real browser session:

  1. You start Chrome with remote debugging and log into GHL yourself (once):

    # macOS example — use a dedicated profile directory
    "/Applications/Google Chrome.app/Contents/MacOS/Google Chrome" \
      --remote-debugging-port=9222 --user-data-dir="$HOME/.ghl-chrome-profile"
  2. The server attaches over CDP (GHL_CDP_URL), opens the sub-account and installs a small script that records the Authorization header the GHL app itself uses.

  3. Requests are sent with XMLHttpRequest from inside the page, reusing the browser's TLS fingerprint, cookies and the app's live token. The app keeps refreshing the token itself.

  4. Because GHL issues different tokens per service, each tool first "warms" the matching UI module (e.g. Settings → Custom Fields) so the right token is available.

Optional headless fallback: point GHL_STORAGE_STATE at a Playwright storage-state file you exported yourself. That file holds live session cookies — keep it outside the repo, chmod 600. The server never writes secrets to disk and never closes your own Chrome.

token. Direct HTTPS with httpx and GHL_API_TOKEN. Simpler, but the web-app JWT expires and rotates, and Cloudflare may answer 403 / error 1010 to non-browser clients; the server reports that case explicitly so you can switch to browser.

Installation

git clone https://github.com/<your-user>/ghl-mcp-server.git
cd ghl-mcp-server
python3 -m venv .venv && source .venv/bin/activate
pip install -e ".[browser]"          # or: pip install -r requirements.txt
python -m playwright install chromium  # only needed for the headless fallback
cp .env.example .env                  # then fill in your values (never commit .env)

Configuration

Variable

Required

Description

GHL_TRANSPORT

no

browser or token (default: token if GHL_API_TOKEN is set, else browser)

GHL_LOCATION_ID

recommended

Default sub-account id

GHL_API_TOKEN

token transport

Bearer token for the internal API

GHL_APP_URL

browser transport

The URL you log into (https://app.gohighlevel.com or your white-label domain)

GHL_CDP_URL

no

Chrome DevTools endpoint (default http://127.0.0.1:9222)

GHL_STORAGE_STATE

no

Path to your exported Playwright session (headless fallback)

GHL_COMPANY_ID

no

Agency id, only for ghl_a2p_registration_status

GHL_TIMEOUT

no

Per-request timeout in seconds (default 30)

GHL_READ_ONLY

no

1 disables all writes

Claude Code

claude mcp add ghl-internal \
  -e GHL_TRANSPORT=browser \
  -e GHL_APP_URL=https://app.gohighlevel.com \
  -e GHL_LOCATION_ID=your-location-id \
  -e GHL_READ_ONLY=1 \
  -- /path/to/ghl-mcp-server/.venv/bin/python -m ghl_mcp_server

Claude Desktop / Cursor (mcpServers JSON)

{
  "mcpServers": {
    "ghl-internal": {
      "command": "/path/to/ghl-mcp-server/.venv/bin/python",
      "args": ["-m", "ghl_mcp_server"],
      "env": {
        "GHL_TRANSPORT": "browser",
        "GHL_APP_URL": "https://app.gohighlevel.com",
        "GHL_CDP_URL": "http://127.0.0.1:9222",
        "GHL_LOCATION_ID": "your-location-id",
        "GHL_READ_ONLY": "1"
      }
    }
  }
}

Then ask things like "list the workflows of this sub-account and tell me which ones are still drafts" or "create the custom fields Google Ads Click ID and UTM Source as contact fields".

Tests

The offline test suite uses a fake transport — no network, no browser:

pip install -e ".[dev]" && pytest -q

Reverse-engineering GHL's internal API

The official API didn't cover what the agency needed, so the first step was to map what the web app itself does.

1. Capture. A real Chrome session (logged in manually — Google's login blocks automation) was driven through every module of a sub-account — dashboard, automation, sites, settings, phone system, agency view — with Playwright attached over the Chrome DevTools Protocol. Every XHR/fetch the app made was recorded to JSONL (method, URL, status, request and response shape). Result: 4,673 captured calls, all read-only navigation.

2. Catalog. A build script normalized URLs into templates (20-character GHL ids, UUIDs and numbers replaced by placeholders), grouped them by resource and summarized request/response shapes. Result: 259 unique endpoints (method + template) in roughly 60 resource groups, 257 of them on GHL's two API hosts. The generic, data-free version is in docs/ENDPOINTS.md.

3. Find the defenses. Plain HTTP didn't work, and figuring out why shaped the transport:

Defense

Evidence

Workaround

Cloudflare filters by TLS fingerprint

Python urllib → error 1010; browser → OK

Send requests from inside the browser

CSP blocks cross-host fetch() from the page

fetch → "Failed to fetch"

Use XMLHttpRequest, which the page allows

Bearer JWT rotates in memory

Token in localStorage ≠ token actually sent

Hook the app's own XHR/fetch to read the live header

Tokens are per service

Workflow token rejected by custom-fields API

"Warm" the matching UI module first

Mandatory Version header

401 "version header was not found"

Always send Version: 2021-07-28

4. Verify writes. Passive capture only shows reads, so create/update/delete contracts were probed actively on a test sub-account with minimal payloads and a throw-away name prefix, then cleaned up. 15 contracts (custom fields, custom values, tags, pipelines, workflows, forms, contacts) returned 200/201 and are marked ✅ verified in the catalog. End-to-end smoke test through the MCP: create workflow → it appears in the list → delete it, three 200s.

Known gaps. Number-pool creation and A2P submission were not probed (they cost money and need a provisioned phone system). Workflow triggers are stored separately from the workflow graph and are not handled by a dedicated tool yet.

How it was built

Designed, directed and tested by Yeison Munera with AI pair-programming (Claude Code): the capture strategy, the choice of transports and every live verification were done by hand on real accounts; much of the code was written with the assistant.

Disclaimer

  • This is not an official GoHighLevel / LeadConnector product and is not affiliated with or endorsed by them.

  • It relies on an internal, undocumented API that can change or break at any time without notice.

  • Use it only with accounts you own or are explicitly authorized to operate, and make sure your use complies with GoHighLevel's Terms of Service. You are responsible for what an AI agent does with write access — start with GHL_READ_ONLY=1.

  • Never commit tokens, exported sessions, browser profiles or captured traffic: they contain live secrets and customer data. The provided .gitignore excludes them.

License

MIT © 2026 Yeison Munera


Built by Yeison Munera · TechCube

Available Tools

21 tools
ghl_a2p_registration_statusGhl A2P Registration StatusA

Read the A2P 10DLC standard registration settings of a sub-account. Never submits anything.

ParametersJSON Schema
NameRequiredDescriptionDefault
company_idNoagency (company) id; defaults to GHL_COMPANY_ID.
location_idNoGHL sub-account id (defaults to GHL_LOCATION_ID).

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden. It explicitly states 'Never submits anything,' which is a critical behavioral guarantee that goes beyond the schema. This is a strong disclosure for a read operation, though it doesn't cover other traits like error handling or authentication, which are not specified elsewhere.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences, front-loaded with the main action and a clear behavioral note. There is no extraneous content, and it is appropriately concise.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool is simple with optional parameters and an output schema. The description covers the core function and read-only nature. However, it does not mention the distinction from sibling ghl_a2p_status, which could be important for correct tool selection, leaving a minor gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema fully describes both parameters (company_id and location_id) with defaults, achieving 100% coverage. The description adds no additional parameter information, so the baseline of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states 'Read the A2P 10DLC *standard registration* settings of a sub-account,' which is a specific verb and resource. It clearly conveys the tool's function, but it does not explicitly differentiate from the sibling ghl_a2p_status, so it lacks sibling differentiation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase 'Never submits anything' provides a clear behavioral context, implying this tool is for read-only operations and should be used when no changes are intended. However, it does not explicitly mention alternatives or exclusions, so it's clear context without a direct when-not comparison.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ghl_a2p_statusGhl A2P StatusA

Read the phone-system sub-account record, including A2P 10DLC (US SMS) state. Read-only.

ParametersJSON Schema
NameRequiredDescriptionDefault
location_idNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description explicitly says 'Read-only', which is a useful behavioral disclosure. However, no annotations are provided, so the description carries the burden. It does not disclose what happens if location_id is null, whether the tool returns an error for missing sub-account records, or any rate-limit/auth requirements. The read-only claim is clear but minimal.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two short sentences with no filler. The key action ('Read') and scope ('phone-system sub-account record') are front-loaded, and the read-only note is concise. Every word earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool has an output schema, which likely covers return values, and a single optional parameter. The description is adequate for a simple read operation, but it lacks guidance on the location_id parameter's semantics and does not distinguish itself from the closely named sibling ghl_a2p_registration_status. Given the low schema coverage and no annotations, a bit more context would be needed for full completeness.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. The description mentions the resource being read but does not explain the location_id parameter's meaning, format, or behavior when null. With only one optional parameter, the gap is moderate; the description adds some context but not enough to fully clarify the parameter's role.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('Read') and resource ('phone-system sub-account record'), and mentions the A2P 10DLC state. It is clear enough to distinguish from most siblings, though it does not explicitly name a sibling alternative like ghl_a2p_registration_status, which is a closely related tool.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage context: it is a read-only status check for A2P 10DLC state. However, it does not explicitly state when to use this tool versus ghl_a2p_registration_status or other phone-number tools, nor does it provide exclusions or alternative routing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ghl_callGhl CallA

Generic passthrough to any internal endpoint listed in docs/ENDPOINTS.md.

Use it for anything without a dedicated tool. Non-GET methods WRITE to the live account and are refused when GHL_READ_ONLY is enabled.

ParametersJSON Schema
NameRequiredDescriptionDefault
bodyNooptional JSON body.
hostNo"backend" (backend.leadconnectorhq.com) or "services" (services.leadconnectorhq.com).backend
pathYesabsolute API path, e.g. "/opportunities/pipelines". The placeholder "{loc}" is replaced by the location id.
queryNooptional query-string parameters.
methodYesHTTP method.
location_idNoGHL sub-account id (defaults to GHL_LOCATION_ID).

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden of behavioral disclosure. It discloses the critical side-effect: non-GET methods WRITE to the live account and are refused when GHL_READ_ONLY is enabled. It does not mention auth, rate limits, or error behavior, but the most important mutation/read-only trait is covered.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences with no filler: purpose, usage guidance, and safety warning. Each sentence earns its place and the most important information is front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a generic passthrough tool, the description plus a fully documented 6-parameter schema and an output schema cover what an agent needs: valid endpoint source, when to use it, and write-safety behavior. No critical operational context is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3. The description adds value by pointing to docs/ENDPOINTS.md as the source of valid paths and by explaining the behavioral meaning of non-GET methods, which helps agents reason about method and path parameters beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly identifies this as a 'Generic passthrough to any internal endpoint listed in docs/ENDPOINTS.md', which is a specific verb+resource. It also distinguishes itself from the many dedicated sibling tools by stating it is for anything 'without a dedicated tool'.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly says when to use it: 'Use it for anything without a dedicated tool.' This also implies when not to use it, and the warning about non-GET methods writing to the live account and being refused under GHL_READ_ONLY gives clear decision-relevant context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ghl_create_contactGhl Create ContactA

Create a contact. WRITES to the live account. Provide at least an email or a phone.

ParametersJSON Schema
NameRequiredDescriptionDefault
emailNo
phoneNo
last_nameNo
first_nameNo
location_idNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure. It explicitly flags 'WRITES to the live account,' which warns of a mutating operation. It does not mention potential side effects (e.g., duplicate handling, required authentication) or error conditions, but the explicit write warning is a valuable baseline. Since the description adds this warning, it earns a 3.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is extremely concise: two sentences. The core purpose is stated first, followed by the critical requirement. There is no fluff or redundancy, making it easy for an agent to parse quickly.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple create operation with an output schema, the description covers the essential context: what it does and the key input requirement. It omits details about error handling or post-creation behavior, but the output schema can convey return structure. Given the tool's simplicity and the presence of an output schema, this is adequate completeness.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate for parameter meaning. It highlights the key constraint that at least an email or phone is required, which the schema does not enforce (required: 0). However, it does not explain first_name, last_name, or location_id, though these are intuitively named. The partial compensation yields a 3.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action (create) and the resource (contact), and explicitly notes it writes to the live account. It differentiates from sibling tools, none of which create contacts, so an agent can easily identify this tool's purpose.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides a concrete usage requirement: 'Provide at least an email or a phone.' This is a clear condition for invoking the tool. However, it does not mention when not to use it or suggest alternative tools, but given the sibling list has no overlapping contact-creation tool, the guidance is sufficient.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ghl_create_custom_fieldGhl Create Custom FieldA

Create a custom field. WRITES to the live account.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesdisplay name of the field.
modelNo"contact" or "opportunity".contact
data_typeNoone of TEXT, LARGE_TEXT, NUMERICAL, PHONE, MONETORY (sic, GHL spelling), CHECKBOX, SINGLE_OPTIONS, MULTIPLE_OPTIONS, DATE, TEXTBOX_LIST, FILE_UPLOAD, RADIO.TEXT
location_idNoGHL sub-account id (defaults to GHL_LOCATION_ID).

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the behavioral burden. It explicitly warns that the tool 'WRITES to the live account,' which is useful, but it does not disclose idempotency, duplicate-name behavior, permission requirements, or other side effects.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences with the purpose first and the live-write warning second. No filler or redundant detail.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The schema covers all parameters and an output schema exists, so the description does not need to explain return values. However, it lacks usage guidance and deeper behavioral context, making it adequate but not complete for a mutation tool with no annotations.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, and the schema already documents all four parameters with defaults and enums. The description adds no parameter-level meaning beyond that, so the baseline of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific action ('Create') and resource ('custom field'), and the resource name distinguishes it from siblings like ghl_create_custom_value, ghl_create_tag, and ghl_create_pipeline. The 'WRITES to the live account' warning reinforces that this is a real mutation, not a dry run.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance on when to choose this over ghl_update_custom_field, ghl_delete_custom_field, or ghl_create_custom_value. The description only restates the tool's purpose and gives no exclusions or prerequisites.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ghl_create_custom_valueGhl Create Custom ValueC

Create a custom value (a reusable sub-account variable such as {{custom_values.x}}). WRITES.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes
valueYes
location_idNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

C2.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

There are no annotations, so the description carries the full burden of behavioral disclosure. It only adds 'WRITES,' which is redundant with the verb 'Create' and does not explain side effects, overwrite behavior, auth requirements, or the role of location_id. No contradiction exists because no annotations are present.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The core statement 'Create a custom value' is front-loaded and concise, and the example adds useful context in a compact way. However, the trailing 'WRITES.' is redundant with 'Create' and does not earn its place in such a short description.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a three-parameter create tool with no annotation coverage and no schema descriptions, the description omits parameter semantics, usage guidance, and meaningful behavioral context. The presence of an output schema reduces the need for return-value detail, but the remaining gaps are substantial.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate for the undocumented parameters name, value, and location_id. It does not define any of them, though the example '{{custom_values.x}}' hints at how the variable name might be referenced. Required parameters remain semantically unclear.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description identifies a specific verb ('Create') and resource ('custom value'), and explains what that resource is via the example '{{custom_values.x}}'. It differentiates from sibling ghl_create_custom_field by describing the value as a reusable sub-account variable rather than a field definition.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is provided about when to use this tool versus siblings like ghl_create_custom_field or ghl_create_tag. The description does not discuss prerequisites, scenarios, or selection criteria. Given the large sibling set, this leaves the agent without direction.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ghl_create_formGhl Create FormA

Create an empty form and return its id. WRITES to the live account.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes
location_idNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description must carry the behavioral burden. It explicitly warns 'WRITES to the live account,' signaling mutation and real-world side effects, and states that the tool returns an id. It does not disclose auth requirements or idempotency, but the live-account warning is valuable transparency.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two short sentences with every phrase earning its place. The primary action and return value are front-loaded, followed by the critical side-effect warning. No filler or redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple 2-parameter creation tool with an output schema, the description covers the core action, the return value, and the write side effect. However, it omits the meaning of 'location_id', any usage context, and any mention of permissions, leaving some practical gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, and the description adds no meaning for either parameter. 'name' may be inferred as the form's name, but 'location_id' remains completely unexplained, leaving an optional parameter without semantic context.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: 'Create an empty form and return its id.' It clearly differentiates this creation tool from sibling list/read/update/delete tools, and 'empty form' adds precision about the operation's scope.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no explicit guidance on when to use this tool versus alternatives, no exclusions, and no mention of prerequisites. The intended use is only weakly implied by the name and 'Create an empty form.'

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ghl_create_pipelineGhl Create PipelineC

Create an opportunity pipeline. WRITES to the live account.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYespipeline name.
stagesYesordered list of stage names, e.g. ["New Lead", "Contacted", "Won"].
location_idNoGHL sub-account id (defaults to GHL_LOCATION_ID).

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

C2.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description must carry the full burden of behavioral disclosure. It warns 'WRITES to the live account,' which signals a mutation, but it does not mention whether the operation is idempotent, what happens if a pipeline with the same name exists, or any permission requirements. For a write tool, this is minimal transparency.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single sentence that is concise and front-loaded with the primary action. It has no redundant phrases or filler. However, it is arguably too short to provide any contextual framing, though this is not a structural flaw—it is a matter of completeness.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool has a simple create operation with three parameters (two required) and an output schema, so the description does not need to explain return values. The schema covers parameter details, and the description states the core purpose. Still, it omits any guidance on when to use this tool or what constitutes a valid pipeline configuration, which an agent might need for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, meaning every parameter (name, stages, location_id) already has a clear description in the schema. The tool description adds no additional parameter semantics, so it does not go beyond the baseline expected for full schema coverage. The baseline of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'Create an opportunity pipeline,' which is a specific verb-resource pair. It distinguishes this tool from siblings like ghl_list_pipelines (which lists rather than creates) and ghl_create_custom_field (which creates a different entity type). However, it does not elaborate on what an 'opportunity pipeline' entails beyond the name, so it is clear but not deeply descriptive.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no guidance on when to use this tool versus alternatives. It does not mention prerequisites, such as needing a location_id, nor does it reference sibling tools like ghl_list_pipelines for verification. The only context is 'WRITES to the live account,' which implies a write operation but gives no condition for selection.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ghl_create_tagGhl Create TagC

Create a contact tag. WRITES to the live account.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes
location_idNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

C2.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden. The 'WRITES to the live account' statement meaningfully discloses that this is a mutating operation with real-world side effects. However, it omits other behavioral details such as auth requirements, idempotency, or reversibility.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is efficiently structured with the action front-loaded and the side-effect warning following immediately. Every sentence earns its place, though it leans toward under-specification rather than genuine conciseness.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 2-parameter create tool with zero annotation coverage and 0% schema description coverage, the description is incomplete. The output schema covers return values, but the location_id parameter semantics are unaddressed, leaving an agent guessing about a valid call.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate, but it explains neither parameter. While 'name' is self-evident as the tag's name, 'location_id' is unexplained — an agent doesn't know what it represents or when to supply it in the GHL context.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb (Create) and resource (contact tag), making the tool's purpose clear. It is distinguishable from siblings like create_pipeline, create_workflow, and create_contact, though it doesn't explicitly name a sibling to contrast against.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no guidance on when to use this tool versus alternatives. It doesn't mention when to prefer ghl_create_tag over ghl_create_contact or other create tools, and gives no exclusions or context for selection.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ghl_create_workflowGhl Create WorkflowA

Create an empty draft workflow and return its id. WRITES to the live account.

Triggers and actions can then be added with ghl_call (see docs/ENDPOINTS.md).

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes
location_idNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden. It explicitly discloses 'WRITES to the live account,' which is a critical behavioral trait. It also states it creates a 'draft workflow' and returns the id, clarifying the side effect and return. It does not mention permissions or reversibility, but the core write nature is transparent.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences with zero redundancy. The core purpose is front-loaded in the first sentence, and the second sentence adds essential follow-up context. Every word earns its place; it is efficient and well-structured.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool has two parameters with no schema descriptions, the description should explain what 'name' and 'location_id' represent. It does not. While the output schema is present (so return values are covered) and the write nature is disclosed, the missing parameter semantics leaves the agent unable to call the tool correctly. The mention of ghl_call is useful but insufficient.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, meaning the input schema provides no parameter descriptions. The description does not mention 'name' or 'location_id' at all, so an agent has no idea what values to pass. This is a critical gap for a tool with two parameters. The description's lack of parameter explanation fails to compensate for the schema's silence.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action: 'Create an empty draft workflow and return its id.' It specifies the verb, resource, and key distinguishing feature (empty draft). This separates it from other creation tools like ghl_create_contact or ghl_create_tag, and the mention of 'return its id' clarifies the output.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives follow-up guidance: 'Triggers and actions can then be added with ghl_call,' indicating a typical workflow sequence. However, it does not explicitly state when to use this tool versus alternatives (e.g., when to use ghl_list_workflows or ghl_get_workflow), nor does it list exclusions. The guidance is implicit rather than explicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ghl_delete_custom_fieldGhl Delete Custom FieldA

Delete a custom field. DESTRUCTIVE: data stored in the field is lost.

ParametersJSON Schema
NameRequiredDescriptionDefault
field_idYes
location_idNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure. It explicitly warns that the operation is DESTRUCTIVE and that data stored in the field is lost, which is critical for an agent to know before invoking the tool. It does not mention irreversibility or cascading effects, but the core destructive trait is clearly disclosed.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two short sentences with no filler. The destructive warning is front-loaded and every word adds value. It is appropriately sized for a simple delete operation.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool has no annotations, 0% schema description coverage, and the description only covers the destructive nature. It omits guidance on when to use the tool, what location_id is for, and any prerequisites or side effects beyond data loss. Although an output schema exists, the description alone is not sufficient for an agent to confidently select and invoke the tool in all relevant contexts.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, and the description does not explain the meaning of field_id or location_id. The term 'custom field' weakly implies field_id refers to the custom field being deleted, but location_id is left entirely unexplained. The description does not compensate for the lack of schema documentation.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('Delete') and resource ('custom field'), making the tool's purpose immediately clear. It also distinguishes itself from sibling tools like ghl_create_custom_field and ghl_list_custom_fields without needing to name them.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies the tool is used to delete a custom field, but it provides no explicit guidance on when to use it versus alternatives, no prerequisites, and no mention of related operations like create or update. An agent must infer the usage context from the tool name and siblings.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ghl_delete_workflowGhl Delete WorkflowB

Delete a workflow by UUID. DESTRUCTIVE.

ParametersJSON Schema
NameRequiredDescriptionDefault
location_idNo
workflow_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the behavioral transparency burden. 'DESTRUCTIVE' is a useful explicit warning about the irreversible nature of the operation, but it does not elaborate on side effects, permissions, or recovery options.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is only two short sentences, both of which earn their place. It front-loads the core action and immediately follows with a high-signal danger warning.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple two-parameter delete operation, the description is mostly adequate: the required workflow_id is semantically covered and the output schema exists. However, the optional location_id is left unexplained, and the behavioral warning lacks detail about consequences beyond 'DESTRUCTIVE'.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The phrase 'by UUID' adds some meaning to workflow_id, but location_id is completely unexplained. Since schema description coverage is 0%, the description should compensate by clarifying both parameters, and it only partially does so.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('Delete'), resource ('workflow'), and identifier type ('by UUID'), making the tool's purpose immediately clear. It differentiates cleanly from siblings like ghl_get_workflow and ghl_list_workflows.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is given about when to use this tool versus alternatives, when not to use it, or what conditions should precede deletion. The word 'DESTRUCTIVE' implies caution but does not provide explicit usage direction.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ghl_get_workflowGhl Get WorkflowA

Get one workflow in full: triggers, actions (nodes) and branches.

ParametersJSON Schema
NameRequiredDescriptionDefault
location_idNoGHL sub-account id (defaults to GHL_LOCATION_ID).
workflow_idYesthe workflow UUID (from ghl_list_workflows).

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the behavioral disclosure burden. 'Get one workflow in full' clearly signals a read-only retrieval and enumerates the returned content (triggers, actions/nodes, branches). It does not mention error/not-found handling or authorization, but for a simple get operation with an output schema, this is adequate.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single front-loaded sentence with no redundant wording. It states the operation, the scope, and the included components in ten words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 2-parameter read tool with an output schema and a precise one-line description, the definition is nearly complete. It would be slightly more complete if it explicitly pointed to ghl_list_workflows for obtaining workflow IDs or mentioned the alternative for bulk listing, but the schema already covers ID provenance.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, with workflow_id and location_id already well-described (including the UUID source and default location). The description itself adds no parameter-level detail, so the baseline of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('Get'), a specific resource ('one workflow'), and the scope of the result ('in full', including triggers, actions/nodes, and branches). This clearly differentiates it from sibling tools like ghl_list_workflows, ghl_create_workflow, and ghl_delete_workflow.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase 'one workflow in full' establishes that this tool is for retrieving a complete single workflow, and the parameter description ties workflow_id to ghl_list_workflows. However, it stops short of explicitly naming alternatives for list/create/delete operations or stating when not to use it, so it earns a 4 rather than 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ghl_list_custom_fieldsGhl List Custom FieldsB

List custom fields (contact and opportunity models), including their ids and fieldKeys.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
location_idNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

B3.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description must carry behavioral disclosure. It does state the operation is a read-only list and adds that it returns ids and fieldKeys, which is useful. However, it does not mention pagination, filtering effects, authentication, or any rate-limit behavior, leaving the safety profile mostly implied by the verb.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single sentence that front-loads the action and resource, includes the key scope qualifier, and contains no filler. Every word earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple list operation with two optional parameters and an output schema, the description is mostly adequate. However, it omits parameter semantics entirely and lacks usage guidance, so an agent would not know what location_id filters or that limit defaults to 200.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate for the undocumented 'limit' and 'location_id' parameters. It does not mention either parameter, their defaults, or what they control. The phrase about ids and fieldKeys describes the response, not the parameters.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('List'), a resource ('custom fields'), and narrows scope to contact and opportunity models, while noting that ids and fieldKeys are included. This clearly differentiates it from sibling create/update/delete tools without needing to open their schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is given on when to use this tool versus alternatives, nor any conditions that would favor a different tool such as ghl_create_custom_field. The verb 'list' implies retrieval, but there is no explicit context, exclusions, or alternative routing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ghl_list_formsGhl List FormsC

List the forms of a sub-account.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
location_idNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

C2.6/5.0
Behavior1/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure. It does not mention side effects, read-only nature, pagination, rate limits, or authentication requirements. The single sentence adds no behavioral context beyond 'List'.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, efficient sentence with no wasted words. However, it is so minimal that it borders on under-specification, but for what it includes, it is appropriately concise.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Although an output schema exists and covers return values, the description omits critical context about how the parameters relate to the sub-account and fails to provide any usage or behavioral framing. The tool's simplicity does not excuse the lack of guidance around location_id and filtering.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, and the description adds no meaning to the parameters. It does not explain that 'limit' controls result count or that 'location_id' likely corresponds to the sub-account. The schema provides the only parameter information, which is minimal.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a clear verb ('List'), a specific resource ('forms'), and a context ('of a sub-account'), which distinguishes it from sibling list tools for workflows, funnels, custom fields, and pipelines. An agent can immediately tell this tool is for forms.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is provided on when to use this tool versus alternatives, nor any exclusions or conditions. The description merely states what it does, leaving the agent to infer that it should be chosen when forms are needed.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ghl_list_funnelsGhl List FunnelsB

List funnels and websites of a sub-account.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
location_idNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

B3.4/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden of behavioral disclosure. It only states 'List funnels and websites' and says nothing about pagination, limit behavior, scoping semantics, side effects, or any operational caveats. For a list operation this is minimal, but it does not go beyond the obvious action.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single concise, front-loaded sentence that clearly communicates the tool's core purpose. It wastes no words, though it could be slightly more informative without losing conciseness.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no annotations, zero schema description coverage, and minimal behavioral context, the description is not sufficient for an agent to understand how to use the two parameters or anticipate behavior. The output schema exists, but the description still leaves meaningful gaps around usage and scoping.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate by explaining parameters. It does not mention limit at all, and only vaguely implies location_id through 'sub-account'. The description adds little meaning beyond the raw schema property names.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('List') with a clear resource ('funnels and websites') and a clear scope ('of a sub-account'). It distinguishes this tool from sibling list tools such as ghl_list_workflows or ghl_list_forms by naming the exact resources.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear context that this tool is for listing funnels and websites within a sub-account, which implies when to use it. It does not explicitly mention alternatives or exclusions, but the resource-based wording is enough to guide selection among the sibling tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ghl_list_number_poolsGhl List Number PoolsB

List number pools (dynamic call-tracking numbers shown on websites).

ParametersJSON Schema
NameRequiredDescriptionDefault
location_idNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

B3/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

There are no annotations, so the description carries the full burden of behavioral disclosure. It only says 'List number pools,' which implies a read operation, but it does not disclose whether location_id filters results, whether pagination applies, or any other behavioral traits. The safe/read-only nature is not explicitly stated.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single concise sentence that front-loads the action and resource, then adds a useful clarifying definition. There is no wasted text or repetition of the tool name.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool is simple, has only one optional parameter, and an output schema exists, so the description does not need to explain return values. However, it is incomplete in that it fails to explain the optional location_id parameter or provide any usage context, leaving the agent to guess whether passing a location changes the result.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, and the description does not mention location_id at all. Because coverage is low, the description needed to compensate by explaining what location_id does (e.g., filtering pools by location), but it provides no parameter-level meaning beyond the schema's bare name and type.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific action ('List') and resource ('number pools'), and clarifies what number pools are with the parenthetical 'dynamic call-tracking numbers shown on websites.' This also helps distinguish the tool from the sibling ghl_list_phone_numbers, since the definition makes clear these are pools of tracking numbers rather than ordinary phone numbers.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives no guidance about when to use this tool versus alternatives such as ghl_list_phone_numbers or other list tools. It does not mention any prerequisites, filters, or exclusions, so an agent must infer usage solely from the tool name.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ghl_list_phone_numbersGhl List Phone NumbersC

List the phone numbers provisioned in the sub-account's phone system.

ParametersJSON Schema
NameRequiredDescriptionDefault
location_idNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

C2.7/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden of behavioral disclosure. It implies a read-only listing operation but does not state whether it is safe/non-destructive, how location_id affects the request, or any prerequisites or limitations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single, front-loaded sentence with no filler. Every word contributes to identifying the action and resource, making it efficient for a simple tool.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers the basic action and output schema exists to describe return values, but the missing explanation of location_id's filtering semantics and the absence of any usage guidance leaves the tool incomplete for correct invocation, especially with no annotations to fill the gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The only parameter, location_id, has 0% schema description coverageاصدق and the description never mentions it. The agent is left to infer its meaning and default behavior solely from the parameter name, which is insufficient.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('List') and resource ('phone numbers provisioned in the sub-account's phone system'), making the tool's core function clear. It is reasonably distinct from siblings like ghl_list_number_pools, though it does not explicitly contrast with them.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no guidance on when to use this tool versus alternatives such as ghl_list_number_pools or other list tools. It states only what the tool does, with no conditions, exclusions, or context for selecting it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ghl_list_pipelinesGhl List PipelinesC

List opportunity pipelines and their stages.

ParametersJSON Schema
NameRequiredDescriptionDefault
location_idNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

C2.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are present, so the description carries the full burden. It only states that it lists pipelines and stages, implying a read operation, but does not disclose any behavioral details such as authentication requirements, rate limits, pagination, or the effect of the location_id parameter. The description adds no insight beyond the basic purpose.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, clear sentence with no redundant words. It is front-loaded with the action and resource, making it easy to scan. Every word contributes to the meaning.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given that the tool has an optional parameter and no annotations, the description is too sparse. It does not explain the purpose of location_id, any potential filtering behavior, or any constraints. While the output schema exists, the agent is left guessing about how to effectively use the tool. A more complete description would at least mention the parameter's role.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, and the description does not mention the location_id parameter at all. The agent has no indication of what this optional parameter does or when to use it. The description completely fails to compensate for the lack of schema-level documentation.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific action ('List') on a specific resource ('opportunity pipelines') and includes that it returns stages. This clearly distinguishes it from sibling tools like ghl_create_pipeline (creation) or ghl_list_workflows (different resource). The verb-resource pairing is unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is provided on when to use this tool versus alternatives. It does not mention any context, prerequisites, or exclusions. The agent must rely solely on the tool name to infer usage, which is not sufficient for differentiation from other list tools like ghl_list_forms or ghl_list_workflows.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ghl_list_workflowsGhl List WorkflowsB

List automation workflows and folders of a sub-account.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNomaximum number of items (1-500).
parent_idNofolder id to list; "root" for the top level.root
location_idNoGHL sub-account id (defaults to GHL_LOCATION_ID).

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

B3.3/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description must carry the full burden. It adds no behavioral detail beyond 'List'—it does not state that the operation is read-only, how pagination works, whether folder traversal is recursive, or what the response contains. The description largely restates the tool name.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single concise sentence with no filler. It front-loads the verb and object immediately and includes useful scoping information ('of a sub-account'). Every word earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool is simple and has a complete input schema plus an output schema, so the basics are covered. However, with no annotations and no usage or behavioral context, the description alone does not fully inform an agent about read-only safety, folder semantics, or when to choose this tool over ghl_get_workflow.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the input schema already documents limit, parent_id, and location_id clearly. The description adds no parameter-specific meaning, but per the rubric the baseline is 3 when the schema covers all parameters.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('List') and names the exact resource ('automation workflows and folders') plus scope ('of a sub-account'). This clearly differentiates the tool from siblings like ghl_get_workflow, ghl_create_workflow, and ghl_list_forms.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives no guidance about when to use this tool versus alternatives. It does not mention that ghl_get_workflow should be used for a single workflow, or that create/delete tools are for modification. Usage is only weakly implied by the word 'List'.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ghl_update_custom_fieldGhl Update Custom FieldB

Rename a custom field. WRITES to the live account.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes
field_idYes
location_idNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

B3.3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the burden of disclosing side effects. 'WRITES to the live account' explicitly signals a live mutation, which is useful. However, it does not mention permissions, reversibility, or effects on existing data, so the disclosure is only partially complete.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is highly concise: two short sentences with no filler. The primary action is front-loaded, and the live-write warning is placed prominently in the second sentence.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

While an output schema exists, the description is too sparse for correct invocation. It misses parameter semantics, usage conditions, and context around the optional location_id. The live-write warning is helpful, but an agent still lacks important operational details for safe and correct use.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description needed to compensate. 'Rename a custom field' hints that 'name' is the new name and 'field_id' identifies the target, but it does not explain these parameters explicitly, and the optional 'location_id' is completely unexplained.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific action and resource: 'Rename a custom field.' This clearly differentiates it from sibling tools like ghl_create_custom_field and ghl_delete_custom_field, which involve creating or deleting rather than updating.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives no explicit guidance on when to use this tool versus alternatives. It implies an update/rename operation, but it does not state conditions, exclusions, or mention that creating or deleting should be handled by siblings.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 21 tool updatesv0.1.0
    • First observedghl_a2p_registration_status
    • First observedghl_a2p_status
    • First observedghl_call
    • First observedghl_create_contact
    • First observedghl_create_custom_field
    • First observedghl_create_custom_value
    • First observedghl_create_form
    • First observedghl_create_pipeline
    • First observedghl_create_tag
    • First observedghl_create_workflow
    • First observedghl_delete_custom_field
    • First observedghl_delete_workflow
    • First observedghl_get_workflow
    • First observedghl_list_custom_fields
    • First observedghl_list_forms
    • First observedghl_list_funnels
    • First observedghl_list_number_pools
    • First observedghl_list_phone_numbers
    • First observedghl_list_pipelines
    • First observedghl_list_workflows
    • First observedghl_update_custom_field

TDQS

B3.4/5.0

Scored across 21 tools

Disambiguation5/5

Each tool targets a distinct resource and action—custom fields, workflows, forms, contacts, pipelines, tags, phone numbers, etc. Even the two A2P status tools are clearly separated by their scope (sub-account record vs. registration settings). The generic ghl_call is explicitly marked as a passthrough for anything else, so no ambiguity.

Naming Consistency4/5

All tools share the ghl_ prefix and follow a verb_noun pattern (create, update, delete, list, get, call). Minor inconsistencies include plural vs. singular nouns (e.g., ghl_list_number_pools vs. ghl_list_forms) and two non-verb tools (ghl_a2p_status, ghl_a2p_registration_status), but the overall convention is predictable and readable.

Tool Count4/5

With 21 tools, the count is slightly above the ideal range, but it is justified by the breadth of the GoHighLevel domain—covering CRM entities, phone systems, funnels, workflows, and more. Each tool serves a distinct purpose, so there is no redundancy; the count feels appropriate for the scope.

Completeness3/5

The tool surface has notable gaps: contacts only have create (no list/update/delete), tags only have create, custom values only have create, and forms/pipelines lack update/delete. However, the generic ghl_call passthrough provides a fallback for any missing endpoint, so agents are not dead-ended. This makes the set partially complete.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • F
    license
    Not graded
    quality
    Not graded
    maintenance
    Enables AI agents to programmatically manage GoHighLevel accounts through a Cloudflare Workers-based server. It currently supports CRUD operations for custom fields, custom values, and object folders with plans to include contact and pipeline management.
    33 npm
    -
  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables AI agents to manage GoHighLevel workspaces through natural language, with 508 tools across 18 domains for complete CRM, marketing, and workflow automation.
    Apache 2.0
  • F
    license
    C
    quality
    C
    maintenance
    Enables AI agents to interact with GoHighLevel's internal v2 API, managing Agent Studio, Voice AI, and Knowledge Base features through natural language commands.
    47
    1
    -