ghl-mcp-server
This server is an MCP interface to GoHighLevel's entire public API, letting AI clients read (and optionally modify) CRM data through generated tools.
Search and manage contacts: advanced contact search, duplicate lookup, contact details, tasks, notes, and appointments.
Work with conversations: search conversations, fetch messages, email details, message recordings/transcriptions, and export messages by location.
Manage opportunities: search opportunities, advanced search, pipelines, lost reasons, and opportunity details.
Handle calendars: get calendars/groups, free slots, blocked slots, appointments, calendar events, resources, notifications, and availability schedules.
Access location data: search sub-accounts, get location details, tags, custom fields/values, templates, and timezones.
Use meta-tools to discover, describe, and call any of the 576 endpoints on demand, including modules not loaded as dedicated tools.
Safe by default: writes and deletes are hidden unless explicitly enabled, while read-only tools are available out of the box.
Run locally via stdio or as a remote authenticated HTTP MCP server.
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-mcp-serverList contacts created this week in my GoHighLevel account"
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-mcp-server
A GoHighLevel MCP server with every endpoint in HighLevel's public OpenAPI specs —
576 as of the committed catalog — generated straight from those specs. The official
HighLevel MCP exposes ~36 tools; this one covers the whole public surface and stays
current with one command. npm run generate prints the live total.
Generated, not hand-written.
npm run generateturnsspecs/*.jsoninto tool definitions. When HighLevel updates their docs, re-fetch and regenerate.Context-friendly. Load only the modules you need (
GHL_MODULES), and use three meta-tools (ghl_search_endpoints,ghl_describe_endpoint,ghl_call_endpoint) to reach everything else on demand. The default set is 52 tools, about 11k tokens of tool list;GHL_MODULES=allwith writes and deletes on is ~213k tokens and will not fit in any model's context on its own.Safe by default. Writes and deletes are off until you enable them. Disabled tools are hidden from the client entirely, not just blocked. Note what this does not mean: read tools in the default set can export every contact, conversation body, and call transcription in the sub-account. "Safe" here means no mutation, not small blast radius.
Public API only. Private Integration Token auth, no undocumented endpoints, no browser-session tokens.
Setup
npm install # also builds, via the prepare script
cp .env.example .env # then fill in GHL_API_KEY and GHL_LOCATION_ID
npm test # optional: 42 tests, no credentials neededspecs/ and generated/ are committed, so a fresh clone is ready to run. npm run specs:fetch and npm run generate are for refreshing against HighLevel's docs — see
Updating. Running them on a fresh clone
replaces the specs you just checked out with whatever is on HighLevel's main today.
Get a Private Integration Token in GHL: sub-account → Settings → Private Integrations →
Create. Enable the scopes for the endpoints you plan to use (e.g. contacts.readonly,
contacts.write). Every tool description lists the scopes it needs.
Related MCP server: GoHighLevel MCP Server
Configuration
Variable | Default | Purpose |
| required | Private Integration Token |
| — | Default sub-account; injected into any endpoint that takes |
|
| Comma-separated modules to expose as dedicated tools, or |
|
| Expose POST/PUT/PATCH tools |
|
| Expose DELETE tools |
|
| Expose the three discovery/call meta-tools covering all endpoints |
|
| List the 19 endpoints HighLevel marks deprecated as dedicated tools |
|
| API host override. Rejected unless it is https and stays on |
| required for HTTP | Bearer token clients must send to the HTTP transport |
|
| HTTP transport port |
|
| HTTP bind address. Anything but loopback exposes the server to the network |
| — | Extra |
| — | Lifts GitHub's rate limit for |
GHL_MODULES is not a security boundary. With GHL_META_TOOLS=true (the default),
ghl_call_endpoint can run any of the 576 endpoints in every module regardless of what
is loaded. Only GHL_ALLOW_WRITES and GHL_ALLOW_DELETES constrain what can be done.
Set GHL_META_TOOLS=false if you want module selection to be the limit.
Module names match the spec files: ad-manager, affiliate-manager, agent-studio,
associations, blogs, brand-boards, businesses, calendars, campaigns,
companies, contacts, conversation-ai, conversations, courses, custom-fields,
custom-menus, email-isv, emails, forms, funnels, invoices, knowledge-base,
links, locations, marketplace, medias, oauth, objects, opportunities,
payments, phone-system, products, proposals, saas-api, snapshots,
social-media-posting, store, surveys, users, voice-ai, workflows.
A few modules (companies, saas-api, snapshots, parts of locations and users)
are agency-level and need an agency token; tool descriptions say Token: agency.
Use with Claude Code (stdio)
Add to .mcp.json in your project (or ~/.claude.json for global):
{
"mcpServers": {
"ghl": {
"command": "node",
"args": ["--env-file=/absolute/path/to/GHL-MCP/.env", "/absolute/path/to/GHL-MCP/dist/src/stdio.js"]
}
}
}--env-file is built into Node, so no dotenv dependency. You can also put the variables
in the "env" block of the config instead.
Use as a remote connector (Streamable HTTP)
MCP_AUTH_TOKEN=$(openssl rand -hex 32) npm run start:http
# -> http://127.0.0.1:3000/mcp (clients send: Authorization: Bearer <MCP_AUTH_TOKEN>)The HTTP transport is stateless, refuses to start without MCP_AUTH_TOKEN, and binds
loopback only. It serves POST /mcp (authenticated) and an unauthenticated GET /health
that returns {"ok":true}.
To reach it from elsewhere, terminate TLS in front of it and set MCP_BIND_HOST plus
MCP_ALLOWED_HOSTS=your.host:443. Without TLS the bearer token and every CRM record
cross the wire in cleartext, and that token fronts a full-access Private Integration
Token. Host headers outside the allowlist are rejected, which is what stops a hostile
page from rebinding its own domain to your loopback address.
How the tools look
Each endpoint becomes {module}_{operationId}, for example contacts_upsert_contact,
invoices_send_invoice, calendars_get_free_slots. Arguments are flat: path params,
query params, and body fields all sit at the top level, and the server routes them to the
right place. If a body isn't an object (e.g. an array), it's passed as a single body arg.
A field the spec marks as binary (file uploads) takes { "base64": "...", "filename": "rows.csv", "contentType": "text/csv" } and is sent as a real multipart file part.
Meta-tools:
ghl_search_endpoints({ query, module?, method?, limit? })— keyword search over all 576ghl_describe_endpoint({ name })— full input schema, scopes, HTTP method/pathghl_call_endpoint({ name, arguments })— run any endpoint. Same write/delete gates, and arguments are validated against that endpoint's schema before anything is sent
Development
npm run dev # run the stdio server from source (Node type-stripping)
npm run typecheck
npm test # unit tests + in-memory end-to-end MCP testsnpm run dev runs the sources through Node's strip-only type stripping, which cannot
erase enums, namespaces, or constructor parameter properties. erasableSyntaxOnly in
tsconfig.json makes tsc reject that syntax, so the build fails instead of dev.
Layout:
scripts/fetch-specs.ts download specs from GoHighLevel/highlevel-api-docs
src/generator/ OpenAPI -> endpoint definitions (pure, unit-tested)
generated/ committed catalog, one JSON per module
src/client.ts fetch wrapper: auth, Version header, errors, 429 retry
src/tools.ts tool registration, arg routing, gating, result formatting
src/meta-tools.ts search / describe / call
src/server.ts McpServer factory
src/stdio.ts, src/http.ts transportsUpdating when HighLevel changes the API
npm run specs:fetch && npm run generate && npm testThe generator refuses to write anything and exits non-zero if a spec produces a schema
Zod can't express, a tool name collides or exceeds 64 characters, or a {placeholder} in
a URL has no argument to fill it. generated/ is left untouched on failure, so a bad
upstream change can neither ship silently nor half-replace the committed catalog.
That last check is not hypothetical: HighLevel's specs declare a path parameter on one
method of a path and omit it on the others (GET /users/{userId} declares userId,
PUT and DELETE do not). The generator reads placeholders from the URL template rather
than trusting the parameter list, and the guard is there so a future gap fails the build.
Available Tools
55 toolscalendars_fetch_calendar_resourcesList Calendar ResourcesARead-onlyIdempotent
List Calendar Resources List calendar resources by resource type and location ID [GET /calendars/resources/{resourceType}] Token: location. Scopes: calendars/resources.readonly.
| Name | Required | Description | Default |
|---|---|---|---|
| skip | Yes | ||
| limit | Yes | ||
| locationId | Yes | ||
| resourceType | Yes | Calendar Resource Type |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnly, idempotent, and non-destructive behavior. The description adds useful context beyond those annotations by specifying the endpoint, the required auth token scope ('Token: location'), and the OAuth scope ('calendars/resources.readonly'), which helps an agent understand authorization requirements. It does not contradict the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loads the core behavior, endpoint, and auth context in a few short lines. Minor redundancy exists in the opening ('List Calendar Resources List calendar resources...'), but the extra tokens about scopes and endpoint are worthwhile, so overall it is appropriately sized.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a listing endpoint with four required parameters and no output schema, the description covers the purpose and auth but omits important contextual details: the meaning of limit/skip, response shape, possible defaults, and how this relates to the singular resource sibling. It is adequate but has clear gaps an agent must resolve elsewhere.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 25%, so the description must compensate. It does name resourceType and locationId as the listing criteria, but it gives no guidance on limit and skip, which are required but only described as generic numbers. Pagination semantics and default behavior are left entirely to inference.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('List'), the resource ('calendar resources'), and the filtering dimensions ('by resource type and location ID'). It also includes the exact endpoint and is distinguishable from the sibling tool calendars_get_calendar_resource, which returns a single resource rather than listing resources.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage context: call this when listing calendar resources filtered by resourceType and locationId. However, it provides no explicit guidance about when not to use it or which sibling tool should be chosen instead, such as the singular calendars_get_calendar_resource for retrieving one resource.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
calendars_find_event_notificationGet notificationCRead-onlyIdempotent
Get notification Find Event notification by notificationId [GET /calendars/{calendarId}/notifications/{notificationId}] Scopes: calendars/events.readonly.
| Name | Required | Description | Default |
|---|---|---|---|
| calendarId | Yes | ||
| notificationId | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already cover read-only, idempotent, and non-destructive behavior. The description adds the required OAuth scope 'calendars/events.readonly' and the REST path, which is useful context beyond annotations. It does not disclose return format, error behavior, or any side effects, but those are less critical given the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short but awkwardly constructed: 'Get notification Find Event notification by notificationId' reads like a concatenation of the title and a separate purpose phrase. It front-loads the main intent but wastes a few words on redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
This is a simple two-parameter read operation, and the description provides the endpoint and scope, which is reasonably complete for a low-complexity tool. However, it lacks context about what an event notification is, how to discover one, or what the response contains, and the absence of an output schema makes those gaps more noticeable.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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. It mentionse notificationId in text and exposes both calendarId and notificationId as path placeholders in the endpoint, giving some clue. However, it does not explain what calendarId represents or what formats/constraints the values must satisfy, leaving an agent partially guessing.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Find'), a resource ('Event notification'), and an identifier ('notificationId'), so the action is clear. The endpoint template reinforces the exact resource being accessed. It does not explicitly differentiate from the similarly named sibling 'calendars_get_event_notification', but the behavior itself is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this tool versus alternatives, and no mention of exclusions or prerequisites. The description merely states what the tool does, leaving the agent to infer usage context from the endpoint and name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
calendars_getallschedulesList user availability scheduleARead-onlyIdempotent
List user availability schedule Retrieve user availability schedules based on various filters including location, calendar, and user. Supports pagination. [GET /calendars/schedules/search] Scopes: calendars.readonly.
| Name | Required | Description | Default |
|---|---|---|---|
| skip | No | (default: 0) | |
| limit | No | (default: 50) | |
| userId | Yes | User ID to filter schedules by specific user | |
| calendarId | No | Calendar ID for filtering schedules by specific calendar | |
| locationId | Yes | Location ID to filter schedules by |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide readOnlyHint=true, openWorldHint=true, idempotentHint=true, and destructiveHint=false. The description adds the HTTP GET endpoint, calendars.readonly scope, and pagination support, which enriches the behavioral context beyond the annotations. No contradiction exists.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short but redundant: it opens with 'List user availability schedule' and then restates 'Retrieve user availability schedules' in the next sentence. The endpoint and scope information is useful, but the repetition could be trimmed without losing meaning.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only list operation, the description covers the essential aspects: endpoint, scopes, filters, and pagination. Required parameters and default limits are visible in the schema, and the absence of an output schema is acceptable since the return type is implied to be a list of schedules. The description is sufficient for an agent to call this tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the description's mention of filters by location, calendar, and user mirrors the schema descriptions without adding new meaning. The baseline of 3 applies because the schema already handles parameter documentation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific verb ('List'/'Retrieve') and resource ('user availability schedules') and enumerates filters by location, calendar, and user. It does not explicitly contrast with the similar sibling calendars_getschedulebyid, but the plural 'schedules' and 'search' endpoint make the list-oriented purpose clear.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage through the filter list and pagination support, but it does not explicitly state when to choose this tool over alternatives or mention any exclusions. An agent can infer this is the search/list availability tool, but there is no direct guidance on sibling selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
calendars_get_appointmentGet AppointmentBRead-onlyIdempotent
Get Appointment Get appointment by ID [GET /calendars/events/appointments/{eventId}] Scopes: calendars/events.readonly.
| Name | Required | Description | Default |
|---|---|---|---|
| eventId | Yes | Event Id or Instance id. For recurring appointments send masterEventId to modify original series. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the read-only, idempotent, non-destructive nature. The description adds the required OAuth scope and the exact endpoint, which is useful, but it does not disclose return format, error behavior, or any other notable traits. With annotations present, the bar is lower and a 3 is appropriate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short but starts with a redundant repetition of the title ('Get Appointment Get appointment by ID'). It is not poorly structured, but the redundant opening could be trimmed. Overall it is concise but not optimally front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple lookup by ID, the description plus annotations and complete schema are nearly sufficient. However, there is no output schema and no hint of what fields are returned, and the schema's note about 'modify original series' is a confusing distraction in a read-only tool. The description could have clarified the response shape or explicitly routed to calendar event listing tools.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% for the only parameter, so the description does not need to compensate. The description itself adds no parameter semantics beyond the endpoint path, but the baseline of 3 is correct when the schema fully documents the parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description specifies a clear verb and resource: 'Get appointment by ID' with the explicit endpoint path. It distinguishes itself from the many list/search calendar tools by focusing on a single appointment ID, though it does not explicitly name sibling alternatives.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied: use this tool when you have an event/appointment ID and need that single appointment. However, there is no explicit guidance on when not to use it or which sibling to choose instead (e.g., calendars_get_calendar_events for listing).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
calendars_get_appointment_notesGet NotesBRead-onlyIdempotent
Get Notes Get Appointment Notes [GET /calendars/appointments/{appointmentId}/notes] Scopes: calendars/events.readonly.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | Yes | Limit of notes to fetch | |
| offset | Yes | Offset of notes to fetch | |
| appointmentId | Yes | Appointment ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds the required OAuth scope 'calendars/events.readonly' and the endpoint, which is useful auth context, but it does not disclose pagination behavior, ordering, or what happens when no notes exist.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short, but it redundantly repeats 'Get Notes Get Appointment Notes', where the first phrase adds nothing. The endpoint path and scope are useful and front-loaded, yet the duplication makes it less polished than necessary.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only fetch with well-documented parameters and safety annotations, the description is mostly adequate. However, it lacks usage guidance, return-shape expectations (no output schema exists), and any mention of pagination semantics beyond the schema's limit/offset definitions.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with limit, offset, and appointmentId each having meaningful descriptions. The tool description adds no parameter details beyond the schema, 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.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states the exact resource ('Appointment Notes') and operation ('Get') via both the title and the endpoint path '[GET /calendars/appointments/{appointmentId}/notes]'. This clearly distinguishes it from sibling tools like contacts_get_note and contacts_get_all_notes by making the appointment context explicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
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 alternatives such as calendars_get_appointment or contacts_get_all_notes. The description does not mention exclusions, prerequisites, or conditions that would route an agent to a sibling.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
calendars_get_blocked_slotsGet Blocked SlotsBRead-onlyIdempotent
Get Blocked Slots [GET /calendars/blocked-slots] Scopes: calendars/events.readonly.
| Name | Required | Description | Default |
|---|---|---|---|
| userId | No | User Id - Owner of an appointment. Either of userId, groupId or calendarId is required | |
| endTime | Yes | End Time (in millis) | |
| groupId | No | Either of groupId, calendarId or userId is required | |
| startTime | Yes | Start Time (in millis) | |
| calendarId | No | Either of calendarId, userId or groupId is required | |
| locationId | Yes | Location Id |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare readOnlyHint=true and idempotentHint=true, so the safety profile is covered. The description adds the HTTP method (GET) and the auth scope (calendars/events.readonly), which is useful, but it does not explain what a blocked slot is or what behavior the response will have. No contradiction with annotations exists.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single compact sentence with no wasted words, placing the operation and endpoint first followed by the scope. It is appropriately front-loaded, though it is so minimal that it sacrifices explanatory value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given there is no output schema and the tool has six parameters with alternative identity fields, the description is too thin. It does not explain the semantics of blocked slots, clarify the userId/groupId/calendarId relationship, or describe the expected response, leaving important gaps for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the parameters are already documented. The tool description adds no additional parameter semantics, and the schema contains a mild tension between the required fields and the 'either userId, groupId or calendarId' notes, which the description does not resolve.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the operation ('Get Blocked Slots') and the specific resource via the endpoint '/calendars/blocked-slots'. It is distinguishable from siblings like calendars_get_slots by the 'blocked-slots' resource, though it does not explicitly contrast itself with that sibling.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives no guidance on when to use this tool versus alternatives such as calendars_get_slots or calendars_get_calendar_events. It only provides the endpoint and required OAuth scope, leaving the agent to infer usage from the name alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
calendars_get_calendarGet CalendarARead-onlyIdempotent
Get Calendar Get calendar by ID [GET /calendars/{calendarId}] Scopes: calendars.readonly.
| Name | Required | Description | Default |
|---|---|---|---|
| calendarId | Yes | Calendar Id |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description provides the HTTP method, endpoint pattern, and required OAuth scope 'calendars.readonly', which adds useful context beyond the readOnlyHint annotation. It does not describe error behavior or return format, but the annotations already establish the safe, read-only, idempotent nature of the operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short and front-loads the core behavior ('Get calendar by ID') before adding the endpoint and scope. The opening 'Get Calendar' is slightly redundant with the title, but the overall structure is efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple, single-required-parameter read-only getter, the description is largely complete: it names the resource, the lookup key, the endpoint, and the auth scope. It could be stronger by explicitly routing users away from this tool when they need to list calendars or retrieve calendar events.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 100% description coverage for the only parameter, calendarId, so the description does not need to add much. It simply reinforces that the calendar is fetched by ID but provides no additional format, validation, or usage nuance beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a clear action and target: 'Get calendar by ID'. It includes the HTTP GET endpoint and specifies that this tool fetches a single calendar, which distinguishes it from list-oriented siblings like calendars_get_calendars.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the tool should be used when a calendarId is available, but it does not explicitly state when to use this tool versus alternatives. It also does not mention that listing calendars without an ID should use calendars_get_calendars.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
calendars_get_calendar_eventsGet Calendar EventsCRead-onlyIdempotent
Get Calendar Events [GET /calendars/events] Scopes: calendars/events.readonly.
| Name | Required | Description | Default |
|---|---|---|---|
| userId | No | User Id - Owner of an appointment. Either of userId, groupId or calendarId is required | |
| endTime | Yes | End Time (in millis) | |
| groupId | No | Either of groupId, calendarId or userId is required | |
| startTime | Yes | Start Time (in millis) | |
| calendarId | No | Either of calendarId, userId or groupId is required | |
| locationId | Yes | Location Id |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, openWorld, idempotent, and non-destructive. The description adds the HTTP method and the calendars/events.readonly scope, which is useful auth context beyond the annotations, but it does not reveal any further behavioral traits such as result shape, pagination, or timeboundary handling.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The definition is compact and front-loads the endpoint, but the phrase 'Get Calendar Events' merely restates the tool name and title. It is concise yet nearly redundant, providing little unique structured information beyond the endpoint and scope metadata.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 6 parameters, no output schema, and a large sibling set, this description is too thin. It omits the mutual-exclusivity requirement among userId, groupId, and calendarId that the schema 'required' array does not capture in its required list, and it says nothing about the expected return value or failure conditions.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Input schema description coverage is 100%, and the schema already explains units ('in millis') and the either/or constraint among userId, groupId, and calendarId. The description adds no parameter-specific meaning, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb and resource ('Get Calendar Events') and adds the exact endpoint (GET /calendars/events) and auth scope. This distinguishes it from siblings like calendars_get_calendar or calendars_get_appointment, though it does not explicitly say it returns a list or how those events are scoped.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this tool versus the many sibling calendar/conversation/opportunity tools. It does not describe filtering by locationId/time range or the required 'one of userId, groupId, calendarId' rule, so an agent cannot reliably decide between this and calendars_get_slots or calendars_get_appointment.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
calendars_get_calendar_resourceGet Calendar ResourceARead-onlyIdempotent
Get Calendar Resource Get calendar resource by ID [GET /calendars/resources/{resourceType}/{id}] Token: location. Scopes: calendars/resources.readonly.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Calendar Resource ID | |
| resourceType | Yes | Calendar Resource Type |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only, idempotent, and non-destructive behavior, so the description does not need to re-state safety. It adds valuable invocation context beyond those annotations: HTTP GET, the path structure, token location, and required OAuth scope.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loads the actionable detail in one sentence, then provides auth requirements. The opening phrase 'Get Calendar Resource' is a redundant restatement of the title, which prevents a 5.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-parameter read-only getter, this is complete: the schema documents all inputs, the endpoint defines the resource, and token and scopes cover authorization. An output schema is not necessary to make the call correctly, and annotations already cover safety behavior.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, and both parameters have descriptions, with resourceType further constrained by an enum. The description's endpoint template reinforces the parameter roles but adds no semantic detail beyond what the schema already provides, so baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific operation, 'Get calendar resource by ID', and gives the exact endpoint [GET /calendars/resources/{resourceType}/{id}]. This clearly separates it from nearby getters like calendars_get_calendar_events or calendars_get_appointment.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description makes it obvious this tool is for retrieving a single calendar resource by resourceType and id, and the endpoint, token, and scopes define the call context. It does not explicitly name sibling alternatives or say when not to use it, so it falls short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
calendars_get_calendarsGet CalendarsARead-onlyIdempotent
Get Calendars Get all calendars in a location. [GET /calendars/] Scopes: calendars.readonly.
| Name | Required | Description | Default |
|---|---|---|---|
| groupId | No | Group Id | |
| locationId | Yes | Location Id | |
| showDrafted | No | (default: true) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish read-only, idempotent, non-destructive behavior. The description adds 'Scopes: calendars.readonly' and the GET endpoint, which provides some authentication context. Still, it does not disclose response shape or pagination behavior, though these are less critical given the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short and efficient, containing the operation, endpoint, and scope. The only minor flaw is the redundant repetition of the tool title 'Get Calendars' at the start, which wastes a few words without adding information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple list operation with strong annotations and a fully documented schema, the description is minimally adequate. It does not explain how to choose between related calendar endpoints or describe the return format, but the core purpose and parameters are clear enough.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all parameters are documented in the schema. The description adds no meaning beyond 'location', but because the schema carries the full parameter burden, a baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action and resource: 'Get all calendars in a location.' This clearly distinguishes it from siblings like calendars_get_calendar (singular) and calendars_get_calendar_events. Including the endpoint and scopes reinforces the exact operation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The context is understandable: use this to list all calendars for a location. However, it does not explicitly say when to prefer this over related calendar endpoints such as calendars_get_calendar or calendars_get_groups, and no alternatives or exclusions are mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
calendars_get_event_notificationGet notificationsCRead-onlyIdempotent
Get notifications Get calendar notifications based on query [GET /calendars/{calendarId}/notifications] Scopes: calendars/events.readonly.
| Name | Required | Description | Default |
|---|---|---|---|
| skip | No | (default: 0) | |
| limit | No | (default: 100) | |
| deleted | No | ||
| isActive | No | ||
| calendarId | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already convey readOnly, idempotent, openWorld, and non-destructive behavior. The description adds the HTTP endpoint and the required read-only scope 'calendars/events.readonly', which is useful context. It does not describe pagination, filtering behavior, or the shape of returned notifications, but the annotation coverage lowers the burden.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short and front-loads the essential endpoint and scope information. The repetition of 'Get notifications' from the title is minor and does not significantly hurt clarity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with five parameters, no output schema, and a close sibling, this description is incomplete. An agent would still not know when to select this over calendars_find_event_notification, how to form a meaningful query, or what the response contains. Annotations cover safety but not usage context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 40%, with skip and limit documented but deleted, isActive, and calendarId left to the schema. The description adds that this is a query against /calendars/{calendarId}/notifications, implying calendarId is a path parameter and the rest are query parameters, but it does not explain what deleted or isActive mean or how pagination works.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a clear verb and resource: 'Get calendar notifications based on query' with a specific endpoint. It identifies the operation as a read on calendar notifications, though it does not explicitly differentiate itself from the similarly named sibling calendars_find_event_notification.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
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 alternatives such as calendars_find_event_notification or calendars_get_calendar_events. The phrase 'based on query' implies filtering but gives no concrete selection criteria or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
calendars_get_groupsGet GroupsARead-onlyIdempotent
Get Groups Get all calendar groups in a location. [GET /calendars/groups] Scopes: calendars/groups.readonly.
| Name | Required | Description | Default |
|---|---|---|---|
| locationId | Yes | Location Id |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate read-only, idempotent, non-destructive behavior, but the description adds a specific auth requirement ('Scopes: calendars/groups.readonly'), which is useful beyond the annotations. It also clarifies the operation is scoped to a location and returns all groups, adding behavioral context without contradicting the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short, but it begins with the redundant phrase 'Get Groups' which merely repeats the tool name and title. The substantive information is front-loaded afterward, and the endpoint/scopes line is useful but could be more tightly integrated without the initial redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only list operation with one required parameter and rich annotations, the description covers the necessary invocation context: resource type, location scope, endpoint, and required auth scope. It does not describe the response shape or pagination, but the low complexity and open-world annotation lessen that gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the single required parameter locationId is already documented. The description reinforces that the operation is location-scoped but does not add new semantic detail such as accepted formats or additional constraints, so the baseline score applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific action and resource: 'Get all calendar groups in a location.' This is more specific than the tool title and distinguishes this endpoint from siblings like calendars_get_calendars or calendars_get_calendar, which operate on calendars rather than calendar groups.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies its use case: retrieve calendar groups for a given location. However, it provides no explicit guidance about when to prefer this tool over sibling tools, nor does it mention exclusions or related endpoints. The context is clear but alternatives are not addressed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
calendars_getschedulebyidGet user availability scheduleARead-onlyIdempotent
Get user availability schedule Retrieve a specific schedule by its unique identifier. Returns detailed information including rules, timezone, and associated calendars/users. [GET /calendars/schedules/{id}] Scopes: calendars.readonly.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Unique identifier of the schedule |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish read-only, idempotent, non-destructive behavior, so the description's additional disclosure burden is modest. It adds useful context by specifying the endpoint, required scope ('calendars.readonly'), and the type of data returned, but it does not describe edge cases, error behavior, or response format.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core description is short and front-loaded with the retrieval purpose. However, the opening phrase 'Get user availability schedule' duplicates the tool title before the real sentence begins, which is minor redundancy that prevents a perfect score.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple, one-parameter get-by-id tool, the description is complete: it names the resource, the identifier parameter, the endpoint, the required scope, and the kind of information returned. The rich annotations also cover safety and idempotency, so nothing critical is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema covers 100% of the single parameter and describes it as the unique identifier of the schedule. The description echoes this without adding new semantics such as format, examples, or constraints, so it remains at baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Retrieve') and clearly identifies the resource ('a specific schedule by its unique identifier'). It also lists the return contents (rules, timezone, associated calendars/users), which makes the tool's purpose unambiguous and distinguishable from sibling list-style tools like calendars_getallschedules.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description makes the intended use clear: call this when you have a schedule's unique identifier and need its detailed data. It does not explicitly name alternatives or exclusions, but the id-based retrieval pattern is self-evident given the endpoint and sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
calendars_get_slotsGet Free SlotsBRead-onlyIdempotent
Get Free Slots Get free slots for a calendar between a date range. Optionally a consumer can also request free slots in a particular timezone and also for a particular user. [GET /calendars/{calendarId}/free-slots] Scopes: calendars.readonly.
| Name | Required | Description | Default |
|---|---|---|---|
| userId | No | The user for whom the free slots are returned | |
| endDate | Yes | End Date (**⚠️ Important:** Date range cannot be more than 31 days) | |
| userIds | No | The users for whom the free slots are returned | |
| timezone | No | The timezone in which the free slots are returned | |
| startDate | Yes | Start Date (**⚠️ Important:** Date range cannot be more than 31 days) | |
| calendarId | Yes | Calendar Id |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint and non-destructive annotations, the description adds useful context: the HTTP method, the exact endpoint, and the required OAuth scope 'calendars.readonly'. This helps an agent understand auth expectations and that the operation is a safe read.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short and mostly to the point, but it opens with the redundant phrase 'Get Free Slots' immediately followed by 'Get free slots...'. The optional-filter sentence is also wordier than necessary, though the endpoint and scope are useful additions.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With full schema documentation for all parameters, read-only annotations, and the endpoint and scopes included in the description, an agent has enough information to select and invoke the tool successfully. The lack of an output schema is mitigated by the simple nature of the operation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all parameters are already documented. The description adds little beyond restating that timezone and user filters are optional, and it does not clarify the relationship between userId and userIds.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool gets free slots for a calendar within a date range, which is a specific verb and resource. It includes the REST endpoint and optional filters, making the purpose apparent, though it does not explicitly differentiate from sibling tools like calendars_get_blocked_slots.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
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 such as calendars_get_blocked_slots or calendars_get_calendar_events. The description mentions optional timezone and user filters, but that is parameter information, not usage direction.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
calendars_validate_groups_slugValidate group slugARead-only
Validate group slug Validate if group slug is available or not. [POST /calendars/groups/validate-slug] Scopes: calendars/groups.write.
| Name | Required | Description | Default |
|---|---|---|---|
| slug | Yes | Slug | |
| locationId | Yes | Location Id |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Read-only behavior is already covered by annotations (readOnlyHint=true). The description adds useful context by specifying the POST endpoint and required calendars/groups.write scope, which are not available in annotations or schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short and includes helpful endpoint/scope details, but it opens with 'Validate group slug', which repeats the title and the next sentence. The redundant phrase could be removed without losing meaning.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-parameter validation tool, the description supplies endpoint, method, scopes, and the outcome it reports. It does not specify the exact response shape, but 'available or not' conveys the intended result, and no output schema is present.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents both parameters. The description adds little beyond the slug's role in availability, and locationId remains minimally explained, but no compensation is required at this coverage level.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names the exact resource (group slug) and the specific action: checking availability. It is clearly distinct from siblings like calendars_get_groups, which list groups rather than validating a slug.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The purpose implies the tool is for availability checks, so an agent can infer when to use it, but there is no explicit guidance on prerequisites, timing (e.g., before creating a group), or when not to use it versus related calendar tools. No alternatives are named.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
contacts_get_all_notesGet All NotesBRead-onlyIdempotent
Get All Notes [GET /contacts/{contactId}/notes] Scopes: contacts.readonly.
| Name | Required | Description | Default |
|---|---|---|---|
| contactId | Yes | Contact Id |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnly, idempotent, and non-destructive behavior. The description adds the HTTP method, path, and auth scope ('contacts.readonly'), which is useful, but it does not disclose pagination, ordering, or return shape.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single compact line that front-loads the operation and endpoint, then gives the required scope. There is no filler or redundant wording.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter read-only endpoint with rich annotations, the description is largely sufficient: an agent knows what to call and with what permission. It could be more complete by naming the singular alternative or stating return behavior, but the core calling context is present.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema covers 100% of the single parameter with a 'Contact Id' description, so no extra parameter detail is required. The description adds no additional semantic value beyond what the schema already provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states the operation ('Get All Notes') and the exact endpoint, making clear this retrieves all notes for a contact. It is distinguishable from contacts_get_note by the plural 'All Notes,' though it does not explicitly name that sibling.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is given about when to choose this tool over contacts_get_note or other note-related endpoints. The usage must be inferred from the tool name and endpoint path.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
contacts_get_all_tasksGet all TasksARead-onlyIdempotent
Get all Tasks [GET /contacts/{contactId}/tasks] Scopes: contacts.readonly.
| Name | Required | Description | Default |
|---|---|---|---|
| contactId | Yes | Contact Id |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only, non-destructive, idempotent behavior. The description adds the concrete HTTP method and required scope 'contacts.readonly', which is useful auth context beyond annotations. Pagination and response details are not mentioned, but the annotation coverage lowers that burden.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One compact line containing the operation, endpoint, and scope with no filler. The key information is front-loaded and every element earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
This is a simple one-parameter read operation with rich annotations and an explicit endpoint/scope, so it can be invoked correctly without additional details. It omits return-shape or pagination details, but for a straightforward list operation these are less critical.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The single parameter contactId is fully documented in the schema with 100% coverage, so the description need not repeat it. The path template clarifies that contactId is a path parameter, but this adds only marginal value over the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Get'), resource ('all Tasks'), and the REST endpoint scoped to a contact. The plural 'all Tasks' differentiates it from the singular sibling contacts_get_task.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the name and endpoint: retrieve every task for a contact. However, there is no explicit when-to-use or when-not-to-use guidance, nor any reference to alternatives like contacts_get_task.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
contacts_get_appointments_for_contactGet Appointments for ContactARead-onlyIdempotent
Get Appointments for Contact [GET /contacts/{contactId}/appointments] Scopes: contacts.readonly.
| Name | Required | Description | Default |
|---|---|---|---|
| contactId | Yes | Contact Id |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and non-destructive behavior; the description adds the concrete OAuth scope 'contacts.readonly' and the HTTP verb, which are useful for invocation. It does not describe pagination or return shape, but the annotation coverage lowers the burden on the description.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single compact line containing the operation, resource path, and required scopes. Every element earns its place, and the core purpose is front-loaded with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple GET operation with one required parameter and strong annotations, the description plus schema is sufficient to construct a correct call. There is no output schema and no detailed return-value description, but the plural 'Appointments' conveys the general result and the other gaps are minor.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so contactId is already documented as 'Contact Id'. The description adds no additional meaning about the parameter's format, source, or constraints, so it does not improve on the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description explicitly states 'Get Appointments for Contact' and gives the exact REST path, making the operation unambiguous. It clearly distinguishes itself from sibling calendar/appointment tools by tying the operation to a contactId resource.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The path and title imply the tool is for retrieving a contact's appointments, but the description gives no explicit when-to-use guidance or alternatives. With many sibling tools available, an agent must infer selection from the name and endpoint rather than from stated criteria.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
contacts_get_contactGet ContactBRead-onlyIdempotent
Get Contact [GET /contacts/{contactId}] Scopes: contacts.readonly.
| Name | Required | Description | Default |
|---|---|---|---|
| contactId | Yes | Contact Id |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, so the safety profile is covered. The description adds the HTTP method and the required OAuth scope contacts.readonly, which is useful authorization context beyond the annotations. It does not describe error behavior or return format, but for a simple read-only GET this is a reasonable level of disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely short and front-loads the endpoint and scope, which are the most actionable details. The phrase 'Get Contact' redundantly repeats the title, but this is minor and does not meaningfully hurt the definition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter read-only GET with full schema coverage and strong safety annotations, the endpoint and scope are sufficient for an agent to invoke the tool correctly. It does not explain response contents, but no output schema exists and the operation is simple enough that this is an acceptable gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The only parameter, contactId, is already 100% documented in the schema as 'Contact Id'. The description adds no additional semantics about path vs query usage, format expectations, or edge cases, so the schema carries the full burden and the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a concrete resource ('contact by ID'), the HTTP verb GET, and the exact endpoint path, which is more specific than the title alone. However, it does not explicitly differentiate this tool from sibling tools like contacts_get_duplicate_contact or contacts_get_contacts, leaving some ambiguity about the exact use case.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
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 searching for contacts or retrieving related contact data. It only notes the required scope, with no when-to-use, prerequisites, or alternative recommendations.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
contacts_get_contactsGet ContactsARead-onlyIdempotent
Get Contacts Note: This API endpoint is deprecated. Please use the Search Contacts endpoint instead. [GET /contacts/] Scopes: contacts.readonly. DEPRECATED.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | (default: 20) | |
| query | No | Contact Query | |
| locationId | Yes | Location Id | |
| startAfter | No | Start Afte | |
| startAfterId | No | Start After Id |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, which establish the safety profile. The description adds valuable context beyond those hints: the endpoint is deprecated, the HTTP verb is GET, and the required OAuth scope is contacts.readonly. This helps the agent understand operational constraints that the annotations do not convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short and front-loads the key deprecation warning, but it repeats 'DEPRECATED' both in the note and at the end. The markdown link is useful for humans but adds little for an AI agent. Overall it earns a mid score because it is efficient despite minor redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a deprecated tool with strong read-only annotations and 100% schema coverage, the description provides the most critical contextual fact: do not use this, use Search Contacts instead. The lack of an output schema is mitigated because the tool is effectively superseded. It could have mentioned pagination behavior or response shape, but the deprecation guidance makes the description sufficient for agent decision-making.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents every parameter, which sets the baseline at 3. The description itself adds no parameter-level meaning beyond what the schema provides. Some schema descriptions are thin (e.g., 'Start Afte' typo and 'Contact Query'), but the description does not compensate for those gaps.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies the operation as 'Get Contacts' with the endpoint 'GET /contacts/', so an agent can tell it is a contact-list retrieval tool. It also names the deprecated status and points to 'Search Contacts' as the replacement, which helps distinguish it from the sibling contacts_search_contacts_advanced. However, it does not describe exactly what contacts are returned or the listing scope beyond the endpoint.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives an explicit usage directive: this endpoint is deprecated and the agent should use the Search Contacts endpoint instead. It names the exact alternative, so there is no ambiguity about when to prefer another tool. This is strong, actionable guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
contacts_get_contacts_by_businessidGet Contacts By BusinessIdARead-onlyIdempotent
Get Contacts By BusinessId [GET /contacts/business/{businessId}] Scopes: contacts.readonly.
| Name | Required | Description | Default |
|---|---|---|---|
| skip | No | (default: "0") | |
| limit | No | (default: "25") | |
| query | No | ||
| businessId | Yes | ||
| locationId | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark this as read-only, idempotent, and non-destructive, so the description does not need to restate safety. It adds useful behavioral context by exposing the HTTP method '[GET ...]' and the auth requirement 'Scopes: contacts.readonly'. It could include response/pagination behavior, but that is minor given the strong annotation coverage.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, dense sentence containing the operation, endpoint, and required scope. It is front-loaded and contains no filler or redundant prose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given five parameters, two required, no output schema, and minimal parameter documentation, this description is not complete enough for reliable invocation. It leaves the role of locationId unexplained and says nothing about what response shape will come back or how pagination works.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 40% and the description adds almost no parameter meaning beyond what the schema names. The endpoint clarifies that businessId is a path parameter, but it never explains the required locationId, the query param, or the meaning of skip and limit. This is a significant gap for actually invoking the tool.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific operation and resource, 'Get Contacts By BusinessId', and pins it to an exact endpoint, 'GET /contacts/business/{businessId}'. This clearly distinguishes it from sibling contact tools like contacts_get_contact or contacts_get_contacts because it identifies the businessId filter.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage context is implied by the name and endpoint: an agent would use this when it has a businessId and needs the contacts associated with it. However, the description gives no explicit guidance about when to prefer this over contacts_get_contacts or contacts_search_contacts_advanced, and no exclusions or prerequisites beyond the listed scope.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
contacts_get_duplicate_contactGet Duplicate ContactARead-onlyIdempotent
Get Duplicate Contact .If Allow Duplicate Contact is disabled under Settings, the global unique identifier will be used for searching the contact. If the setting is enabled, first priority for search is email and the second priority will be phone. [GET /contacts/search/duplicate] Scopes: contacts.readonly.
| Name | Required | Description | Default |
|---|---|---|---|
| No | Email - Pass in URL Encoded form. i.e test+abc@gmail.com will become `test%2Babc%40gmail.com` | ||
| number | No | Phone Number - Pass in URL Encoded form. i.e +1423164516 will become `%2B1423164516` | |
| locationId | Yes | Location Id |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only and idempotent behavior; the description adds conditional search behavior, the endpoint, and the required auth scope contacts.readonly, which is useful context beyond the annotations. No contradiction exists.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The substantive conditional behavior, endpoint, and scope are compact, but the opening sentence 'Get Duplicate Contact .' simply repeats the title and adds no value. Structure is acceptable but not tightly front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only search with fully documented schema and rich annotations, the description supplies the endpoint, search priority, and auth scope needed to invoke it. It does not describe return format, and the global-unique-identifier reference is slightly underspecified, but these are minor gaps for invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already documents all three parameters (100% coverage), and the description adds meaningful semantics by defining email and phone priority and tying them to the Allow Duplicate Contact setting. The mapping of the 'global unique identifier' to an actual parameter remains somewhat ambiguous.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description identifies the resource as duplicate contacts and includes the exact endpoint GET /contacts/search/duplicate, so the tool's purpose is clear. It does not explicitly contrast with sibling tools like contacts_get_contact or contacts_search_contacts_advanced, so it misses full differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The setting-dependent search priority tells an agent how search keys behave (email then phone when duplicates are allowed, unique identifier otherwise), but it does not state when to prefer this tool over sibling search/get tools. Selection guidance remains mostly implied by the name and endpoint.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
contacts_get_noteGet NoteBRead-onlyIdempotent
Get Note [GET /contacts/{contactId}/notes/{id}] Scopes: contacts.readonly.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Note Id | |
| contactId | Yes | Contact Id |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the operation as read-only, idempotent, and non-destructive. The description adds the OAuth scope `contacts.readonly`, which is useful authorization context beyond the annotations, but it does not describe error behavior or response semantics. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is one short sentence containing the endpoint and scopes, with no filler or redundant explanations. It is front-loaded with the verb and resource. This is appropriately concise.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-parameter read-only GET, the combination of description, schema, and annotations is adequate to construct a valid request. It lacks an explicit return-value description, but that is a minor gap given no output schema and the simplicity of the operation. The main omission is guidance on choosing between this and the plural note-list sibling.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema provides descriptions for both parameters (`Note Id`, `Contact Id`), covering all parameters. The URL template reinforces the relationship between contactId and id, but the description adds no format or constraint details. Baseline 3 applies for high schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description provides an HTTP GET endpoint and resource path `/contacts/{contactId}/notes/{id}`, which specifies a single note retrieval. This distinguishes it from the sibling `contacts_get_all_notes` by its singular resource and ID parameter, though it does not explicitly state that distinction. The phrasing is clear but closely mirrors the tool name.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
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 `contacts_get_all_notes` or other sibling getters. The description only states the operation and scopes, leaving the agent to infer selection criteria from naming conventions. This is a no-guidance situation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
contacts_get_taskGet TaskBRead-onlyIdempotent
Get Task [GET /contacts/{contactId}/tasks/{taskId}] Scopes: contacts.readonly.
| Name | Required | Description | Default |
|---|---|---|---|
| taskId | Yes | Task Id | |
| contactId | Yes | Contact Id |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, so the safety profile is well covered. The description adds the HTTP method and required OAuth scope, but does not disclose response shape, error behavior, or any other behavioral nuances beyond what annotations provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single compact sentence that includes the endpoint and scopes without any unnecessary wording. Every element earns its place and it is immediately scannable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a straightforward two-parameter read operation, the endpoint, scope, and annotations provide most necessary context. However, the missing guidance about when to use this versus contacts_get_all_tasks leaves a small but relevant completeness gap, especially since there is no output schema to clarify expected returns.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and both parameters are individually described, albeit minimally. The tool description adds no extra parameter meaning beyond the schema, so a baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies a specific operation: retrieving a single task via 'Get Task' and the exact endpoint path. It is distinguishable from siblings like contacts_get_all_tasks by the composite resource path, though it does not explicitly state that distinction.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit guidance is given for when to use this tool versus alternatives such as contacts_get_all_tasks or contacts_get_note. The endpoint implies retrieving one task by contactId and taskId, but the tool description does not state when it should be selected over related getters.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
contacts_search_contacts_advancedSearch ContactsBRead-only
Search Contacts Search contacts based on combinations of advanced filters. Documentation Link - https://doc.clickup.com/8631005/d/h/87cpx-158396/6e629989abe7fad [POST /contacts/search] Scopes: contacts.readonly.
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | Full request body |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only, non-destructive, and open-world behavior, so the description only needs to add context. It adds the endpoint [POST /contacts/search], the required scope contacts.readonly, and a documentation link, which is useful but does not describe response shape, pagination, or filtering behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short and mostly readable, but it opens with a redundant 'Search Contacts' that repeats the title before providing real content. The endpoint and scope line is useful, though the overall structure is slightly clumsy with a long inline documentation link.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an advanced search endpoint with a completely undefined request body and no output schema, this description is not complete enough. It provides the endpoint, scope, and a docs link, but omits any details about the available filters, required body fields, pagination, or return values, which are critical for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema exposes only an opaque 'body' object with no defined properties and only the generic description 'Full request body'. The tool description mentions 'advanced filters' but does not enumerate filter fields, value formats, or example structures, so an agent cannot confidently construct a valid request body.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool searches contacts using combinations of advanced filters, with a specific verb and resource. It is more specific than the title alone and hints at how it differs from simpler list/get contact siblings, though it does not explicitly name an alternative.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'combinations of advanced filters' implies usage when a caller needs complex contact search beyond simple retrieval, but there is no explicit when-to-use/when-not-to-use guidance or mention of alternative contact tools. Usage context is only implied, so it does not fully route an agent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
conversations_download_message_transcriptionDownload transcription by Message IDCRead-onlyIdempotent
Download transcription by Message ID Download the recording transcription for a message by passing the message id [GET /conversations/locations/{locationId}/messages/{messageId}/transcription/download] Token: location. Scopes: conversations/message.readonly.
| Name | Required | Description | Default |
|---|---|---|---|
| messageId | Yes | Message ID as string | |
| locationId | Yes | Location ID as string |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this as read-only, idempotent, and non-destructive. The description adds useful context such as the token requirement, scopes, and endpoint. However, it does not mention the response format or what happens when a transcription is unavailable, so it only partially supplements the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description opens by repeating the title verbatim ('Download transcription by Message ID') and then immediately restates the same idea. The endpoint and scopes are useful, but the first phrase is redundant and adds noise rather than value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple and annotations cover safety, but the description fails to differentiate this from conversations_get_message_transcription or explain what the downloaded payload looks like. With no output schema, that missing distinction and response clarity are important gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both messageId and locationId are already explained as strings. The description restates the message ID concept but adds no real semantic detail beyond what the schema provides, so the baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Download the recording transcription for a message by passing the message id', and includes the exact endpoint. It is clear about what the tool does, but it does not distinguish itself from the similarly named sibling conversations_get_message_transcription.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance about when to use this tool versus conversations_get_message_transcription or conversations_get_message_recording. The description only explains the action and auth scopes, leaving the selection decision entirely to the agent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
conversations_export_messages_by_locationExport messages by location IDARead-onlyIdempotent
Export messages by location ID Export messages for a specific location with cursor-based pagination support. Response includes messageType (string), source, and subType fields. The channel parameter is optional - if not provided, all non-email message types will be returned including activity messages (opportunity updates, appointments, etc.). [GET /conversations/messages/export] Scopes: conversations/message.readonly.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | (default: 100) | |
| cursor | No | Cursor for pagination. Pass the nextCursor from previous response to get next page. | |
| sortBy | No | (default: "createdAt") | |
| channel | No | Filter by message channel. If not provided, all non-email message types will be returned including activity messages (opportunity updates, appointments, etc.) | |
| endDate | No | End date to filter messages by | |
| contactId | No | Filter messages by contact ID | |
| sortOrder | No | (default: "desc") | |
| startDate | No | Start date to filter messages by | |
| locationId | Yes | Location ID to filter messages by | |
| conversationId | No | Filter messages by conversation ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, so the safety profile is covered. The description adds meaningful behavioral detail beyond annotations: cursor-based pagination mechanics, the presence of messageType/source/subType fields in the response, the default channel behavior that includes activity messages, and required OAuth scope. This gives an agent a solid behavioral model before calling.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded with the core purpose, then adds pagination, response fields, and channel default in a logical order. It loses a point because 'Export messages by location ID' is immediately repeated in the next sentence, creating mild redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 10-parameter export tool with no output schema, the description covers the essentials: pagination via cursor, default channel behavior, key response fields, and required scope. The remaining gaps (date format, sorting defaults) are already covered by schema descriptions. It is slightly short of complete because it does not describe the overall response envelope.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema fully documents all ten parameters. The description adds some value by explaining the channel default and pagination cursor pattern, but largely restates what the schema already conveys. A baseline 3 is appropriate given the strong schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description opens with a specific verb-resource pair: 'Export messages' for a specific location, and is further clarified by cursor-based pagination and the explicit GET endpoint. It is clearly distinguishable from sibling tools like conversations_get_messages because it frames the operation as a location-scoped export rather than a general message retrieval.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly states this tool exports messages for a specific location, which orients the agent toward its intended scope. It also explains the channel parameter's default behavior, letting the agent know when to pass it. However, it does not explicitly contrast this with sibling tools or state when NOT to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
conversations_get_all_custom_subtypesGet All Custom SubtypesCRead-onlyIdempotent
Get All Custom Subtypes Get all custom subtypes for a location [GET /conversations/preferences/custom-subtypes]
| Name | Required | Description | Default |
|---|---|---|---|
| locationId | Yes | Location Id |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnlyHint, idempotentHint, and non-destructiveness, so the safety profile is covered. The description adds minor context by specifying location scoping and the exact GET endpoint, but it does not disclose pagination, response shape, or any unusual behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short, but it begins with 'Get All Custom Subtypes', an exact duplication of the title, before adding the actual sentence. That redundancy wastes the opening slot and does not earn its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple, read-only, single-parameter tool, the description plus schema and annotations give enough to call the endpoint. However, the absence of an output schema and any explanation of what 'custom subtypes' are leaves some ambiguity about the expected response.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with locationId described as 'Location Id'. The description adds no parameter-level detail beyond that, which is acceptable since the schema already provides the only parameter's meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Get all custom subtypes for a location', which is clear and useful. However, it repeats the tool title almost verbatim and does not explicitly distinguish this endpoint from sibling getter tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
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 other conversation or location getter tools. It does not mention prerequisites, alternatives, or exclusions, so an agent must infer context purely from the name and parameter.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
conversations_get_contact_unsubscription_statusGet Contact Unsubscription StatusBRead-onlyIdempotent
Get Contact Unsubscription Status Get all subscription statuses for a contact (all emails or specific email) [GET /conversations/preferences/unsubscriptions/status]
| Name | Required | Description | Default |
|---|---|---|---|
| No | Email address (optional - if not provided, gets all emails for contact) | ||
| contactId | Yes | Contact Id | |
| locationId | Yes | Location Id |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, covering the safety profile. The description adds the behavioral distinction of returning statuses for all emails or a specific email, but does not disclose response shape, pagination, or error behavior. That is acceptable given annotations, but not rich.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short but contains redundancy: 'Get Contact Unsubscription Status' duplicates the tool title and adds no information. The useful content, 'Get all subscription statuses for a contact (all emails or specific email)' plus the endpoint, is compact but could be cleaner.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only GET tool with well-documented parameters and safety annotations, the description is largely sufficient. It clarifies the optional email behavior and result scope, though it could additionally note what a successful response contains. Given no output schema, this is a minor gap rather than a critical one.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all three parameters. The description adds only marginal value by reinforcing the optional email behavior, which is already present in the schema. Baseline 3 is appropriate here.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action ('Get') on a clear resource ('subscription statuses for a contact') and clarifies the scope (all emails or a specific email). It is not explicitly differentiated from siblings, but no sibling covers the same resource, so the purpose is nonetheless clear.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies this tool is for retrieving subscription statuses, and the optional email parameter gives a meaningful usage variation (all emails vs. specific email). However, it does not explicitly state when to choose this tool over alternatives or mention any exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
conversations_get_conversationGet ConversationBRead-onlyIdempotent
Get Conversation Get the conversation details based on the conversation ID [GET /conversations/{conversationId}] Scopes: conversations.readonly.
| Name | Required | Description | Default |
|---|---|---|---|
| conversationId | Yes | Conversation ID as string |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnlyHint=true, openWorldHint=true, idempotentHint=true, and destructiveHint=false, covering safety. The description adds the required scope (conversations.readonly) and the GET endpoint, which provides useful context beyond annotations. No contradictions; the description aligns with the read-only nature.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short but begins with a redundant repetition of the title ('Get Conversation') before stating the actual purpose. It could be more concise and front-loaded by removing the redundant prefix. No excessive length, but structure could be improved.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple get-by-ID tool with one parameter, no output schema, and a rich annotation set, the description provides enough context: it specifies the endpoint, scopes, and purpose. It doesn't need to explain return values or error handling for a tool this straightforward, so it is adequately complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema fully describes the only parameter (conversationId as string, 100% coverage). The description offers no additional meaning about the parameter, so the baseline of 3 applies. Not adding extra detail is acceptable given the schema's completeness.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool retrieves conversation details by ID, with the endpoint and scopes. It distinguishes itself from search tools by relying on the ID, though it doesn't explicitly contrast with siblings like conversations_search_conversation. The redundancy of repeating 'Get Conversation' at the start slightly detracts from precision.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
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 such as conversations_search_conversation or conversations_get_messages. The intended use case (having a conversationId) is implied but never stated, so an agent might not know when to prefer this over a search.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
conversations_get_email_by_idGet email by IdCRead-onlyIdempotent
Get email by Id [GET /conversations/messages/email/{id}]
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description only adds the HTTP GET path, which mostly restates the annotations and does not disclose response shape, required authorization, or any other behavioral details.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is very short and front-loaded, but the main phrase is a direct repetition of the title. The endpoint path is the only genuinely additive piece; the rest is redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only fetch tool with no output schema, the description should at least state what is returned, such as the email message details, headers, or body. It does not, and it also fails to clarify how this relates to sibling message tools, leaving the agent with only the bare endpoint.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema is empty, and with zero parameters the baseline is 4. The description does add some value by exposing the {id} path parameter in the endpoint, signaling that an identifier is required even though the schema does not list it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description restates the title verbatim and adds the REST path. It clearly identifies the resource as an email message retrieved by ID, but it does not explain what an 'email' is in this context or how this tool differs from siblings like conversations_get_message or conversations_get_messages.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance about when to use this tool versus alternatives. The sibling list contains several related message-fetching tools, but the description gives no conditions, exclusions, or selection criteria.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
conversations_get_messageGet message by message idARead-onlyIdempotent
Get message by message id . [GET /conversations/messages/{id}] Scopes: conversations/message.readonly.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, covering the safety profile. The description adds the HTTP method and required OAuth scope, which is useful auth context, but does not describe response format, error behavior, or other runtime traits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short and front-loaded with the core action, followed by the endpoint and scope. It is slightly redundant with the title, but the endpoint and scope information earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only fetch, the description covers the action, endpoint, and auth scope. However, because the input schema exposes no parameters, the description should more explicitly state that a message ID is required and how it is supplied; it also does not clarify the relationship with conversations_get_messages.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema is empty, so the description's mention of 'message id' and the endpoint path /conversations/messages/{id} is the only signal that an identifier is required. This adds essential meaning beyond the schema, though the exact argument name and type are not specified.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action and resource: 'Get message by message id' with a concrete GET endpoint and scope. This makes the tool's primary purpose clear and separates it from list-oriented siblings like conversations_get_messages, though it does not explicitly name any alternative tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'by message id' implies the tool should be used when a single message identifier is available, but there is no explicit guidance about when not to use it or which sibling to prefer. No exclusions or alternative tool references are provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
conversations_get_message_recordingGet Recording by Message IDBRead-onlyIdempotent
Get Recording by Message ID Get the recording for a message by passing the message id [GET /conversations/messages/{messageId}/locations/{locationId}/recording] Token: location. Scopes: conversations/message.readonly.
| Name | Required | Description | Default |
|---|---|---|---|
| messageId | Yes | Message ID as string | |
| locationId | Yes | Location ID as string |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, covering the safety profile. The description adds useful context beyond annotations by specifying the auth token type ('Token: location') and required scope ('conversations/message.readonly'), as well as the endpoint format. It does not describe the response shape, but for a read-only GET this is a minor gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description repeats the title almost verbatim before restating the same idea, creating redundancy. The endpoint and auth details are valuable, but the first sentence could be removed or merged. It is compact but not tightly edited.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-string-param GET with read-only and idempotent annotations, the description covers the endpoint, token, and scopes. It does not specify the return format, but the absence of an output schema and the straightforward resource make this acceptable. The description could have noted that this is not the transcription endpoint, but that is reasonably inferable from the name.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both messageId and locationId are already documented. The description only adds 'passing the message id' and shows locationId in the endpoint path, providing no additional semantic meaning. A baseline score of 3 is appropriate when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific action and resource: 'Get the recording for a message by passing the message id', and includes the exact endpoint path. This distinguishes it from siblings like conversations_get_message_transcription by the object type 'recording', even though it does not explicitly contrast with them. The opening duplicates the title but does not undermine purpose clarity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
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 alternatives such as conversations_get_message_transcription or conversations_download_message_transcription. It mentions required token and scopes, but gives no criteria, exclusions, or comparison to sibling tools. The only implied usage cue is the resource name 'recording'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
conversations_get_messagesGet messages by conversation idBRead-onlyIdempotent
Get messages by conversation id . [GET /conversations/{conversationId}/messages] Scopes: conversations/message.readonly.
| Name | Required | Description | Default |
|---|---|---|---|
| type | No | Types of message to fetched separated with comma | |
| limit | No | Number of messages to be fetched from the conversation. Default limit is 20 | |
| lastMessageId | No | Message ID of the last message in the list as a string | |
| conversationId | Yes | Conversation ID as string |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destuctiveHint=false, so the safety profile is covered. The description adds the required OAuth scope 'conversations/message.readonly', which is useful authorization context, but does not disclose behavior such as default limit, pagination semantics, or result ordering.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short and front-loaded, with the endpoint and scope appended compactly. It is not padded with fluff, though 'Get messages by conversation id' largely repeats the tool title and could have been replaced with more useful behavioral detail.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Together with the fully documented schema and safety annotations, this is adequate for a simple read-only listing tool, but it omits any description of response format or pagination behavior despite there being no output schema. Auth scope and endpoint are present, which helps, but richer list-specific context would improve completeness.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so parameters are already documented in the input schema. The tool description does not add extra meaning about conversationId, type, limit, or lastMessageId beyond what the schema provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Get messages by conversation id', and the endpoint makes the operation concrete. It is distinguishable from the sibling conversations_get_message by the plural resource and path. However, it does not explicitly clarify that this returns a list or that optional filters are available.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
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 conversations_get_message, conversations_search_conversation, or conversations_export_messages_by_location. Sibling names imply differences, but the description itself leaves selection entirely to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
conversations_get_message_transcriptionGet transcription by Message IDARead-onlyIdempotent
Get transcription by Message ID Get the recording transcription for a message by passing the message id [GET /conversations/locations/{locationId}/messages/{messageId}/transcription] Token: location. Scopes: conversations/message.readonly.
| Name | Required | Description | Default |
|---|---|---|---|
| messageId | Yes | Message ID as string | |
| locationId | Yes | Location ID as string |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish read-only, idempotent, non-destructive behavior. The description adds genuinely useful access context – the exact HTTP method, 'Token: location', and required scope 'conversations/message.readonly' – which the annotations do not convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The text is short but opens by repeating the title verbatim ('Get transcription by Message ID'), and the body is a run-on sentence. It packs route, token, and scope compactly, yet the redundancy makes it less crisp than it should be.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-parameter read with strong annotations, the endpoint, token, and scope are effectively covered. The lack of an output schema means the description could have added what the response contains or whether it returns raw text, but this is a moderate gap rather than a fatal one.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%: both required parameters are documented as strings, and the description reinforces locationId/messageId via the REST path. The description adds no format or additional semantics beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names the exact action ('Get') and resource ('recording transcription for a message') and provides the full REST path, so intent is clear. It does not explicitly contrast with the sibling audio-recording and download-transcription tools, but the resource is unambiguous enough.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It implies the use case: pass a message ID to fetch its transcription, and includes the required token/scope. However, it gives no explicit guidance about when to prefer this over conversations_get_message_recording or conversations_download_message_transcription, leaving some selection ambiguity among sibling transcription tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
conversations_search_conversationSearch ConversationsBRead-onlyIdempotent
Search Conversations Returns a list of all conversations matching the search criteria along with the sort and filter options selected. [GET /conversations/search] Scopes: conversations.readonly.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | Id of the conversation | |
| sort | No | Sort paramater - asc or desc | |
| limit | No | Limit of conversations - Default is 20 | |
| query | No | Search paramater as a string | |
| sortBy | No | The sorting of the conversation to be filtered as - manual messages or all messages | |
| status | No | The status of the conversation to be filtered - all, read, unread, starred | |
| endDate | No | End date filter for dateAdded field (Unix timestamp in milliseconds) | |
| mentions | No | User Id of the mention. Multiple values are comma separated. | |
| contactId | No | Contact Id | |
| followers | No | User IDs of followers to filter conversations by. Multiple IDs can be provided as comma-separated values. | |
| startDate | No | Start date filter for dateAdded field (Unix timestamp in milliseconds) | |
| assignedTo | No | User IDs that conversations are assigned to. Multiple IDs can be provided as comma-separated values. Use "unassigned" to fetch conversations not assigned to any user. | |
| locationId | Yes | Location Id | |
| scoreProfile | No | Id of score profile on which conversations should get filtered out, works with scoreProfileMin & scoreProfileMax | |
| startAfterDate | No | Search to begin after the specified date - should contain the sort value of the last document | |
| lastMessageType | No | Type of the last message in the conversation as a string | |
| scoreProfileMax | No | Maximum value for score | |
| scoreProfileMin | No | Minimum value for score | |
| sortScoreProfile | No | Id of score profile on which sortBy.ScoreProfile should sort on | |
| lastMessageAction | No | Action of the last outbound message in the conversation as string. | |
| lastMessageDirection | No | Direction of the last message in the conversation as string. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate a read-only, non-destructive, idempotent operation. The description adds that it returns a list with sort/filter options and specifies the endpoint and scopes. It doesn't contradict annotations and adds some context, but doesn't disclose pagination or rate limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is very concise, with the main purpose front-loaded in the first sentence, followed by endpoint and scopes. No redundant filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (21 parameters, no output schema), the description is sparse. It doesn't mention pagination, defaults beyond what the schema notes, or any usage examples. Agents need more guidance on constructing searches, such as combining filters or using startAfterDate for pagination.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema descriptions cover 100% of parameters, so the description doesn't need to add parameter details. It doesn't add anything beyond what the schema provides; it relies entirely on the schema for parameter meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function: searching conversations and returning a list matching criteria. It distinguishes from single-conversation retrieval by emphasizing 'list of all conversations' and includes the endpoint and scopes.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this tool versus alternatives. It doesn't mention that for a single conversation by ID you should use get_conversation, or that for messages within a conversation you'd use get_messages. The description only states what it does, not when to choose it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ghl_call_endpointCall any GHL endpointADestructive
Execute any endpoint by tool name with a flat arguments object (path, query, and body fields all at top level; see ghl_describe_endpoint). Subject to the same write/delete gates as dedicated tools.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Tool name from ghl_search_endpoints | |
| arguments | No | Flat arguments matching the endpoint input schema |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate destructive and non-idempotent behavior, so the description adds useful context by noting that the same write/delete gates as dedicated tools apply and that all path/query/body fields are flattened. This goes beyond the structured annotations without contradicting them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences with no filler. The core action and the critical flat-argument behavior are front-loaded, and the important gate caveat is appended efficiently.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a highly generic dynamic endpoint tool, the description is reasonably complete: it explains the argument model, points to the schema-discovery sibling, and flags safety gates. It does not describe return values or error behavior, but those are inherently variable for 'any endpoint', so this is an acceptable gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema descriptions already cover the parameters at 100%, but the description adds meaningful semantics: arguments must be flat with path, query, and body fields at top level, and users should consult ghl_describe_endpoint for the exact shape. This materially improves an agent's ability to build correct calls.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Execute any endpoint by tool name') and the resource (any GHL endpoint), and immediately distinguishes itself from the dedicated sibling tools by being a generic executor. The mention of a flat arguments object further specifies how the operation is performed.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies a generic fallback use case but never explicitly says when to prefer this tool over a dedicated sibling endpoint. It references ghl_describe_endpoint for input structure and mentions write/delete gates, but stops short of stating 'use dedicated tools when one exists' or providing a clear when/when-not rule.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ghl_describe_endpointDescribe a GHL endpointARead-onlyIdempotent
Return the full input schema, required fields, auth scopes, and HTTP details for one endpoint by tool name.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Tool name from ghl_search_endpoints |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the description does not need to restate safety. It adds useful behavioral context by enumerating what the tool returns: input schema, required fields, auth scopes, and HTTP details. Potential error or formatting behavior is not described, but this is minor for a read-only introspection tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single focused sentence that front-loads the return payload and scopes the tool with 'for one endpoint by tool name.' There is no filler, repetition, or extraneous detail.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter, read-only introspection tool, this description covers what an agent needs: what the tool returns and how to identify the target endpoint. There is no output schema, so the listed return categories are sufficient, and missing error semantics are an acceptable gap at this complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, and the schema already explains that 'name' is 'Tool name from ghl_search_endpoints.' The description repeats 'by tool name' but adds no new parameter semantics, so the baseline score of 3 is appropriate when the schema carries the semantic weight.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action ('Return') and a concrete object ('full input schema, required fields, auth scopes, and HTTP details for one endpoint'). It clearly distinguishes this introspection tool from sibling tools like ghl_search_endpoints and ghl_call_endpoint without requiring the reader to open the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description conveys a clear use case: obtain schema, auth, and HTTP details for a named endpoint. It does not explicitly name alternatives, but the parameter description 'Tool name from ghl_search_endpoints' gives workflow context, and the tool's meta-role is obvious from its name and siblings. No exclusions are stated, but the intended usage is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ghl_search_endpointsSearch GHL endpointsARead-onlyIdempotent
Find GoHighLevel API endpoints by keyword across all 576 endpoints in 41 modules, including ones not loaded as dedicated tools. Returns tool names to pass to ghl_describe_endpoint / ghl_call_endpoint. Modules: ad-manager, affiliate-manager, agent-studio, associations, blogs, brand-boards, businesses, calendars, campaigns, companies, contacts, conversation-ai, conversations, courses, custom-fields, custom-menus, email-isv, emails, forms, funnels, invoices, knowledge-base, links, locations, marketplace, medias, oauth, objects, opportunities, payments, phone-system, products, proposals, saas-api, snapshots, social-media-posting, store, surveys, users, voice-ai, workflows.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max results (default 20) | |
| query | Yes | Keywords, e.g. "invoice send", "calendar free slots", "workflow" | |
| method | No | ||
| module | No | Restrict to one module, e.g. "invoices" |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark this as readOnly, idempotent, and non-destructive, so the safety profile is covered. The description adds behavioral context beyond that: it searches across all 576 endpoints in 41 modules, includes endpoints not exposed as dedicated tools, and returns tool names intended for ghl_describe_endpoint / ghl_call_endpoint. It stops short of describing search matching semantics, but that is a minor gap given the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core purpose and output are front-loaded in two efficient sentences. The long module list adds bulk but is genuinely useful as a reference for the module parameter and for understanding the tool's coverage. No filler or tautological phrasing is present.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a search/discovery tool with no output schema, the description adequately explains the return value ('tool names') and how to chain it with ghl_describe_endpoint / ghl_call_endpoint. It also makes the scope explicit with the 576-endpoint/41-module framing. A more complete description might clarify how keyword matching works, but the schema and annotations fill most remaining gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 75%, with query, limit, and module already documented via descriptions and examples. The description adds useful parameter-related context by listing the valid module names and clarifying that the input is a keyword search returning tool names. The method parameter is an enum with obvious values, so no further description is essential.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action ('Find GoHighLevel API endpoints by keyword'), a concrete scope ('all 576 endpoints in 41 modules'), and the output ('Returns tool names'). This clearly distinguishes it from the data-specific sibling search tools and directly connects to the ghl_describe_endpoint / ghl_call_endpoint workflow.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description indicates when this tool is valuable by noting it covers endpoints 'including ones not loaded as dedicated tools', implying discovery use when no dedicated tool exists. It also names the downstream tools to use with the results, giving a clear workflow. It does not explicitly say when not to use it or when a dedicated sibling search tool should be preferred, but the context is strong.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
locations_get_all_or_email_sms_templatesGET all or email/sms templatesARead-onlyIdempotent
GET all or email/sms templates [GET /locations/{locationId}/templates] Scopes: locations/templates.readonly.
| Name | Required | Description | Default |
|---|---|---|---|
| skip | No | (default: "0") | |
| type | No | ||
| limit | No | (default: "25") | |
| deleted | No | (default: false) | |
| originId | Yes | Origin Id | |
| locationId | Yes | Location Id |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare readOnlyHint, idempotentHint, and non-destructive, so the description does not need to restate those traits. It adds the required auth scope ('locations/templates.readonly') and endpoint, but does not disclose default filtering behavior, pagination, deleted-template handling, or response shape.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and front-loads the verb, resource, and endpoint in one sentence with no filler. The wording 'all or email/sms templates' is slightly ungrammatical and hurts clarity, but the overall structure is efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given strong read-only annotations, high schema coverage, and required parameters explicitly present in the schema, the description provides enough for an agent to select and invoke the tool. The lack of an output schema and response-format details is a minor gap, but the endpoint and resource name make the expected return type evident.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 83%, so the schema already documents skip, limit, type, deleted, originId, and locationId well enough. The description only loosely hints at email/sms filtering and adds no real semantic value beyond the enum and parameter names already present.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses an explicit GET verb, names the resource (location templates), and gives the exact endpoint path, which helps distinguish it from other read-only sibling tools. However, the phrasing 'all or email/sms templates' is awkward and leaves whether 'all' is a distinct filter mode somewhat ambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit when-to-use guidance or alternative exclusion is given. The resource 'templates' makes the intended use reasonably clear and no sibling tool covers the same endpoint, but the description does not state when to choose this over other locations or template-related tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
locations_get_custom_fieldGet Custom FieldCRead-onlyIdempotent
Get Custom Field [GET /locations/{locationId}/customFields/{id}]
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Custom Field Id or Field Key (e.g. "contact.first_name" or "opportunity.pipeline_id") | |
| locationId | Yes | Location Id |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false. The description adds only the endpoint path and provides no additional behavioral context such as single-resource semantics, response shape, or limitations. It does not go beyond what the annotations already communicate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is one compact sentence with no filler and front-loads the HTTP method and endpoint. It is appropriately concise, though it is also too sparse to provide contextual guidance.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-parameter read operation with rich annotations and complete schema coverage, the endpoint alone is nearly sufficient. The main gap is the lack of usage guidance to disambiguate it from the many sibling getter and list tools.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline applies. The schema documents id as 'Custom Field Id or Field Key' with examples and locationId as 'Location Id'; the description adds no parameter meaning beyond the path placeholders.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a concrete verb and resource ('Get Custom Field') and includes the exact endpoint path, which identifies the operation as fetching one custom field rather than a list. However, it does not explicitly differentiate from sibling tools such as locations_get_custom_fields or locations_get_custom_value.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance about when to use this tool instead of locations_get_custom_fields, locations_get_custom_value, or other related getter tools. The agent must infer usage from the name and endpoint alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
locations_get_custom_fieldsGet Custom FieldsARead-onlyIdempotent
Get Custom Fields [GET /locations/{locationId}/customFields] Scopes: locations/customFields.readonly.
| Name | Required | Description | Default |
|---|---|---|---|
| model | No | Model of the custom field you want to retrieve | |
| locationId | Yes | Location Id |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds the HTTP method (GET) and the required OAuth scope (locations/customFields.readonly), which are behaviorally useful beyond the annotations. The annotations already establish read-only, idempotent, non-destructive behavior, and the description is consistent with them. No contradiction found.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded: it starts with the operation, then provides the endpoint and auth scope. There is no redundant or filler content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only GET with two parameters and strong annotations, the description is mostly sufficient. However, it does not explain what the returned custom fields contain or how this differs from the singular custom field endpoint, leaving a moderate gap for an agent deciding between related tools.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 both locationId and model. The description does not add extra meaning about the model filter or locationId format, so it relies on the schema as expected.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the operation is 'Get Custom Fields' and includes the exact endpoint path with locationId. It is specific about the resource, though it does not explicitly distinguish itself from the sibling tool locations_get_custom_field beyond the plural/singular naming.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance about when to use this tool versus alternatives such as locations_get_custom_field or locations_get_custom_values. The endpoint and scope are provided, but no context is given for choosing this tool over related custom-field tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
locations_get_custom_valueGet Custom ValueBRead-onlyIdempotent
Get Custom Value [GET /locations/{locationId}/customValues/{id}]
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Custom Value Id | |
| locationId | Yes | Location Id |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds the explicit HTTP GET method and the resource path template, which is useful contextual detail beyond the annotations. However, it discloses no further behavioral traits such as return format, auth requirements, or error behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise, front-loading the operation and endpoint in a single line with no filler. However, it is almost too sparse: it restates the title and adds the URL, but omits explanatory content that could aid tool selection. It is efficient but at the cost of completeness, warranting a 4 rather than a 5.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description should explain what the tool returns or what a custom value is, but it does neither. There is also no mention of how this singular retrieval relates to locations_get_custom_values or custom fields. Given the low parameter count and annotations, the operation is simple, but the missing context about return values and resource meaning leaves a notable gap for an agent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% for the two required parameters, so the baseline is 3. The description's endpoint template shows that locationId and id are path parameters, adding a small amount of locational meaning beyond the schema's 'Location Id' and 'Custom Value Id'. But it does not clarify value formats, constraints, or relationships beyond what the schema already provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Get Custom Value' with the endpoint GET /locations/{locationId}/customValues/{id}. This makes clear it retrieves a single custom value by ID, and the singular form distinguishes it from sibling locations_get_custom_values (plural). However, it does not explain what a 'custom value' semantically represents, so it is clear but slightly under-specified.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No usage guidance is provided. The description does not state when to use this tool versus the many sibling tools, such as locations_get_custom_values (list all) or locations_get_custom_field. An agent must infer from the endpoint and tool name that this is for retrieving one specific custom value by ID, which is left entirely to the reader.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
locations_get_custom_valuesGet Custom ValuesBRead-onlyIdempotent
Get Custom Values [GET /locations/{locationId}/customValues] Scopes: locations/customValues.readonly.
| Name | Required | Description | Default |
|---|---|---|---|
| locationId | Yes | Location Id |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, openWorldHint=true, idempotentHint=true, and destructiveHint=false. The description adds the OAuth scope 'locations/customValues.readonly' and the explicit endpoint, which is useful authentication context, but it does not describe return format, array shape, pagination, or any other behavioral details. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single concise sentence containing the endpoint and scope with no filler. It is front-loaded and easy to parse, though it mostly restates the title and leaves room for more informative content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only operation with one parameter and rich annotations, the schema and annotations cover much of the safety profile. However, the description does not explain what custom values are, whether multiple results are returned, or when to choose this over the singular locations_get_custom_value. With no output schema, these gaps are not filled elsewhere.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 100% coverage for the only parameter, locationId, with the description 'Location Id'. The tool description adds no parameter-specific meaning beyond the schema, so the baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states the action 'Get' and the resource 'Custom Values', and includes the endpoint [GET /locations/{locationId}/customValues] and the required scope. This makes the operation clear, though it does not explicitly differentiate it from the similarly named sibling tool locations_get_custom_value.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
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 locations_get_custom_value (singular) or locations_get_custom_fields. Usage context must be inferred entirely from the tool name and endpoint.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
locations_get_locationGet Sub-Account (Formerly Location)ARead-onlyIdempotent
Get Sub-Account (Formerly Location) Get details of a Sub-Account (Formerly Location) by passing the sub-account id [GET /locations/{locationId}] Token: location or agency. Scopes: locations.readonly.
| Name | Required | Description | Default |
|---|---|---|---|
| locationId | Yes | Location Id |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds meaningful context beyond annotations by specifying the required token type and scope ('Token: location or agency. Scopes: locations.readonly.'), which is valuable for execution.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short but contains noticeable redundancy: 'Get Sub-Account (Formerly Location)' appears twice in the same sentence. The endpoint and auth details are useful, but the repetition wastes a bit of space. Still, the key information is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple one-parameter read operation with rich annotations and full schema coverage, the description provides enough to call the tool correctly. It includes the endpoint, token requirement, and scopes. Since there is no output schema, a brief mention of return details could be helpful, but the operation is straightforward enough that missing it is not a major gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the single parameter locationId is already described as 'Location Id'. The description adds only marginal context by referring to it as 'sub-account id', but this is largely redundant with the schema, so the baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Get details') and resource ('Sub-Account (Formerly Location)') and explains the lookup mechanism: 'by passing the sub-account id'. It also includes the exact endpoint, which removes ambiguity and helps distinguish it from sibling tools like locations_search_locations.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly implies this tool is for fetching a single record when the sub-account id is already known. However, it does not explicitly state when not to use it or point to alternatives such as locations_search_locations for discovery, so usage guidance is only implied rather than fully articulated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
locations_get_location_tagsGet TagsARead-onlyIdempotent
Get Tags Get Sub-Account (Formerly Location) Tags [GET /locations/{locationId}/tags] Scopes: locations/tags.readonly.
| Name | Required | Description | Default |
|---|---|---|---|
| locationId | Yes | Location Id |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and non-destructive, so the safety profile is covered. The description adds the HTTP method and required scope 'locations/tags.readonly' but does not disclose return format or pagination; given the strong annotations, this is a reasonable neutral score.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is very short and information-dense, with the endpoint and scopes included. Minor redundancy exists in the leading 'Get Tags Get Sub-Account...' phrase, but there is no wasted explanation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple one-parameter, read-only GET endpoint, the description supplies enough to invoke the call correctly: the path, the resource, and the required scope. It does not describe the response shape, but no output schema exists and the return value is strongly implied by the endpoint resource.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and only describes 'Location Id', which is the baseline. The description adds value by showing the parameter in the endpoint path and clarifying that 'Location' now means 'Sub-Account', helping an agent supply the correct identifier.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description makes clear the operation is retrieving tags ('Get Tags') for a sub-account/location, reinforced by the endpoint path '/locations/{locationId}/tags'. However, it does not explicitly differentiate itself from the sibling 'locations_get_tag_by_id' beyond the plural resource and path, so it is clear but not fully differentiated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The intended usage is implied by the verb and resource: use this tool when you need the tags associated with a location/sub-account. There is no explicit when-to-use/when-not-to-use guidance or mention of alternatives such as 'locations_get_tag_by_id'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
locations_get_recurring_task_by_idGet Recurring Task By IdCRead-onlyIdempotent
Get Recurring Task By Id [GET /locations/{locationId}/recurring-tasks/{id}]
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Recurring Task Id | |
| locationId | Yes | Location Id |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so the safety profile is covered. The description adds no behavioral context beyond the GET method and path—no mention of response shape, error cases, permissions, or pagination.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence with no filler. It includes the useful endpoint pattern without redundancy, making it easy to scan.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple, idempotent GET with fully documented parameters and safe annotations, the description is mostly adequate. However, with no output schema and no description of what the response contains, an agent still has some uncertainty about what the tool returns.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and both parameter descriptions are present, so the baseline is 3. The description's path template does clarify that id and locationId are path parameters, but it adds no deeper semantic meaning beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies the action ('Get'), the resource ('Recurring Task'), and the lookup key ('By Id'), and the path template adds concrete routing detail. It does not explicitly contrast with sibling tools, but the recurring-task resource is distinct from the many other get-by-id siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no explicit when-to-use guidance, prerequisites, or alternative tool suggestions. Usage is only implied by the tool name, which is not enough for an agent deciding among many similar getter tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
locations_get_tag_by_idGet tag by idARead-onlyIdempotent
Get tag by id [GET /locations/{locationId}/tags/{tagId}]
| Name | Required | Description | Default |
|---|---|---|---|
| tagId | Yes | Tag Id | |
| locationId | Yes | Location Id |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and destructiveHint=false, covering the safety profile. The description adds no behavioral context beyond the HTTP GET endpoint, which is minimal but not contradictory.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is very short and front-loaded with the action and resource. It includes the endpoint, which is useful, though the opening phrase largely repeats the tool title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only singleton lookup with fully documented parameters and strong annotations, the description is sufficient. It does not describe the response shape, but the absence of an output schema and the simplicity of a GET-by-id operation make this a minor gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters are already documented with descriptions. The description reinforces the path parameters but adds no additional semantic meaning beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('Get tag by id') and provides the explicit endpoint path, making the operation clear. It distinguishes from sibling tools like locations_get_location_tags by indicating a single tag lookup, though it does not explicitly name alternatives.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage when a specific tag ID and location ID are known, which is reasonably clear. However, it gives no explicit guidance on when not to use it or which sibling tool to prefer for listing tags or searching.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
locations_get_timezonesFetch TimezonesARead-onlyIdempotent
Fetch Timezones Fetch the available timezones [GET /locations/{locationId}/timezones] Token: location. Scopes: locations.readonly.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses the HTTP method (GET), the auth token location ('Token: location'), and the required scope ('locations.readonly'), going beyond the annotations. It is consistent with the readOnlyHint and idempotentHint, and does not hide the read-only nature. It does not describe return formatting or potential empty-result behavior, but the annotations already cover the safety profile.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short and mostly efficient, but it opens with an unnecessary duplicate of the title: 'Fetch Timezones Fetch the available timezones.' That repetition wastes two words and makes the structure feel accidental rather than deliberately front-loaded. The endpoint and auth details are compact and useful.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only list tool, the description covers what it returns, the endpoint, and auth requirements. However, it references a path parameter, locationId, that is not present in the input schema, so an agent could be uncertain whether it must somehow supply that value or whether it comes from the token context. There is no output schema, and the return shape is only implied as a list of timezones.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There are zero declared parameters, so the baseline is 4. The endpoint path '/locations/{locationId}/timezones' does imply a location-scoped resource, adding context about what the result depends on. The description does not explain how locationId is supplied, but with no parameters in the schema this is not an immediate description failure.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool fetches available timezones, and the included endpoint specifies the resource path. It is distinguishable from all sibling tools, none of which target timezones. However, the opening repeats the title verbatim ('Fetch Timezones Fetch...'), which is redundant and slightly muddies the clarity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The intended usage is implicit: call this tool when you need the list of timezones available for a location. There are no competing timezone tools among the siblings, so no alternative routing is necessary. It does not explicitly state when not to use it or provide prerequisites beyond the described token/scope.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
locations_search_locationsSearchBRead-onlyIdempotent
Search Sub-Account (Formerly Location) [GET /locations/search] Token: location or agency. Scopes: locations.readonly.
| Name | Required | Description | Default |
|---|---|---|---|
| skip | No | (default: "0") | |
| No | |||
| limit | No | (default: "10") | |
| order | No | (default: "asc") | |
| companyId | No | The company/agency id on which you want to perform the search |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark this as readOnly, openWorld, idempotent, and non-destructive, so the description does not need to restate those. It adds useful context by stating the HTTP method, token types, and required scope, but it does not disclose pagination or response behavior beyond what the schema defaults imply.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded: it names the resource, endpoint, HTTP method, token types, and required scope in one efficient line. Every piece of information earns its place, with no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, yet the description never states what the search returns or how the optional parameters like email and companyId affect results. An agent can infer it lists matching locations, but the missing return-value and filter semantics leave an important gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 80%, so the schema already documents skip, limit, order, and companyId. The description adds no parameter-specific meaning, but it also does not need to compensate for missing schema info, so the baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description identifies a specific action ('Search') on a specific resource ('Sub-Account (Formerly Location)') and provides a concrete endpoint, making the tool's purpose reasonably clear. It does not elaborate on exact search fields, but the resource is unambiguous and distinguishable from the many get_ tools in the sibling list.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
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 such as locations_get_location or other search endpoints. The only extra context is token and scope information, which is authentication info rather than usage direction.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
opportunities_get_lost_reasonGet lost reasonCRead-onlyIdempotent
Get lost reason [GET /opportunities/lost-reason] Scopes: opportunities.readonly.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | lost reason name | |
| skip | No | (default: 0) | |
| limit | No | (default: 100) | |
| query | No | search query | |
| deleted | No | (default: false) | |
| getCount | No | get count | |
| locationId | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and destructiveHint=false. The description adds the HTTP method (GET) and required scope (opportunities.readonly), which is useful context beyond the annotations. However, it does not disclose pagination behavior, list-vs-single return shape, or filtering semantics.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is very short, front-loads the endpoint and scope, and contains no filler. It loses a point because the brevity sacrifices substantive behavioral or semantic guidance, though as conciseness itself it is effective.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 7-parameter endpoint with no output schema, the description should at least indicate whether the tool returns a single record or a list, and what the results represent. It only says 'Get lost reason', leaving the result shape and usage context under-specified.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is high at 86%, so most parameters are already documented in the schema. The description adds no parameter-level meaning, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a verb and resource ('Get lost reason') and adds the endpoint, so it is not a pure tautology. However, it does not clarify whether this returns a single lost reason or a paginated list, nor what a 'lost reason' represents, leaving the core purpose ambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this tool versus alternatives such as opportunities_search_opportunity or opportunities_get_opportunity. The endpoint and scope are given, but the agent must infer the intended use case entirely.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
opportunities_get_opportunityGet OpportunityBRead-onlyIdempotent
Get Opportunity [GET /opportunities/{id}] Scopes: opportunities.readonly.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Opportunity Id |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and non-destructive behavior. The description adds value by specifying the required OAuth scope ('opportunities.readonly') and the exact REST endpoint, which gives useful access context beyond the annotations. However, it does not describe return shape, error behavior, or pagination, so the added behavioral context is limited.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence containing the HTTP method, path, and required scopes. No fluff or redundant content exists; every piece of information is useful for invoking the tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple one-parameter read-only operation with full annotation coverage, this description is mostly complete: it gives the endpoint and the required scope. It does not describe the response format or potential 404 behavior, but the absence of an output schema and the simplicity of the operation makes those omissions acceptable.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema describes the only parameter 'id' as 'Opportunity Id', which is self-explanatory. Schema coverage is 100%, so the description does not need to add much; it also doesn't add any semantics beyond what the schema already provides. The endpoint path '{id}' reinforces that the id is the path parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Get') and the resource ('Opportunity') and includes the exact endpoint path '[GET /opportunities/{id}]', so an agent knows what the tool does. It does not explicitly distinguish itself from sibling tools like opportunities_search_opportunity, but the get-versus-search contrast is evident from the name.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
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 opportunities_search_opportunity or opportunities_search_opportunities_advanced. There is no mention of prerequisites, filtering, or when a search would be more appropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
opportunities_get_pipelinesGet PipelinesCRead-onlyIdempotent
Get Pipelines [GET /opportunities/pipelines] Scopes: opportunities.readonly.
| Name | Required | Description | Default |
|---|---|---|---|
| locationId | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is known. The description adds the auth scope 'opportunities.readonly', which is useful context beyond annotations, but it does not describe response behavior, pagination, or any other side-effect-relevant details.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loads the core action and endpoint. The 'Scopes' line is useful and there is no filler, though the phrase 'Get Pipelines' partially duplicates the title without adding much information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple, but with no output schema and no parameter explanation, an agent lacks important calling context. The annotations cover safety but not what the response contains, how locationId should be sourced, or what makes this tool distinct among related opportunities tools.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, and the description gives no meaning for the sole required parameter 'locationId'. While the parameter name is somewhat self-explanatory, the description contributes nothing to clarify what value should be passed or how it affects the request.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('Get Pipelines') and includes the HTTP endpoint and required scope, making the basic purpose unambiguous. It does not explicitly differentiate it from sibling opportunity tools, but 'pipelines' is a distinct resource among the listed siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this tool versus the many sibling tools. It does not say 'use this to list pipelines before creating an opportunity' or when the alternatives like opportunities_search_opportunity would be more appropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
opportunities_search_opportunities_advancedSearch OpportunitiesCRead-only
Search Opportunities based on combinations of advanced filters. Documentation Link - https://doc.clickup.com/8631005/d/h/87cpx-424216/7bf11bc9b94f80f [POST /opportunities/search] Scopes: opportunities.readonly.
| Name | Required | Description | Default |
|---|---|---|---|
| page | Yes | ||
| limit | Yes | ||
| query | Yes | ||
| locationId | Yes | Location Id | |
| searchAfter | Yes | ||
| additionalDetails | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, and the description adds the REST endpoint (POST /opportunities/search) and required scope (opportunities.readonly), which are useful behavioral signals. However, it does not disclose pagination/searchAfter behavior, query syntax, or how additionalDetails affects results, so the added transparency beyond annotations is modest.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The main sentence is single and direct ('Search Opportunities based on combinations of advanced filters'), and the endpoint/scopes line is dense but relevant. It could be more structured, but it is not verbose and front-loads the action and resource.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Even with readOnly annotations, this tool has six required parameters, a nested additionalDetails object, and no output schema. The description provides none of the parameter semantics, searchAfter usage, or pagination logic needed to make a correct call, and instead defers to an external documentation link. It is not self-contained enough for an agent to invoke reliably.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 17% (only locationId has a generic description), so the description carries the burden of explaining the six required parameters. It does not mention query, limit, page, searchAfter, or additionalDetails at all, leaving an agent with no understanding of their meaning or formats.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Search') and resource ('Opportunities'), and adds that it operates on 'combinations of advanced filters,' which suggests a more complex search than a basic one. However, it does not explicitly differentiate itself from the sibling tool opportunities_search_opportunity, so it is clear but not fully distinct.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'based on combinations of advanced filters' implies this tool is for complex, multi-filter searches, which provides some implicit usage context. Yet the description does not explicitly state when to use this tool over opportunities_search_opportunity or other search endpoints, nor any exclusions or prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
opportunities_search_opportunitySearch OpportunityBRead-onlyIdempotent
Search Opportunity [GET /opportunities/search] Scopes: opportunities.readonly.
| Name | Required | Description | Default |
|---|---|---|---|
| q | No | ||
| id | No | Opportunity Id | |
| date | No | Start date | |
| page | No | (default: 1) | |
| limit | No | (default: 20) | |
| order | No | ||
| status | No | ||
| country | No | ||
| endDate | No | End date | |
| getNotes | No | get Notes in contact | |
| getTasks | No | get Tasks in contact | |
| campaignId | No | Campaign Id | |
| contact_id | No | Contact Id | |
| startAfter | No | Start After | |
| assigned_to | No | ||
| location_id | Yes | Location Id | |
| pipeline_id | No | Pipeline Id | |
| startAfterId | No | Start After Id | |
| getCalendarEvents | No | get Calender event in contact | |
| pipeline_stage_id | No | stage Id |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false. The description adds the HTTP GET verb and the 'opportunities.readonly' scope, reinforcing the read-only nature and providing permission context. It does not mention pagination, result shape, or rate limits, but the annotation coverage lowers the burden on the description.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single terse sentence that front-loads the action and adds endpoint and scopes. It is appropriately concise, though the opening phrase 'Search Opportunity' is largely redundant with the title, which costs a small amount of efficiency.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
This is a 20-parameter search endpoint with no output schema, so the description needs to convey more than the action and scopes. It does not state that location_id is required, explain the role of q or status/country filters, or clarify pagination behavior. Sibling differentiation is also missing, making the description incomplete for effective tool selection and invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 75%, so the schema already explains most parameters. The description adds no parameter-level meaning; parameters like q, order, status, country, and assigned_to remain without additional context beyond the schema. This aligns with the baseline for high coverage where the schema carries the load.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states the verb 'Search' and the resource 'Opportunity' and includes the endpoint [GET /opportunities/search], making the basic operation clear. However, it does not differentiate this from the sibling opportunities_search_opportunities_advanced, leaving some ambiguity about which search endpoint should be used.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this tool versus alternatives like opportunities_search_opportunities_advanced or opportunities_get_opportunity. The description only includes scopes, which is not usage direction. No exclusions, conditions, or preference cues are provided.
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.
55 tool updates
v0.1.0- First observed
calendars_fetch_calendar_resources - First observed
calendars_find_event_notification - First observed
calendars_get_appointment - First observed
calendars_get_appointment_notes - First observed
calendars_get_blocked_slots - First observed
calendars_get_calendar - First observed
calendars_get_calendar_events - First observed
calendars_get_calendar_resource - First observed
calendars_get_calendars - First observed
calendars_get_event_notification - First observed
calendars_get_groups - First observed
calendars_get_slots - First observed
calendars_getallschedules - First observed
calendars_getschedulebyid - First observed
calendars_validate_groups_slug - First observed
contacts_get_all_notes - First observed
contacts_get_all_tasks - First observed
contacts_get_appointments_for_contact - First observed
contacts_get_contact - First observed
contacts_get_contacts - First observed
contacts_get_contacts_by_businessid - First observed
contacts_get_duplicate_contact - First observed
contacts_get_note - First observed
contacts_get_task - First observed
contacts_search_contacts_advanced - First observed
conversations_download_message_transcription - First observed
conversations_export_messages_by_location - First observed
conversations_get_all_custom_subtypes - First observed
conversations_get_contact_unsubscription_status - First observed
conversations_get_conversation - First observed
conversations_get_email_by_id - First observed
conversations_get_message - First observed
conversations_get_message_recording - First observed
conversations_get_message_transcription - First observed
conversations_get_messages - First observed
conversations_search_conversation - First observed
ghl_call_endpoint - First observed
ghl_describe_endpoint - First observed
ghl_search_endpoints - First observed
locations_get_all_or_email_sms_templates - First observed
locations_get_custom_field - First observed
locations_get_custom_fields - First observed
locations_get_custom_value - First observed
locations_get_custom_values - First observed
locations_get_location - First observed
locations_get_location_tags - First observed
locations_get_recurring_task_by_id - First observed
locations_get_tag_by_id - First observed
locations_get_timezones - First observed
locations_search_locations - First observed
opportunities_get_lost_reason - First observed
opportunities_get_opportunity - First observed
opportunities_get_pipelines - First observed
opportunities_search_opportunities_advanced - First observed
opportunities_search_opportunity
TDQS
Scored across 55 tools
Several tools have unclear boundaries: opportunities_search_opportunity vs opportunities_search_opportunities_advanced, deprecated contacts_get_contacts vs contacts_search_contacts_advanced, and calendars_get_event_notification vs calendars_find_event_notification. The get/search/find verb variation across similar resources creates frequent ambiguity.
Naming is highly inconsistent: module prefixes are mixed with camelCase (calendars_getallschedules, calendars_getschedulebyid), verbs vary between get/search/fetch/find, and singular/plural forms are inconsistent (opportunity vs opportunities, resource vs resources). There is no predictable overall pattern.
At 55 tools, the server is far over the typical well-scoped range. While it covers multiple modules, the count feels bloated, especially since nearly all dedicated tools are read-only GETs and many could be consolidated.
The dedicated tool set has obvious gaps: there are no create/update/delete tools for contacts, conversations, tasks, notes, or appointments. However, the ghl_call_endpoint meta-tool exposes all 576 API endpoints, so agents can work around the missing operations, though this creates an awkward dependence on a generic escape hatch.
Maintenance
Related MCP Connectors
LeadConnector / GoHighLevel MCP Pack — wraps the GoHighLevel CRM for AI agents.
Zero-setup MCP gateway securely connecting AI to your tools with authentication and workflows
The OpenRouter for tools. One MCP connection gives any AI agent 254 hosted tools, pay per call.
Find, vet, and run MCP tools through a secure audited gateway with prompt-injection risk scoring
Related MCP Servers
- AlicenseNot gradedqualityBmaintenanceProvides access to over 460 tools within the GoHighLevel CRM, allowing AI assistants to manage contacts, opportunities, messaging, and business workflows through natural language.17 npm106ISC
- AlicenseNot gradedqualityCmaintenanceEnables AI assistants to manage GoHighLevel CRM data including contacts, conversations, opportunities, calendars, and forms through MCP tools and resources.51AGPL 3.0
- AlicenseNot gradedqualityDmaintenanceConnects AI assistants to GoHighLevel CRM via MCP, enabling full sub-account automation with 269+ tools for contacts, messaging, sales, marketing, and more.17 npmISC
- AlicenseNot gradedqualityBmaintenanceEnables AI assistants to directly interact with the entire GoHighLevel CRM via 563+ tools across 44 categories, allowing natural language control for contacts, messaging, opportunities, calendars, and more.17 npm1ISC