Zero CRM tools access the connected workspace. The `get_instructions` tool provides Zero data-model and query reference information, workspace configuration, and the available skill catalog.
Protocol
Pass100/10020 / 20 pts
Connection, authentication, and protocol compatibility.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description95/100
Get focused workspace configuration. By default returns users, pipelines, list counts, activity type names, AI context names, and custom-column counts. Request mcpConnectors before enabling an external connector tool on an automation AI action, manualAutomations before authoring a Start agent action, slackIntegrations before a Slack action, and linkedinUsers before a LinkedIn message action. Request linkedinPages for page IDs before filtering lead searches by page followers. Request columns with an entity/query when custom field definitions are needed; set includeOptions=true only when option UUIDs are needed for a write.
The description explains the capability, when to use it, and what to expect.
Inputs88/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
sections
Only return these metadata sections. Defaults to a compact overview without column details. Request products for the quote product catalog (ids, prices) before add_quote.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
entity
When requesting columns, only return columns for this entity.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
query
When requesting columns, only return column names containing this text.
Clear enough to supply this argument.
includeOptions
Include select option key UUIDs. Use only when preparing a custom-field write.
Clear enough to supply this argument.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "get_workspace_metadata",
"title": "Get workspace metadata",
"description": "Get focused workspace configuration. By default returns users, pipelines, list counts, activity type names, AI context names, and custom-column counts. Request mcpConnectors before enabling an external connector tool on an automation AI action, manualAutomations before authoring a Start agent action, slackIntegrations before a Slack action, and linkedinUsers before a LinkedIn message action. Request linkedinPages for page IDs before filtering lead searches by page followers. Request columns with an entity/query when custom field definitions are needed; set includeOptions=true only when option UUIDs are needed for a write.",
"inputSchema": {
"type": "object",
"required": [],
"properties": {
"query": {
"type": "string",
"description": "When requesting columns, only return column names containing this text."
},
"entity": {
"enum": [
"companies",
"contacts",
"deals"
],
"type": "string",
"description": "When requesting columns, only return columns for this entity."
},
"sections": {
"type": "array",
"items": {
"enum": [
"users",
"pipelines",
"columns",
"lists",
"customActivityTypes",
"aiContexts",
"slackIntegrations",
"linkedinUsers",
"linkedinPages",
"mcpConnectors",
"manualAutomations",
"products"
],
"type": "string"
},
"description": "Only return these metadata sections. Defaults to a compact overview without column details. Request products for the quote product catalog (ids, prices) before add_quote."
},
"includeOptions": {
"type": "boolean",
"description": "Include select option key UUIDs. Use only when preparing a custom-field write."
}
},
"additionalProperties": false
},
"annotations": {
"title": "Get workspace metadata",
"readOnlyHint": true,
"openWorldHint": false,
"destructiveHint": false
}
}
Name the specific action and subject instead of using a generic label such as ‘manage’ or ‘tool’.
Description77/100
Get Zero CRM data-model and query reference information, workspace configuration, and the available skill catalog for tasks involving the connected Zero workspace.
Describe the returned information so the agent knows whether it will answer the request.
Inputs100/100
This tool declares no inputs, so argument descriptions are not needed.
No input fields.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description99/100
In Chat, matching rows may include connectedSlackChannels with active customer-channel sync destinations. Search, list, or filter companies (accounts, organizations) by name, domain, location, owner, list, parent company, or custom properties. A string name does a case-insensitive substring search and is the default for locating a company the user names, because their wording may omit prefixes or suffixes or contain a typo. A name written as a domain (acme.com) also matches companies named after it (Acme) and companies that own that domain. Use name.$eq only when strict full-name equality is explicitly required, not merely because the user supplied a specific-looking name. Returns { resultSetId, total, rows } — use total for counts without reading all rows; pass resultSetId to add_companies_to_list, remove_companies_from_list, archive_companies instead of copying IDs. It covers every matching record (resultSetCount, up to 10,000); rows is a 5 row sample when more matched, so use query_result_set to read more, narrow, or project fields, and pass resultSetId to bulk tools to act on all matches. For list membership pass listIds only; add viewId to query a specific dynamic list view (get_list.views). Do not copy get_list filters. Use returnColumns.system to request only the company fields needed. Request relations only when their compact summaries are needed: contacts and deals return id/name; activities return id/name/time/type. Use the relevant find tool for richer related-record data. Max 500 results per page.
The description explains the capability, when to use it, and what to expect.
Inputs67/100
26 of 30 inputs have descriptions. Add descriptions to the missing inputs, including where to obtain IDs and how to supply values.
id › $in
Not provided
Missing description. Explain what this value means and how to supply it.
name › oneOf › 1 › $eq
Exact company name
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
domain
Company domain (substring match against the primary domain and every secondary domain)
Clear enough to supply this argument.
linkedin
Company LinkedIn handle, e.g. acme-corporation
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
location › oneOf › 1 › city
City name (e.g. Berlin, London)
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
location › oneOf › 1 › state
State or region (e.g. California, Bavaria)
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
location › oneOf › 1 › country
Country name (e.g. Germany, United Kingdom, Finland)
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
location › oneOf › 1 › continent
Continent (e.g. Europe, North America)
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
listIds
Query records in any of these lists. Pass the list UUID only — the tool resolves dynamic lists (filterBased: true) from saved view filters automatically. Omit viewId to use the list default view; pass viewId (from get_list.views) to query a specific named view. Do not copy resolvedFilters from get_list into other find fields.
Clear enough to supply this argument.
viewId
Optional view ID for a single list query. Defaults to the list's default view for its entity. On a dynamic list it selects that view's filters; on a regular list it narrows the membership to the view's saved filters. Call get_list to list views (id, name, entity). Use when the user names a specific view — each view can return different records.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
ownerIds
Belongs to any of these Owner User IDs: - db54dbf6-1249-418f-b3a1-7551588afc65: Tuomo Riekki ([email protected])
- 0cfdbed4-6b6d-4731-ac4d-d5c2f7fa41ee: Santtu Koivumäki ([email protected])
- 7dc63d26-8fd7-46c1-8ccf-f6611426532a: Niko Salkola ([email protected])
- 996e1a22-7cc5-462a-b3f0-e2bf69aad8ec: Santtu Koivumäki ([email protected])
- 36274288-9ff8-4ab9-9495-3b859c880aeb: Philip Ziegler ([email protected])
- 950e005a-0201-425a-b5bf-274446f39d40: Chandrasekhar Iyengar ([email protected])
- 8ad43fff-3cd6-4d46-8c53-53175706c900: Sergey Ushakov ([email protected])
- ad5a11e9-9434-407d-885b-58541032fcf3: Mariia Nedelkina ([email protected])
- 8b4032db-404c-46e4-9dcc-20e6851c9cb5: Olli Jokinen ([email protected])
- 09a4a339-91f7-4caa-8084-6dc0ff7fb6c7: Markus Vapaavuori ([email protected])
- 5d313045-1fe5-47a3-bd1a-d483f22721c5: Janne Sarja ([email protected])
- fcfdb1a0-00a2-4f3d-9e0f-6efd1808ebb5: Daniel Gregorio Cardil ([email protected])
- 4c0510ac-2047-4ce1-8677-bebc0ad6a7eb: Taru Heikinniemi ([email protected])
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
createdAt › $gte
ISO date or datetime, or a relative date expression such as now(), -30d, +7d, or startOfMonth.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
createdAt › $lte
ISO date or datetime, or a relative date expression such as now(), -30d, +7d, or startOfMonth.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
fieldChangedAt › field
Field that changed. One of: name, ownerIds, isChurned, or "custom.<columnId>" for a custom property.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
fieldChangedAt › after
Match changes at or after this ISO date or datetime
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
fieldChangedAt › before
Match changes at or before this ISO date or datetime
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
offset
Offset
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
limit
Limit
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
orderBy › column
Column to order by
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
orderBy › direction
Direction to order by
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
lastActivity › anyOf › 0 › $exists
Not provided
Missing description. Explain what this value means and how to supply it.
lastActivity › anyOf › 1 › time › $gte
ISO date or datetime, or a relative date expression such as now(), -30d, +7d, or startOfMonth.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
lastActivity › anyOf › 1 › time › $lte
ISO date or datetime, or a relative date expression such as now(), -30d, +7d, or startOfMonth.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
nextActivity › anyOf › 0 › $exists
Not provided
Missing description. Explain what this value means and how to supply it.
nextActivity › anyOf › 1 › time › $gte
ISO date or datetime, or a relative date expression such as now(), -30d, +7d, or startOfMonth.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
nextActivity › anyOf › 1 › time › $lte
ISO date or datetime, or a relative date expression such as now(), -30d, +7d, or startOfMonth.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
custom
Custom property filters. Keys must be raw column UUIDs from get_workspace_metadata — never column names or UUIDs wrapped in literal quote characters. For select/multiselect filters, use options[].key UUIDs in values, not option names.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
returnColumns › system
Only these top-level company fields are returned; id is always included.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
returnColumns › custom
Not provided
Missing description. Explain what this value means and how to supply it.
returnColumns › relations
Optional compact relation summaries only: contacts/deals return id and name; lastActivity/nextActivity return id, name, time, and type.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "find_companies",
"title": "Find companies",
"description": "In Chat, matching rows may include connectedSlackChannels with active customer-channel sync destinations. Search, list, or filter companies (accounts, organizations) by name, domain, location, owner, list, parent company, or custom properties. A string name does a case-insensitive substring search and is the default for locating a company the user names, because their wording may omit prefixes or suffixes or contain a typo. A name written as a domain (acme.com) also matches companies named after it (Acme) and companies that own that domain. Use name.$eq only when strict full-name equality is explicitly required, not merely because the user supplied a specific-looking name. Returns { resultSetId, total, rows } — use total for counts without reading all rows; pass resultSetId to add_companies_to_list, remove_companies_from_list, archive_companies instead of copying IDs. It covers every matching record (resultSetCount, up to 10,000); rows is a 5 row sample when more matched, so use query_result_set to read more, narrow, or project fields, and pass resultSetId to bulk tools to act on all matches. For list membership pass listIds only; add viewId to query a specific dynamic list view (get_list.views). Do not copy get_list filters. Use returnColumns.system to request only the company fields needed. Request relations only when their compact summaries are needed: contacts and deals return id/name; activities return id/name/time/type. Use the relevant find tool for richer related-record data. Max 500 results per page.",
"inputSchema": {
"type": "object",
"required": [],
"properties": {
"id": {
"type": "object",
"properties": {
"$in": {
"type": "array",
"items": {
"type": "string",
"format": "uuid"
}
}
}
},
"name": {
"oneOf": [
{
"type": "string",
"description": "Company name (case-insensitive substring match)"
},
{
"type": "object",
"required": [
"$eq"
],
"properties": {
"$eq": {
"type": "string",
"description": "Exact company name"
}
},
"description": "Strict full-name filter. Use $eq only when exact, case-sensitive equality is explicitly required; otherwise use the substring string form.",
"additionalProperties": false
}
]
},
"limit": {
"type": "number",
"description": "Limit"
},
"custom": {
"type": "object",
"description": "Custom property filters. Keys must be raw column UUIDs from get_workspace_metadata — never column names or UUIDs wrapped in literal quote characters. For select/multiselect filters, use options[].key UUIDs in values, not option names.",
"propertyNames": {
"type": "string",
"format": "uuid",
"description": "Custom column UUID from get_workspace_metadata."
},
"additionalProperties": {
"anyOf": [
{
"type": "string"
},
{
"type": "number"
},
{
"type": "boolean"
},
{
"type": "array",
"items": {
"anyOf": [
{
"type": "string"
},
{
"type": "number"
},
{
"type": "boolean"
}
]
}
},
{
"type": "object",
"additionalProperties": true
}
],
"description": "Custom property filter value. Each custom[columnId] may be either a direct value or an operator object such as {$in: [...]}, {$gte: ...}, {$lte: ...}, {$contains: ...}, {$overlaps: [...]}. Use get_workspace_metadata first to look up the property ID, type, options, and filterSchema."
}
},
"domain": {
"type": "string",
"description": "Company domain (substring match against the primary domain and every secondary domain)"
},
"offset": {
"type": "number",
"description": "Offset"
},
"viewId": {
"type": "string",
"format": "uuid",
"description": "Optional view ID for a single list query. Defaults to the list's default view for its entity. On a dynamic list it selects that view's filters; on a regular list it narrows the membership to the view's saved filters. Call get_list to list views (id, name, entity). Use when the user names a specific view — each view can return different records."
},
"listIds": {
"type": "array",
"items": {
"type": "string",
"format": "uuid",
"description": "List ID"
},
"description": "Query records in any of these lists. Pass the list UUID only — the tool resolves dynamic lists (filterBased: true) from saved view filters automatically. Omit viewId to use the list default view; pass viewId (from get_list.views) to query a specific named view. Do not copy resolvedFilters from get_list into other find fields."
},
"orderBy": {
"type": "object",
"required": [],
"properties": {
"column": {
"enum": [
"id",
"createdAt",
"updatedAt",
"name"
],
"type": "string",
"description": "Column to order by"
},
"direction": {
"enum": [
"asc",
"desc"
],
"type": "string",
"description": "Direction to order by"
}
},
"additionalProperties": false
},
"linkedin": {
"type": "string",
"description": "Company LinkedIn handle, e.g. acme-corporation"
},
"location": {
"oneOf": [
{
"type": "string",
"description": "Free-text location to geocode (e.g. 'Berlin', 'United Kingdom', 'San Francisco, CA'). Resolved server-side via Google Maps."
},
{
"type": "object",
"properties": {
"city": {
"type": "string",
"description": "City name (e.g. Berlin, London)"
},
"state": {
"type": "string",
"description": "State or region (e.g. California, Bavaria)"
},
"country": {
"type": "string",
"description": "Country name (e.g. Germany, United Kingdom, Finland)"
},
"continent": {
"enum": [
"Africa",
"Antarctica",
"Asia",
"Europe",
"North America",
"Oceania",
"South America"
],
"type": "string",
"description": "Continent (e.g. Europe, North America)"
}
},
"description": "Structured location — pass known fields directly without geocoding. Use this when the model already knows the city/country.",
"additionalProperties": false
}
]
},
"ownerIds": {
"type": "array",
"items": {
"enum": [
"db54dbf6-1249-418f-b3a1-7551588afc65",
"0cfdbed4-6b6d-4731-ac4d-d5c2f7fa41ee",
"7dc63d26-8fd7-46c1-8ccf-f6611426532a",
"996e1a22-7cc5-462a-b3f0-e2bf69aad8ec",
"36274288-9ff8-4ab9-9495-3b859c880aeb",
"950e005a-0201-425a-b5bf-274446f39d40",
"8ad43fff-3cd6-4d46-8c53-53175706c900",
"ad5a11e9-9434-407d-885b-58541032fcf3",
"8b4032db-404c-46e4-9dcc-20e6851c9cb5",
"09a4a339-91f7-4caa-8084-6dc0ff7fb6c7",
"5d313045-1fe5-47a3-bd1a-d483f22721c5",
"fcfdb1a0-00a2-4f3d-9e0f-6efd1808ebb5",
"4c0510ac-2047-4ce1-8677-bebc0ad6a7eb"
],
"type": "string",
"format": "uuid"
},
"description": "Belongs to any of these Owner User IDs: - db54dbf6-1249-418f-b3a1-7551588afc65: Tuomo Riekki ([email protected])\n- 0cfdbed4-6b6d-4731-ac4d-d5c2f7fa41ee: Santtu Koivumäki ([email protected])\n- 7dc63d26-8fd7-46c1-8ccf-f6611426532a: Niko Salkola ([email protected])\n- 996e1a22-7cc5-462a-b3f0-e2bf69aad8ec: Santtu Koivumäki ([email protected])\n- 36274288-9ff8-4ab9-9495-3b859c880aeb: Philip Ziegler ([email protected])\n- 950e005a-0201-425a-b5bf-274446f39d40: Chandrasekhar Iyengar ([email protected])\n- 8ad43fff-3cd6-4d46-8c53-53175706c900: Sergey Ushakov ([email protected])\n- ad5a11e9-9434-407d-885b-58541032fcf3: Mariia Nedelkina ([email protected])\n- 8b4032db-404c-46e4-9dcc-20e6851c9cb5: Olli Jokinen ([email protected])\n- 09a4a339-91f7-4caa-8084-6dc0ff7fb6c7: Markus Vapaavuori ([email protected])\n- 5d313045-1fe5-47a3-bd1a-d483f22721c5: Janne Sarja ([email protected])\n- fcfdb1a0-00a2-4f3d-9e0f-6efd1808ebb5: Daniel Gregorio Cardil ([email protected])\n- 4c0510ac-2047-4ce1-8677-bebc0ad6a7eb: Taru Heikinniemi ([email protected])"
},
"createdAt": {
"type": "object",
"required": [],
"properties": {
"$gte": {
"type": "string",
"description": "ISO date or datetime, or a relative date expression such as now(), -30d, +7d, or startOfMonth."
},
"$lte": {
"type": "string",
"description": "ISO date or datetime, or a relative date expression such as now(), -30d, +7d, or startOfMonth."
}
},
"additionalProperties": false
},
"lastActivity": {
"anyOf": [
{
"type": "object",
"required": [
"$exists"
],
"properties": {
"$exists": {
"type": "boolean"
}
},
"additionalProperties": false
},
{
"type": "object",
"required": [
"time"
],
"properties": {
"time": {
"type": "object",
"required": [
"$gte",
"$lte"
],
"properties": {
"$gte": {
"type": "string",
"description": "ISO date or datetime, or a relative date expression such as now(), -30d, +7d, or startOfMonth."
},
"$lte": {
"type": "string",
"description": "ISO date or datetime, or a relative date expression such as now(), -30d, +7d, or startOfMonth."
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
]
},
"nextActivity": {
"anyOf": [
{
"type": "object",
"required": [
"$exists"
],
"properties": {
"$exists": {
"type": "boolean"
}
},
"description": "Whether the next activity exists",
"additionalProperties": false
},
{
"type": "object",
"required": [
"time"
],
"properties": {
"time": {
"type": "object",
"required": [
"$gte",
"$lte"
],
"properties": {
"$gte": {
"type": "string",
"description": "ISO date or datetime, or a relative date expression such as now(), -30d, +7d, or startOfMonth."
},
"$lte": {
"type": "string",
"description": "ISO date or datetime, or a relative date expression such as now(), -30d, +7d, or startOfMonth."
}
},
"additionalProperties": false
}
},
"description": "Filter by next activity time",
"additionalProperties": false
}
]
},
"returnColumns": {
"type": "object",
"required": [],
"properties": {
"custom": {
"type": "array",
"items": {
"type": "string",
"format": "uuid",
"description": "Custom column ID"
}
},
"system": {
"type": "array",
"items": {
"enum": [
"id",
"name",
"domain",
"domains",
"description",
"linkedin",
"location",
"ownerIds",
"listIds"
],
"type": "string"
},
"description": "Only these top-level company fields are returned; id is always included."
},
"relations": {
"type": "array",
"items": {
"enum": [
"lastActivity",
"nextActivity",
"contacts",
"deals"
],
"type": "string"
},
"description": "Optional compact relation summaries only: contacts/deals return id and name; lastActivity/nextActivity return id, name, time, and type."
}
},
"description": "Exact response projection. Omit only when the standard company summary is needed; otherwise request the minimum system fields and relations needed for the answer.",
"additionalProperties": false
},
"fieldChangedAt": {
"type": "object",
"required": [
"field"
],
"properties": {
"after": {
"type": "string",
"description": "Match changes at or after this ISO date or datetime"
},
"field": {
"type": "string",
"description": "Field that changed. One of: name, ownerIds, isChurned, or \"custom.<columnId>\" for a custom property."
},
"before": {
"type": "string",
"description": "Match changes at or before this ISO date or datetime"
}
},
"description": "Filter to records where a specific field was changed (an update, not the initial set at creation) within a period. Only changelog-tracked fields are supported.",
"additionalProperties": false
}
},
"additionalProperties": false
},
"annotations": {
"title": "Find companies",
"readOnlyHint": true,
"openWorldHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description92/100
Create one new company (account/organization). Requires a name and domain, plus optional description, LinkedIn, location, owners, lists, parent company, custom properties. Check find_companies or known context for an existing match by name/domain first and reuse it for requested contact/deal links. Create a missing company when the user's request implies it and provides enough details; ask for missing required details rather than inventing them. Resolve a requested parent company to its UUID. Refuses to create a company whose domain an existing company already uses, or whose name matches an existing company, and names that company: link to it instead. Pass distinctFromCompanyIds only after the user confirms a name match is a different organization. Creates a single record; does not search, list, or edit existing companies. Creates one record per call.
The description explains the capability, when to use it, and what to expect.
Inputs75/100
13 of 15 inputs have descriptions. Add descriptions to the missing inputs, including where to obtain IDs and how to supply values.
name
Company name
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
domain
Company primary domain
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
domains
Every domain the company owns, primary first. Replaces the whole set: to add a domain, pass the existing domains plus the new one; leave the current primary in the list to keep it, or set domain to choose a different primary.
Clear enough to supply this argument.
description
Short description of what the company does
Clear enough to supply this argument.
linkedin
Company LinkedIn handle, e.g. acme-corporation
Clear enough to supply this argument.
location › oneOf › 1 › city
City name (e.g. Berlin, London)
Clear enough to supply this argument.
location › oneOf › 1 › state
State or region (e.g. California, Bavaria)
Clear enough to supply this argument.
location › oneOf › 1 › country
Country name (e.g. Germany, United Kingdom, Finland)
Clear enough to supply this argument.
location › oneOf › 1 › continent
Continent (e.g. Europe, North America)
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
listIds
Not provided
Missing description. Explain what this value means and how to supply it.
ownerIds
Not provided
Missing description. Explain what this value means and how to supply it.
parentCompanyId
Parent company ID for subsidiary relationships
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
content
Sticky note content (markdown)
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
custom
Map raw custom property UUIDs to values to write. Do not wrap UUID keys in literal quote characters. Use find_custom_properties first to discover valid custom property IDs for this workspace.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
distinctFromCompanyIds
IDs of existing companies with a matching name that the user confirmed are different organizations. Never use it to bypass a shared domain.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "add_company",
"title": "Add company",
"description": "Create one new company (account/organization). Requires a name and domain, plus optional description, LinkedIn, location, owners, lists, parent company, custom properties. Check find_companies or known context for an existing match by name/domain first and reuse it for requested contact/deal links. Create a missing company when the user's request implies it and provides enough details; ask for missing required details rather than inventing them. Resolve a requested parent company to its UUID. Refuses to create a company whose domain an existing company already uses, or whose name matches an existing company, and names that company: link to it instead. Pass distinctFromCompanyIds only after the user confirms a name match is a different organization. Creates a single record; does not search, list, or edit existing companies. Creates one record per call.",
"inputSchema": {
"type": "object",
"required": [
"name",
"domain"
],
"properties": {
"name": {
"type": "string",
"description": "Company name"
},
"custom": {
"type": "object",
"description": "Map raw custom property UUIDs to values to write. Do not wrap UUID keys in literal quote characters. Use find_custom_properties first to discover valid custom property IDs for this workspace.",
"propertyNames": {
"type": "string",
"format": "uuid"
},
"additionalProperties": {
"anyOf": [
{
"type": "string"
},
{
"type": "number"
},
{
"type": "boolean"
},
{
"type": "array",
"items": {
"anyOf": [
{
"type": "string"
},
{
"type": "number"
},
{
"type": "boolean"
}
]
}
},
{
"type": "object",
"additionalProperties": true
}
],
"description": "Custom property write value. Each custom[columnId] should be the value to store for that column. Use find_custom_properties first to look up the property ID, type, and options. Shapes by type: text/link/email/phone a string (link keeps what you pass; https:// is added at render time), richtext a markdown string, number/currency a number, percentage a 0-1 fraction, rating a whole number 0-5 (0 clears the rating and renders as no stars), boolean a boolean, date YYYY-MM-DD, timestamp an ISO 8601 datetime, select an option key, multiselect an array of option keys, company/contact/deal/user a record UUID, companies/contacts/deals/users an array of record UUIDs, location an object with city, state, country and/or continent (place-name strings are not geocoded here)."
}
},
"domain": {
"type": "string",
"description": "Company primary domain"
},
"content": {
"type": "string",
"description": "Sticky note content (markdown)"
},
"domains": {
"type": "array",
"items": {
"type": "string"
},
"description": "Every domain the company owns, primary first. Replaces the whole set: to add a domain, pass the existing domains plus the new one; leave the current primary in the list to keep it, or set domain to choose a different primary."
},
"listIds": {
"type": "array",
"items": {
"type": "string",
"format": "uuid",
"description": "List ID"
}
},
"linkedin": {
"type": "string",
"description": "Company LinkedIn handle, e.g. acme-corporation"
},
"location": {
"oneOf": [
{
"type": "string",
"description": "Free-text location to geocode (e.g. 'Berlin', 'United Kingdom', 'San Francisco, CA'). Resolved server-side via Google Maps."
},
{
"type": "object",
"properties": {
"city": {
"type": "string",
"description": "City name (e.g. Berlin, London)"
},
"state": {
"type": "string",
"description": "State or region (e.g. California, Bavaria)"
},
"country": {
"type": "string",
"description": "Country name (e.g. Germany, United Kingdom, Finland)"
},
"continent": {
"enum": [
"Africa",
"Antarctica",
"Asia",
"Europe",
"North America",
"Oceania",
"South America"
],
"type": "string",
"description": "Continent (e.g. Europe, North America)"
}
},
"description": "Structured location — pass known fields directly without geocoding. Use this when the model already knows the city/country.",
"additionalProperties": false
}
]
},
"ownerIds": {
"type": "array",
"items": {
"type": "string",
"format": "uuid",
"description": "Owner User ID"
}
},
"description": {
"type": "string",
"description": "Short description of what the company does"
},
"parentCompanyId": {
"type": "string",
"format": "uuid",
"description": "Parent company ID for subsidiary relationships"
},
"distinctFromCompanyIds": {
"type": "array",
"items": {
"type": "string",
"format": "uuid"
},
"description": "IDs of existing companies with a matching name that the user confirmed are different organizations. Never use it to bypass a shared domain."
}
},
"additionalProperties": false
},
"annotations": {
"title": "Add company",
"readOnlyHint": false,
"openWorldHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description87/100
Update one existing company by ID. Change fields on a single company you already have the ID for — name, domain, description, location, LinkedIn, owners, lists, parent, custom properties. Modifies one record; does not search, list, or create. Requires the company's ID. Updates one record per call.
The description explains the capability, when to use it, and what to expect.
Inputs80/100
13 of 15 inputs have descriptions. Add descriptions to the missing inputs, including where to obtain IDs and how to supply values.
id
Company ID
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
name
Company name
Clear enough to supply this argument.
domain
Company primary domain
Clear enough to supply this argument.
domains
Every domain the company owns, primary first. Replaces the whole set: to add a domain, pass the existing domains plus the new one; leave the current primary in the list to keep it, or set domain to choose a different primary.
Clear enough to supply this argument.
description
Short description of what the company does
Clear enough to supply this argument.
linkedin
Company LinkedIn handle, e.g. acme-corporation
Clear enough to supply this argument.
location › oneOf › 1 › city
City name (e.g. Berlin, London)
Clear enough to supply this argument.
location › oneOf › 1 › state
State or region (e.g. California, Bavaria)
Clear enough to supply this argument.
location › oneOf › 1 › country
Country name (e.g. Germany, United Kingdom, Finland)
Clear enough to supply this argument.
location › oneOf › 1 › continent
Continent (e.g. Europe, North America)
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
listIds
Not provided
Missing description. Explain what this value means and how to supply it.
ownerIds
Not provided
Missing description. Explain what this value means and how to supply it.
parentCompanyId
Parent company ID for subsidiary relationships
Clear enough to supply this argument.
content
Sticky note content (markdown)
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
custom
Map raw custom property UUIDs to values to write. Do not wrap UUID keys in literal quote characters. Use find_custom_properties first to discover valid custom property IDs for this workspace.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "edit_company",
"title": "Edit company",
"description": "Update one existing company by ID. Change fields on a single company you already have the ID for — name, domain, description, location, LinkedIn, owners, lists, parent, custom properties. Modifies one record; does not search, list, or create. Requires the company's ID. Updates one record per call.",
"inputSchema": {
"type": "object",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"format": "uuid",
"description": "Company ID"
},
"name": {
"type": "string",
"description": "Company name"
},
"custom": {
"type": "object",
"description": "Map raw custom property UUIDs to values to write. Do not wrap UUID keys in literal quote characters. Use find_custom_properties first to discover valid custom property IDs for this workspace.",
"propertyNames": {
"type": "string",
"format": "uuid"
},
"additionalProperties": {
"anyOf": [
{
"type": "string"
},
{
"type": "number"
},
{
"type": "boolean"
},
{
"type": "array",
"items": {
"anyOf": [
{
"type": "string"
},
{
"type": "number"
},
{
"type": "boolean"
}
]
}
},
{
"type": "object",
"additionalProperties": true
}
],
"description": "Custom property write value. Each custom[columnId] should be the value to store for that column. Use find_custom_properties first to look up the property ID, type, and options. Shapes by type: text/link/email/phone a string (link keeps what you pass; https:// is added at render time), richtext a markdown string, number/currency a number, percentage a 0-1 fraction, rating a whole number 0-5 (0 clears the rating and renders as no stars), boolean a boolean, date YYYY-MM-DD, timestamp an ISO 8601 datetime, select an option key, multiselect an array of option keys, company/contact/deal/user a record UUID, companies/contacts/deals/users an array of record UUIDs, location an object with city, state, country and/or continent (place-name strings are not geocoded here)."
}
},
"domain": {
"type": "string",
"description": "Company primary domain"
},
"content": {
"type": "string",
"description": "Sticky note content (markdown)"
},
"domains": {
"type": "array",
"items": {
"type": "string"
},
"description": "Every domain the company owns, primary first. Replaces the whole set: to add a domain, pass the existing domains plus the new one; leave the current primary in the list to keep it, or set domain to choose a different primary."
},
"listIds": {
"type": "array",
"items": {
"type": "string",
"format": "uuid",
"description": "List ID"
}
},
"linkedin": {
"type": "string",
"description": "Company LinkedIn handle, e.g. acme-corporation"
},
"location": {
"oneOf": [
{
"type": "string",
"description": "Free-text location to geocode (e.g. 'Berlin', 'United Kingdom', 'San Francisco, CA'). Resolved server-side via Google Maps."
},
{
"type": "object",
"properties": {
"city": {
"type": "string",
"description": "City name (e.g. Berlin, London)"
},
"state": {
"type": "string",
"description": "State or region (e.g. California, Bavaria)"
},
"country": {
"type": "string",
"description": "Country name (e.g. Germany, United Kingdom, Finland)"
},
"continent": {
"enum": [
"Africa",
"Antarctica",
"Asia",
"Europe",
"North America",
"Oceania",
"South America"
],
"type": "string",
"description": "Continent (e.g. Europe, North America)"
}
},
"description": "Structured location — pass known fields directly without geocoding. Use this when the model already knows the city/country.",
"additionalProperties": false
}
]
},
"ownerIds": {
"type": "array",
"items": {
"type": "string",
"format": "uuid",
"description": "Owner User ID"
}
},
"description": {
"type": "string",
"description": "Short description of what the company does"
},
"parentCompanyId": {
"type": "string",
"format": "uuid",
"description": "Parent company ID for subsidiary relationships"
}
},
"additionalProperties": false
},
"annotations": {
"title": "Edit company",
"readOnlyHint": false,
"openWorldHint": false,
"destructiveHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description76/100
Bulk-add companies to a list. Pass listId plus either companyIds or resultSetId from find_companies or import_lead_search_results (never both).
The description explains the capability, when to use it, and what to expect.
Inputs75/100
Explain the meaning of this value, not just its name.
listId
List ID
Explain the meaning of this value, not just its name.
companyIds
Company IDs. Or omit this and pass resultSetId from find_companies.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
resultSetId
resultSetId returned by a find_* call (or contactResultSetId / companyResultSetId from import_lead_search_results). Targets every record that call matched (its resultSetCount, up to 10,000), not just the rows shown. Use instead of copying IDs; never combine with an explicit ID array.
Clear enough to supply this argument.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "add_companies_to_list",
"title": "Add companies to list",
"description": "Bulk-add companies to a list. Pass listId plus either companyIds or resultSetId from find_companies or import_lead_search_results (never both).",
"inputSchema": {
"type": "object",
"required": [
"listId"
],
"properties": {
"listId": {
"type": "string",
"format": "uuid",
"description": "List ID"
},
"companyIds": {
"type": "array",
"items": {
"type": "string",
"format": "uuid",
"description": "Company ID"
},
"description": "Company IDs. Or omit this and pass resultSetId from find_companies."
},
"resultSetId": {
"type": "string",
"format": "uuid",
"description": "resultSetId returned by a find_* call (or contactResultSetId / companyResultSetId from import_lead_search_results). Targets every record that call matched (its resultSetCount, up to 10,000), not just the rows shown. Use instead of copying IDs; never combine with an explicit ID array."
}
},
"additionalProperties": false
},
"annotations": {
"title": "Add companies to list",
"readOnlyHint": false,
"openWorldHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description75/100
Bulk-remove companies from a list. Pass listId plus either companyIds or resultSetId from find_companies (never both).
Explain mutations, irreversible effects, or prerequisites that matter before calling this tool.
Inputs83/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
listId
List ID
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
companyIds
Company IDs. Or omit this and pass resultSetId from find_companies.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
resultSetId
resultSetId returned by a find_* call (or contactResultSetId / companyResultSetId from import_lead_search_results). Targets every record that call matched (its resultSetCount, up to 10,000), not just the rows shown. Use instead of copying IDs; never combine with an explicit ID array.
Clear enough to supply this argument.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "remove_companies_from_list",
"title": "Remove companies from list",
"description": "Bulk-remove companies from a list. Pass listId plus either companyIds or resultSetId from find_companies (never both).",
"inputSchema": {
"type": "object",
"required": [
"listId"
],
"properties": {
"listId": {
"type": "string",
"format": "uuid",
"description": "List ID"
},
"companyIds": {
"type": "array",
"items": {
"type": "string",
"format": "uuid",
"description": "Company ID"
},
"description": "Company IDs. Or omit this and pass resultSetId from find_companies."
},
"resultSetId": {
"type": "string",
"format": "uuid",
"description": "resultSetId returned by a find_* call (or contactResultSetId / companyResultSetId from import_lead_search_results). Targets every record that call matched (its resultSetCount, up to 10,000), not just the rows shown. Use instead of copying IDs; never combine with an explicit ID array."
}
},
"additionalProperties": false
},
"annotations": {
"title": "Remove companies from list",
"readOnlyHint": false,
"openWorldHint": false,
"destructiveHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description76/100
Archive (soft-delete) companies in bulk. Pass either companyIds or resultSetId from find_companies (never both).
Explain mutations, irreversible effects, or prerequisites that matter before calling this tool.
Inputs88/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
companyIds
Company IDs. Or omit this and pass resultSetId from find_companies.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
resultSetId
resultSetId returned by a find_* call (or contactResultSetId / companyResultSetId from import_lead_search_results). Targets every record that call matched (its resultSetCount, up to 10,000), not just the rows shown. Use instead of copying IDs; never combine with an explicit ID array.
Clear enough to supply this argument.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "archive_companies",
"title": "Archive companies",
"description": "Archive (soft-delete) companies in bulk. Pass either companyIds or resultSetId from find_companies (never both).",
"inputSchema": {
"type": "object",
"required": [],
"properties": {
"companyIds": {
"type": "array",
"items": {
"type": "string",
"format": "uuid",
"description": "Company ID"
},
"description": "Company IDs. Or omit this and pass resultSetId from find_companies."
},
"resultSetId": {
"type": "string",
"format": "uuid",
"description": "resultSetId returned by a find_* call (or contactResultSetId / companyResultSetId from import_lead_search_results). Targets every record that call matched (its resultSetCount, up to 10,000), not just the rows shown. Use instead of copying IDs; never combine with an explicit ID array."
}
},
"additionalProperties": false
},
"annotations": {
"title": "Archive companies",
"readOnlyHint": false,
"openWorldHint": false,
"destructiveHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description99/100
In Chat, matching rows may include connectedSlackChannels from a direct contact association or the contact's company. Search, find, or filter contacts (people, leads, prospects) by name, email, phone, title, company, location, LinkedIn, list, owner, or global messaging suppression. Each standard row includes email (the primary address), emails (every address the contact can be reached at, primary first), emailVerified, emailVerifiedAt, unsubscribedFromAllMessaging, and unsubscribedFromAllMessagingAt. emailVerified describes the primary address only: true means it was verified, false means it failed verification, and null means it is unverified. Secondary addresses in emails carry no verification state and are always treated as unverified when sending. unsubscribedFromAllMessaging is the system-wide opt-out flag, not a custom property. Returns { resultSetId, total, rows } — use total for counts, rows for data; pass resultSetId to add_contacts_to_list, remove_contacts_from_list, archive_contacts, or sequence audience tools instead of copying IDs. It covers every matching record (resultSetCount, up to 10,000); rows is a 5 row sample when more matched, so use query_result_set to read more, narrow, or project fields, and pass resultSetId to bulk tools to act on all matches. For list membership pass listIds only; add viewId to query a specific dynamic list view (get_list.views). Do not copy get_list filters. Use listIds for OR, allListIds for AND. Use returnColumns.system to request only the contact fields needed. Request relations only when their compact summaries are needed: company and deals return id/name; activities return id/name/time/type. Use the relevant find tool for richer related-record data. Max 500 results per page.
The description explains the capability, when to use it, and what to expect.
Inputs78/100
27 of 28 inputs have descriptions. Add descriptions to the missing inputs, including where to obtain IDs and how to supply values.
id
Contact ID
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
name
Contact name (substring match)
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
email
Contact email (substring match against the primary address and every secondary address)
Clear enough to supply this argument.
title
Contact title (substring match)
Clear enough to supply this argument.
location › oneOf › 1 › city
City name (e.g. Berlin, London)
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
location › oneOf › 1 › state
State or region (e.g. California, Bavaria)
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
location › oneOf › 1 › country
Country name (e.g. Germany, United Kingdom, Finland)
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
location › oneOf › 1 › continent
Continent (e.g. Europe, North America)
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
linkedin
Contact LinkedIn handle, e.g. johndoe
Clear enough to supply this argument.
companyId
Filter by one company UUID or an array of company UUIDs (matches any).
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
listIds
Query records in any of these lists. Pass the list UUID only — the tool resolves dynamic lists (filterBased: true) from saved view filters automatically. Omit viewId to use the list default view; pass viewId (from get_list.views) to query a specific named view. Do not copy resolvedFilters from get_list into other find fields.
Clear enough to supply this argument.
allListIds
Records must match ALL of these lists (AND). Pass list UUIDs only — dynamic lists resolve from view filters the same way as listIds. Use listIds for OR.
Clear enough to supply this argument.
viewId
Optional view ID for a single list query. Defaults to the list's default view for its entity. On a dynamic list it selects that view's filters; on a regular list it narrows the membership to the view's saved filters. Call get_list to list views (id, name, entity). Use when the user names a specific view — each view can return different records.
Clear enough to supply this argument.
ownerIds
Belongs to any of these Owner User IDs: - db54dbf6-1249-418f-b3a1-7551588afc65: Tuomo Riekki ([email protected])
- 0cfdbed4-6b6d-4731-ac4d-d5c2f7fa41ee: Santtu Koivumäki ([email protected])
- 7dc63d26-8fd7-46c1-8ccf-f6611426532a: Niko Salkola ([email protected])
- 996e1a22-7cc5-462a-b3f0-e2bf69aad8ec: Santtu Koivumäki ([email protected])
- 36274288-9ff8-4ab9-9495-3b859c880aeb: Philip Ziegler ([email protected])
- 950e005a-0201-425a-b5bf-274446f39d40: Chandrasekhar Iyengar ([email protected])
- 8ad43fff-3cd6-4d46-8c53-53175706c900: Sergey Ushakov ([email protected])
- ad5a11e9-9434-407d-885b-58541032fcf3: Mariia Nedelkina ([email protected])
- 8b4032db-404c-46e4-9dcc-20e6851c9cb5: Olli Jokinen ([email protected])
- 09a4a339-91f7-4caa-8084-6dc0ff7fb6c7: Markus Vapaavuori ([email protected])
- 5d313045-1fe5-47a3-bd1a-d483f22721c5: Janne Sarja ([email protected])
- fcfdb1a0-00a2-4f3d-9e0f-6efd1808ebb5: Daniel Gregorio Cardil ([email protected])
- 4c0510ac-2047-4ce1-8677-bebc0ad6a7eb: Taru Heikinniemi ([email protected])
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
createdAt › $gte
ISO date or datetime, or a relative date expression such as now(), -30d, +7d, or startOfMonth.
Clear enough to supply this argument.
createdAt › $lte
ISO date or datetime, or a relative date expression such as now(), -30d, +7d, or startOfMonth.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
unsubscribedFromAllMessaging
Filter by the system-wide outbound messaging suppression flag.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
fieldChangedAt › field
Field that changed. One of: name, ownerIds, email, emails, title, linkedin, or "custom.<columnId>" for a custom property.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
fieldChangedAt › after
Match changes at or after this ISO date or datetime
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
fieldChangedAt › before
Match changes at or before this ISO date or datetime
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
offset
Offset
Explain the meaning of this value, not just its name.
limit
Limit
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
orderBy › column
Column to order by
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
orderBy › direction
Direction to order by
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
custom
Custom property filters. Keys must be raw column UUIDs from get_workspace_metadata — never column names or UUIDs wrapped in literal quote characters. For select/multiselect filters, use options[].key UUIDs in values, not option names.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
returnColumns › system
Only these top-level contact fields are returned; id is always included.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
returnColumns › custom
Not provided
Missing description. Explain what this value means and how to supply it.
returnColumns › relations
Optional compact relation summaries only: company/deals return id and name; lastActivity/nextActivity return id, name, time, and type.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "find_contacts",
"title": "Find contacts",
"description": "In Chat, matching rows may include connectedSlackChannels from a direct contact association or the contact's company. Search, find, or filter contacts (people, leads, prospects) by name, email, phone, title, company, location, LinkedIn, list, owner, or global messaging suppression. Each standard row includes email (the primary address), emails (every address the contact can be reached at, primary first), emailVerified, emailVerifiedAt, unsubscribedFromAllMessaging, and unsubscribedFromAllMessagingAt. emailVerified describes the primary address only: true means it was verified, false means it failed verification, and null means it is unverified. Secondary addresses in emails carry no verification state and are always treated as unverified when sending. unsubscribedFromAllMessaging is the system-wide opt-out flag, not a custom property. Returns { resultSetId, total, rows } — use total for counts, rows for data; pass resultSetId to add_contacts_to_list, remove_contacts_from_list, archive_contacts, or sequence audience tools instead of copying IDs. It covers every matching record (resultSetCount, up to 10,000); rows is a 5 row sample when more matched, so use query_result_set to read more, narrow, or project fields, and pass resultSetId to bulk tools to act on all matches. For list membership pass listIds only; add viewId to query a specific dynamic list view (get_list.views). Do not copy get_list filters. Use listIds for OR, allListIds for AND. Use returnColumns.system to request only the contact fields needed. Request relations only when their compact summaries are needed: company and deals return id/name; activities return id/name/time/type. Use the relevant find tool for richer related-record data. Max 500 results per page.",
"inputSchema": {
"type": "object",
"required": [],
"properties": {
"id": {
"type": "string",
"description": "Contact ID"
},
"name": {
"type": "string",
"description": "Contact name (substring match)"
},
"email": {
"type": "string",
"description": "Contact email (substring match against the primary address and every secondary address)"
},
"limit": {
"type": "number",
"description": "Limit"
},
"title": {
"type": "string",
"description": "Contact title (substring match)"
},
"custom": {
"type": "object",
"description": "Custom property filters. Keys must be raw column UUIDs from get_workspace_metadata — never column names or UUIDs wrapped in literal quote characters. For select/multiselect filters, use options[].key UUIDs in values, not option names.",
"propertyNames": {
"type": "string",
"format": "uuid",
"description": "Custom column UUID from get_workspace_metadata."
},
"additionalProperties": {
"anyOf": [
{
"type": "string"
},
{
"type": "number"
},
{
"type": "boolean"
},
{
"type": "array",
"items": {
"anyOf": [
{
"type": "string"
},
{
"type": "number"
},
{
"type": "boolean"
}
]
}
},
{
"type": "object",
"additionalProperties": true
}
],
"description": "Custom property filter value. Each custom[columnId] may be either a direct value or an operator object such as {$in: [...]}, {$gte: ...}, {$lte: ...}, {$contains: ...}, {$overlaps: [...]}. Use get_workspace_metadata first to look up the property ID, type, options, and filterSchema."
}
},
"offset": {
"type": "number",
"description": "Offset"
},
"viewId": {
"type": "string",
"format": "uuid",
"description": "Optional view ID for a single list query. Defaults to the list's default view for its entity. On a dynamic list it selects that view's filters; on a regular list it narrows the membership to the view's saved filters. Call get_list to list views (id, name, entity). Use when the user names a specific view — each view can return different records."
},
"listIds": {
"type": "array",
"items": {
"type": "string",
"format": "uuid",
"description": "List ID"
},
"description": "Query records in any of these lists. Pass the list UUID only — the tool resolves dynamic lists (filterBased: true) from saved view filters automatically. Omit viewId to use the list default view; pass viewId (from get_list.views) to query a specific named view. Do not copy resolvedFilters from get_list into other find fields."
},
"orderBy": {
"type": "object",
"required": [],
"properties": {
"column": {
"enum": [
"id",
"createdAt",
"updatedAt",
"name"
],
"type": "string",
"description": "Column to order by"
},
"direction": {
"enum": [
"asc",
"desc"
],
"type": "string",
"description": "Direction to order by"
}
},
"additionalProperties": false
},
"linkedin": {
"type": "string",
"description": "Contact LinkedIn handle, e.g. johndoe"
},
"location": {
"oneOf": [
{
"type": "string",
"description": "Free-text location to geocode (e.g. 'Berlin', 'United Kingdom', 'San Francisco, CA'). Resolved server-side via Google Maps."
},
{
"type": "object",
"properties": {
"city": {
"type": "string",
"description": "City name (e.g. Berlin, London)"
},
"state": {
"type": "string",
"description": "State or region (e.g. California, Bavaria)"
},
"country": {
"type": "string",
"description": "Country name (e.g. Germany, United Kingdom, Finland)"
},
"continent": {
"enum": [
"Africa",
"Antarctica",
"Asia",
"Europe",
"North America",
"Oceania",
"South America"
],
"type": "string",
"description": "Continent (e.g. Europe, North America)"
}
},
"description": "Structured location — pass known fields directly without geocoding. Use this when the model already knows the city/country.",
"additionalProperties": false
}
]
},
"ownerIds": {
"type": "array",
"items": {
"enum": [
"db54dbf6-1249-418f-b3a1-7551588afc65",
"0cfdbed4-6b6d-4731-ac4d-d5c2f7fa41ee",
"7dc63d26-8fd7-46c1-8ccf-f6611426532a",
"996e1a22-7cc5-462a-b3f0-e2bf69aad8ec",
"36274288-9ff8-4ab9-9495-3b859c880aeb",
"950e005a-0201-425a-b5bf-274446f39d40",
"8ad43fff-3cd6-4d46-8c53-53175706c900",
"ad5a11e9-9434-407d-885b-58541032fcf3",
"8b4032db-404c-46e4-9dcc-20e6851c9cb5",
"09a4a339-91f7-4caa-8084-6dc0ff7fb6c7",
"5d313045-1fe5-47a3-bd1a-d483f22721c5",
"fcfdb1a0-00a2-4f3d-9e0f-6efd1808ebb5",
"4c0510ac-2047-4ce1-8677-bebc0ad6a7eb"
],
"type": "string",
"format": "uuid"
},
"description": "Belongs to any of these Owner User IDs: - db54dbf6-1249-418f-b3a1-7551588afc65: Tuomo Riekki ([email protected])\n- 0cfdbed4-6b6d-4731-ac4d-d5c2f7fa41ee: Santtu Koivumäki ([email protected])\n- 7dc63d26-8fd7-46c1-8ccf-f6611426532a: Niko Salkola ([email protected])\n- 996e1a22-7cc5-462a-b3f0-e2bf69aad8ec: Santtu Koivumäki ([email protected])\n- 36274288-9ff8-4ab9-9495-3b859c880aeb: Philip Ziegler ([email protected])\n- 950e005a-0201-425a-b5bf-274446f39d40: Chandrasekhar Iyengar ([email protected])\n- 8ad43fff-3cd6-4d46-8c53-53175706c900: Sergey Ushakov ([email protected])\n- ad5a11e9-9434-407d-885b-58541032fcf3: Mariia Nedelkina ([email protected])\n- 8b4032db-404c-46e4-9dcc-20e6851c9cb5: Olli Jokinen ([email protected])\n- 09a4a339-91f7-4caa-8084-6dc0ff7fb6c7: Markus Vapaavuori ([email protected])\n- 5d313045-1fe5-47a3-bd1a-d483f22721c5: Janne Sarja ([email protected])\n- fcfdb1a0-00a2-4f3d-9e0f-6efd1808ebb5: Daniel Gregorio Cardil ([email protected])\n- 4c0510ac-2047-4ce1-8677-bebc0ad6a7eb: Taru Heikinniemi ([email protected])"
},
"companyId": {
"anyOf": [
{
"type": "string",
"format": "uuid"
},
{
"type": "array",
"items": {
"type": "string",
"format": "uuid"
}
}
],
"description": "Filter by one company UUID or an array of company UUIDs (matches any)."
},
"createdAt": {
"type": "object",
"required": [],
"properties": {
"$gte": {
"type": "string",
"description": "ISO date or datetime, or a relative date expression such as now(), -30d, +7d, or startOfMonth."
},
"$lte": {
"type": "string",
"description": "ISO date or datetime, or a relative date expression such as now(), -30d, +7d, or startOfMonth."
}
},
"additionalProperties": false
},
"allListIds": {
"type": "array",
"items": {
"type": "string",
"format": "uuid"
},
"description": "Records must match ALL of these lists (AND). Pass list UUIDs only — dynamic lists resolve from view filters the same way as listIds. Use listIds for OR."
},
"returnColumns": {
"type": "object",
"properties": {
"custom": {
"type": "array",
"items": {
"type": "string",
"format": "uuid",
"description": "Custom column ID"
}
},
"system": {
"type": "array",
"items": {
"enum": [
"id",
"name",
"email",
"emails",
"emailVerified",
"emailVerifiedAt",
"phone",
"linkedin",
"title",
"companyId",
"location",
"ownerIds",
"listIds",
"unsubscribedFromAllMessaging",
"unsubscribedFromAllMessagingAt"
],
"type": "string"
},
"description": "Only these top-level contact fields are returned; id is always included."
},
"relations": {
"type": "array",
"items": {
"enum": [
"lastActivity",
"nextActivity",
"company",
"deals"
],
"type": "string"
},
"description": "Optional compact relation summaries only: company/deals return id and name; lastActivity/nextActivity return id, name, time, and type."
}
},
"description": "Exact response projection. Omit only when the standard contact summary is needed; otherwise request the minimum system fields and relations needed for the answer."
},
"fieldChangedAt": {
"type": "object",
"required": [
"field"
],
"properties": {
"after": {
"type": "string",
"description": "Match changes at or after this ISO date or datetime"
},
"field": {
"type": "string",
"description": "Field that changed. One of: name, ownerIds, email, emails, title, linkedin, or \"custom.<columnId>\" for a custom property."
},
"before": {
"type": "string",
"description": "Match changes at or before this ISO date or datetime"
}
},
"description": "Filter to records where a specific field was changed (an update, not the initial set at creation) within a period. Only changelog-tracked fields are supported.",
"additionalProperties": false
},
"unsubscribedFromAllMessaging": {
"type": "boolean",
"description": "Filter by the system-wide outbound messaging suppression flag."
}
},
"additionalProperties": false
},
"annotations": {
"title": "Find contacts",
"readOnlyHint": true,
"openWorldHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description86/100
Add a new contact (person). Requires name. Include email and/or LinkedIn for enrichment. These may link an existing company or create one from a known company profile; otherwise the contact stays unlinked. Pass emails when the person has several addresses; the first one becomes the primary unless email is also set. When the user names or clearly implies a company, resolve it with find_companies or known context and set its UUID instead of relying on enrichment. If no match exists, create the company when the request implies creation and supplies its name/domain; otherwise ask a focused question. Omit companyId only when no company was identified; never silently drop a requested association or use placeholder IDs. Also optional: phone, title, location, owners, lists, custom properties. Creates one record per call.
Describe the returned information so the agent knows whether it will answer the request.
Inputs77/100
13 of 15 inputs have descriptions. Add descriptions to the missing inputs, including where to obtain IDs and how to supply values.
name
Contact name
Clear enough to supply this argument.
email
Contact primary email. Strongly recommended for enrichment and automatic company linking.
Clear enough to supply this argument.
emails
Every address the contact can be reached at, primary first. Replaces the whole set: to add an address, pass the existing emails plus the new one; leave the current primary in the list to keep it, or set email to choose a different primary.
Clear enough to supply this argument.
phone
Contact phone number
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
linkedin
Contact LinkedIn handle, e.g. johndoe. Strongly recommended for enrichment and automatic company linking.
Clear enough to supply this argument.
title
Contact title
Explain the meaning of this value, not just its name.
location › oneOf › 1 › city
City name (e.g. Berlin, London)
Clear enough to supply this argument.
location › oneOf › 1 › state
State or region (e.g. California, Bavaria)
Clear enough to supply this argument.
location › oneOf › 1 › country
Country name (e.g. Germany, United Kingdom, Finland)
Clear enough to supply this argument.
location › oneOf › 1 › continent
Continent (e.g. Europe, North America)
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
companyId
Company UUID from find_companies, add_company, or record context. Resolve a company named or implied by the request; omit only when no company was identified. Never use placeholders.
Clear enough to supply this argument.
ownerIds
Not provided
Missing description. Explain what this value means and how to supply it.
listIds
Not provided
Missing description. Explain what this value means and how to supply it.
content
Sticky note content (markdown)
Clear enough to supply this argument.
custom
Map raw custom property UUIDs to values to write. Do not wrap UUID keys in literal quote characters. Use find_custom_properties first to discover valid custom property IDs for this workspace.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "add_contact",
"title": "Add contact",
"description": "Add a new contact (person). Requires name. Include email and/or LinkedIn for enrichment. These may link an existing company or create one from a known company profile; otherwise the contact stays unlinked. Pass emails when the person has several addresses; the first one becomes the primary unless email is also set. When the user names or clearly implies a company, resolve it with find_companies or known context and set its UUID instead of relying on enrichment. If no match exists, create the company when the request implies creation and supplies its name/domain; otherwise ask a focused question. Omit companyId only when no company was identified; never silently drop a requested association or use placeholder IDs. Also optional: phone, title, location, owners, lists, custom properties. Creates one record per call.",
"inputSchema": {
"type": "object",
"required": [
"name"
],
"properties": {
"name": {
"type": "string",
"description": "Contact name"
},
"email": {
"type": "string",
"description": "Contact primary email. Strongly recommended for enrichment and automatic company linking."
},
"phone": {
"type": "string",
"description": "Contact phone number"
},
"title": {
"type": "string",
"description": "Contact title"
},
"custom": {
"type": "object",
"description": "Map raw custom property UUIDs to values to write. Do not wrap UUID keys in literal quote characters. Use find_custom_properties first to discover valid custom property IDs for this workspace.",
"propertyNames": {
"type": "string",
"format": "uuid"
},
"additionalProperties": {
"anyOf": [
{
"type": "string"
},
{
"type": "number"
},
{
"type": "boolean"
},
{
"type": "array",
"items": {
"anyOf": [
{
"type": "string"
},
{
"type": "number"
},
{
"type": "boolean"
}
]
}
},
{
"type": "object",
"additionalProperties": true
}
],
"description": "Custom property write value. Each custom[columnId] should be the value to store for that column. Use find_custom_properties first to look up the property ID, type, and options. Shapes by type: text/link/email/phone a string (link keeps what you pass; https:// is added at render time), richtext a markdown string, number/currency a number, percentage a 0-1 fraction, rating a whole number 0-5 (0 clears the rating and renders as no stars), boolean a boolean, date YYYY-MM-DD, timestamp an ISO 8601 datetime, select an option key, multiselect an array of option keys, company/contact/deal/user a record UUID, companies/contacts/deals/users an array of record UUIDs, location an object with city, state, country and/or continent (place-name strings are not geocoded here)."
}
},
"emails": {
"type": "array",
"items": {
"type": "string",
"format": "email"
},
"description": "Every address the contact can be reached at, primary first. Replaces the whole set: to add an address, pass the existing emails plus the new one; leave the current primary in the list to keep it, or set email to choose a different primary."
},
"content": {
"type": "string",
"description": "Sticky note content (markdown)"
},
"listIds": {
"type": "array",
"items": {
"type": "string",
"format": "uuid",
"description": "List ID"
}
},
"linkedin": {
"type": "string",
"description": "Contact LinkedIn handle, e.g. johndoe. Strongly recommended for enrichment and automatic company linking."
},
"location": {
"oneOf": [
{
"type": "string",
"description": "Free-text location to geocode (e.g. 'Berlin', 'United Kingdom', 'San Francisco, CA'). Resolved server-side via Google Maps."
},
{
"type": "object",
"properties": {
"city": {
"type": "string",
"description": "City name (e.g. Berlin, London)"
},
"state": {
"type": "string",
"description": "State or region (e.g. California, Bavaria)"
},
"country": {
"type": "string",
"description": "Country name (e.g. Germany, United Kingdom, Finland)"
},
"continent": {
"enum": [
"Africa",
"Antarctica",
"Asia",
"Europe",
"North America",
"Oceania",
"South America"
],
"type": "string",
"description": "Continent (e.g. Europe, North America)"
}
},
"description": "Structured location — pass known fields directly without geocoding. Use this when the model already knows the city/country.",
"additionalProperties": false
}
]
},
"ownerIds": {
"type": "array",
"items": {
"type": "string",
"format": "uuid",
"description": "Owner User ID"
}
},
"companyId": {
"type": "string",
"format": "uuid",
"description": "Company UUID from find_companies, add_company, or record context. Resolve a company named or implied by the request; omit only when no company was identified. Never use placeholders."
}
},
"additionalProperties": false
},
"annotations": {
"title": "Add contact",
"readOnlyHint": false,
"openWorldHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description81/100
Edit fields on an existing contact (name, email, emails, phone, LinkedIn, title, location, company, owners, lists, custom properties, unsubscribedFromAllMessaging). Setting email swaps the primary address and keeps the secondaries; setting emails replaces the whole address set, so to add or remove a secondary pass the full desired list.
Explain mutations, irreversible effects, or prerequisites that matter before calling this tool.
Inputs82/100
15 of 17 inputs have descriptions. Add descriptions to the missing inputs, including where to obtain IDs and how to supply values.
id
Contact ID
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
unsubscribedFromAllMessaging
unsubscribedFromAllMessaging is a system boolean field. Set true to globally suppress the contact, record the opt-out time, cancel active or pending sequence enrollments, and remove pending outreach. Set false only for an explicit resubscription request: clears the flag and timestamp without restarting cancelled sequences. Change it only when the user or configured agent instructions explicitly request that subscription change; removing a contact from one sequence does not imply a global opt-out. Omit to preserve the current preference.
Clear enough to supply this argument.
name
Contact name
Clear enough to supply this argument.
email
Contact primary email
Clear enough to supply this argument.
emails
Every address the contact can be reached at, primary first. Replaces the whole set: to add an address, pass the existing emails plus the new one; leave the current primary in the list to keep it, or set email to choose a different primary.
Clear enough to supply this argument.
phone
Contact phone number
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
linkedin
Contact LinkedIn handle, e.g. johndoe
Clear enough to supply this argument.
title
Contact title
Clear enough to supply this argument.
location › oneOf › 1 › city
City name (e.g. Berlin, London)
Clear enough to supply this argument.
location › oneOf › 1 › state
State or region (e.g. California, Bavaria)
Clear enough to supply this argument.
location › oneOf › 1 › country
Country name (e.g. Germany, United Kingdom, Finland)
Clear enough to supply this argument.
location › oneOf › 1 › continent
Continent (e.g. Europe, North America)
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
companyId
Existing company UUID from find_companies. Omit if unknown — do not use placeholders.
Clear enough to supply this argument.
listIds
Not provided
Missing description. Explain what this value means and how to supply it.
ownerIds
Not provided
Missing description. Explain what this value means and how to supply it.
content
Sticky note content (markdown)
Clear enough to supply this argument.
custom
Map raw custom property UUIDs to values to write. Do not wrap UUID keys in literal quote characters. Use find_custom_properties first to discover valid custom property IDs for this workspace.
Clear enough to supply this argument.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "edit_contact",
"title": "Edit contact",
"description": "Edit fields on an existing contact (name, email, emails, phone, LinkedIn, title, location, company, owners, lists, custom properties, unsubscribedFromAllMessaging). Setting email swaps the primary address and keeps the secondaries; setting emails replaces the whole address set, so to add or remove a secondary pass the full desired list.",
"inputSchema": {
"type": "object",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"format": "uuid",
"description": "Contact ID"
},
"name": {
"type": "string",
"description": "Contact name"
},
"email": {
"type": "string",
"description": "Contact primary email"
},
"phone": {
"type": "string",
"description": "Contact phone number"
},
"title": {
"type": "string",
"description": "Contact title"
},
"custom": {
"type": "object",
"description": "Map raw custom property UUIDs to values to write. Do not wrap UUID keys in literal quote characters. Use find_custom_properties first to discover valid custom property IDs for this workspace.",
"propertyNames": {
"type": "string",
"format": "uuid"
},
"additionalProperties": {
"anyOf": [
{
"type": "string"
},
{
"type": "number"
},
{
"type": "boolean"
},
{
"type": "array",
"items": {
"anyOf": [
{
"type": "string"
},
{
"type": "number"
},
{
"type": "boolean"
}
]
}
},
{
"type": "object",
"additionalProperties": true
}
],
"description": "Custom property write value. Each custom[columnId] should be the value to store for that column. Use find_custom_properties first to look up the property ID, type, and options. Shapes by type: text/link/email/phone a string (link keeps what you pass; https:// is added at render time), richtext a markdown string, number/currency a number, percentage a 0-1 fraction, rating a whole number 0-5 (0 clears the rating and renders as no stars), boolean a boolean, date YYYY-MM-DD, timestamp an ISO 8601 datetime, select an option key, multiselect an array of option keys, company/contact/deal/user a record UUID, companies/contacts/deals/users an array of record UUIDs, location an object with city, state, country and/or continent (place-name strings are not geocoded here)."
}
},
"emails": {
"type": "array",
"items": {
"type": "string",
"format": "email"
},
"description": "Every address the contact can be reached at, primary first. Replaces the whole set: to add an address, pass the existing emails plus the new one; leave the current primary in the list to keep it, or set email to choose a different primary."
},
"content": {
"type": "string",
"description": "Sticky note content (markdown)"
},
"listIds": {
"type": "array",
"items": {
"type": "string",
"format": "uuid",
"description": "List ID"
}
},
"linkedin": {
"type": "string",
"description": "Contact LinkedIn handle, e.g. johndoe"
},
"location": {
"oneOf": [
{
"type": "string",
"description": "Free-text location to geocode (e.g. 'Berlin', 'United Kingdom', 'San Francisco, CA'). Resolved server-side via Google Maps."
},
{
"type": "object",
"properties": {
"city": {
"type": "string",
"description": "City name (e.g. Berlin, London)"
},
"state": {
"type": "string",
"description": "State or region (e.g. California, Bavaria)"
},
"country": {
"type": "string",
"description": "Country name (e.g. Germany, United Kingdom, Finland)"
},
"continent": {
"enum": [
"Africa",
"Antarctica",
"Asia",
"Europe",
"North America",
"Oceania",
"South America"
],
"type": "string",
"description": "Continent (e.g. Europe, North America)"
}
},
"description": "Structured location — pass known fields directly without geocoding. Use this when the model already knows the city/country.",
"additionalProperties": false
}
]
},
"ownerIds": {
"type": "array",
"items": {
"type": "string",
"format": "uuid",
"description": "Owner User ID"
}
},
"companyId": {
"type": "string",
"format": "uuid",
"description": "Existing company UUID from find_companies. Omit if unknown — do not use placeholders."
},
"unsubscribedFromAllMessaging": {
"type": "boolean",
"description": "unsubscribedFromAllMessaging is a system boolean field. Set true to globally suppress the contact, record the opt-out time, cancel active or pending sequence enrollments, and remove pending outreach. Set false only for an explicit resubscription request: clears the flag and timestamp without restarting cancelled sequences. Change it only when the user or configured agent instructions explicitly request that subscription change; removing a contact from one sequence does not imply a global opt-out. Omit to preserve the current preference."
}
},
"additionalProperties": false
},
"annotations": {
"title": "Edit contact",
"readOnlyHint": false,
"openWorldHint": false,
"destructiveHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description75/100
Bulk-add contacts to a list. Pass listId plus either contactIds or resultSetId from find_contacts or import_lead_search_results (never both).
The description explains the capability, when to use it, and what to expect.
Inputs83/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
listId
List ID
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
contactIds
Contact IDs. Or omit this and pass resultSetId from find_contacts.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
resultSetId
resultSetId returned by a find_* call (or contactResultSetId / companyResultSetId from import_lead_search_results). Targets every record that call matched (its resultSetCount, up to 10,000), not just the rows shown. Use instead of copying IDs; never combine with an explicit ID array.
Clear enough to supply this argument.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "add_contacts_to_list",
"title": "Add contacts to list",
"description": "Bulk-add contacts to a list. Pass listId plus either contactIds or resultSetId from find_contacts or import_lead_search_results (never both).",
"inputSchema": {
"type": "object",
"required": [
"listId"
],
"properties": {
"listId": {
"type": "string",
"format": "uuid",
"description": "List ID"
},
"contactIds": {
"type": "array",
"items": {
"type": "string",
"format": "uuid",
"description": "Contact ID"
},
"description": "Contact IDs. Or omit this and pass resultSetId from find_contacts."
},
"resultSetId": {
"type": "string",
"format": "uuid",
"description": "resultSetId returned by a find_* call (or contactResultSetId / companyResultSetId from import_lead_search_results). Targets every record that call matched (its resultSetCount, up to 10,000), not just the rows shown. Use instead of copying IDs; never combine with an explicit ID array."
}
},
"additionalProperties": false
},
"annotations": {
"title": "Add contacts to list",
"readOnlyHint": false,
"openWorldHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description75/100
Bulk-remove contacts from a list. Pass listId plus either contactIds or resultSetId from find_contacts (never both).
Explain mutations, irreversible effects, or prerequisites that matter before calling this tool.
Inputs83/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
listId
List ID
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
contactIds
Contact IDs. Or omit this and pass resultSetId from find_contacts.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
resultSetId
resultSetId returned by a find_* call (or contactResultSetId / companyResultSetId from import_lead_search_results). Targets every record that call matched (its resultSetCount, up to 10,000), not just the rows shown. Use instead of copying IDs; never combine with an explicit ID array.
Clear enough to supply this argument.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "remove_contacts_from_list",
"title": "Remove contacts from list",
"description": "Bulk-remove contacts from a list. Pass listId plus either contactIds or resultSetId from find_contacts (never both).",
"inputSchema": {
"type": "object",
"required": [
"listId"
],
"properties": {
"listId": {
"type": "string",
"format": "uuid",
"description": "List ID"
},
"contactIds": {
"type": "array",
"items": {
"type": "string",
"format": "uuid",
"description": "Contact ID"
},
"description": "Contact IDs. Or omit this and pass resultSetId from find_contacts."
},
"resultSetId": {
"type": "string",
"format": "uuid",
"description": "resultSetId returned by a find_* call (or contactResultSetId / companyResultSetId from import_lead_search_results). Targets every record that call matched (its resultSetCount, up to 10,000), not just the rows shown. Use instead of copying IDs; never combine with an explicit ID array."
}
},
"additionalProperties": false
},
"annotations": {
"title": "Remove contacts from list",
"readOnlyHint": false,
"openWorldHint": false,
"destructiveHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description75/100
Archive (soft-delete) contacts in bulk. Pass either contactIds or resultSetId from find_contacts (never both).
The description explains the capability, when to use it, and what to expect.
Inputs88/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
contactIds
Contact IDs. Or omit this and pass resultSetId from find_contacts.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
resultSetId
resultSetId returned by a find_* call (or contactResultSetId / companyResultSetId from import_lead_search_results). Targets every record that call matched (its resultSetCount, up to 10,000), not just the rows shown. Use instead of copying IDs; never combine with an explicit ID array.
Clear enough to supply this argument.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "archive_contacts",
"title": "Archive contacts",
"description": "Archive (soft-delete) contacts in bulk. Pass either contactIds or resultSetId from find_contacts (never both).",
"inputSchema": {
"type": "object",
"required": [],
"properties": {
"contactIds": {
"type": "array",
"items": {
"type": "string",
"format": "uuid",
"description": "Contact ID"
},
"description": "Contact IDs. Or omit this and pass resultSetId from find_contacts."
},
"resultSetId": {
"type": "string",
"format": "uuid",
"description": "resultSetId returned by a find_* call (or contactResultSetId / companyResultSetId from import_lead_search_results). Targets every record that call matched (its resultSetCount, up to 10,000), not just the rows shown. Use instead of copying IDs; never combine with an explicit ID array."
}
},
"additionalProperties": false
},
"annotations": {
"title": "Archive contacts",
"readOnlyHint": false,
"openWorldHint": false,
"destructiveHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description97/100
Mark exact CRM contacts as unsubscribed from all messaging across sequences, automations, agents, email, and LinkedIn outreach. This immediately cancels every active or pending sequence enrollment for those contacts and removes pending scheduled sequence messages. Call find_contacts first and pass either contactIds or its resultSetId (never both), use only after the user explicitly requests a global unsubscribe or opt-out, and confirm the exact count with expectedCount. This is broader than cancelling one sequence.
The description explains the capability, when to use it, and what to expect.
Inputs92/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
contactIds
Exact CRM contact IDs to suppress globally. Or omit this and pass resultSetId from find_contacts.
Clear enough to supply this argument.
resultSetId
resultSetId returned by a find_* call (or contactResultSetId / companyResultSetId from import_lead_search_results). Targets every record that call matched (its resultSetCount, up to 10,000), not just the rows shown. Use instead of copying IDs; never combine with an explicit ID array.
Clear enough to supply this argument.
expectedCount
Must exactly match the number of unique contactIds, or the number of contacts in the result set.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
{
"title": "Unsubscribe contacts from all messaging",
"readOnlyHint": false,
"openWorldHint": false,
"destructiveHint": true
}
Output schema0/100
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "unsubscribe_contacts_from_all_messaging",
"title": "Unsubscribe contacts from all messaging",
"description": "Mark exact CRM contacts as unsubscribed from all messaging across sequences, automations, agents, email, and LinkedIn outreach. This immediately cancels every active or pending sequence enrollment for those contacts and removes pending scheduled sequence messages. Call find_contacts first and pass either contactIds or its resultSetId (never both), use only after the user explicitly requests a global unsubscribe or opt-out, and confirm the exact count with expectedCount. This is broader than cancelling one sequence.",
"inputSchema": {
"type": "object",
"required": [
"expectedCount"
],
"properties": {
"contactIds": {
"type": "array",
"items": {
"type": "string",
"format": "uuid"
},
"maxItems": 500,
"minItems": 1,
"description": "Exact CRM contact IDs to suppress globally. Or omit this and pass resultSetId from find_contacts."
},
"resultSetId": {
"type": "string",
"format": "uuid",
"description": "resultSetId returned by a find_* call (or contactResultSetId / companyResultSetId from import_lead_search_results). Targets every record that call matched (its resultSetCount, up to 10,000), not just the rows shown. Use instead of copying IDs; never combine with an explicit ID array."
},
"expectedCount": {
"type": "integer",
"maximum": 500,
"minimum": 1,
"description": "Must exactly match the number of unique contactIds, or the number of contacts in the result set."
}
},
"additionalProperties": false
},
"annotations": {
"title": "Unsubscribe contacts from all messaging",
"readOnlyHint": false,
"openWorldHint": false,
"destructiveHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description99/100
In Chat, matching rows may include connectedSlackChannels from the deal or its company. Search, list, or filter deals by name, value, weighted value, stage, pipeline stage type (lead/in-progress/won/lost/active), company, contact, owner, list, created, close, start, or end date. weightedValue is the computed deal value after confidence; value is the unweighted amount. A string name does a case-insensitive substring search and is the default for locating a deal the user names, because their wording may omit prefixes or suffixes or contain a typo. Use name.$eq only when strict full-name equality is explicitly required, not merely because the user supplied a specific-looking name. If the user names a pipeline, first get its pipelineId from get_workspace_metadata and include pipelineId in the find_deals input; do not filter by stage/type alone across all pipelines. Returns { resultSetId, total, rows } — use total for counts without reading all rows (e.g. limit=1 to count a stage); pass resultSetId to add_deals_to_list, remove_deals_from_list, archive_deals instead of copying IDs. It covers every matching record (resultSetCount, up to 10,000); rows is a 5 row sample when more matched, so use query_result_set to read more, narrow, or project fields, and pass resultSetId to bulk tools to act on all matches. For list membership pass listIds only; add viewId to query a specific dynamic list view (get_list.views). Do not copy get_list filters. Use returnColumns.system to request only the deal fields needed. Request relations only when their compact summaries are needed: company and contacts return id/name; activities return id/name/time/type. Do not request company or contacts just to get companyId/contactIds, and use the relevant find tool for richer related-record data. Use pipelineStage.type 'active' to match all non-won/non-lost deals in the selected pipeline. Max 500 results per page. For 'recently added' queries, filter by createdAt.$gte. For 'recently updated or active' queries, include returnColumns.relations=['lastActivity'] and sort or filter by that.
The description explains the capability, when to use it, and what to expect.
Inputs44/100
26 of 44 inputs have descriptions. Add descriptions to the missing inputs, including where to obtain IDs and how to supply values.
id
Deal ID
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
name › oneOf › 1 › $eq
Exact deal name
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
stage
Not provided
Missing description. Explain what this value means and how to supply it.
pipelineStage › type
Stage type. Use "active" to match all non-won/non-lost deals (lead + in-progress).
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
value › $gt
Not provided
Missing description. Explain what this value means and how to supply it.
value › $gte
Not provided
Missing description. Explain what this value means and how to supply it.
value › $lt
Not provided
Missing description. Explain what this value means and how to supply it.
value › $lte
Not provided
Missing description. Explain what this value means and how to supply it.
weightedValue › $gt
Not provided
Missing description. Explain what this value means and how to supply it.
weightedValue › $gte
Not provided
Missing description. Explain what this value means and how to supply it.
weightedValue › $lt
Not provided
Missing description. Explain what this value means and how to supply it.
weightedValue › $lte
Not provided
Missing description. Explain what this value means and how to supply it.
timeToClose › $gt
Not provided
Missing description. Explain what this value means and how to supply it.
timeToClose › $gte
Not provided
Missing description. Explain what this value means and how to supply it.
timeToClose › $lt
Not provided
Missing description. Explain what this value means and how to supply it.
timeToClose › $lte
Not provided
Missing description. Explain what this value means and how to supply it.
timeInCurrentStage › $gt
Not provided
Missing description. Explain what this value means and how to supply it.
timeInCurrentStage › $gte
Not provided
Missing description. Explain what this value means and how to supply it.
timeInCurrentStage › $lt
Not provided
Missing description. Explain what this value means and how to supply it.
timeInCurrentStage › $lte
Not provided
Missing description. Explain what this value means and how to supply it.
closeDate › $gte
ISO date or datetime, or a relative date expression such as now(), -30d, +7d, or startOfMonth.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
closeDate › $lte
ISO date or datetime, or a relative date expression such as now(), -30d, +7d, or startOfMonth.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
startDate › $gte
ISO date or datetime, or a relative date expression such as now(), -30d, +7d, or startOfMonth.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
startDate › $lte
ISO date or datetime, or a relative date expression such as now(), -30d, +7d, or startOfMonth.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
endDate › $gte
ISO date or datetime, or a relative date expression such as now(), -30d, +7d, or startOfMonth.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
endDate › $lte
ISO date or datetime, or a relative date expression such as now(), -30d, +7d, or startOfMonth.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
companyId
Filter by one company UUID or an array of company UUIDs (matches any).
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
pipelineId
Pipeline ID from get_workspace_metadata. Required whenever the user refers to a specific pipeline or when using pipelineStage.type for pipeline-specific counts.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
ownerIds
Belongs to any of these Owner User IDs: - db54dbf6-1249-418f-b3a1-7551588afc65: Tuomo Riekki ([email protected])
- 0cfdbed4-6b6d-4731-ac4d-d5c2f7fa41ee: Santtu Koivumäki ([email protected])
- 7dc63d26-8fd7-46c1-8ccf-f6611426532a: Niko Salkola ([email protected])
- 996e1a22-7cc5-462a-b3f0-e2bf69aad8ec: Santtu Koivumäki ([email protected])
- 36274288-9ff8-4ab9-9495-3b859c880aeb: Philip Ziegler ([email protected])
- 950e005a-0201-425a-b5bf-274446f39d40: Chandrasekhar Iyengar ([email protected])
- 8ad43fff-3cd6-4d46-8c53-53175706c900: Sergey Ushakov ([email protected])
- ad5a11e9-9434-407d-885b-58541032fcf3: Mariia Nedelkina ([email protected])
- 8b4032db-404c-46e4-9dcc-20e6851c9cb5: Olli Jokinen ([email protected])
- 09a4a339-91f7-4caa-8084-6dc0ff7fb6c7: Markus Vapaavuori ([email protected])
- 5d313045-1fe5-47a3-bd1a-d483f22721c5: Janne Sarja ([email protected])
- fcfdb1a0-00a2-4f3d-9e0f-6efd1808ebb5: Daniel Gregorio Cardil ([email protected])
- 4c0510ac-2047-4ce1-8677-bebc0ad6a7eb: Taru Heikinniemi ([email protected])
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
createdAt › $gte
ISO date or datetime, or a relative date expression such as now(), -30d, +7d, or startOfMonth.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
createdAt › $lte
ISO date or datetime, or a relative date expression such as now(), -30d, +7d, or startOfMonth.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
fieldChangedAt › field
Field that changed. One of: name, ownerIds, pipelineId, stage, value, closeDate, confidence, or "custom.<columnId>" for a custom property.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
fieldChangedAt › after
Match changes at or after this ISO date or datetime
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
fieldChangedAt › before
Match changes at or before this ISO date or datetime
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
listIds
Query records in any of these lists. Pass the list UUID only — the tool resolves dynamic lists (filterBased: true) from saved view filters automatically. Omit viewId to use the list default view; pass viewId (from get_list.views) to query a specific named view. Do not copy resolvedFilters from get_list into other find fields.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
viewId
Optional view ID for a single list query. Defaults to the list's default view for its entity. On a dynamic list it selects that view's filters; on a regular list it narrows the membership to the view's saved filters. Call get_list to list views (id, name, entity). Use when the user names a specific view — each view can return different records.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
offset
Offset
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
limit
Limit
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
orderBy › column
Column to order by
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
orderBy › direction
Direction to order by
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
custom
Custom property filters. Keys must be raw column UUIDs from get_workspace_metadata — never column names or UUIDs wrapped in literal quote characters. For select/multiselect filters, use options[].key UUIDs in values, not option names.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
returnColumns › system
Only these top-level deal fields are returned; id is always included. Selecting stage also includes its compact stageHistory.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
returnColumns › custom
Not provided
Missing description. Explain what this value means and how to supply it.
returnColumns › relations
Optional compact relation summaries only: company/contacts return id and name; lastActivity/nextActivity return id, name, time, and type.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "find_deals",
"title": "Find deals",
"description": "In Chat, matching rows may include connectedSlackChannels from the deal or its company. Search, list, or filter deals by name, value, weighted value, stage, pipeline stage type (lead/in-progress/won/lost/active), company, contact, owner, list, created, close, start, or end date. weightedValue is the computed deal value after confidence; value is the unweighted amount. A string name does a case-insensitive substring search and is the default for locating a deal the user names, because their wording may omit prefixes or suffixes or contain a typo. Use name.$eq only when strict full-name equality is explicitly required, not merely because the user supplied a specific-looking name. If the user names a pipeline, first get its pipelineId from get_workspace_metadata and include pipelineId in the find_deals input; do not filter by stage/type alone across all pipelines. Returns { resultSetId, total, rows } — use total for counts without reading all rows (e.g. limit=1 to count a stage); pass resultSetId to add_deals_to_list, remove_deals_from_list, archive_deals instead of copying IDs. It covers every matching record (resultSetCount, up to 10,000); rows is a 5 row sample when more matched, so use query_result_set to read more, narrow, or project fields, and pass resultSetId to bulk tools to act on all matches. For list membership pass listIds only; add viewId to query a specific dynamic list view (get_list.views). Do not copy get_list filters. Use returnColumns.system to request only the deal fields needed. Request relations only when their compact summaries are needed: company and contacts return id/name; activities return id/name/time/type. Do not request company or contacts just to get companyId/contactIds, and use the relevant find tool for richer related-record data. Use pipelineStage.type 'active' to match all non-won/non-lost deals in the selected pipeline. Max 500 results per page. For 'recently added' queries, filter by createdAt.$gte. For 'recently updated or active' queries, include returnColumns.relations=['lastActivity'] and sort or filter by that.",
"inputSchema": {
"type": "object",
"required": [],
"properties": {
"id": {
"type": "string",
"description": "Deal ID"
},
"name": {
"oneOf": [
{
"type": "string",
"description": "Deal name (case-insensitive substring match)"
},
{
"type": "object",
"required": [
"$eq"
],
"properties": {
"$eq": {
"type": "string",
"description": "Exact deal name"
}
},
"description": "Strict full-name filter. Use $eq only when exact, case-sensitive equality is explicitly required; otherwise use the substring string form.",
"additionalProperties": false
}
]
},
"limit": {
"type": "number",
"description": "Limit"
},
"stage": {
"type": "array",
"items": {
"type": "string",
"format": "uuid",
"description": "Stage ID"
}
},
"value": {
"type": "object",
"properties": {
"$gt": {
"type": "number"
},
"$lt": {
"type": "number"
},
"$gte": {
"type": "number"
},
"$lte": {
"type": "number"
}
},
"additionalProperties": false
},
"custom": {
"type": "object",
"description": "Custom property filters. Keys must be raw column UUIDs from get_workspace_metadata — never column names or UUIDs wrapped in literal quote characters. For select/multiselect filters, use options[].key UUIDs in values, not option names.",
"propertyNames": {
"type": "string",
"format": "uuid",
"description": "Custom column UUID from get_workspace_metadata."
},
"additionalProperties": {
"anyOf": [
{
"type": "string"
},
{
"type": "number"
},
{
"type": "boolean"
},
{
"type": "array",
"items": {
"anyOf": [
{
"type": "string"
},
{
"type": "number"
},
{
"type": "boolean"
}
]
}
},
{
"type": "object",
"additionalProperties": true
}
],
"description": "Custom property filter value. Each custom[columnId] may be either a direct value or an operator object such as {$in: [...]}, {$gte: ...}, {$lte: ...}, {$contains: ...}, {$overlaps: [...]}. Use get_workspace_metadata first to look up the property ID, type, options, and filterSchema."
}
},
"offset": {
"type": "number",
"description": "Offset"
},
"viewId": {
"type": "string",
"format": "uuid",
"description": "Optional view ID for a single list query. Defaults to the list's default view for its entity. On a dynamic list it selects that view's filters; on a regular list it narrows the membership to the view's saved filters. Call get_list to list views (id, name, entity). Use when the user names a specific view — each view can return different records."
},
"endDate": {
"type": "object",
"properties": {
"$gte": {
"type": "string",
"description": "ISO date or datetime, or a relative date expression such as now(), -30d, +7d, or startOfMonth."
},
"$lte": {
"type": "string",
"description": "ISO date or datetime, or a relative date expression such as now(), -30d, +7d, or startOfMonth."
}
},
"description": "Deal end date, e.g. when a contract or subscription ends or renews"
},
"listIds": {
"type": "array",
"items": {
"type": "string",
"format": "uuid",
"description": "List ID"
},
"description": "Query records in any of these lists. Pass the list UUID only — the tool resolves dynamic lists (filterBased: true) from saved view filters automatically. Omit viewId to use the list default view; pass viewId (from get_list.views) to query a specific named view. Do not copy resolvedFilters from get_list into other find fields."
},
"orderBy": {
"type": "object",
"required": [],
"properties": {
"column": {
"enum": [
"id",
"createdAt",
"updatedAt",
"value",
"weightedValue",
"timeToClose",
"timeInCurrentStage",
"closeDate",
"startDate",
"endDate",
"name"
],
"type": "string",
"description": "Column to order by"
},
"direction": {
"enum": [
"asc",
"desc"
],
"type": "string",
"description": "Direction to order by"
}
},
"additionalProperties": false
},
"ownerIds": {
"type": "array",
"items": {
"enum": [
"db54dbf6-1249-418f-b3a1-7551588afc65",
"0cfdbed4-6b6d-4731-ac4d-d5c2f7fa41ee",
"7dc63d26-8fd7-46c1-8ccf-f6611426532a",
"996e1a22-7cc5-462a-b3f0-e2bf69aad8ec",
"36274288-9ff8-4ab9-9495-3b859c880aeb",
"950e005a-0201-425a-b5bf-274446f39d40",
"8ad43fff-3cd6-4d46-8c53-53175706c900",
"ad5a11e9-9434-407d-885b-58541032fcf3",
"8b4032db-404c-46e4-9dcc-20e6851c9cb5",
"09a4a339-91f7-4caa-8084-6dc0ff7fb6c7",
"5d313045-1fe5-47a3-bd1a-d483f22721c5",
"fcfdb1a0-00a2-4f3d-9e0f-6efd1808ebb5",
"4c0510ac-2047-4ce1-8677-bebc0ad6a7eb"
],
"type": "string",
"format": "uuid"
},
"description": "Belongs to any of these Owner User IDs: - db54dbf6-1249-418f-b3a1-7551588afc65: Tuomo Riekki ([email protected])\n- 0cfdbed4-6b6d-4731-ac4d-d5c2f7fa41ee: Santtu Koivumäki ([email protected])\n- 7dc63d26-8fd7-46c1-8ccf-f6611426532a: Niko Salkola ([email protected])\n- 996e1a22-7cc5-462a-b3f0-e2bf69aad8ec: Santtu Koivumäki ([email protected])\n- 36274288-9ff8-4ab9-9495-3b859c880aeb: Philip Ziegler ([email protected])\n- 950e005a-0201-425a-b5bf-274446f39d40: Chandrasekhar Iyengar ([email protected])\n- 8ad43fff-3cd6-4d46-8c53-53175706c900: Sergey Ushakov ([email protected])\n- ad5a11e9-9434-407d-885b-58541032fcf3: Mariia Nedelkina ([email protected])\n- 8b4032db-404c-46e4-9dcc-20e6851c9cb5: Olli Jokinen ([email protected])\n- 09a4a339-91f7-4caa-8084-6dc0ff7fb6c7: Markus Vapaavuori ([email protected])\n- 5d313045-1fe5-47a3-bd1a-d483f22721c5: Janne Sarja ([email protected])\n- fcfdb1a0-00a2-4f3d-9e0f-6efd1808ebb5: Daniel Gregorio Cardil ([email protected])\n- 4c0510ac-2047-4ce1-8677-bebc0ad6a7eb: Taru Heikinniemi ([email protected])"
},
"closeDate": {
"type": "object",
"properties": {
"$gte": {
"type": "string",
"description": "ISO date or datetime, or a relative date expression such as now(), -30d, +7d, or startOfMonth."
},
"$lte": {
"type": "string",
"description": "ISO date or datetime, or a relative date expression such as now(), -30d, +7d, or startOfMonth."
}
}
},
"companyId": {
"anyOf": [
{
"type": "string",
"format": "uuid"
},
{
"type": "array",
"items": {
"type": "string",
"format": "uuid"
}
}
],
"description": "Filter by one company UUID or an array of company UUIDs (matches any)."
},
"createdAt": {
"type": "object",
"required": [],
"properties": {
"$gte": {
"type": "string",
"description": "ISO date or datetime, or a relative date expression such as now(), -30d, +7d, or startOfMonth."
},
"$lte": {
"type": "string",
"description": "ISO date or datetime, or a relative date expression such as now(), -30d, +7d, or startOfMonth."
}
},
"additionalProperties": false
},
"startDate": {
"type": "object",
"properties": {
"$gte": {
"type": "string",
"description": "ISO date or datetime, or a relative date expression such as now(), -30d, +7d, or startOfMonth."
},
"$lte": {
"type": "string",
"description": "ISO date or datetime, or a relative date expression such as now(), -30d, +7d, or startOfMonth."
}
},
"description": "Deal start date, e.g. when a contract or subscription begins"
},
"pipelineId": {
"type": "string",
"format": "uuid",
"description": "Pipeline ID from get_workspace_metadata. Required whenever the user refers to a specific pipeline or when using pipelineStage.type for pipeline-specific counts."
},
"timeToClose": {
"type": "object",
"properties": {
"$gt": {
"type": "number"
},
"$lt": {
"type": "number"
},
"$gte": {
"type": "number"
},
"$lte": {
"type": "number"
}
},
"description": "Computed duration from deal creation to close, in milliseconds.",
"additionalProperties": false
},
"pipelineStage": {
"type": "object",
"required": [],
"properties": {
"type": {
"enum": [
"lead",
"in-progress",
"won",
"lost",
"active"
],
"type": "string",
"description": "Stage type. Use \"active\" to match all non-won/non-lost deals (lead + in-progress)."
}
},
"additionalProperties": false
},
"returnColumns": {
"type": "object",
"properties": {
"custom": {
"type": "array",
"items": {
"type": "string",
"format": "uuid",
"description": "Custom column ID"
}
},
"system": {
"type": "array",
"items": {
"enum": [
"id",
"name",
"value",
"weightedValue",
"timeToClose",
"timeInCurrentStage",
"confidence",
"closeDate",
"startDate",
"endDate",
"stage",
"pipelineId",
"companyId",
"contactIds",
"ownerIds",
"listIds"
],
"type": "string"
},
"description": "Only these top-level deal fields are returned; id is always included. Selecting stage also includes its compact stageHistory."
},
"relations": {
"type": "array",
"items": {
"enum": [
"lastActivity",
"nextActivity",
"company",
"contacts"
],
"type": "string"
},
"description": "Optional compact relation summaries only: company/contacts return id and name; lastActivity/nextActivity return id, name, time, and type."
}
},
"description": "Exact response projection. Omit only when the standard deal summary is needed; otherwise request the minimum system fields and relations needed for the answer."
},
"weightedValue": {
"type": "object",
"properties": {
"$gt": {
"type": "number"
},
"$lt": {
"type": "number"
},
"$gte": {
"type": "number"
},
"$lte": {
"type": "number"
}
},
"description": "Computed weighted deal value (value × confidence, or value when confidence is unset).",
"additionalProperties": false
},
"fieldChangedAt": {
"type": "object",
"required": [
"field"
],
"properties": {
"after": {
"type": "string",
"description": "Match changes at or after this ISO date or datetime"
},
"field": {
"type": "string",
"description": "Field that changed. One of: name, ownerIds, pipelineId, stage, value, closeDate, confidence, or \"custom.<columnId>\" for a custom property."
},
"before": {
"type": "string",
"description": "Match changes at or before this ISO date or datetime"
}
},
"description": "Filter to records where a specific field was changed (an update, not the initial set at creation) within a period. Only changelog-tracked fields are supported.",
"additionalProperties": false
},
"timeInCurrentStage": {
"type": "object",
"properties": {
"$gt": {
"type": "number"
},
"$lt": {
"type": "number"
},
"$gte": {
"type": "number"
},
"$lte": {
"type": "number"
}
},
"description": "Computed duration in the current pipeline stage, in milliseconds.",
"additionalProperties": false
}
},
"additionalProperties": false
},
"annotations": {
"title": "Find deals",
"readOnlyHint": true,
"openWorldHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description93/100
Create a new deal (opportunity). Requires a name and company, plus optional value, stage, confidence, close/start/end dates, contacts, owners, lists, custom properties. Resolve the company named or implied by the request (including the deal name) with find_companies or known context before asking the user. If no match exists, create the company when the request implies creation and supplies its name/domain; otherwise ask which company to use. Resolve any requested contacts too; never pick an unrelated record. When workspace has multiple pipelines, choose pipelineId first from get_workspace_metadata and only use a stage that belongs to that same pipeline. Refuses when the company already has an open deal with a similar name and names it: update that deal instead. Pass distinctFromDealIds only after the user confirms it is a separate opportunity. Creates a record; does not search, list, or edit existing deals. Creates one record per call.
The description explains the capability, when to use it, and what to expect.
Inputs70/100
12 of 15 inputs have descriptions. Add descriptions to the missing inputs, including where to obtain IDs and how to supply values.
name
Deal name
Clear enough to supply this argument.
value
Deal value
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
stage
Pipeline stage ID from get_workspace_metadata. Must belong to pipelineId when pipelineId is provided.
Clear enough to supply this argument.
pipelineId
Pipeline ID. Required if workspace has multiple pipelines.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
confidence
Deal confidence/probability as a decimal between 0 and 1 (e.g. 0.8 for 80%)
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
closeDate
Deal close date (ISO date)
Clear enough to supply this argument.
startDate
Deal start date (ISO date), e.g. when a contract or subscription begins
Clear enough to supply this argument.
endDate
Deal end date (ISO date), e.g. when a contract or subscription ends or renews
Clear enough to supply this argument.
companyId
Company UUID from find_companies, add_company, or known context
Clear enough to supply this argument.
contactIds
Not provided
Missing description. Explain what this value means and how to supply it.
ownerIds
Not provided
Missing description. Explain what this value means and how to supply it.
listIds
Not provided
Missing description. Explain what this value means and how to supply it.
content
Sticky note content (markdown)
Clear enough to supply this argument.
custom
Map raw custom property UUIDs to values to write. Do not wrap UUID keys in literal quote characters. Use find_custom_properties first to discover valid custom property IDs for this workspace.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
distinctFromDealIds
IDs of open deals with a similar name on the same company that the user confirmed are separate opportunities.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "add_deal",
"title": "Add deal",
"description": "Create a new deal (opportunity). Requires a name and company, plus optional value, stage, confidence, close/start/end dates, contacts, owners, lists, custom properties. Resolve the company named or implied by the request (including the deal name) with find_companies or known context before asking the user. If no match exists, create the company when the request implies creation and supplies its name/domain; otherwise ask which company to use. Resolve any requested contacts too; never pick an unrelated record. When workspace has multiple pipelines, choose pipelineId first from get_workspace_metadata and only use a stage that belongs to that same pipeline. Refuses when the company already has an open deal with a similar name and names it: update that deal instead. Pass distinctFromDealIds only after the user confirms it is a separate opportunity. Creates a record; does not search, list, or edit existing deals. Creates one record per call.",
"inputSchema": {
"type": "object",
"required": [
"name",
"companyId"
],
"properties": {
"name": {
"type": "string",
"description": "Deal name"
},
"stage": {
"type": "string",
"format": "uuid",
"description": "Pipeline stage ID from get_workspace_metadata. Must belong to pipelineId when pipelineId is provided."
},
"value": {
"type": "number",
"description": "Deal value"
},
"custom": {
"type": "object",
"description": "Map raw custom property UUIDs to values to write. Do not wrap UUID keys in literal quote characters. Use find_custom_properties first to discover valid custom property IDs for this workspace.",
"propertyNames": {
"type": "string",
"format": "uuid"
},
"additionalProperties": {
"anyOf": [
{
"type": "string"
},
{
"type": "number"
},
{
"type": "boolean"
},
{
"type": "array",
"items": {
"anyOf": [
{
"type": "string"
},
{
"type": "number"
},
{
"type": "boolean"
}
]
}
},
{
"type": "object",
"additionalProperties": true
}
],
"description": "Custom property write value. Each custom[columnId] should be the value to store for that column. Use find_custom_properties first to look up the property ID, type, and options. Shapes by type: text/link/email/phone a string (link keeps what you pass; https:// is added at render time), richtext a markdown string, number/currency a number, percentage a 0-1 fraction, rating a whole number 0-5 (0 clears the rating and renders as no stars), boolean a boolean, date YYYY-MM-DD, timestamp an ISO 8601 datetime, select an option key, multiselect an array of option keys, company/contact/deal/user a record UUID, companies/contacts/deals/users an array of record UUIDs, location an object with city, state, country and/or continent (place-name strings are not geocoded here)."
}
},
"content": {
"type": "string",
"description": "Sticky note content (markdown)"
},
"endDate": {
"type": "string",
"description": "Deal end date (ISO date), e.g. when a contract or subscription ends or renews"
},
"listIds": {
"type": "array",
"items": {
"type": "string",
"format": "uuid",
"description": "List ID"
}
},
"ownerIds": {
"type": "array",
"items": {
"type": "string",
"description": "User ID"
}
},
"closeDate": {
"type": "string",
"description": "Deal close date (ISO date)"
},
"companyId": {
"type": "string",
"description": "Company UUID from find_companies, add_company, or known context"
},
"startDate": {
"type": "string",
"description": "Deal start date (ISO date), e.g. when a contract or subscription begins"
},
"confidence": {
"type": "number",
"maximum": 1,
"minimum": 0,
"description": "Deal confidence/probability as a decimal between 0 and 1 (e.g. 0.8 for 80%)"
},
"contactIds": {
"type": "array",
"items": {
"type": "string",
"description": "Contact ID"
}
},
"pipelineId": {
"type": "string",
"format": "uuid",
"description": "Pipeline ID. Required if workspace has multiple pipelines."
},
"distinctFromDealIds": {
"type": "array",
"items": {
"type": "string",
"format": "uuid"
},
"description": "IDs of open deals with a similar name on the same company that the user confirmed are separate opportunities."
}
},
"additionalProperties": false
},
"annotations": {
"title": "Add deal",
"readOnlyHint": false,
"openWorldHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description93/100
Update one existing deal by ID. Change fields on a single deal you already have the ID for — name, value, stage, pipelineId, confidence, close date, start date, end date, company, contacts, owners, lists, custom properties. For stage changes, call get_workspace_metadata first, identify the target pipeline, and use the stage UUID from that pipeline only. Stage names/types like Won or Lead can exist in multiple pipelines; never choose by stage name/type alone. When moving to won/lost, omit closeDate by default so the backend uses today's date; only send closeDate when the user gives a different real-world close date. Modifies a record; does not search, list, or create. Requires the deal's ID. Updates one record per call.
The description explains the capability, when to use it, and what to expect.
Inputs68/100
12 of 15 inputs have descriptions. Add descriptions to the missing inputs, including where to obtain IDs and how to supply values.
id
Deal ID
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
name
Deal name
Clear enough to supply this argument.
value
Deal value
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
stage
Pipeline stage ID from get_workspace_metadata. Must belong to the target pipeline/current deal pipeline.
Clear enough to supply this argument.
pipelineId
Target pipeline ID from get_workspace_metadata. Include with stage changes when the user names a pipeline so the stage can be validated against the right pipeline.
Clear enough to supply this argument.
confidence
Deal confidence/probability as a decimal between 0 and 1 (e.g. 0.8 for 80%)
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
closeDate
Deal close date
Explain what happens when this optional value is omitted.
startDate
Deal start date (ISO date), e.g. when a contract or subscription begins
Clear enough to supply this argument.
endDate
Deal end date (ISO date), e.g. when a contract or subscription ends or renews
Clear enough to supply this argument.
companyId
Company ID
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
contactIds
Not provided
Missing description. Explain what this value means and how to supply it.
ownerIds
Not provided
Missing description. Explain what this value means and how to supply it.
listIds
Not provided
Missing description. Explain what this value means and how to supply it.
content
Sticky note content (markdown)
Clear enough to supply this argument.
custom
Map raw custom property UUIDs to values to write. Do not wrap UUID keys in literal quote characters. Use find_custom_properties first to discover valid custom property IDs for this workspace.
Clear enough to supply this argument.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "edit_deal",
"title": "Edit deal",
"description": "Update one existing deal by ID. Change fields on a single deal you already have the ID for — name, value, stage, pipelineId, confidence, close date, start date, end date, company, contacts, owners, lists, custom properties. For stage changes, call get_workspace_metadata first, identify the target pipeline, and use the stage UUID from that pipeline only. Stage names/types like Won or Lead can exist in multiple pipelines; never choose by stage name/type alone. When moving to won/lost, omit closeDate by default so the backend uses today's date; only send closeDate when the user gives a different real-world close date. Modifies a record; does not search, list, or create. Requires the deal's ID. Updates one record per call.",
"inputSchema": {
"type": "object",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"format": "uuid",
"description": "Deal ID"
},
"name": {
"type": "string",
"description": "Deal name"
},
"stage": {
"type": "string",
"format": "uuid",
"description": "Pipeline stage ID from get_workspace_metadata. Must belong to the target pipeline/current deal pipeline."
},
"value": {
"type": "number",
"description": "Deal value"
},
"custom": {
"type": "object",
"description": "Map raw custom property UUIDs to values to write. Do not wrap UUID keys in literal quote characters. Use find_custom_properties first to discover valid custom property IDs for this workspace.",
"propertyNames": {
"type": "string",
"format": "uuid"
},
"additionalProperties": {
"anyOf": [
{
"type": "string"
},
{
"type": "number"
},
{
"type": "boolean"
},
{
"type": "array",
"items": {
"anyOf": [
{
"type": "string"
},
{
"type": "number"
},
{
"type": "boolean"
}
]
}
},
{
"type": "object",
"additionalProperties": true
}
],
"description": "Custom property write value. Each custom[columnId] should be the value to store for that column. Use find_custom_properties first to look up the property ID, type, and options. Shapes by type: text/link/email/phone a string (link keeps what you pass; https:// is added at render time), richtext a markdown string, number/currency a number, percentage a 0-1 fraction, rating a whole number 0-5 (0 clears the rating and renders as no stars), boolean a boolean, date YYYY-MM-DD, timestamp an ISO 8601 datetime, select an option key, multiselect an array of option keys, company/contact/deal/user a record UUID, companies/contacts/deals/users an array of record UUIDs, location an object with city, state, country and/or continent (place-name strings are not geocoded here)."
}
},
"content": {
"type": "string",
"description": "Sticky note content (markdown)"
},
"endDate": {
"type": "string",
"description": "Deal end date (ISO date), e.g. when a contract or subscription ends or renews"
},
"listIds": {
"type": "array",
"items": {
"type": "string",
"format": "uuid",
"description": "List ID"
}
},
"ownerIds": {
"type": "array",
"items": {
"type": "string",
"description": "User ID"
}
},
"closeDate": {
"type": "string",
"description": "Deal close date"
},
"companyId": {
"type": "string",
"description": "Company ID"
},
"startDate": {
"type": "string",
"description": "Deal start date (ISO date), e.g. when a contract or subscription begins"
},
"confidence": {
"type": "number",
"maximum": 1,
"minimum": 0,
"description": "Deal confidence/probability as a decimal between 0 and 1 (e.g. 0.8 for 80%)"
},
"contactIds": {
"type": "array",
"items": {
"type": "string",
"description": "Contact ID"
}
},
"pipelineId": {
"type": "string",
"format": "uuid",
"description": "Target pipeline ID from get_workspace_metadata. Include with stage changes when the user names a pipeline so the stage can be validated against the right pipeline."
}
},
"additionalProperties": false
},
"annotations": {
"title": "Edit deal",
"readOnlyHint": false,
"openWorldHint": false,
"destructiveHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description74/100
Bulk-add deals to a list. Pass listId plus either dealIds or resultSetId from find_deals (never both).
The description explains the capability, when to use it, and what to expect.
Inputs83/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
listId
List ID
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
dealIds
Deal IDs. Or omit this and pass resultSetId from find_deals.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
resultSetId
resultSetId returned by a find_* call (or contactResultSetId / companyResultSetId from import_lead_search_results). Targets every record that call matched (its resultSetCount, up to 10,000), not just the rows shown. Use instead of copying IDs; never combine with an explicit ID array.
Clear enough to supply this argument.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "add_deals_to_list",
"title": "Add deals to list",
"description": "Bulk-add deals to a list. Pass listId plus either dealIds or resultSetId from find_deals (never both).",
"inputSchema": {
"type": "object",
"required": [
"listId"
],
"properties": {
"listId": {
"type": "string",
"format": "uuid",
"description": "List ID"
},
"dealIds": {
"type": "array",
"items": {
"type": "string",
"format": "uuid",
"description": "Deal ID"
},
"description": "Deal IDs. Or omit this and pass resultSetId from find_deals."
},
"resultSetId": {
"type": "string",
"format": "uuid",
"description": "resultSetId returned by a find_* call (or contactResultSetId / companyResultSetId from import_lead_search_results). Targets every record that call matched (its resultSetCount, up to 10,000), not just the rows shown. Use instead of copying IDs; never combine with an explicit ID array."
}
},
"additionalProperties": false
},
"annotations": {
"title": "Add deals to list",
"readOnlyHint": false,
"openWorldHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description76/100
Bulk-remove deals from a list. Pass listId plus either dealIds or resultSetId from find_deals (never both).
Explain mutations, irreversible effects, or prerequisites that matter before calling this tool.
Inputs92/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
listId
List ID
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
dealIds
Deal IDs. Or omit this and pass resultSetId from find_deals.
Clear enough to supply this argument.
resultSetId
resultSetId returned by a find_* call (or contactResultSetId / companyResultSetId from import_lead_search_results). Targets every record that call matched (its resultSetCount, up to 10,000), not just the rows shown. Use instead of copying IDs; never combine with an explicit ID array.
Clear enough to supply this argument.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "remove_deals_from_list",
"title": "Remove deals from list",
"description": "Bulk-remove deals from a list. Pass listId plus either dealIds or resultSetId from find_deals (never both).",
"inputSchema": {
"type": "object",
"required": [
"listId"
],
"properties": {
"listId": {
"type": "string",
"format": "uuid",
"description": "List ID"
},
"dealIds": {
"type": "array",
"items": {
"type": "string",
"format": "uuid",
"description": "Deal ID"
},
"description": "Deal IDs. Or omit this and pass resultSetId from find_deals."
},
"resultSetId": {
"type": "string",
"format": "uuid",
"description": "resultSetId returned by a find_* call (or contactResultSetId / companyResultSetId from import_lead_search_results). Targets every record that call matched (its resultSetCount, up to 10,000), not just the rows shown. Use instead of copying IDs; never combine with an explicit ID array."
}
},
"additionalProperties": false
},
"annotations": {
"title": "Remove deals from list",
"readOnlyHint": false,
"openWorldHint": false,
"destructiveHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description75/100
Archive (soft-delete) deals in bulk. Pass either dealIds or resultSetId from find_deals (never both).
Explain mutations, irreversible effects, or prerequisites that matter before calling this tool.
Inputs88/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
dealIds
Deal IDs. Or omit this and pass resultSetId from find_deals.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
resultSetId
resultSetId returned by a find_* call (or contactResultSetId / companyResultSetId from import_lead_search_results). Targets every record that call matched (its resultSetCount, up to 10,000), not just the rows shown. Use instead of copying IDs; never combine with an explicit ID array.
Clear enough to supply this argument.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "archive_deals",
"title": "Archive deals",
"description": "Archive (soft-delete) deals in bulk. Pass either dealIds or resultSetId from find_deals (never both).",
"inputSchema": {
"type": "object",
"required": [],
"properties": {
"dealIds": {
"type": "array",
"items": {
"type": "string",
"format": "uuid",
"description": "Deal ID"
},
"description": "Deal IDs. Or omit this and pass resultSetId from find_deals."
},
"resultSetId": {
"type": "string",
"format": "uuid",
"description": "resultSetId returned by a find_* call (or contactResultSetId / companyResultSetId from import_lead_search_results). Targets every record that call matched (its resultSetCount, up to 10,000), not just the rows shown. Use instead of copying IDs; never combine with an explicit ID array."
}
},
"additionalProperties": false
},
"annotations": {
"title": "Archive deals",
"readOnlyHint": false,
"openWorldHint": false,
"destructiveHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description90/100
Verify exact email candidates for one or more CRM contacts in a single call. Call find_contacts first. For each target, pass contactId and optionally up to 5 unsaved candidateEmails. Omit candidateEmails to recheck the saved primary address (verification state is recorded against the primary only; a contact's secondary addresses in emails have no verification state). Passing a saved secondary as a candidate checks it and, when it is the unique valid match, promotes it to primary while keeping the previous primary as a secondary. In chat, one approval shows every candidate, the total workspace credit cost, and whether a unique valid match will be saved. Each distinct email is charged at the workspace plan's email verification price, including invalid, risky, or inconclusive results; the approval shows the exact cost. A catch-all result is risky, not verified, and is never saved automatically. A single call can verify at most 100 distinct addresses.
Describe the returned information so the agent knows whether it will answer the request.
Inputs97/100
Input documentation gives an agent enough context to populate the arguments.
targets › items › contactId
Contact ID from find_contacts.
Clear enough to supply this argument.
targets › items › candidateEmails
Exact candidates to verify: unsaved addresses, or a saved secondary from the contact's emails. Omit to verify the contact's current primary email.
Clear enough to supply this argument.
targets › items › saveUniqueValidMatch
For candidateEmails, save the address only if exactly one is valid. Defaults to true and is shown in approval.
Clear enough to supply this argument.
targets › items › contactName
Server-populated contact name used by the approval preview.
Clear enough to supply this argument.
targets › items › currentEmail
Server-populated current primary email snapshot used to prevent stale writes.
Clear enough to supply this argument.
creditCostPerEmail
Server-populated workspace credit cost per distinct email.
Clear enough to supply this argument.
estimatedCredits
Server-populated total workspace credit cost shown in approval.
Clear enough to supply this argument.
creditNotice
Server-populated billing and conditional-save notice shown in approval.
Clear enough to supply this argument.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "verify_contact_emails",
"title": "Verify contact emails",
"description": "Verify exact email candidates for one or more CRM contacts in a single call. Call find_contacts first. For each target, pass contactId and optionally up to 5 unsaved candidateEmails. Omit candidateEmails to recheck the saved primary address (verification state is recorded against the primary only; a contact's secondary addresses in emails have no verification state). Passing a saved secondary as a candidate checks it and, when it is the unique valid match, promotes it to primary while keeping the previous primary as a secondary. In chat, one approval shows every candidate, the total workspace credit cost, and whether a unique valid match will be saved. Each distinct email is charged at the workspace plan's email verification price, including invalid, risky, or inconclusive results; the approval shows the exact cost. A catch-all result is risky, not verified, and is never saved automatically. A single call can verify at most 100 distinct addresses.",
"inputSchema": {
"type": "object",
"required": [
"targets"
],
"properties": {
"targets": {
"type": "array",
"items": {
"type": "object",
"required": [
"contactId"
],
"properties": {
"contactId": {
"type": "string",
"format": "uuid",
"description": "Contact ID from find_contacts."
},
"contactName": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Server-populated contact name used by the approval preview."
},
"currentEmail": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Server-populated current primary email snapshot used to prevent stale writes."
},
"candidateEmails": {
"type": "array",
"items": {
"type": "string",
"format": "email"
},
"maxItems": 5,
"minItems": 1,
"description": "Exact candidates to verify: unsaved addresses, or a saved secondary from the contact's emails. Omit to verify the contact's current primary email."
},
"saveUniqueValidMatch": {
"type": "boolean",
"description": "For candidateEmails, save the address only if exactly one is valid. Defaults to true and is shown in approval."
}
},
"additionalProperties": false
},
"maxItems": 100,
"minItems": 1
},
"creditNotice": {
"type": "string",
"description": "Server-populated billing and conditional-save notice shown in approval."
},
"estimatedCredits": {
"type": "number",
"description": "Server-populated total workspace credit cost shown in approval."
},
"creditCostPerEmail": {
"type": "number",
"description": "Server-populated workspace credit cost per distinct email."
}
},
"additionalProperties": false
},
"annotations": {
"title": "Verify contact emails",
"readOnlyHint": false,
"openWorldHint": true,
"destructiveHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description98/100
Find tasks and to-dos by title (substring match), done state, deadline, assignee, or linked companies/contacts/deals. Returns { resultSetId, total, rows }; pass resultSetId to remove_tasks instead of copying IDs. It covers every matching record (resultSetCount, up to 10,000); rows is a 5 row sample when more matched, so use query_result_set to read more or narrow. Max 500 results per page.
The description explains the capability, when to use it, and what to expect.
Inputs48/100
10 of 15 inputs have descriptions. Add descriptions to the missing inputs, including where to obtain IDs and how to supply values.
name
Not provided
Missing description. Explain what this value means and how to supply it.
deadline › $gte
ISO date or datetime, or a relative date expression such as now(), -30d, +7d, or startOfMonth.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
deadline › $lte
ISO date or datetime, or a relative date expression such as now(), -30d, +7d, or startOfMonth.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
done
Not provided
Missing description. Explain what this value means and how to supply it.
companyIds
Not provided
Missing description. Explain what this value means and how to supply it.
contactIds
Not provided
Missing description. Explain what this value means and how to supply it.
dealIds
Not provided
Missing description. Explain what this value means and how to supply it.
assignedToIds
Assigned to any of these User IDs: - db54dbf6-1249-418f-b3a1-7551588afc65: Tuomo Riekki ([email protected])
- 0cfdbed4-6b6d-4731-ac4d-d5c2f7fa41ee: Santtu Koivumäki ([email protected])
- 7dc63d26-8fd7-46c1-8ccf-f6611426532a: Niko Salkola ([email protected])
- 996e1a22-7cc5-462a-b3f0-e2bf69aad8ec: Santtu Koivumäki ([email protected])
- 36274288-9ff8-4ab9-9495-3b859c880aeb: Philip Ziegler ([email protected])
- 950e005a-0201-425a-b5bf-274446f39d40: Chandrasekhar Iyengar ([email protected])
- 8ad43fff-3cd6-4d46-8c53-53175706c900: Sergey Ushakov ([email protected])
- ad5a11e9-9434-407d-885b-58541032fcf3: Mariia Nedelkina ([email protected])
- 8b4032db-404c-46e4-9dcc-20e6851c9cb5: Olli Jokinen ([email protected])
- 09a4a339-91f7-4caa-8084-6dc0ff7fb6c7: Markus Vapaavuori ([email protected])
- 5d313045-1fe5-47a3-bd1a-d483f22721c5: Janne Sarja ([email protected])
- fcfdb1a0-00a2-4f3d-9e0f-6efd1808ebb5: Daniel Gregorio Cardil ([email protected])
- 4c0510ac-2047-4ce1-8677-bebc0ad6a7eb: Taru Heikinniemi ([email protected])
Explain the meaning of this value, not just its name.
fieldChangedAt › field
Field that changed. One of: name, done, deadline, assignedToIds.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
fieldChangedAt › after
Match changes at or after this ISO date or datetime
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
fieldChangedAt › before
Match changes at or before this ISO date or datetime
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
offset
Offset
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
limit
Limit
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
orderBy › column
Column to order by
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
orderBy › direction
Direction to order by
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description86/100
Edit an existing task (title, done state, call outcome and notes, priority, deadline, description, assignees, linked records). For sequence call tasks, send callOutcome and callNotes together with done=true to record and complete the call. Correcting the outcome on a completed call rechecks sequence stop rules; clearing it does not restart a stopped sequence.
The description explains the capability, when to use it, and what to expect.
Inputs54/100
8 of 12 inputs have descriptions. Add descriptions to the missing inputs, including where to obtain IDs and how to supply values.
id
Task ID
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
name
Task name
Explain the meaning of this value, not just its name.
done
Whether the task is completed
Clear enough to supply this argument.
callOutcome
Sequence call outcome. Use null to clear the recorded outcome.
Clear enough to supply this argument.
callNotes
Optional plain-text call notes. Use null or an empty string to clear them.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
priority
Not provided
Missing description. Explain what this value means and how to supply it.
deadline
Task deadline date e.g. 2026-01-01
Clear enough to supply this argument.
companyIds
Not provided
Missing description. Explain what this value means and how to supply it.
contactIds
Not provided
Missing description. Explain what this value means and how to supply it.
dealIds
Not provided
Missing description. Explain what this value means and how to supply it.
assignedToIds
Assign to User IDs: - db54dbf6-1249-418f-b3a1-7551588afc65: Tuomo Riekki ([email protected])
- 0cfdbed4-6b6d-4731-ac4d-d5c2f7fa41ee: Santtu Koivumäki ([email protected])
- 7dc63d26-8fd7-46c1-8ccf-f6611426532a: Niko Salkola ([email protected])
- 996e1a22-7cc5-462a-b3f0-e2bf69aad8ec: Santtu Koivumäki ([email protected])
- 36274288-9ff8-4ab9-9495-3b859c880aeb: Philip Ziegler ([email protected])
- 950e005a-0201-425a-b5bf-274446f39d40: Chandrasekhar Iyengar ([email protected])
- 8ad43fff-3cd6-4d46-8c53-53175706c900: Sergey Ushakov ([email protected])
- ad5a11e9-9434-407d-885b-58541032fcf3: Mariia Nedelkina ([email protected])
- 8b4032db-404c-46e4-9dcc-20e6851c9cb5: Olli Jokinen ([email protected])
- 09a4a339-91f7-4caa-8084-6dc0ff7fb6c7: Markus Vapaavuori ([email protected])
- 5d313045-1fe5-47a3-bd1a-d483f22721c5: Janne Sarja ([email protected])
- fcfdb1a0-00a2-4f3d-9e0f-6efd1808ebb5: Daniel Gregorio Cardil ([email protected])
- 4c0510ac-2047-4ce1-8677-bebc0ad6a7eb: Taru Heikinniemi ([email protected])
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
description
Task description (markdown)
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description71/100
Remove tasks in bulk. Pass either taskIds or resultSetId from find_tasks (never both).
Explain mutations, irreversible effects, or prerequisites that matter before calling this tool.
Inputs88/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
taskIds
Task IDs. Or omit this and pass resultSetId from find_tasks.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
resultSetId
resultSetId returned by a find_* call (or contactResultSetId / companyResultSetId from import_lead_search_results). Targets every record that call matched (its resultSetCount, up to 10,000), not just the rows shown. Use instead of copying IDs; never combine with an explicit ID array.
Clear enough to supply this argument.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "remove_tasks",
"title": "Remove tasks",
"description": "Remove tasks in bulk. Pass either taskIds or resultSetId from find_tasks (never both).",
"inputSchema": {
"type": "object",
"required": [],
"properties": {
"taskIds": {
"type": "array",
"items": {
"type": "string",
"format": "uuid",
"description": "Task ID"
},
"description": "Task IDs. Or omit this and pass resultSetId from find_tasks."
},
"resultSetId": {
"type": "string",
"format": "uuid",
"description": "resultSetId returned by a find_* call (or contactResultSetId / companyResultSetId from import_lead_search_results). Targets every record that call matched (its resultSetCount, up to 10,000), not just the rows shown. Use instead of copying IDs; never combine with an explicit ID array."
}
},
"additionalProperties": false
},
"annotations": {
"title": "Remove tasks",
"readOnlyHint": false,
"openWorldHint": false,
"destructiveHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description99/100
Look up custom property (column) definitions before filtering or writing a custom field. Returns IDs, types, option key UUIDs, filter schemas, and for AI properties the prompt, enabled sources (tools) and automatic-run settings. Formula properties come back with readOnly: true and their expression; they are calculated on read and can never be written. Call it whenever you need a column UUID by name, and ALWAYS before create_custom_property: search the entity without a query and match existing properties by meaning, not just exact name, so you reuse instead of duplicating. When exact per-record sequence copy already exists, look for a suitable contact/company text property before configuring AI; call create_custom_property if none exists. Query by entity (companies/contacts/deals) and optional name/type search.
The description explains the capability, when to use it, and what to expect.
Inputs72/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
entity
Entity to search within
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
type
Filter by custom property type. formula properties are read-only: calculated on read, never written.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
query
Search text matched against property ID, name, key, description, and option names
Clear enough to supply this argument.
limit
Limit
Explain the meaning of this value, not just its name.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "find_custom_properties",
"title": "Find custom properties",
"description": "Look up custom property (column) definitions before filtering or writing a custom field. Returns IDs, types, option key UUIDs, filter schemas, and for AI properties the prompt, enabled sources (tools) and automatic-run settings. Formula properties come back with readOnly: true and their expression; they are calculated on read and can never be written. Call it whenever you need a column UUID by name, and ALWAYS before create_custom_property: search the entity without a query and match existing properties by meaning, not just exact name, so you reuse instead of duplicating. When exact per-record sequence copy already exists, look for a suitable contact/company text property before configuring AI; call create_custom_property if none exists. Query by entity (companies/contacts/deals) and optional name/type search.",
"inputSchema": {
"type": "object",
"required": [],
"properties": {
"type": {
"enum": [
"text",
"number",
"percentage",
"boolean",
"link",
"currency",
"email",
"phone",
"select",
"multiselect",
"richtext",
"user",
"users",
"date",
"timestamp",
"location",
"rating",
"company",
"companies",
"contact",
"contacts",
"deal",
"deals",
"formula"
],
"type": "string",
"description": "Filter by custom property type. formula properties are read-only: calculated on read, never written."
},
"limit": {
"type": "number",
"description": "Limit"
},
"query": {
"type": "string",
"description": "Search text matched against property ID, name, key, description, and option names"
},
"entity": {
"enum": [
"companies",
"contacts",
"deals"
],
"type": "string",
"description": "Entity to search within"
}
},
"additionalProperties": false
},
"annotations": {
"title": "Find custom properties",
"readOnlyHint": true,
"openWorldHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description85/100
Create a contact, company, or deal custom property of any type the property editor offers. Create one only when the user asked for it, and only after find_custom_properties over the whole entity shows nothing that already means the same thing; reuse that one instead. A compatible active MCP property with the same entity and name is reused; any other same-name (case-insensitive), archived, or incompatible property returns a conflict. Approval-gated workspace configuration write: use a fresh idempotencyKey per intended creation, and reuse it only to retry the identical call.
The description explains the capability, when to use it, and what to expect.
Inputs81/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
entity
CRM entity that owns the property.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
name
User-visible property name.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
description
Optional explanation of what the property stores.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
type
Property type; defaults to text — match the data rather than storing everything as text. select/multiselect require options; every other type rejects them.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
options › items › name
Option display name.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
options › items › color
Optional; auto-assigned when omitted.
Clear enough to supply this argument.
ai › prompt
Markdown instructions for computing the value per record. Runs are triggered separately (run_agent); company and contact properties also run for new records by default, deal properties do not.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
ai › sources
Read-only tools the AI may call, scoped to the record being computed; without them the AI sees only the record's own fields. Web search cannot be enabled from here.
Clear enough to supply this argument.
idempotencyKey
Caller-generated key for safe retries of this call.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "create_custom_property",
"title": "Create custom property",
"description": "Create a contact, company, or deal custom property of any type the property editor offers. Create one only when the user asked for it, and only after find_custom_properties over the whole entity shows nothing that already means the same thing; reuse that one instead. A compatible active MCP property with the same entity and name is reused; any other same-name (case-insensitive), archived, or incompatible property returns a conflict. Approval-gated workspace configuration write: use a fresh idempotencyKey per intended creation, and reuse it only to retry the identical call.",
"inputSchema": {
"type": "object",
"required": [
"entity",
"name",
"idempotencyKey"
],
"properties": {
"ai": {
"type": "object",
"required": [
"prompt"
],
"properties": {
"prompt": {
"type": "string",
"maxLength": 4000,
"minLength": 1,
"description": "Markdown instructions for computing the value per record. Runs are triggered separately (run_agent); company and contact properties also run for new records by default, deal properties do not."
},
"sources": {
"type": "array",
"items": {
"enum": [
"findCompanies",
"findContacts",
"findDeals",
"findCompanyActivities",
"findContactActivities",
"findDealActivities",
"findNotes",
"findTasks",
"findEmails",
"findCalendarEvents",
"findMeetingPreps",
"findAnalyticsEvents",
"findInvoices",
"findQuotes",
"findIssues",
"readFiles",
"findContexts",
"findLinkedinConnections",
"findLinkedinMessages"
],
"type": "string"
},
"description": "Read-only tools the AI may call, scoped to the record being computed; without them the AI sees only the record's own fields. Web search cannot be enabled from here."
}
},
"description": "Optional; the value is then computed by AI. Only these types: text, richtext, number, boolean, currency, email, select, multiselect, date, timestamp, rating.",
"additionalProperties": false
},
"name": {
"type": "string",
"maxLength": 255,
"minLength": 1,
"description": "User-visible property name."
},
"type": {
"enum": [
"text",
"richtext",
"number",
"percentage",
"boolean",
"link",
"currency",
"email",
"phone",
"select",
"multiselect",
"user",
"users",
"date",
"timestamp",
"location",
"rating",
"company",
"companies",
"contact",
"contacts",
"deal",
"deals"
],
"type": "string",
"description": "Property type; defaults to text — match the data rather than storing everything as text. select/multiselect require options; every other type rejects them."
},
"entity": {
"enum": [
"companies",
"contacts",
"deals"
],
"type": "string",
"description": "CRM entity that owns the property."
},
"options": {
"type": "array",
"items": {
"type": "object",
"required": [
"name"
],
"properties": {
"name": {
"type": "string",
"maxLength": 255,
"minLength": 1,
"description": "Option display name."
},
"color": {
"enum": [
"Blue",
"Indigo",
"Purple",
"Magenta",
"Red",
"Orange",
"Yellow",
"Green",
"Teal",
"Gray"
],
"type": "string",
"description": "Optional; auto-assigned when omitted."
}
},
"additionalProperties": false
},
"description": "Required for select/multiselect; invalid for every other type."
},
"description": {
"type": "string",
"maxLength": 1000,
"description": "Optional explanation of what the property stores."
},
"idempotencyKey": {
"type": "string",
"maxLength": 200,
"minLength": 1,
"description": "Caller-generated key for safe retries of this call."
}
},
"additionalProperties": false
},
"annotations": {
"title": "Create custom property",
"readOnlyHint": false,
"openWorldHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description95/100
Full activity timeline for ONE specific company — emails, calendar events, notes, comments, tasks, deals, custom activities (calls, meetings), LinkedIn, and Slack. Omitting 'types' returns ALL activity types including custom activities. Use 'types' to fetch only specific categories (e.g. ["emails","tasks"]). For recency comparisons across companies, do NOT use a hard 'since' limit — omit it or use a long window so older activity is included. Do NOT call this in a loop over many companies — use find_companies + summarise from rows instead.
The description explains the capability, when to use it, and what to expect.
Inputs75/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
companyId
Company ID
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
since
Only return activities after this date. Supports ISO dates (2026-01-01) and relative macros (-7d, -30d, -1m, now()).
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
types
Only return these activity types. Omit for general history or 'what happened?' questions. For communication, outreach, or whether something was sent, include 'emails', 'linkedin', and 'slack' unless the user explicitly names one channel. Use 'linkedin' for both LinkedIn message threads and connections; use 'slack' for Slack threads and messages.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "find_company_activities",
"title": "Find company activities",
"description": "Full activity timeline for ONE specific company — emails, calendar events, notes, comments, tasks, deals, custom activities (calls, meetings), LinkedIn, and Slack. Omitting 'types' returns ALL activity types including custom activities. Use 'types' to fetch only specific categories (e.g. [\"emails\",\"tasks\"]). For recency comparisons across companies, do NOT use a hard 'since' limit — omit it or use a long window so older activity is included. Do NOT call this in a loop over many companies — use find_companies + summarise from rows instead.",
"inputSchema": {
"type": "object",
"required": [
"companyId"
],
"properties": {
"since": {
"type": "string",
"description": "Only return activities after this date. Supports ISO dates (2026-01-01) and relative macros (-7d, -30d, -1m, now())."
},
"types": {
"type": "array",
"items": {
"enum": [
"emails",
"calendarEvents",
"notes",
"comments",
"tasks",
"deals",
"customActivities",
"linkedin",
"slack"
],
"type": "string"
},
"description": "Only return these activity types. Omit for general history or 'what happened?' questions. For communication, outreach, or whether something was sent, include 'emails', 'linkedin', and 'slack' unless the user explicitly names one channel. Use 'linkedin' for both LinkedIn message threads and connections; use 'slack' for Slack threads and messages."
},
"companyId": {
"type": "string",
"format": "uuid",
"description": "Company ID"
}
},
"additionalProperties": false
},
"annotations": {
"title": "Find company activities",
"readOnlyHint": true,
"openWorldHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description94/100
Full activity timeline for ONE specific contact — emails, calendar events, notes, comments, custom activities (calls, meetings), LinkedIn, and Slack. Omitting 'types' returns ALL activity types. Use 'types' to fetch only specific categories (e.g. ["emails","tasks"]). Use 'since' to limit to recent activity. For recency comparisons, omit 'since' or use a long window so older activity is visible. Do NOT call in a loop over many contacts.
The description explains the capability, when to use it, and what to expect.
Inputs75/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
contactId
Contact ID
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
since
Only return activities after this date. Supports ISO dates (2026-01-01) and relative macros (-7d, -30d, -1m, now()).
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
types
Only return these activity types. Omit for general history or 'what happened?' questions. For communication, outreach, or whether something was sent, include 'emails', 'linkedin', and 'slack' unless the user explicitly names one channel. Use 'linkedin' for LinkedIn message threads, connections, and page followers; use 'slack' for Slack threads and messages.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "find_contact_activities",
"title": "Find contact activities",
"description": "Full activity timeline for ONE specific contact — emails, calendar events, notes, comments, custom activities (calls, meetings), LinkedIn, and Slack. Omitting 'types' returns ALL activity types. Use 'types' to fetch only specific categories (e.g. [\"emails\",\"tasks\"]). Use 'since' to limit to recent activity. For recency comparisons, omit 'since' or use a long window so older activity is visible. Do NOT call in a loop over many contacts.",
"inputSchema": {
"type": "object",
"required": [
"contactId"
],
"properties": {
"since": {
"type": "string",
"description": "Only return activities after this date. Supports ISO dates (2026-01-01) and relative macros (-7d, -30d, -1m, now())."
},
"types": {
"type": "array",
"items": {
"enum": [
"emails",
"calendarEvents",
"notes",
"comments",
"customActivities",
"linkedin",
"slack"
],
"type": "string"
},
"description": "Only return these activity types. Omit for general history or 'what happened?' questions. For communication, outreach, or whether something was sent, include 'emails', 'linkedin', and 'slack' unless the user explicitly names one channel. Use 'linkedin' for LinkedIn message threads, connections, and page followers; use 'slack' for Slack threads and messages."
},
"contactId": {
"type": "string",
"format": "uuid",
"description": "Contact ID"
}
},
"additionalProperties": false
},
"annotations": {
"title": "Find contact activities",
"readOnlyHint": true,
"openWorldHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description97/100
Full activity timeline for ONE specific deal — notes, comments, custom activities, tasks, emails, calendar events, LinkedIn, and Slack. Omitting 'types' returns ALL activity types. Use 'types' to fetch only specific categories. Use 'since' to limit to recent activity. Do NOT call in a loop over many deals — summarise from find_deals rows instead.
The description explains the capability, when to use it, and what to expect.
Inputs75/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
dealId
Deal ID
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
since
Only return activities after this date. Supports ISO dates (2026-01-01) and relative macros (-7d, -30d, -1m, now()).
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
types
Only return these activity types. Omit for general history or 'what happened?' questions. For communication, outreach, or whether something was sent, include 'emails', 'linkedin', and 'slack' unless the user explicitly names one channel. Use 'linkedin' for LinkedIn message threads and connections; use 'slack' for Slack threads and messages.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "find_deal_activities",
"title": "Find deal activities",
"description": "Full activity timeline for ONE specific deal — notes, comments, custom activities, tasks, emails, calendar events, LinkedIn, and Slack. Omitting 'types' returns ALL activity types. Use 'types' to fetch only specific categories. Use 'since' to limit to recent activity. Do NOT call in a loop over many deals — summarise from find_deals rows instead.",
"inputSchema": {
"type": "object",
"required": [
"dealId"
],
"properties": {
"since": {
"type": "string",
"description": "Only return activities after this date. Supports ISO dates (2026-01-01) and relative macros (-7d, -30d, -1m, now())."
},
"types": {
"type": "array",
"items": {
"enum": [
"emails",
"calendarEvents",
"notes",
"comments",
"customActivities",
"tasks",
"linkedin",
"slack"
],
"type": "string"
},
"description": "Only return these activity types. Omit for general history or 'what happened?' questions. For communication, outreach, or whether something was sent, include 'emails', 'linkedin', and 'slack' unless the user explicitly names one channel. Use 'linkedin' for LinkedIn message threads and connections; use 'slack' for Slack threads and messages."
},
"dealId": {
"type": "string",
"format": "uuid",
"description": "Deal ID"
}
},
"additionalProperties": false
},
"annotations": {
"title": "Find deal activities",
"readOnlyHint": true,
"openWorldHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description97/100
Find email messages by subject, sender, recipient, linked company/contact, or mailbox. For searches intended to cover the current user's own email, call get_mailboxes first and pass its ids as mailboxIds; omit mailboxIds only when the user explicitly wants a broader workspace/team search. Returns { total, rows } — each row is one email message with its `id` (email row id), `emailThreadId` (the conversation thread it belongs to), `messageId` for email threading, `draft` (true for an unsent draft saved in the mailbox, which was never delivered; never count a draft as sent), and `attachments` (metadata only: emailAttachmentId, name, type, size). Up to 500 results per page.
The description explains the capability, when to use it, and what to expect.
Inputs54/100
13 of 18 inputs have descriptions. Add descriptions to the missing inputs, including where to obtain IDs and how to supply values.
id
Email ID. Fetches that single email and returns its full body untruncated. Use this when a listed email's body was truncated.
Clear enough to supply this argument.
subject
Not provided
Missing description. Explain what this value means and how to supply it.
mailboxIds
Mailbox IDs to include. For the current user's own email, call get_mailboxes and pass its ids here.
Clear enough to supply this argument.
emailThreadId
Email thread ID — returns the messages of that conversation thread in order
Clear enough to supply this argument.
time › $gte
On or after (ISO date or relative macro)
Clear enough to supply this argument.
time › $lte
On or before (ISO date or relative macro)
Clear enough to supply this argument.
participantEmails
Not provided
Missing description. Explain what this value means and how to supply it.
participantDomains
Not provided
Missing description. Explain what this value means and how to supply it.
fromEmail
Not provided
Missing description. Explain what this value means and how to supply it.
hasAttachments
true: only emails with attachments; false: only emails without
Clear enough to supply this argument.
draft
true: only unsent drafts; false: only real messages (sent or received). Pass false when counting or checking what was actually sent.
Explain the meaning of this value, not just its name.
toEmails
Not provided
Missing description. Explain what this value means and how to supply it.
companyId
Company ID
Explain the meaning of this value, not just its name.
contactId
Contact ID
Explain the meaning of this value, not just its name.
offset
Offset
Explain the meaning of this value, not just its name.
limit
Limit
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
orderBy › column
Column to order by
Explain the meaning of this value, not just its name.
orderBy › direction
Direction to order by
Explain the meaning of this value, not just its name.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "find_emails",
"title": "Find emails",
"description": "Find email messages by subject, sender, recipient, linked company/contact, or mailbox. For searches intended to cover the current user's own email, call get_mailboxes first and pass its ids as mailboxIds; omit mailboxIds only when the user explicitly wants a broader workspace/team search. Returns { total, rows } — each row is one email message with its `id` (email row id), `emailThreadId` (the conversation thread it belongs to), `messageId` for email threading, `draft` (true for an unsent draft saved in the mailbox, which was never delivered; never count a draft as sent), and `attachments` (metadata only: emailAttachmentId, name, type, size). Up to 500 results per page.",
"inputSchema": {
"type": "object",
"required": [],
"properties": {
"id": {
"type": "string",
"description": "Email ID. Fetches that single email and returns its full body untruncated. Use this when a listed email's body was truncated."
},
"time": {
"type": "object",
"properties": {
"$gte": {
"type": "string",
"description": "On or after (ISO date or relative macro)"
},
"$lte": {
"type": "string",
"description": "On or before (ISO date or relative macro)"
}
},
"description": "Filter by email time. Supports ISO dates and relative macros (e.g. now(), -7d, -30d, -1m).",
"additionalProperties": false
},
"draft": {
"type": "boolean",
"description": "true: only unsent drafts; false: only real messages (sent or received). Pass false when counting or checking what was actually sent."
},
"limit": {
"type": "number",
"description": "Limit"
},
"offset": {
"type": "number",
"description": "Offset"
},
"orderBy": {
"type": "object",
"required": [],
"properties": {
"column": {
"enum": [
"time"
],
"type": "string",
"description": "Column to order by"
},
"direction": {
"enum": [
"asc",
"desc"
],
"type": "string",
"description": "Direction to order by"
}
},
"additionalProperties": false
},
"subject": {
"type": "string"
},
"toEmails": {
"type": "array",
"items": {
"type": "string"
}
},
"companyId": {
"type": "string",
"description": "Company ID"
},
"contactId": {
"type": "string",
"description": "Contact ID"
},
"fromEmail": {
"type": "string"
},
"mailboxIds": {
"type": "array",
"items": {
"type": "string"
},
"description": "Mailbox IDs to include. For the current user's own email, call get_mailboxes and pass its ids here."
},
"emailThreadId": {
"type": "string",
"description": "Email thread ID — returns the messages of that conversation thread in order"
},
"hasAttachments": {
"type": "boolean",
"description": "true: only emails with attachments; false: only emails without"
},
"participantEmails": {
"type": "array",
"items": {
"type": "string"
}
},
"participantDomains": {
"type": "array",
"items": {
"type": "string"
}
}
},
"additionalProperties": false
},
"annotations": {
"title": "Find emails",
"readOnlyHint": true,
"openWorldHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description97/100
Find calendar events and meetings by id, title, time window, attendees, workspace users (userIds), or linked companies/contacts. Each row returns `description` (the calendar description), `meetingNotes` (the Meeting notes tab stored on the event), and the legacy combined `content` field. Calendar-event meeting notes are not standalone CRM Notes, so do not use find_notes for them. Set includeTranscript=true to also return the full recorded transcript. Returns { total, rows } — up to 500 results per page.
The description explains the capability, when to use it, and what to expect.
Inputs54/100
12 of 17 inputs have descriptions. Add descriptions to the missing inputs, including where to obtain IDs and how to supply values.
id
Calendar event ID. When a calendar event is open in the user view, pass that event's id to retrieve its Meeting notes or transcript directly.
Clear enough to supply this argument.
name
Not provided
Missing description. Explain what this value means and how to supply it.
userIds
Filter to events on these workspace users' calendars. Use user IDs from the workspace configuration — the direct way to find a specific user's meetings.
Clear enough to supply this argument.
includeRecurrence
Read the current repeat rule and time zone from Google Calendar. Requires one event id on the current user's connected Google calendar. Use to inspect the series schedule.
Clear enough to supply this argument.
includeTranscript
When true, include the full recorded meeting transcript for each event. Defaults to false. Prefer narrowing the search (e.g. a single event id or a tight time window) before requesting transcripts, as they can be long.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
startTime › $gte
ISO date or datetime, or a relative date expression such as now(), -30d, +7d, or startOfMonth.
Clear enough to supply this argument.
startTime › $lte
ISO date or datetime, or a relative date expression such as now(), -30d, +7d, or startOfMonth.
Clear enough to supply this argument.
createdAt › $gte
ISO date or datetime, or a relative date expression such as now(), -30d, +7d, or startOfMonth.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
createdAt › $lte
ISO date or datetime, or a relative date expression such as now(), -30d, +7d, or startOfMonth.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
attendeeEmails
Not provided
Missing description. Explain what this value means and how to supply it.
attendeeDomains
Not provided
Missing description. Explain what this value means and how to supply it.
companyIds
Not provided
Missing description. Explain what this value means and how to supply it.
contactIds
Not provided
Missing description. Explain what this value means and how to supply it.
offset
Offset
Explain the meaning of this value, not just its name.
limit
Limit
Explain the meaning of this value, not just its name.
orderBy › column
Column to order by
Explain the meaning of this value, not just its name.
orderBy › direction
Direction to order by
Explain the meaning of this value, not just its name.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "find_calendar_events",
"title": "Find calendar events",
"description": "Find calendar events and meetings by id, title, time window, attendees, workspace users (userIds), or linked companies/contacts. Each row returns `description` (the calendar description), `meetingNotes` (the Meeting notes tab stored on the event), and the legacy combined `content` field. Calendar-event meeting notes are not standalone CRM Notes, so do not use find_notes for them. Set includeTranscript=true to also return the full recorded transcript. Returns { total, rows } — up to 500 results per page.",
"inputSchema": {
"type": "object",
"required": [],
"properties": {
"id": {
"type": "string",
"format": "uuid",
"description": "Calendar event ID. When a calendar event is open in the user view, pass that event's id to retrieve its Meeting notes or transcript directly."
},
"name": {
"type": "string"
},
"limit": {
"type": "number",
"description": "Limit"
},
"offset": {
"type": "number",
"description": "Offset"
},
"orderBy": {
"type": "object",
"required": [],
"properties": {
"column": {
"enum": [
"startTime",
"createdAt"
],
"type": "string",
"description": "Column to order by"
},
"direction": {
"enum": [
"asc",
"desc"
],
"type": "string",
"description": "Direction to order by"
}
},
"additionalProperties": false
},
"userIds": {
"type": "array",
"items": {
"type": "string",
"format": "uuid",
"description": "Workspace user ID"
},
"description": "Filter to events on these workspace users' calendars. Use user IDs from the workspace configuration — the direct way to find a specific user's meetings."
},
"createdAt": {
"type": "object",
"required": [],
"properties": {
"$gte": {
"type": "string",
"description": "ISO date or datetime, or a relative date expression such as now(), -30d, +7d, or startOfMonth."
},
"$lte": {
"type": "string",
"description": "ISO date or datetime, or a relative date expression such as now(), -30d, +7d, or startOfMonth."
}
},
"additionalProperties": false
},
"startTime": {
"type": "object",
"required": [],
"properties": {
"$gte": {
"type": "string",
"description": "ISO date or datetime, or a relative date expression such as now(), -30d, +7d, or startOfMonth."
},
"$lte": {
"type": "string",
"description": "ISO date or datetime, or a relative date expression such as now(), -30d, +7d, or startOfMonth."
}
},
"additionalProperties": false
},
"companyIds": {
"type": "array",
"items": {
"type": "string",
"format": "uuid",
"description": "Company ID"
}
},
"contactIds": {
"type": "array",
"items": {
"type": "string",
"format": "uuid",
"description": "Contact ID"
}
},
"attendeeEmails": {
"type": "array",
"items": {
"type": "string"
}
},
"attendeeDomains": {
"type": "array",
"items": {
"type": "string"
}
},
"includeRecurrence": {
"type": "boolean",
"description": "Read the current repeat rule and time zone from Google Calendar. Requires one event id on the current user's connected Google calendar. Use to inspect the series schedule."
},
"includeTranscript": {
"type": "boolean",
"default": false,
"description": "When true, include the full recorded meeting transcript for each event. Defaults to false. Prefer narrowing the search (e.g. a single event id or a tight time window) before requesting transcripts, as they can be long."
}
},
"additionalProperties": false
},
"annotations": {
"title": "Find calendar events",
"readOnlyHint": true,
"openWorldHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description93/100
Schedule a calendar event on the user's connected Google Calendar and create a calendarEvents record in Zero. Call get_calendars first. If exactly one calendar with canScheduleEvents=true is returned, use its id. If multiple calendars can schedule events, ask the user which one to use before calling this tool. If none can schedule events, explain that a supported calendar must be connected. For repeated meetings, create one recurring series with recurrence and timeZone. Check each occurrence for a finite series; for an open-ended series check the next year and explain that horizon. Before calling this tool, call find_calendar_events for the current user's id over the full calendar day of the proposed start time. Treat any event where startTime < proposedEnd and endTime > proposedStart as a conflict. If there is a conflict, pick another time or ask the user — do not schedule until the current user is free unless they explicitly accept the conflict.
The description explains the capability, when to use it, and what to expect.
Inputs73/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
name
Event title.
Clear enough to supply this argument.
startTime
Start time as ISO 8601 date-time with Z or an explicit UTC offset.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
endTime
End time as ISO 8601 date-time with Z or an explicit UTC offset.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
calendarId
Required ID from get_calendars for a calendar with canScheduleEvents=true. If multiple calendars can schedule events, ask the user which one to use before scheduling. Do not call this tool when none can schedule events.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
recurrence
Optional repeat rule, e.g. ['RRULE:FREQ=DAILY;COUNT=3'] for three consecutive days. Supports one DAILY/WEEKLY/MONTHLY/YEARLY RRULE with interval, weekdays, COUNT or UNTIL. Omit for a single event. Never invent an end date or count.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
timeZone
IANA time zone, e.g. Europe/Helsinki. Required for recurrence. Use the user's intended local zone so repeats follow daylight saving time.
Clear enough to supply this argument.
description
Optional event description.
Explain the meaning of this value, not just its name.
location
Optional event location.
Explain the meaning of this value, not just its name.
attendeeEmails
Optional attendee email addresses to invite. The calendar owner is always added as an attendee automatically (matching an event created in the Google Calendar UI), so there is no need to list them here.
Clear enough to supply this argument.
contactIds
Optional contact IDs to link to the event.
Explain the meaning of this value, not just its name.
companyIds
Optional company IDs to link to the event.
Explain the meaning of this value, not just its name.
dealIds
Optional deal IDs to link to the event.
Explain the meaning of this value, not just its name.
addGoogleMeet
Create a Google Meet link. Defaults to true when omitted. Set false only when the user explicitly requests no Google Meet link.
Clear enough to supply this argument.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "schedule_calendar_event",
"title": "Schedule calendar event",
"description": "Schedule a calendar event on the user's connected Google Calendar and create a calendarEvents record in Zero. Call get_calendars first. If exactly one calendar with canScheduleEvents=true is returned, use its id. If multiple calendars can schedule events, ask the user which one to use before calling this tool. If none can schedule events, explain that a supported calendar must be connected. For repeated meetings, create one recurring series with recurrence and timeZone. Check each occurrence for a finite series; for an open-ended series check the next year and explain that horizon. Before calling this tool, call find_calendar_events for the current user's id over the full calendar day of the proposed start time. Treat any event where startTime < proposedEnd and endTime > proposedStart as a conflict. If there is a conflict, pick another time or ask the user — do not schedule until the current user is free unless they explicitly accept the conflict.",
"inputSchema": {
"type": "object",
"required": [
"name",
"startTime",
"endTime",
"calendarId"
],
"properties": {
"name": {
"type": "string",
"description": "Event title."
},
"dealIds": {
"type": "array",
"items": {
"type": "string"
},
"description": "Optional deal IDs to link to the event."
},
"endTime": {
"type": "string",
"format": "date-time",
"description": "End time as ISO 8601 date-time with Z or an explicit UTC offset."
},
"location": {
"type": "string",
"description": "Optional event location."
},
"timeZone": {
"type": "string",
"description": "IANA time zone, e.g. Europe/Helsinki. Required for recurrence. Use the user's intended local zone so repeats follow daylight saving time."
},
"startTime": {
"type": "string",
"format": "date-time",
"description": "Start time as ISO 8601 date-time with Z or an explicit UTC offset."
},
"calendarId": {
"type": "string",
"description": "Required ID from get_calendars for a calendar with canScheduleEvents=true. If multiple calendars can schedule events, ask the user which one to use before scheduling. Do not call this tool when none can schedule events."
},
"companyIds": {
"type": "array",
"items": {
"type": "string"
},
"description": "Optional company IDs to link to the event."
},
"contactIds": {
"type": "array",
"items": {
"type": "string"
},
"description": "Optional contact IDs to link to the event."
},
"recurrence": {
"type": "array",
"items": {
"type": "string"
},
"maxItems": 1,
"minItems": 1,
"description": "Optional repeat rule, e.g. ['RRULE:FREQ=DAILY;COUNT=3'] for three consecutive days. Supports one DAILY/WEEKLY/MONTHLY/YEARLY RRULE with interval, weekdays, COUNT or UNTIL. Omit for a single event. Never invent an end date or count."
},
"description": {
"type": "string",
"description": "Optional event description."
},
"addGoogleMeet": {
"type": "boolean",
"default": true,
"description": "Create a Google Meet link. Defaults to true when omitted. Set false only when the user explicitly requests no Google Meet link."
},
"attendeeEmails": {
"type": "array",
"items": {
"type": "string"
},
"description": "Optional attendee email addresses to invite. The calendar owner is always added as an attendee automatically (matching an event created in the Google Calendar UI), so there is no need to list them here."
}
},
"additionalProperties": false
},
"annotations": {
"title": "Schedule calendar event",
"readOnlyHint": false,
"openWorldHint": true,
"destructiveHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description92/100
Update an existing calendar event on the user's connected Google Calendar and in Zero. Call find_calendar_events first to get the event id. Only pass fields that should change. Recurring events support only editScope=this_event for one occurrence. Ask if the intended scope is unclear. Direct all-events, this-and-following, repeat-rule changes, and conversion between single and recurring events to Google Calendar. Do not simulate series edits by looping over occurrences. Before changing startTime or endTime, call find_calendar_events for the current user's id over the full calendar day of the proposed time and exclude the event being edited when checking for conflicts (event.startTime < proposedEnd and event.endTime > proposedStart). To add guests, pass addAttendeeEmails with only the new email(s). To remove guests, pass removeAttendeeEmails. Do not pass the organizer or the full attendee list.
The description explains the capability, when to use it, and what to expect.
Inputs83/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
id
Calendar event ID from find_calendar_events.
Clear enough to supply this argument.
editScope
Required for a recurring occurrence. Changes only the selected meeting. Series edits and repeat-rule changes must be made in Google Calendar. Ask if the intended scope is unclear.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
timeZone
IANA time zone for this individual event. Omit to preserve its current zone.
Clear enough to supply this argument.
name
Updated event title.
Clear enough to supply this argument.
startTime
Updated start time as ISO 8601 date-time with Z or an explicit UTC offset.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
endTime
Updated end time as ISO 8601 date-time with Z or an explicit UTC offset.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
description
Updated event description.
Clear enough to supply this argument.
location
Updated event location.
Clear enough to supply this argument.
addAttendeeEmails
Email addresses to invite. Pass only the new attendee(s), not the full list or the organizer.
Clear enough to supply this argument.
removeAttendeeEmails
Email addresses to remove from the event. Do not include the organizer.
Clear enough to supply this argument.
contactIds
Updated contact IDs to link to the event.
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
companyIds
Updated company IDs to link to the event.
Explain the meaning of this value, not just its name.
dealIds
Updated deal IDs to link to the event.
Explain the meaning of this value, not just its name.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "edit_calendar_event",
"title": "Edit calendar event",
"description": "Update an existing calendar event on the user's connected Google Calendar and in Zero. Call find_calendar_events first to get the event id. Only pass fields that should change. Recurring events support only editScope=this_event for one occurrence. Ask if the intended scope is unclear. Direct all-events, this-and-following, repeat-rule changes, and conversion between single and recurring events to Google Calendar. Do not simulate series edits by looping over occurrences. Before changing startTime or endTime, call find_calendar_events for the current user's id over the full calendar day of the proposed time and exclude the event being edited when checking for conflicts (event.startTime < proposedEnd and event.endTime > proposedStart). To add guests, pass addAttendeeEmails with only the new email(s). To remove guests, pass removeAttendeeEmails. Do not pass the organizer or the full attendee list.",
"inputSchema": {
"type": "object",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"format": "uuid",
"description": "Calendar event ID from find_calendar_events."
},
"name": {
"type": "string",
"description": "Updated event title."
},
"dealIds": {
"type": "array",
"items": {
"type": "string"
},
"description": "Updated deal IDs to link to the event."
},
"endTime": {
"type": "string",
"format": "date-time",
"description": "Updated end time as ISO 8601 date-time with Z or an explicit UTC offset."
},
"location": {
"type": "string",
"description": "Updated event location."
},
"timeZone": {
"type": "string",
"description": "IANA time zone for this individual event. Omit to preserve its current zone."
},
"editScope": {
"enum": [
"this_event"
],
"type": "string",
"description": "Required for a recurring occurrence. Changes only the selected meeting. Series edits and repeat-rule changes must be made in Google Calendar. Ask if the intended scope is unclear."
},
"startTime": {
"type": "string",
"format": "date-time",
"description": "Updated start time as ISO 8601 date-time with Z or an explicit UTC offset."
},
"companyIds": {
"type": "array",
"items": {
"type": "string"
},
"description": "Updated company IDs to link to the event."
},
"contactIds": {
"type": "array",
"items": {
"type": "string"
},
"description": "Updated contact IDs to link to the event."
},
"description": {
"type": "string",
"description": "Updated event description."
},
"addAttendeeEmails": {
"type": "array",
"items": {
"type": "string"
},
"description": "Email addresses to invite. Pass only the new attendee(s), not the full list or the organizer."
},
"removeAttendeeEmails": {
"type": "array",
"items": {
"type": "string"
},
"description": "Email addresses to remove from the event. Do not include the organizer."
}
},
"additionalProperties": false
},
"annotations": {
"title": "Edit calendar event",
"readOnlyHint": false,
"openWorldHint": true,
"destructiveHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description95/100
List files (attachments) on a company, contact, or deal. Returns { total, rows } — each row has id, name, type, description, size. Use a file id with read_files to read its contents. Up to 500 results per page.
The description explains the capability, when to use it, and what to expect.
Inputs54/100
Explain the meaning of this value, not just its name.
companyId
Company ID
Explain the meaning of this value, not just its name.
contactId
Contact ID
Explain the meaning of this value, not just its name.
dealId
Deal ID
Explain the meaning of this value, not just its name.
offset
Offset
Explain the meaning of this value, not just its name.
limit
Limit (default 100, max 500)
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description85/100
Read attached files and answer a question about their contents. Provide a record id (companyId/contactId/dealId) to read its attachments, and/or fileIds (from find_files) to target specific files. A question is required. Only image/jpeg, image/png, image/gif, image/webp, application/pdf are supported; other files are reported in filesSkipped. Reads up to 5 files / ~20MB per call; for a record, the 100 most recent files are considered.
Describe the returned information so the agent knows whether it will answer the request.
Inputs67/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
companyId
Company ID
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
contactId
Contact ID
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
dealId
Deal ID
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
fileIds
Specific file IDs (from find_files)
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
question
What to find out from the files
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "read_files",
"title": "Read files",
"description": "Read attached files and answer a question about their contents. Provide a record id (companyId/contactId/dealId) to read its attachments, and/or fileIds (from find_files) to target specific files. A question is required. Only image/jpeg, image/png, image/gif, image/webp, application/pdf are supported; other files are reported in filesSkipped. Reads up to 5 files / ~20MB per call; for a record, the 100 most recent files are considered.",
"inputSchema": {
"type": "object",
"required": [
"question"
],
"properties": {
"dealId": {
"type": "string",
"description": "Deal ID"
},
"fileIds": {
"type": "array",
"items": {
"type": "string"
},
"maxItems": 50,
"description": "Specific file IDs (from find_files)"
},
"question": {
"type": "string",
"description": "What to find out from the files"
},
"companyId": {
"type": "string",
"description": "Company ID"
},
"contactId": {
"type": "string",
"description": "Contact ID"
}
},
"additionalProperties": false
},
"annotations": {
"title": "Read files",
"readOnlyHint": true,
"openWorldHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description89/100
Queue a LinkedIn connection request to a contact. Creates a draft connection that the Zero Chrome extension sends on the next LinkedIn sync. Provide contactId or linkedin handle.
Explain mutations, irreversible effects, or prerequisites that matter before calling this tool.
Inputs75/100
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
contactId
Contact ID to connect with
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
linkedin
LinkedIn profile handle (e.g. johndoe) or URL. Required if contactId is omitted.
Clear enough to supply this argument.
message
Optional connection note (max 300 characters)
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description99/100
Search LinkedIn connections across ALL workspace members by name, headline, LinkedIn handle, or linked company — not just the calling user's own connections. Each row includes the owning `userId`/`userName`, so you can see which teammate is connected to someone. Pass `userId` to narrow to one member's connections. Returns { total, rows } — use total for counts without reading all rows. Each row has a `status` of `connected` (an accepted, established connection), `sent` (a request sent, awaiting acceptance — see `sentAt`), or `draft` (a connection request/invitation prepared in Zero and ready to be sent via the Zero Chrome extension, but not sent yet). By default drafts are EXCLUDED (only connected + sent returned) — set includeDrafts=true to include them. Each row also has `sentAt`/`connectedAt` timestamps, and connected results sort first. Useful for finding warm intros and surfacing people to turn into contacts with add_contact (use the returned linkedin handle, name, and headline). Set contactId.$exists=false to find connections that are not yet contacts in the CRM. Up to 100 results per page.
The description explains the capability, when to use it, and what to expect.
Inputs91/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
name
Connection name (substring match)
Clear enough to supply this argument.
headline
LinkedIn headline / title (substring match)
Clear enough to supply this argument.
linkedin
LinkedIn handle, e.g. johndoe
Clear enough to supply this argument.
companyId
Only connections linked to this company
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
userId
Filter to connections owned by one workspace member. Omit to search all members. Look up member IDs with the get_workspace_metadata tool.
Clear enough to supply this argument.
status
Filter by connection status: connected (accepted/established), sent (request sent, awaiting acceptance), or draft (a request/invitation prepared in Zero, ready to be sent via the Chrome extension but not sent yet). Filtering by draft overrides the default draft exclusion.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
includeDrafts
Include draft connections — requests/invitations prepared in Zero and ready to be sent via the Chrome extension, but not yet sent (stored with draft=true). Default false (drafts are excluded).
Clear enough to supply this argument.
contactId › $exists
true = already a contact, false = not yet a contact
Clear enough to supply this argument.
connectedAt › $gte
On or after (ISO date or relative macro)
Clear enough to supply this argument.
connectedAt › $lte
On or before (ISO date or relative macro)
Clear enough to supply this argument.
offset
Offset
Explain the meaning of this value, not just its name.
limit
Limit (max 100)
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
orderBy › column
Column to order by
Clear enough to supply this argument.
orderBy › direction
Direction to order by
Clear enough to supply this argument.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "find_linkedin_connections",
"title": "Find LinkedIn connections",
"description": "Search LinkedIn connections across ALL workspace members by name, headline, LinkedIn handle, or linked company — not just the calling user's own connections. Each row includes the owning `userId`/`userName`, so you can see which teammate is connected to someone. Pass `userId` to narrow to one member's connections. Returns { total, rows } — use total for counts without reading all rows. Each row has a `status` of `connected` (an accepted, established connection), `sent` (a request sent, awaiting acceptance — see `sentAt`), or `draft` (a connection request/invitation prepared in Zero and ready to be sent via the Zero Chrome extension, but not sent yet). By default drafts are EXCLUDED (only connected + sent returned) — set includeDrafts=true to include them. Each row also has `sentAt`/`connectedAt` timestamps, and connected results sort first. Useful for finding warm intros and surfacing people to turn into contacts with add_contact (use the returned linkedin handle, name, and headline). Set contactId.$exists=false to find connections that are not yet contacts in the CRM. Up to 100 results per page.",
"inputSchema": {
"type": "object",
"required": [],
"properties": {
"name": {
"type": "string",
"description": "Connection name (substring match)"
},
"limit": {
"type": "number",
"description": "Limit (max 100)"
},
"offset": {
"type": "number",
"description": "Offset"
},
"status": {
"enum": [
"connected",
"sent",
"draft"
],
"type": "string",
"description": "Filter by connection status: connected (accepted/established), sent (request sent, awaiting acceptance), or draft (a request/invitation prepared in Zero, ready to be sent via the Chrome extension but not sent yet). Filtering by draft overrides the default draft exclusion."
},
"userId": {
"type": "string",
"format": "uuid",
"description": "Filter to connections owned by one workspace member. Omit to search all members. Look up member IDs with the get_workspace_metadata tool."
},
"orderBy": {
"type": "object",
"required": [],
"properties": {
"column": {
"enum": [
"connectedAt",
"createdAt",
"name"
],
"type": "string",
"description": "Column to order by"
},
"direction": {
"enum": [
"asc",
"desc"
],
"type": "string",
"description": "Direction to order by"
}
},
"additionalProperties": false
},
"headline": {
"type": "string",
"description": "LinkedIn headline / title (substring match)"
},
"linkedin": {
"type": "string",
"description": "LinkedIn handle, e.g. johndoe"
},
"companyId": {
"type": "string",
"format": "uuid",
"description": "Only connections linked to this company"
},
"contactId": {
"type": "object",
"required": [
"$exists"
],
"properties": {
"$exists": {
"type": "boolean",
"description": "true = already a contact, false = not yet a contact"
}
},
"description": "Filter by whether the connection is already linked to a CRM contact.",
"additionalProperties": false
},
"connectedAt": {
"type": "object",
"required": [],
"properties": {
"$gte": {
"type": "string",
"description": "On or after (ISO date or relative macro)"
},
"$lte": {
"type": "string",
"description": "On or before (ISO date or relative macro)"
}
},
"description": "Filter by when the connection was established (accepted). Only `connected` connections have a connectedAt, so combining this with status sent/draft returns nothing. Supports ISO dates and relative macros (e.g. now(), -7d, -30d, -1m).",
"additionalProperties": false
},
"includeDrafts": {
"type": "boolean",
"description": "Include draft connections — requests/invitations prepared in Zero and ready to be sent via the Chrome extension, but not yet sent (stored with draft=true). Default false (drafts are excluded)."
}
},
"additionalProperties": false
},
"annotations": {
"title": "Find LinkedIn connections",
"readOnlyHint": true,
"openWorldHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description99/100
Find standalone CRM Notes by title, linked company/contact/deal, or creation date. These are separate records from the Meeting notes stored on calendar events. To read the Meeting notes tab for a calendar event, use find_calendar_events with that event's id. Returns { resultSetId, total, rows }; pass resultSetId to remove_notes instead of copying IDs. It covers every matching record (resultSetCount, up to 10,000); rows is a 5 row sample when more matched, so use query_result_set to read more or narrow.
The description explains the capability, when to use it, and what to expect.
Inputs59/100
10 of 11 inputs have descriptions. Add descriptions to the missing inputs, including where to obtain IDs and how to supply values.
id
Standalone CRM Note ID
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
name
Not provided
Missing description. Explain what this value means and how to supply it.
companyId
Company ID
Explain the meaning of this value, not just its name.
contactId
Contact ID
Explain the meaning of this value, not just its name.
dealId
Deal ID
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
createdAt › $gte
ISO date or datetime, or a relative date expression such as now(), -30d, +7d, or startOfMonth.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
createdAt › $lte
ISO date or datetime, or a relative date expression such as now(), -30d, +7d, or startOfMonth.
Explain the meaning of this value, not just its name.
offset
Offset
Explain the meaning of this value, not just its name.
limit
Limit
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
orderBy › column
Column to order by
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
orderBy › direction
Direction to order by
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "find_notes",
"title": "Find notes",
"description": "Find standalone CRM Notes by title, linked company/contact/deal, or creation date. These are separate records from the Meeting notes stored on calendar events. To read the Meeting notes tab for a calendar event, use find_calendar_events with that event's id. Returns { resultSetId, total, rows }; pass resultSetId to remove_notes instead of copying IDs. It covers every matching record (resultSetCount, up to 10,000); rows is a 5 row sample when more matched, so use query_result_set to read more or narrow.",
"inputSchema": {
"type": "object",
"required": [],
"properties": {
"id": {
"type": "string",
"format": "uuid",
"description": "Standalone CRM Note ID"
},
"name": {
"type": "string"
},
"limit": {
"type": "number",
"description": "Limit"
},
"dealId": {
"type": "string",
"description": "Deal ID"
},
"offset": {
"type": "number",
"description": "Offset"
},
"orderBy": {
"type": "object",
"properties": {
"column": {
"enum": [
"createdAt"
],
"type": "string",
"description": "Column to order by"
},
"direction": {
"enum": [
"asc",
"desc"
],
"type": "string",
"description": "Direction to order by"
}
}
},
"companyId": {
"type": "string",
"description": "Company ID"
},
"contactId": {
"type": "string",
"description": "Contact ID"
},
"createdAt": {
"type": "object",
"properties": {
"$gte": {
"type": "string",
"description": "ISO date or datetime, or a relative date expression such as now(), -30d, +7d, or startOfMonth."
},
"$lte": {
"type": "string",
"description": "ISO date or datetime, or a relative date expression such as now(), -30d, +7d, or startOfMonth."
}
}
}
},
"additionalProperties": false
},
"annotations": {
"title": "Find notes",
"readOnlyHint": true,
"openWorldHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description72/100
Remove notes in bulk. Pass either noteIds or resultSetId from find_notes (never both).
Explain mutations, irreversible effects, or prerequisites that matter before calling this tool.
Inputs88/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
noteIds
Note IDs. Or omit this and pass resultSetId from find_notes.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
resultSetId
resultSetId returned by a find_* call (or contactResultSetId / companyResultSetId from import_lead_search_results). Targets every record that call matched (its resultSetCount, up to 10,000), not just the rows shown. Use instead of copying IDs; never combine with an explicit ID array.
Clear enough to supply this argument.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "remove_notes",
"title": "Remove notes",
"description": "Remove notes in bulk. Pass either noteIds or resultSetId from find_notes (never both).",
"inputSchema": {
"type": "object",
"required": [],
"properties": {
"noteIds": {
"type": "array",
"items": {
"type": "string",
"format": "uuid",
"description": "Note ID"
},
"description": "Note IDs. Or omit this and pass resultSetId from find_notes."
},
"resultSetId": {
"type": "string",
"format": "uuid",
"description": "resultSetId returned by a find_* call (or contactResultSetId / companyResultSetId from import_lead_search_results). Targets every record that call matched (its resultSetCount, up to 10,000), not just the rows shown. Use instead of copying IDs; never combine with an explicit ID array."
}
},
"additionalProperties": false
},
"annotations": {
"title": "Remove notes",
"readOnlyHint": false,
"openWorldHint": false,
"destructiveHint": true
}
}
Shorten the title to an action and subject; move usage details into the description.
Description88/100
List active folders in this workspace. Use a returned folder ID as edit_list.listFolderId to move a list; pass null to remove it from its folder. Moving a list does not change its records, views, or pins.
Describe the returned information so the agent knows whether it will answer the request.
Inputs98/100
Input documentation gives an agent enough context to populate the arguments.
query
Optional case-insensitive substring match on folder name.
Clear enough to supply this argument.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "list_list_folders",
"title": "List list folders",
"description": "List active folders in this workspace. Use a returned folder ID as edit_list.listFolderId to move a list; pass null to remove it from its folder. Moving a list does not change its records, views, or pins.",
"inputSchema": {
"type": "object",
"required": [],
"properties": {
"query": {
"type": "string",
"description": "Optional case-insensitive substring match on folder name."
}
},
"additionalProperties": false
},
"annotations": {
"title": "List list folders",
"readOnlyHint": true,
"openWorldHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description94/100
Search workspace lists and return compact metadata only. Use this to discover list IDs before querying members with find_* + listIds. Before a membership write, require filterBased: false and sequenceOwned: false. Use get_list for one list's full dynamic filters and views.
The description explains the capability, when to use it, and what to expect.
Inputs88/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
entity
Optional entity type to filter lists by.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
query
Optional case-insensitive substring match on list name.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description90/100
Get full details for one list, including views (id, name, entity) and how find_* resolves each view. Use views[].id as viewId on find_* when the user names a specific view. resolvedFiltersForListEntity shows the default view only — do not copy into find calls. A view that reports sequenceOnlyFilterFields saves sequence participant rules only the sequence Contacts tab can evaluate: its filters and columns are reported as stored, but passing its viewId to find_* is rejected, and resolved filters come back null.
The description explains the capability, when to use it, and what to expect.
Inputs70/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
listId
List ID
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "get_list",
"title": "Get list",
"description": "Get full details for one list, including views (id, name, entity) and how find_* resolves each view. Use views[].id as viewId on find_* when the user names a specific view. resolvedFiltersForListEntity shows the default view only — do not copy into find calls. A view that reports sequenceOnlyFilterFields saves sequence participant rules only the sequence Contacts tab can evaluate: its filters and columns are reported as stored, but passing its viewId to find_* is rejected, and resolved filters come back null.",
"inputSchema": {
"type": "object",
"required": [
"listId"
],
"properties": {
"listId": {
"type": "string",
"format": "uuid",
"description": "List ID"
}
},
"additionalProperties": false
},
"annotations": {
"title": "Get list",
"readOnlyHint": true,
"openWorldHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description91/100
Add a list grouping records of one entity type. Call list_lists first: an active list of the same entity with the same name is refused so it can be reused instead. Without filters it is a regular list (populate via addRecordIds or add_*_to_list); with filters (or filterBased: true) it is a dynamic list whose membership is computed from them — change those later with edit_list. The saved list is available in Zero.
The description explains the capability, when to use it, and what to expect.
Inputs83/100
Explain the meaning of this value, not just its name.
name
List name
Explain the meaning of this value, not just its name.
entity
Entity type
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
icon
Icon name. Defaults to an entity-specific icon.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
color
Color hex code. Defaults to an entity-specific color. Valid values: #E5484D, #E93D82, #C2185B, #841A69, #AB4ABB, #7B1FA2, #6E56CF, #1976D2, #2554F0, #0090FF, #18A5C8, #15A494, #24B770, #2E7D32, #DBA51F, #C48E1C, #B85A1C, #FF7A1F, #0D0D0D, #666666
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
addRecordIds
Record IDs matching entity to add on creation. Prefer this over a separate add_*_to_list call when creating a list from find_* results. Mutually exclusive with filters/filterBased.
Clear enough to supply this argument.
filterBased
Create a dynamic list whose membership is computed from filters instead of record ids. Implied by filters.
Clear enough to supply this argument.
filters
Filter conditions for a dynamic list, in the saved-view filter format (same shape get_list returns in views[].filters). For stale records use a dotted relation field, e.g. { "lastActivity.time": { "$lte": "-14d" } }; do not use lastActivityAt. For weighted deal value use { "weightedValue": { "$gt": 5000 } }; "value" is the unweighted deal value. Other computed deal fields exposed by the list UI are timeToClose and timeInCurrentStage (both durations in milliseconds). Keys are entity fields, supported computed fields, relations, or custom.<columnId>, and values are conditions like { "$includes": "$user.id" }, { "$gte": "-7d" }, or { "$in": [...] }. Operator keys are exactly $lte, $gte, etc. without extra quote characters in the key. "$user.id" means the viewing user; relative dates like "-7d"/"+2w" are supported on date fields. Location filters use a structured value: { "location": { "city": "Helsinki" } } (city | state | country | continent). Use get_workspace_metadata to discover custom properties and pipeline/stage IDs; it does not enumerate standard or computed fields. Mutually exclusive with addRecordIds.
Clear enough to supply this argument.
columns
Visible columns for the created view, as exact list column keys (e.g. "contacts", "custom.<columnId>"). name is always first. Defaults to entity-specific columns.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
pinFor
Pin the new list in the sidebar: "workspace" for everyone, "user" for you only. Omit to leave unpinned.
Clear enough to supply this argument.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description79/100
Edit a list and one of its views. listFolderId moves it to a folder from list_list_folders; null removes it from its folder without changing records, views, or pins. order is an optional zero-based position in the destination folder (clamped to the end). Moves append by default; same-folder moves keep their position unless order is supplied. Affected folder orders are normalized atomically. viewId defaults to the list's default view. subGroupBy adds an optional nested second-level grouping within groupBy (requires groupBy). filters REPLACES the view filters entirely — call get_list first and send the complete new filter object. On a dynamic list filters define membership; on a regular list they only narrow what the view shows. filterBased: true with filters converts a regular list to dynamic. filterBased: false snapshots the current default view membership into a regular list, replacing old static membership; saved view filters remain as display filters. addView and removeViewId are each a call of their own and cannot be combined with any other edit. On a sequence-owned list, a view's sequence participant columns are presentation the sequence Contacts tab manages: they cannot be passed in and are kept through column edits, and the list's last contacts grid view can be neither deleted nor converted to a board.
Explain mutations, irreversible effects, or prerequisites that matter before calling this tool.
Inputs89/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
listId
List to edit (from list_lists/get_list).
Clear enough to supply this argument.
listFolderId
Destination folder ID from list_list_folders, or null to remove the list from its folder. Omit to keep its folder unchanged.
Clear enough to supply this argument.
order
Optional zero-based list position within its destination folder, clamped to the end. May be used alone to reorder in the current folder. Omit to append on folder changes or keep position within the same folder.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
name
New list name.
Clear enough to supply this argument.
icon
New icon.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
pinFor
Pin the list in the sidebar: "workspace" for everyone, "user" for you only.
Clear enough to supply this argument.
unpinFor
Unpin the list: "workspace" for everyone, "user" for you only (keeps it pinned for others).
Clear enough to supply this argument.
viewId
View to edit. Defaults to the list's default view.
Resolve the mismatch between this description and its schema constraints.
viewName
New name for the target view (name renames the list).
Clear enough to supply this argument.
setDefault
true makes the target view the list's default, replacing the previous one. Only a view of the list's own entity qualifies. false is not supported — make another view the default instead.
Clear enough to supply this argument.
viewType
View layout: "grid" is List, "board" is Kanban. A board view requires groupBy.
Clear enough to supply this argument.
filters
Replacement filters for the target view, same format as add_list filters. On a regular list they narrow the view without changing membership.
Clear enough to supply this argument.
clearFilters
Remove the target view's filters. Mutually exclusive with filters.
Clear enough to supply this argument.
groupBy
Exact list column key to group the target view by, e.g. "ownerIds" (Owners), "stage", "pipelineStage.type", "createdAt:month", "custom.<columnId>". A string, not a report dimension object. Preserves filters.
Clear enough to supply this argument.
clearGroupBy
Remove the target view's grouping. Mutually exclusive with groupBy. Also clears subGroupBy, since sub-grouping only applies within a primary grouping.
Clear enough to supply this argument.
subGroupBy
Add a second level of grouping (Linear-style "group by X, then Y" swimlanes) nested inside each groupBy group. Same format as groupBy, e.g. "stage" or "closeDate:month". Requires an effective groupBy — either already set on the view or passed as groupBy in this same call — and must be a different column key than that groupBy. Setting groupBy to subGroupBy's own column (or clearing groupBy) automatically clears subGroupBy.
Clear enough to supply this argument.
clearSubGroupBy
Remove sub-grouping from the target view, keeping the primary groupBy. Mutually exclusive with subGroupBy.
Clear enough to supply this argument.
sortBy
Exact sortable list column key to sort the target view by, e.g. "name", "weightedValue", "lastActivity", "custom.<columnId>". Preserves filters and grouping.
Clear enough to supply this argument.
sortDirection
Sort direction for sortBy. Defaults to "asc" and is only valid with sortBy.
Clear enough to supply this argument.
clearSort
Restore the view's default sorting. Mutually exclusive with sortBy/sortDirection.
Clear enough to supply this argument.
filterBased
true, with filters, converts a regular list into a dynamic one. false converts a dynamic list into a regular list containing a snapshot of its current default view members, replacing any old static membership.
Clear enough to supply this argument.
columns
Replacement set of visible columns for the target view, as exact list column keys. name is kept first. Any sequence participant columns the view already shows are kept after them. Mutually exclusive with addColumns/removeColumns.
Clear enough to supply this argument.
addColumns
Column keys to append to the target view, e.g. ["custom.<columnId>"]. Existing ones are kept.
Clear enough to supply this argument.
removeColumns
Column keys to hide from the target view. name cannot be removed.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
addView › name
View name shown in the view tabs.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
addView › entity
Entity the view shows; defaults to the list's entity.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
addView › viewType
Same as the top-level field; defaults to grid.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
addView › filters
Same as the top-level field. When omitted the new view copies the default view's filters, so it starts with the same members.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
addView › groupBy
Same as the top-level field. Required for board views.
Clear enough to supply this argument.
addView › sortBy
Same as the top-level field.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
addView › sortDirection
Same as the top-level field.
Clear enough to supply this argument.
addView › columns
Same as the top-level field.
Clear enough to supply this argument.
addView › setDefault
Same as the top-level field.
Clear enough to supply this argument.
removeViewId
Delete this view (get_list views[].id). Membership is unchanged. The default view, a list's last view, and a sequence-owned list's last contacts grid view cannot be deleted.
Clear enough to supply this argument.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "edit_list",
"title": "Edit list",
"description": "Edit a list and one of its views. listFolderId moves it to a folder from list_list_folders; null removes it from its folder without changing records, views, or pins. order is an optional zero-based position in the destination folder (clamped to the end). Moves append by default; same-folder moves keep their position unless order is supplied. Affected folder orders are normalized atomically. viewId defaults to the list's default view. subGroupBy adds an optional nested second-level grouping within groupBy (requires groupBy). filters REPLACES the view filters entirely — call get_list first and send the complete new filter object. On a dynamic list filters define membership; on a regular list they only narrow what the view shows. filterBased: true with filters converts a regular list to dynamic. filterBased: false snapshots the current default view membership into a regular list, replacing old static membership; saved view filters remain as display filters. addView and removeViewId are each a call of their own and cannot be combined with any other edit. On a sequence-owned list, a view's sequence participant columns are presentation the sequence Contacts tab manages: they cannot be passed in and are kept through column edits, and the list's last contacts grid view can be neither deleted nor converted to a board.",
"inputSchema": {
"type": "object",
"required": [
"listId"
],
"properties": {
"icon": {
"enum": [
"mood-smile",
"mood-empty",
"mood-share",
"mood-sad",
"activity-heartbeat",
"adjustments-horizontal",
"trending-up",
"alarm",
"alert-hexagon",
"alert-triangle",
"analyze",
"antenna-bars-5",
"aperture",
"confetti",
"scale",
"archive",
"armchair",
"star",
"sun",
"tag",
"target",
"thumb-up",
"thumb-down",
"trash",
"trophy",
"umbrella",
"upload",
"user",
"video",
"volume",
"wallet",
"check",
"at",
"award",
"ball-tennis",
"ballpen",
"basket",
"beach",
"bell",
"moneybag",
"search",
"bleach",
"rubber-stamp",
"blur",
"bolt",
"bookmark",
"border-all",
"custom:companies",
"custom:members",
"bulb",
"calculator",
"calendar",
"camera",
"sparkles",
"chart-bar",
"chart-line",
"settings",
"circle",
"clipboard",
"clock",
"cloud",
"code",
"coffee",
"coin",
"compass",
"copy",
"credit-card",
"crown",
"database",
"device-desktop",
"shopping-cart",
"rocket",
"diamond",
"discount",
"file-text",
"edit",
"mail",
"eye",
"file",
"flame",
"flag",
"access-point",
"adjustments-alt",
"affiliate",
"arrow-back-up",
"arrow-bear-right",
"arrow-bounce",
"arrow-forward-up",
"arrow-narrow-left",
"arrow-narrow-right",
"arrows-join",
"artboard",
"assembly",
"asterisk",
"binoculars",
"bowl-chopsticks",
"box-model-2",
"box-multiple",
"box",
"brackets-angle",
"brain",
"briefcase",
"brightness-down",
"broadcast",
"brush",
"bug",
"building-bank",
"building-castle",
"capture",
"car-fan",
"car",
"carambola",
"cardboards",
"cactus",
"cash-banknote",
"chart-pie",
"chart-funnel",
"chess-king",
"chess-rook",
"crane",
"currency-dollar",
"currency-euro",
"cut",
"cylinder",
"dashboard",
"details",
"device-gamepad-2",
"diamonds",
"direction-sign",
"disc",
"dna",
"droplet",
"ear",
"exchange",
"eyeglass",
"feather",
"filter",
"fingerprint",
"flag-3",
"flask",
"flower",
"focus-2",
"folder",
"forbid-2",
"frustum",
"gauge",
"geometry",
"gift",
"glass-cocktail",
"golf",
"graph",
"hand-finger",
"hand-love-you",
"headphones",
"heart",
"hexagonal-pyramid",
"hierarchy",
"home",
"hourglass-empty",
"jacket",
"key",
"keyframe-align-horizontal",
"keyframe",
"keyframes",
"label",
"laurel-wreath",
"layers-subtract",
"layout-board",
"layout-cards",
"layout-grid",
"leaf",
"lemon",
"license",
"link",
"location",
"lock-open",
"mailbox",
"map-pin",
"mask",
"medical-cross",
"message-dots",
"message-chatbot",
"microphone",
"moon",
"mouse-2",
"mug",
"music",
"nut",
"paperclip",
"phone",
"plane-tilt",
"plant",
"pointer",
"presentation",
"rainbow",
"road",
"rosette-discount-check",
"rotate-dot",
"run",
"scissors",
"send",
"shield",
"spiral",
"speakerphone",
"tags",
"toggle-left",
"tool",
"triangle-inverted",
"timeline-event",
"users",
"wifi",
"windmill",
"world",
"x",
"arrow-bar-to-down",
"arrow-bar-to-left",
"arrow-bar-to-right",
"arrow-bar-to-up",
"arrow-big-down",
"arrow-big-left",
"plus-circle",
"webhook",
"arrow-down-circle",
"arrow-down-left-circle",
"arrow-down-right-circle",
"arrow-left-circle",
"arrow-right-circle",
"arrow-up-circle",
"arrow-up-left-circle",
"arrow-up-right-circle",
"arrows-diagonal",
"arrows-diagonal-2",
"arrows-double-ne-sw",
"arrows-double-nw-se",
"arrows-double-se-nw",
"arrows-double-sw-ne",
"arrows-exchange",
"arrows-horizontal",
"arrows-join-2",
"arrows-left-down",
"arrows-left-right",
"arrows-maximize",
"arrows-minimize",
"arrows-right-down",
"arrows-right-left",
"arrows-sort",
"arrows-split",
"arrows-split-2",
"arrows-transfer-down",
"arrows-transfer-up",
"arrows-vertical",
"artboard-off",
"aspect-ratio",
"asset",
"asterisk-simple",
"at-off",
"atom",
"augmented-reality",
"automatic-gearbox",
"award-off",
"axe",
"axis-x",
"axis-y",
"baby-carriage",
"backhoe",
"backpack",
"badge",
"badges",
"ball-american-football",
"ball-baseball",
"ball-basketball",
"ball-bowling",
"ball-football",
"ball-volleyball",
"balloon",
"balloon-off",
"ballpen-off",
"bandage",
"barbell",
"barcode",
"barrel",
"barrier-block",
"baseline",
"basket-off",
"bath",
"battery",
"battery-charging",
"battery-off",
"api-app",
"archery-arrow",
"border-corners",
"bike",
"blob",
"chevron-down",
"chevron-up",
"chevron-left",
"chevron-right",
"chevron-down-left",
"chevron-down-right",
"chevron-up-left",
"chevron-up-right",
"chevrons-down",
"chevrons-up",
"chevrons-left",
"chevrons-right",
"chevrons-down-left",
"chevrons-down-right",
"chevrons-up-left",
"chevrons-up-right",
"mood-happy",
"volume-2"
],
"type": "string",
"description": "New icon."
},
"name": {
"type": "string",
"description": "New list name."
},
"color": {
"type": "string",
"description": "New color hex code. Valid values: #E5484D, #E93D82, #C2185B, #841A69, #AB4ABB, #7B1FA2, #6E56CF, #1976D2, #2554F0, #0090FF, #18A5C8, #15A494, #24B770, #2E7D32, #DBA51F, #C48E1C, #B85A1C, #FF7A1F, #0D0D0D, #666666"
},
"order": {
"type": "integer",
"maximum": 2147483647,
"minimum": 0,
"description": "Optional zero-based list position within its destination folder, clamped to the end. May be used alone to reorder in the current folder. Omit to append on folder changes or keep position within the same folder."
},
"listId": {
"type": "string",
"format": "uuid",
"description": "List to edit (from list_lists/get_list)."
},
"pinFor": {
"enum": [
"workspace",
"user"
],
"type": "string",
"description": "Pin the list in the sidebar: \"workspace\" for everyone, \"user\" for you only."
},
"sortBy": {
"type": "string",
"description": "Exact sortable list column key to sort the target view by, e.g. \"name\", \"weightedValue\", \"lastActivity\", \"custom.<columnId>\". Preserves filters and grouping."
},
"viewId": {
"type": "string",
"format": "uuid",
"description": "View to edit. Defaults to the list's default view."
},
"addView": {
"type": "object",
"required": [
"name"
],
"properties": {
"name": {
"type": "string",
"maxLength": 255,
"minLength": 1,
"description": "View name shown in the view tabs."
},
"entity": {
"enum": [
"companies",
"contacts",
"deals"
],
"type": "string",
"description": "Entity the view shows; defaults to the list's entity."
},
"sortBy": {
"type": "string",
"description": "Same as the top-level field."
},
"columns": {
"type": "array",
"items": {
"type": "string"
},
"description": "Same as the top-level field."
},
"filters": {
"type": "object",
"description": "Same as the top-level field. When omitted the new view copies the default view's filters, so it starts with the same members.",
"additionalProperties": true
},
"groupBy": {
"type": "string",
"description": "Same as the top-level field. Required for board views."
},
"viewType": {
"enum": [
"grid",
"board"
],
"type": "string",
"description": "Same as the top-level field; defaults to grid."
},
"setDefault": {
"type": "boolean",
"description": "Same as the top-level field."
},
"sortDirection": {
"enum": [
"asc",
"desc"
],
"type": "string",
"description": "Same as the top-level field."
}
},
"description": "Create a view on this list. A view for a related entity (a contacts view on a companies list) shows the related records of the list's members.",
"additionalProperties": false
},
"columns": {
"type": "array",
"items": {
"type": "string"
},
"description": "Replacement set of visible columns for the target view, as exact list column keys. name is kept first. Any sequence participant columns the view already shows are kept after them. Mutually exclusive with addColumns/removeColumns."
},
"filters": {
"type": "object",
"description": "Replacement filters for the target view, same format as add_list filters. On a regular list they narrow the view without changing membership.",
"additionalProperties": true
},
"groupBy": {
"type": "string",
"description": "Exact list column key to group the target view by, e.g. \"ownerIds\" (Owners), \"stage\", \"pipelineStage.type\", \"createdAt:month\", \"custom.<columnId>\". A string, not a report dimension object. Preserves filters."
},
"unpinFor": {
"enum": [
"workspace",
"user"
],
"type": "string",
"description": "Unpin the list: \"workspace\" for everyone, \"user\" for you only (keeps it pinned for others)."
},
"viewName": {
"type": "string",
"maxLength": 255,
"minLength": 1,
"description": "New name for the target view (name renames the list)."
},
"viewType": {
"enum": [
"grid",
"board"
],
"type": "string",
"description": "View layout: \"grid\" is List, \"board\" is Kanban. A board view requires groupBy."
},
"clearSort": {
"type": "boolean",
"description": "Restore the view's default sorting. Mutually exclusive with sortBy/sortDirection."
},
"addColumns": {
"type": "array",
"items": {
"type": "string"
},
"description": "Column keys to append to the target view, e.g. [\"custom.<columnId>\"]. Existing ones are kept."
},
"setDefault": {
"type": "boolean",
"description": "true makes the target view the list's default, replacing the previous one. Only a view of the list's own entity qualifies. false is not supported — make another view the default instead."
},
"subGroupBy": {
"type": "string",
"description": "Add a second level of grouping (Linear-style \"group by X, then Y\" swimlanes) nested inside each groupBy group. Same format as groupBy, e.g. \"stage\" or \"closeDate:month\". Requires an effective groupBy — either already set on the view or passed as groupBy in this same call — and must be a different column key than that groupBy. Setting groupBy to subGroupBy's own column (or clearing groupBy) automatically clears subGroupBy."
},
"filterBased": {
"type": "boolean",
"description": "true, with filters, converts a regular list into a dynamic one. false converts a dynamic list into a regular list containing a snapshot of its current default view members, replacing any old static membership."
},
"clearFilters": {
"type": "boolean",
"description": "Remove the target view's filters. Mutually exclusive with filters."
},
"clearGroupBy": {
"type": "boolean",
"description": "Remove the target view's grouping. Mutually exclusive with groupBy. Also clears subGroupBy, since sub-grouping only applies within a primary grouping."
},
"listFolderId": {
"type": [
"string",
"null"
],
"format": "uuid",
"description": "Destination folder ID from list_list_folders, or null to remove the list from its folder. Omit to keep its folder unchanged."
},
"removeViewId": {
"type": "string",
"format": "uuid",
"description": "Delete this view (get_list views[].id). Membership is unchanged. The default view, a list's last view, and a sequence-owned list's last contacts grid view cannot be deleted."
},
"removeColumns": {
"type": "array",
"items": {
"type": "string"
},
"description": "Column keys to hide from the target view. name cannot be removed."
},
"sortDirection": {
"enum": [
"asc",
"desc"
],
"type": "string",
"description": "Sort direction for sortBy. Defaults to \"asc\" and is only valid with sortBy."
},
"clearSubGroupBy": {
"type": "boolean",
"description": "Remove sub-grouping from the target view, keeping the primary groupBy. Mutually exclusive with subGroupBy."
}
},
"additionalProperties": false
},
"annotations": {
"title": "Edit list",
"readOnlyHint": false,
"openWorldHint": false,
"destructiveHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description94/100
Find quotes by deal, company, status, or creation date. Returns each quote's line items, contract term (termMonths), totals (totalAmount is TCV over the term, plus MRR/ARR, in the quote currency and converted to the workspace currency), status, and expiry.
The description explains the capability, when to use it, and what to expect.
Inputs64/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
dealId
Deal ID
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
companyId
Company ID
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
status
Quote status filter
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
createdAt › $gte
On or after
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
createdAt › $lte
On or before
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
offset
Offset
Explain the meaning of this value, not just its name.
limit
Limit
Explain the meaning of this value, not just its name.
orderBy › column
Column to order by
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
orderBy › direction
Direction to order by
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description86/100
Create a new quote attached to a deal and/or company. Call get_workspace_metadata with sections=["products"] first to discover catalog products and their price ids. Line items either reference a catalog product (productId, optionally priceId to pick one of its prices — amount, billing interval, and discount are then taken from the price) or are custom (provide name and amount directly). All line items share one quote currency; totals, MRR and ARR are derived from the line items, and absolute discounts are per unit. Creates a record; does not search or edit existing quotes.
The description explains the capability, when to use it, and what to expect.
Inputs87/100
Explain the meaning of this value, not just its name.
name
Quote name
Explain the meaning of this value, not just its name.
dealId
Deal ID to attach the quote to
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
companyId
Company ID to attach the quote to
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
status
Initial status (default draft)
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
currency
ISO currency code for the whole quote (e.g. USD). Defaults to the referenced price's currency, then the workspace currency.
Clear enough to supply this argument.
expiresAt
Expiry date (YYYY-MM-DD)
Explain what happens when this optional value is omitted.
termMonths
Contract term in months. Defaults to the highest minimum among the referenced prices (explicit minimumTermMonths or the billing interval), else 12. totalAmount is TCV over this term.
Clear enough to supply this argument.
lineItems › items › productId
Catalog product ID
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
lineItems › items › priceId
Price ID within the product's prices (defaults to its only price)
Clear enough to supply this argument.
lineItems › items › name
Line item name (defaults to product · price name)
Clear enough to supply this argument.
lineItems › items › quantity
Quantity (default 1)
Clear enough to supply this argument.
lineItems › items › amount
Per-unit amount (overrides the price's amount)
Clear enough to supply this argument.
lineItems › items › interval
Billing interval for recurring lines; omit for one-time
Clear enough to supply this argument.
lineItems › items › discountType
Discount unit: absolute is per unit, percentage is of the line subtotal
Clear enough to supply this argument.
lineItems › items › discount
Discount value (requires discountType)
Clear enough to supply this argument.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "add_quote",
"title": "Add quote",
"description": "Create a new quote attached to a deal and/or company. Call get_workspace_metadata with sections=[\"products\"] first to discover catalog products and their price ids. Line items either reference a catalog product (productId, optionally priceId to pick one of its prices — amount, billing interval, and discount are then taken from the price) or are custom (provide name and amount directly). All line items share one quote currency; totals, MRR and ARR are derived from the line items, and absolute discounts are per unit. Creates a record; does not search or edit existing quotes.",
"inputSchema": {
"type": "object",
"required": [
"name",
"lineItems"
],
"properties": {
"name": {
"type": "string",
"description": "Quote name"
},
"dealId": {
"type": "string",
"format": "uuid",
"description": "Deal ID to attach the quote to"
},
"status": {
"enum": [
"draft",
"sent"
],
"type": "string",
"description": "Initial status (default draft)"
},
"currency": {
"type": "string",
"description": "ISO currency code for the whole quote (e.g. USD). Defaults to the referenced price's currency, then the workspace currency."
},
"companyId": {
"type": "string",
"format": "uuid",
"description": "Company ID to attach the quote to"
},
"expiresAt": {
"type": "string",
"description": "Expiry date (YYYY-MM-DD)"
},
"lineItems": {
"type": "array",
"items": {
"type": "object",
"required": [],
"properties": {
"name": {
"type": "string",
"description": "Line item name (defaults to product · price name)"
},
"amount": {
"type": "number",
"description": "Per-unit amount (overrides the price's amount)"
},
"priceId": {
"type": "string",
"format": "uuid",
"description": "Price ID within the product's prices (defaults to its only price)"
},
"discount": {
"type": "number",
"description": "Discount value (requires discountType)"
},
"interval": {
"enum": [
"day",
"week",
"month",
"quarter",
"year"
],
"type": "string",
"description": "Billing interval for recurring lines; omit for one-time"
},
"quantity": {
"type": "number",
"description": "Quantity (default 1)"
},
"productId": {
"type": "string",
"format": "uuid",
"description": "Catalog product ID"
},
"discountType": {
"enum": [
"absolute",
"percentage"
],
"type": "string",
"description": "Discount unit: absolute is per unit, percentage is of the line subtotal"
}
},
"additionalProperties": false
},
"minItems": 1,
"description": "Line items. Reference a catalog product/price or provide custom name + amount."
},
"termMonths": {
"type": "integer",
"minimum": 1,
"description": "Contract term in months. Defaults to the highest minimum among the referenced prices (explicit minimumTermMonths or the billing interval), else 12. totalAmount is TCV over this term."
}
},
"additionalProperties": false
},
"annotations": {
"title": "Add quote",
"readOnlyHint": false,
"openWorldHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description80/100
Add a custom activity log entry such as a call or site visit. Activity type must be pre-configured in the workspace. Must be linked to at least one company, contact, or deal. An activity with no link is not displayed anywhere.
The description explains the capability, when to use it, and what to expect.
Inputs88/100
Explain the meaning of this value, not just its name.
typeId
Custom activity type ID (from get_workspace_metadata customActivityTypes)
Clear enough to supply this argument.
name
Activity name/title
Explain the meaning of this value, not just its name.
content
Activity content/notes (markdown)
Clear enough to supply this argument.
time
When the activity occurred (ISO date-time)
Explain what happens when this optional value is omitted.
custom
Custom field values keyed by the activity type’s customFields[].id. Call get_workspace_metadata with sections=["customActivityTypes"] to discover fields and options. For select/multiselect fields use options[].key, not display names. Edits update only supplied fields and preserve other values.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
companyIds
Associated company IDs
Clear enough to supply this argument.
contactIds
Associated contact IDs
Clear enough to supply this argument.
dealIds
Associated deal IDs
Clear enough to supply this argument.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description59/100
Edit an existing custom activity entry.
Explain mutations, irreversible effects, or prerequisites that matter before calling this tool.
Inputs81/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
id
Custom activity ID
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
name
Activity name/title
Explain the meaning of this value, not just its name.
content
Activity content/notes (markdown)
Clear enough to supply this argument.
time
When the activity occurred (ISO date-time)
Clear enough to supply this argument.
custom
Custom field values keyed by the activity type’s customFields[].id. Call get_workspace_metadata with sections=["customActivityTypes"] to discover fields and options. For select/multiselect fields use options[].key, not display names. Edits update only supplied fields and preserve other values.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
companyIds
Associated company IDs
Clear enough to supply this argument.
contactIds
Associated contact IDs
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
dealIds
Associated deal IDs
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description83/100
Load the full markdown content of a workspace context by ID. Workspace contexts are reusable background snippets (ICP definitions, scoring criteria, writing style) referenced by AI columns and agents. Often they contain valuable infromation about the user's company or the user themselves.
Describe the returned information so the agent knows whether it will answer the request.
Inputs70/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
id
Context ID
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "load_context",
"title": "Load Workspace context by ID",
"description": "Load the full markdown content of a workspace context by ID. Workspace contexts are reusable background snippets (ICP definitions, scoring criteria, writing style) referenced by AI columns and agents. Often they contain valuable infromation about the user's company or the user themselves.",
"inputSchema": {
"type": "object",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"format": "uuid",
"description": "Context ID"
}
},
"additionalProperties": false
},
"annotations": {
"title": "Load Workspace context by ID",
"readOnlyHint": true,
"openWorldHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description79/100
Find AI context snippets — reusable background text (ICP definitions, scoring criteria, writing style) referenced by AI columns and agents.
The description explains the capability, when to use it, and what to expect.
Inputs75/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
id
Context ID
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
name
Context name (substring match)
Clear enough to supply this argument.
scope
Only return contexts of this scope. "workspace" contexts are shared with everyone in the workspace; "personal" contexts are visible only to their owner. Omit to return both.
Clear enough to supply this argument.
offset
Offset
Explain the meaning of this value, not just its name.
limit
Limit
Explain the meaning of this value, not just its name.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description78/100
Add a reusable AI context snippet (background text referenced by AI columns and agents). "workspace" contexts are shared with everyone in the workspace; "personal" contexts are visible only to their owner. Pass scope "personal" when the user asks for something private to them.
The description explains the capability, when to use it, and what to expect.
Inputs67/100
Explain the meaning of this value, not just its name.
name
Context name
Explain the meaning of this value, not just its name.
content
Context content (markdown)
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
scope
"workspace" contexts are shared with everyone in the workspace; "personal" contexts are visible only to their owner. Defaults to "workspace".
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "add_context",
"title": "Add AI context",
"description": "Add a reusable AI context snippet (background text referenced by AI columns and agents). \"workspace\" contexts are shared with everyone in the workspace; \"personal\" contexts are visible only to their owner. Pass scope \"personal\" when the user asks for something private to them.",
"inputSchema": {
"type": "object",
"required": [
"name",
"content"
],
"properties": {
"name": {
"type": "string",
"description": "Context name"
},
"scope": {
"enum": [
"personal",
"workspace"
],
"type": "string",
"description": "\"workspace\" contexts are shared with everyone in the workspace; \"personal\" contexts are visible only to their owner. Defaults to \"workspace\"."
},
"content": {
"type": "string",
"description": "Context content (markdown)"
}
},
"additionalProperties": false
},
"annotations": {
"title": "Add AI context",
"readOnlyHint": false,
"openWorldHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description84/100
Edit an existing AI context snippet. "workspace" contexts are shared with everyone in the workspace; "personal" contexts are visible only to their owner. Scope can only be widened here: a personal context can be shared with the workspace, but a shared one cannot be made "personal" through this tool, because that takes it away from every other member and leaves the agents and AI columns referencing it running without it. Only a person can make that change, in Settings > Agent Context, where it is confirmed against the list of what would be affected. Pass scope only when the user explicitly asked to change who can see the context.
The description explains the capability, when to use it, and what to expect.
Inputs63/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
id
Context ID
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
name
Context name
Explain the meaning of this value, not just its name.
content
Context content (markdown)
Explain the meaning of this value, not just its name.
scope
"workspace" contexts are shared with everyone in the workspace; "personal" contexts are visible only to their owner. Omit to leave the current scope unchanged. Only "workspace" can be set on a context that is currently personal; un-sharing is rejected and has to be done by a person in settings.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "edit_context",
"title": "Edit AI context",
"description": "Edit an existing AI context snippet. \"workspace\" contexts are shared with everyone in the workspace; \"personal\" contexts are visible only to their owner. Scope can only be widened here: a personal context can be shared with the workspace, but a shared one cannot be made \"personal\" through this tool, because that takes it away from every other member and leaves the agents and AI columns referencing it running without it. Only a person can make that change, in Settings > Agent Context, where it is confirmed against the list of what would be affected. Pass scope only when the user explicitly asked to change who can see the context.",
"inputSchema": {
"type": "object",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"format": "uuid",
"description": "Context ID"
},
"name": {
"type": "string",
"description": "Context name"
},
"scope": {
"enum": [
"personal",
"workspace"
],
"type": "string",
"description": "\"workspace\" contexts are shared with everyone in the workspace; \"personal\" contexts are visible only to their owner. Omit to leave the current scope unchanged. Only \"workspace\" can be set on a context that is currently personal; un-sharing is rejected and has to be done by a person in settings."
},
"content": {
"type": "string",
"description": "Context content (markdown)"
}
},
"additionalProperties": false
},
"annotations": {
"title": "Edit AI context",
"readOnlyHint": false,
"openWorldHint": false,
"destructiveHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description88/100
Find support tickets and issues from Plain, Pylon, or Linear. Filter by status, priority, labels, linked company/contact, or date range. Pass verbose=true to also return each issue's full message/thread history.
Describe the returned information so the agent knows whether it will answer the request.
Inputs68/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
companyId
Filter by company ID
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
contactId
Filter by contact ID
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
status
Issue status
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
type
Integration type
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
priority
Priority level
Explain the meaning of this value, not just its name.
labels
Filter by labels (matches issues containing any of these labels)
Clear enough to supply this argument.
name
Issue name/title (substring match)
Clear enough to supply this argument.
time › $gte
On or after
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
time › $lte
On or before
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
offset
Offset
Explain the meaning of this value, not just its name.
limit
Limit
Explain the meaning of this value, not just its name.
verbose
When true, include the full message/thread history for each issue (author, content, timestamp). Defaults to false. Messages can be long — narrow the search (specific company/issue, tight time window) before requesting verbose output.
Clear enough to supply this argument.
orderBy › column
Column to order by
Explain the meaning of this value, not just its name.
orderBy › direction
Direction
Explain the meaning of this value, not just its name.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description98/100
Search saved reports/charts by name, dashboard, or entity. Returns { total, rows } where each row is { id, name, type, entity, description, order, dashboard }. Rows come back in the order the dashboard renders them, and order is the panel's position within its own dashboard, counting from 0 (a panel with no order renders as 0) — so filter by dashboardId before relying on it to answer "the first panel on this dashboard". Use a report id with read_report to read its computed data. Saved charts can be viewed in Zero.
The description explains the capability, when to use it, and what to expect.
Inputs81/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
name
Report name (case-insensitive substring match)
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
dashboardId
Only reports on this dashboard
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
entity
Report entity, e.g. deals, companies, contacts, pipelineStages, dealHistory
Clear enough to supply this argument.
limit
Max results (default 50, max 200)
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "find_reports",
"title": "Find reports",
"description": "Search saved reports/charts by name, dashboard, or entity. Returns { total, rows } where each row is { id, name, type, entity, description, order, dashboard }. Rows come back in the order the dashboard renders them, and order is the panel's position within its own dashboard, counting from 0 (a panel with no order renders as 0) — so filter by dashboardId before relying on it to answer \"the first panel on this dashboard\". Use a report id with read_report to read its computed data. Saved charts can be viewed in Zero.",
"inputSchema": {
"type": "object",
"required": [],
"properties": {
"name": {
"type": "string",
"description": "Report name (case-insensitive substring match)"
},
"limit": {
"type": "number",
"description": "Max results (default 50, max 200)"
},
"entity": {
"type": "string",
"description": "Report entity, e.g. deals, companies, contacts, pipelineStages, dealHistory"
},
"dashboardId": {
"type": "string",
"format": "uuid",
"description": "Only reports on this dashboard"
}
},
"additionalProperties": false
},
"annotations": {
"title": "Find reports",
"readOnlyHint": true,
"openWorldHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description99/100
Run a report server-side and return its computed data (a single KPI value, grouped breakdown rows, or time-series buckets). Takes exactly one of { reportId } — a saved panel from find_reports — or { config } — an unsaved report config, run as written and saved nowhere, which is how you check what a panel would show before saving it with add_report or edit_report. Returns { report, source, window, rows, rowCount } where report includes the configured relativeTimeframe/startDate/endDate, source is 'report' or 'config', and window is the range actually applied — the report's own window, resolved here. NOTE: a named window (e.g. 'this week') is resolved against the server's clock and timezone while the rendered chart resolved it against the viewer's, so a boundary bucket can differ by a day. A metric, dimension, or filter naming a native column the entity does not have fails here with the offending key; a custom-property UUID or select option key that does not exist is not validated and comes back as zero rows instead. Reading by id also returns config, the saved panel's full configuration in the same form add_report and edit_report take, so you can clone or adapt a panel instead of rebuilding it from its chart; configIssues comes with it when the stored panel does not satisfy the current config contract, and those must be fixed before that config is sent back. Saved charts can be viewed in Zero.
The description explains the capability, when to use it, and what to expect.
Inputs55/100
29 of 46 inputs have descriptions. Add descriptions to the missing inputs, including where to obtain IDs and how to supply values.
reportId
Saved report id (from find_reports)
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
config › type
Chart type.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
config › entity
Entity the report queries.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
config › name
Panel title.
Explain the meaning of this value, not just its name.
config › description
Optional subtitle explaining what the panel shows.
Clear enough to supply this argument.
config › metrics › items › key
Metric key from the entity, e.g. "count", "value", "deals.count", "custom.<columnId>".
Clear enough to supply this argument.
config › metrics › items › op
Aggregate over the key. Omit for "count".
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
config › metrics › items › formula
Raw formula select, used instead of key/op.
Explain the meaning of this value, not just its name.
config › metrics › items › color
Series color as hex, e.g. "#8A9E41".
Clear enough to supply this argument.
config › metrics › items › showKpi
Also show this metric as a headline number above the chart.
Clear enough to supply this argument.
config › dimensions › items › key
Column to group by, e.g. "ownerIds", "pipelineStage.type", "closeDate".
Clear enough to supply this argument.
config › dimensions › items › op
Bucket interval for a date/timestamp column, or "range" for numeric buckets.
Clear enough to supply this argument.
config › dimensions › items › range
Ascending bucket edges. Required when op is "range".
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
config › dimensions › items › options
Restrict and order the buckets shown, by option key.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "read_report",
"title": "Read report data",
"description": "Run a report server-side and return its computed data (a single KPI value, grouped breakdown rows, or time-series buckets). Takes exactly one of { reportId } — a saved panel from find_reports — or { config } — an unsaved report config, run as written and saved nowhere, which is how you check what a panel would show before saving it with add_report or edit_report. Returns { report, source, window, rows, rowCount } where report includes the configured relativeTimeframe/startDate/endDate, source is 'report' or 'config', and window is the range actually applied — the report's own window, resolved here. NOTE: a named window (e.g. 'this week') is resolved against the server's clock and timezone while the rendered chart resolved it against the viewer's, so a boundary bucket can differ by a day. A metric, dimension, or filter naming a native column the entity does not have fails here with the offending key; a custom-property UUID or select option key that does not exist is not validated and comes back as zero rows instead. Reading by id also returns config, the saved panel's full configuration in the same form add_report and edit_report take, so you can clone or adapt a panel instead of rebuilding it from its chart; configIssues comes with it when the stored panel does not satisfy the current config contract, and those must be fixed before that config is sent back. Saved charts can be viewed in Zero.",
"inputSchema": {
"type": "object",
"required": [],
"properties": {
"limit": {
"type": "number",
"description": "Max rows returned (default 100, max 1000)"
},
"config": {
"type": "object",
"required": [
"type",
"entity",
"metrics"
],
"properties": {
"icon": {
"type": "string"
},
"name": {
"type": "string",
"description": "Panel title."
},
"size": {
"enum": [
"small",
"medium",
"large"
],
"type": "string",
"description": "Legacy width class. Prefer settings.grid."
},
"type": {
"enum": [
"bar",
"horizontalBar",
"line",
"pie",
"kpi"
],
"type": "string",
"description": "Chart type."
},
"color": {
"type": "string"
},
"where": {
"type": "object",
"description": "ORM filter conditions, e.g. { \"pipelineStage.type\": \"won\", \"value\": { \"$gt\": 0 } }. Operators: $in, $notIn, $gt, $gte, $lt, $lte, $includes, $overlaps, $exists."
},
"entity": {
"enum": [
"companies",
"contacts",
"deals",
"dealHistory",
"tasks",
"files",
"companyActivities",
"contactActivities",
"customActivities",
"emailThreads",
"emails",
"calendarEvents",
"memberships",
"pipelineStages",
"invoices",
"stripeSubscriptions",
"issues",
"analyticsEvents",
"analyticsSessions",
"webSessions",
"linkedinMessageThreads",
"linkedinMessages",
"linkedinConnections",
"linkedinPageFollowers",
"linkedinPosts",
"linkedinInteractions"
],
"type": "string",
"description": "Entity the report queries."
},
"endDate": {
"type": "string",
"description": "Fixed window end (YYYY-MM-DD). Omit when using relativeTimeframe."
},
"metrics": {
"type": "array",
"items": {
"type": "object",
"properties": {
"op": {
"enum": [
"sum",
"avg",
"min",
"max",
"uniq",
"count"
],
"type": "string",
"description": "Aggregate over the key. Omit for \"count\"."
},
"key": {
"type": "string",
"description": "Metric key from the entity, e.g. \"count\", \"value\", \"deals.count\", \"custom.<columnId>\"."
},
"color": {
"type": "string",
"description": "Series color as hex, e.g. \"#8A9E41\"."
},
"formula": {
"type": "object",
"description": "Raw formula select, used instead of key/op."
},
"showKpi": {
"type": "boolean",
"description": "Also show this metric as a headline number above the chart."
}
},
"additionalProperties": false
},
"maxItems": 10,
"minItems": 1,
"description": "Aggregates plotted as series (or as headline numbers for a kpi report)."
},
"settings": {
"type": "object",
"properties": {
"grid": {
"type": "object",
"required": [
"w",
"h"
],
"properties": {
"h": {
"type": "integer"
},
"w": {
"type": "integer"
}
},
"description": "Dashboard span in grid cells.",
"additionalProperties": false
},
"limit": {
"type": "integer",
"description": "Max buckets returned. Pair with orderBy for a top-N chart."
},
"height": {
"type": "integer",
"description": "Legacy pixel height. Prefer grid."
},
"orderBy": {
"type": "object",
"description": "Sort, keyed by metric or dimension, e.g. { \"value:sum\": \"desc\" }. Use {} for no sort."
},
"fitYAxis": {
"type": "boolean"
},
"showDiff": {
"type": "boolean",
"description": "Show change badges between buckets."
},
"goalValue": {
"type": "number",
"nullable": true
},
"showLines": {
"type": "boolean"
},
"cumulative": {
"type": "boolean",
"description": "Plot a running total."
},
"heightManual": {
"type": "boolean"
},
"showGoalLine": {
"type": "boolean"
},
"showWeekends": {
"type": "boolean"
},
"useSameScale": {
"type": "boolean",
"description": "Share one Y scale across metrics."
},
"goalMetricKey": {
"type": "string"
},
"groupOverflow": {
"type": "boolean",
"description": "Group the tail into \"Other\" (horizontalBar)."
},
"differenceMode": {
"enum": [
"ratio",
"delta"
],
"type": "string"
},
"showTotalFirst": {
"type": "boolean"
},
"showValueInBar": {
"type": "boolean"
},
"hideScaleLabels": {
"type": "boolean"
},
"hideSeriesLegend": {
"type": "boolean"
},
"showDiffPrevious": {
"type": "boolean",
"description": "Compare against the previous bucket instead of the first."
},
"differenceBaseline": {
"type": "number",
"nullable": true
}
},
"description": "Display options. Allowed keys: limit, orderBy, grid, height, heightManual, cumulative, showLines, showValueInBar, showTotalFirst, useSameScale, fitYAxis, showWeekends, hideScaleLabels, hideSeriesLegend, groupOverflow, showDiff, showDiffPrevious, differenceMode, differenceBaseline, showGoalLine, goalValue, goalMetricKey.",
"additionalProperties": false
},
"startDate": {
"type": "string",
"description": "Fixed window start (YYYY-MM-DD). Omit when using relativeTimeframe."
},
"dimensions": {
"type": "array",
"items": {
"type": "object",
"required": [
"key"
],
"properties": {
"op": {
"enum": [
"date",
"week",
"weekday",
"month",
"quarter",
"year",
"range"
],
"type": "string",
"description": "Bucket interval for a date/timestamp column, or \"range\" for numeric buckets."
},
"key": {
"type": "string",
"description": "Column to group by, e.g. \"ownerIds\", \"pipelineStage.type\", \"closeDate\"."
},
"range": {
"type": "array",
"items": {
"type": "number"
},
"description": "Ascending bucket edges. Required when op is \"range\"."
},
"options": {
"type": "array",
"items": {
"type": "string"
},
"description": "Restrict and order the buckets shown, by option key."
},
"optionColors": {
"type": "object",
"description": "Per-option hex colors, keyed by option key.",
"additionalProperties": {
"type": "string"
}
}
},
"additionalProperties": false
},
"maxItems": 4,
"description": "Grouping axis. Required for every chart type except \"kpi\" (and reports on pipelineStages, which group themselves)."
},
"description": {
"type": "string",
"description": "Optional subtitle explaining what the panel shows."
},
"relativeTimeframe": {
"enum": [
"last30d",
"last60d",
"last90d",
"thisWeek",
"lastWeek",
"thisMonth",
"lastMonth",
"thisQuarter",
"lastQuarter",
"thisYear",
"thisYearUntilToday",
"lastYear",
"lifetime"
],
"type": "string",
"description": "Moving window resolved at render time. Preferred over fixed dates."
}
},
"description": "An unsaved report config to run instead of a saved id, so you can see what a panel would show before saving it to a dashboard. Nothing is saved.",
"additionalProperties": false
},
"reportId": {
"type": "string",
"format": "uuid",
"description": "Saved report id (from find_reports)"
}
},
"additionalProperties": false
},
"annotations": {
"title": "Read report data",
"readOnlyHint": true,
"openWorldHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description99/100
List the workspace's reporting dashboards. Returns { total, rows } where each row is { id, name, description, gridColumns, panelCount, panels }. `gridColumns` is the dashboard's column count (8 or 12) and each panel is { id, name, type, entity, order, grid } — a panel's position is its order plus its { w, h } span, since the grid auto-places cards in order. Call this before add_report to pick a target dashboard, or before edit_dashboard to see the current layout.
The description explains the capability, when to use it, and what to expect.
Inputs83/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
name
Dashboard name (case-insensitive substring match)
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
includePanels
Include each dashboard's panels (default true). Set false for a compact name/id index.
Clear enough to supply this argument.
limit
Max results (default 50, max 200)
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "find_dashboards",
"title": "Find dashboards",
"description": "List the workspace's reporting dashboards. Returns { total, rows } where each row is { id, name, description, gridColumns, panelCount, panels }. `gridColumns` is the dashboard's column count (8 or 12) and each panel is { id, name, type, entity, order, grid } — a panel's position is its order plus its { w, h } span, since the grid auto-places cards in order. Call this before add_report to pick a target dashboard, or before edit_dashboard to see the current layout.",
"inputSchema": {
"type": "object",
"required": [],
"properties": {
"name": {
"type": "string",
"description": "Dashboard name (case-insensitive substring match)"
},
"limit": {
"type": "number",
"description": "Max results (default 50, max 200)"
},
"includePanels": {
"type": "boolean",
"description": "Include each dashboard's panels (default true). Set false for a compact name/id index."
}
},
"additionalProperties": false
},
"annotations": {
"title": "Find dashboards",
"readOnlyHint": true,
"openWorldHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description99/100
Create a reporting dashboard. Panels are added separately with add_report, so create the dashboard first and reuse the returned id. `gridColumns` fixes the layout grid: 8 (default, roomier cards) or 12 (denser). Returns { id, name, gridColumns }.
The description explains the capability, when to use it, and what to expect.
Inputs75/100
Explain the meaning of this value, not just its name.
name
Dashboard name shown in the reports sidebar
Clear enough to supply this argument.
description
Optional description
Explain the meaning of this value, not just its name.
icon
Optional icon name from the workspace icon set
Clear enough to supply this argument.
color
Optional color from the workspace color set
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
gridColumns
Columns in the layout grid: 8 (default) or 12.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description99/100
Update a dashboard's name, description, icon, color, or column count. Changing `gridColumns` rescales every panel's width so the layout stays proportional (a full-width card on 8 columns becomes half-width on 12, which is denser rather than bigger); heights are in fixed-size cells and never change. Returns the updated dashboard with its panels. To change one panel's size or position, use edit_report.
The description explains the capability, when to use it, and what to expect.
Inputs54/100
4 of 6 inputs have descriptions. Add descriptions to the missing inputs, including where to obtain IDs and how to supply values.
dashboardId
Dashboard to update (from find_dashboards)
Clear enough to supply this argument.
name
Not provided
Missing description. Explain what this value means and how to supply it.
description
Not provided
Missing description. Explain what this value means and how to supply it.
icon
Icon name from the workspace icon set
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
color
Color from the workspace color set
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
gridColumns
New column count: 8 or 12.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "edit_dashboard",
"title": "Edit dashboard",
"description": "Update a dashboard's name, description, icon, color, or column count. Changing `gridColumns` rescales every panel's width so the layout stays proportional (a full-width card on 8 columns becomes half-width on 12, which is denser rather than bigger); heights are in fixed-size cells and never change. Returns the updated dashboard with its panels. To change one panel's size or position, use edit_report.",
"inputSchema": {
"type": "object",
"required": [
"dashboardId"
],
"properties": {
"icon": {
"type": "string",
"description": "Icon name from the workspace icon set"
},
"name": {
"type": "string"
},
"color": {
"type": "string",
"description": "Color from the workspace color set"
},
"dashboardId": {
"type": "string",
"format": "uuid",
"description": "Dashboard to update (from find_dashboards)"
},
"description": {
"type": "string"
},
"gridColumns": {
"enum": [
8,
12
],
"type": "number",
"description": "New column count: 8 or 12."
}
},
"additionalProperties": false
},
"annotations": {
"title": "Edit dashboard",
"readOnlyHint": false,
"openWorldHint": false,
"destructiveHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description97/100
Create a report panel on a dashboard. To adapt an existing panel, use find_reports and read_report to retrieve its config. The config input schema describes supported report settings. A config naming a native metric or column the entity does not have fails when the panel queries, while a custom-property UUID or select option key that does not exist is not validated and just renders an empty chart, so run the config through read_report first to see which one you have. The panel is appended to the dashboard unless `afterReportId` places it after an existing panel; its size comes from config.settings.grid, defaulting to half a row. Returns { id, dashboardId, name, type, entity, order, grid }. The saved panel can be viewed on its dashboard in Zero.
The description explains the capability, when to use it, and what to expect.
Inputs59/100
29 of 46 inputs have descriptions. Add descriptions to the missing inputs, including where to obtain IDs and how to supply values.
dashboardId
Dashboard to add the panel to (from find_dashboards or add_dashboard)
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
config › type
Chart type.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
config › entity
Entity the report queries.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
config › name
Panel title.
Clear enough to supply this argument.
config › description
Optional subtitle explaining what the panel shows.
Clear enough to supply this argument.
config › metrics › items › key
Metric key from the entity, e.g. "count", "value", "deals.count", "custom.<columnId>".
Clear enough to supply this argument.
config › metrics › items › op
Aggregate over the key. Omit for "count".
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
config › metrics › items › formula
Raw formula select, used instead of key/op.
Explain the meaning of this value, not just its name.
config › metrics › items › color
Series color as hex, e.g. "#8A9E41".
Clear enough to supply this argument.
config › metrics › items › showKpi
Also show this metric as a headline number above the chart.
Clear enough to supply this argument.
config › dimensions › items › key
Column to group by, e.g. "ownerIds", "pipelineStage.type", "closeDate".
Clear enough to supply this argument.
config › dimensions › items › op
Bucket interval for a date/timestamp column, or "range" for numeric buckets.
Clear enough to supply this argument.
config › dimensions › items › range
Ascending bucket edges. Required when op is "range".
Clear enough to supply this argument.
config › dimensions › items › options
Restrict and order the buckets shown, by option key.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description98/100
Update a saved report panel. `config` fields are merged over the stored report and the merged result is validated as a whole, so a partial edit cannot leave the panel unrenderable; array/object fields (metrics, dimensions, where, settings) are replaced rather than deep-merged, so send each one complete. The panel's size settings are carried over unless config.settings.grid is given. `afterReportId` moves the panel after another panel on the same dashboard; `dashboardId` moves it to a different dashboard. Returns the updated panel.
The description explains the capability, when to use it, and what to expect.
Inputs61/100
30 of 47 inputs have descriptions. Add descriptions to the missing inputs, including where to obtain IDs and how to supply values.
reportId
Panel to update (from find_reports)
Clear enough to supply this argument.
config › type
Chart type.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
config › entity
Entity the report queries.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
config › name
Panel title.
Clear enough to supply this argument.
config › description
Optional subtitle explaining what the panel shows.
Clear enough to supply this argument.
config › metrics › items › key
Metric key from the entity, e.g. "count", "value", "deals.count", "custom.<columnId>".
Clear enough to supply this argument.
config › metrics › items › op
Aggregate over the key. Omit for "count".
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
config › metrics › items › formula
Raw formula select, used instead of key/op.
Explain the meaning of this value, not just its name.
config › metrics › items › color
Series color as hex, e.g. "#8A9E41".
Clear enough to supply this argument.
config › metrics › items › showKpi
Also show this metric as a headline number above the chart.
Clear enough to supply this argument.
config › dimensions › items › key
Column to group by, e.g. "ownerIds", "pipelineStage.type", "closeDate".
Clear enough to supply this argument.
config › dimensions › items › op
Bucket interval for a date/timestamp column, or "range" for numeric buckets.
Clear enough to supply this argument.
config › dimensions › items › range
Ascending bucket edges. Required when op is "range".
Clear enough to supply this argument.
config › dimensions › items › options
Restrict and order the buckets shown, by option key.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description93/100
Fetch generated meeting prep (briefs, deal context, relationship, recent news) for one or more calendar events. Pass the calendar event IDs you want preps for. Only returns preps with status='ready'.
Describe the returned information so the agent knows whether it will answer the request.
Inputs83/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
calendarEventIds
Calendar event IDs to fetch preps for
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
limit
Max preps to return (default 50, max 100)
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
offset
Preps to skip before returning rows (default 0), for paging
Clear enough to supply this argument.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description78/100
Inspect the saved definition and writing/approval policy before participant-message work. Before sequences_update_draft, read this and copy its exact definition revision into baseRevision. Participant runs and message revisions are inspected separately.
Describe the returned information so the agent knows whether it will answer the request.
Inputs0/100
0 of 1 inputs have descriptions. Add descriptions to the missing inputs, including where to obtain IDs and how to supply values.
sequenceId
Not provided
Missing description. Explain what this value means and how to supply it.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description94/100
Create a saved database draft and return its normalized definition, revision, validation, and Zero URL. Activate the managing-sequences skill first. If exact recipient-specific copy has already been written or approved, configure settings.preparationMode=individual with AI disabled and write it directly with sequences_write_messages after participants are prepared; do not configure AI to recreate it. This tool never enrolls contacts or activates sending.
The description explains the capability, when to use it, and what to expect.
Inputs54/100
17 of 23 inputs have descriptions. Add descriptions to the missing inputs, including where to obtain IDs and how to supply values.
name
Not provided
Missing description. Explain what this value means and how to supply it.
sendingWindowTimezone
IANA timezone for the default 09:00–17:00 sending window. Invalid values normalize to UTC.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
summary
Short description of the initial sequence design.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
idempotencyKey
Caller-generated key for safe retries. Reuse it only for the exact same mutation arguments.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
operations › items › oneOf › 0 › op
Not provided
Missing description. Explain what this value means and how to supply it.
operations › items › oneOf › 0 › clientId
Unique command-local reference starting with "draft:".
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
operations › items › oneOf › 0 › afterStepId
Step to insert after. Omit or set to null to append.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
operations › items › oneOf › 0 › step › type
Use "addTask" for a CRM task; "task" is not a valid step type.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
operations › items › oneOf › 0 › step › name
Optional builder label.
Explain the meaning of this value, not just its name.
operations › items › oneOf › 0 › step › subject
Compatibility field. For sendEmail steps, put the subject in settings.subject.
Explain the meaning of this value, not just its name.
operations › items › oneOf › 0 › step › content
Compatibility sequenceSteps.content value. For sendEmail steps, put the Tiptap document in settings.content.
Clear enough to supply this argument.
operations › items › oneOf › 0 › step › settings
Channel-specific settings belong here. Message preparationMode is shared or individual. Individual creates per-contact writing slots; set ai.enabled=false and write exact content through participant-message tools. Email mailboxId, from, to, subject, content, draft, replyToStepId, and response behavior must be nested in settings, not placed on the operation. In rich-text content, every contact, company, sender, custom-column, or ai.<part-name> reference must be a separate Tiptap macro node; raw {{...}} inside a text node is invalid and would be sent literally. AI snippet keys must exactly match an enabled parts-mode definition on the same step. AI writing aiContextIds must be exact current workspace AI-context IDs; contexts may contain only the exact built-in contact and company record-context objects documented by the sequence skill. Task title, taskType, numeric priority, assignedToIds, and continueMode must also be nested here; completion-based continuation is "done". For a same-thread email, replyToStepId may be an existing email-step UUID or a command-local "draft:" reference; the builder resolves it to the created step ID.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
Sequence-wide sharing override for private LinkedIn accounts. Public accounts create public threads regardless of this flag. Existing thread visibility is preserved unless this flag is true; enabling it can share existing conversation history with workspace members and agents.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "sequences_create_draft",
"title": "Create sequence draft",
"description": "Create a saved database draft and return its normalized definition, revision, validation, and Zero URL. Activate the managing-sequences skill first. If exact recipient-specific copy has already been written or approved, configure settings.preparationMode=individual with AI disabled and write it directly with sequences_write_messages after participants are prepared; do not configure AI to recreate it. This tool never enrolls contacts or activates sending.",
"inputSchema": {
"type": "object",
"required": [
"name",
"idempotencyKey",
"operations"
],
"properties": {
"name": {
"type": "string",
"maxLength": 500,
"minLength": 1
},
"summary": {
"type": "string",
"maxLength": 500,
"description": "Short description of the initial sequence design."
},
"operations": {
"type": "array",
"items": {
"oneOf": [
{
"type": "object",
"required": [
"op",
"clientId",
"step"
],
"properties": {
"op": {
"enum": [
"insertStep"
],
"type": "string"
},
"step": {
"type": "object",
"required": [
"type"
],
"properties": {
"name": {
"type": [
"string",
"null"
],
"description": "Optional builder label."
},
"type": {
"enum": [
"sendEmail",
"addTask",
"sendLinkedinMessage",
"sendLinkedinConnectionRequest",
"delay",
"startAutomation"
],
"type": "string",
"description": "Use \"addTask\" for a CRM task; \"task\" is not a valid step type."
},
"content": {
"description": "Compatibility sequenceSteps.content value. For sendEmail steps, put the Tiptap document in settings.content."
},
"subject": {
"type": [
"string",
"null"
],
"description": "Compatibility field. For sendEmail steps, put the subject in settings.subject."
},
"settings": {
"type": "object",
"description": "Channel-specific settings belong here. Message preparationMode is shared or individual. Individual creates per-contact writing slots; set ai.enabled=false and write exact content through participant-message tools. Email mailboxId, from, to, subject, content, draft, replyToStepId, and response behavior must be nested in settings, not placed on the operation. In rich-text content, every contact, company, sender, custom-column, or ai.<part-name> reference must be a separate Tiptap macro node; raw {{...}} inside a text node is invalid and would be sent literally. AI snippet keys must exactly match an enabled parts-mode definition on the same step. AI writing aiContextIds must be exact current workspace AI-context IDs; contexts may contain only the exact built-in contact and company record-context objects documented by the sequence skill. Task title, taskType, numeric priority, assignedToIds, and continueMode must also be nested here; completion-based continuation is \"done\". For a same-thread email, replyToStepId may be an existing email-step UUID or a command-local \"draft:\" reference; the builder resolves it to the created step ID.",
"additionalProperties": true
},
"triggerSettings": {
"type": "object",
"properties": {
"delayMs": {
"type": "integer",
"minimum": 1,
"description": "Required for delay steps. Incremental wait before the following step, in milliseconds. 1 day = 86400000."
}
},
"description": "Sequence trigger settings. A delay step must include a positive integer delayMs; never omit it or use zero.",
"additionalProperties": true
}
},
"additionalProperties": false
},
"clientId": {
"type": "string",
"pattern": "^draft:[a-zA-Z0-9][a-zA-Z0-9:_-]{0,127}$",
"description": "Unique command-local reference starting with \"draft:\"."
},
"afterStepId": {
"type": [
"string",
"null"
],
"description": "Step to insert after. Omit or set to null to append."
}
},
"additionalProperties": false
},
{
"type": "object",
"required": [
"op",
"patch"
],
"properties": {
"op": {
"enum": [
"updateSequenceConfig"
],
"type": "string"
},
"patch": {
"type": "object",
"properties": {
"rollMode": {
"enum": [
"auto",
"manual"
],
"type": "string",
"description": "Whether eligible contacts start automatically or await manual scheduling."
},
"activeDays": {
"type": "array",
"items": {
"enum": [
"sun",
"mon",
"tue",
"wed",
"thu",
"fri",
"sat"
],
"type": "string"
},
"minItems": 1,
"description": "Days when contacts may enter and automatic emails may send.",
"uniqueItems": true
},
"dailyStarts": {
"type": "integer",
"maximum": 50,
"minimum": 1,
"description": "Maximum contacts entering the sequence per active day."
},
"sendingWindow": {
"type": "object",
"required": [
"start",
"end",
"timezone"
],
"properties": {
"end": {
"type": "string",
"pattern": "^(?:[01]\\d|2[0-3]):[0-5]\\d$"
},
"start": {
"type": "string",
"pattern": "^(?:[01]\\d|2[0-3]):[0-5]\\d$"
},
"timezone": {
"type": "string",
"maxLength": 200,
"minLength": 1
}
},
"description": "Daily send window in an IANA timezone.",
"additionalProperties": false
},
"staggerMinutes": {
"type": "integer",
"maximum": 120,
"minimum": 1,
"description": "Minimum spacing between automatically sent emails."
},
"linkedinThreadsPublic": {
"type": "boolean",
"description": "Sequence-wide sharing override for private LinkedIn accounts. Public accounts create public threads regardless of this flag. Existing thread visibility is preserved unless this flag is true; enabling it can share existing conversation history with workspace members and agents."
},
"requireManualApproval": {
"type": "boolean",
"description": "Whether AI-generated drafts require approval before sending."
}
},
"minProperties": 1,
"additionalProperties": false
}
},
"additionalProperties": false
}
]
},
"maxItems": 50,
"minItems": 1,
"description": "Optional atomic initial sequence definition. New drafts may only use insertStep and updateSequenceConfig operations."
},
"idempotencyKey": {
"type": "string",
"maxLength": 200,
"minLength": 1,
"description": "Caller-generated key for safe retries. Reuse it only for the exact same mutation arguments."
},
"sendingWindowTimezone": {
"type": "string",
"description": "IANA timezone for the default 09:00–17:00 sending window. Invalid values normalize to UTC."
}
},
"additionalProperties": false
},
"annotations": {
"title": "Create sequence draft",
"readOnlyHint": false,
"openWorldHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description85/100
Atomically update a draft using the current sequence revision. Activate the managing-sequences skill first, call sequences_get immediately before editing, and submit the complete intended change once. If exact recipient-specific copy has already been written or approved, configure settings.preparationMode=individual with AI disabled and write it directly with sequences_write_messages after participants are prepared; do not configure AI to recreate it. Active and paused sequences are rejected.
The description explains the capability, when to use it, and what to expect.
Inputs65/100
26 of 36 inputs have descriptions. Add descriptions to the missing inputs, including where to obtain IDs and how to supply values.
version
Not provided
Missing description. Explain what this value means and how to supply it.
sequenceId
Not provided
Missing description. Explain what this value means and how to supply it.
baseRevision
Required stale-state guard. Copy the exact revision from the current authoritative sequence snapshot.
Clear enough to supply this argument.
summary
Short user-facing description of the proposed changes.
Clear enough to supply this argument.
operations › items › oneOf › 0 › op
Not provided
Missing description. Explain what this value means and how to supply it.
operations › items › oneOf › 0 › clientId
Unique command-local reference starting with "draft:".
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
operations › items › oneOf › 0 › afterStepId
Step to insert after. Omit or set to null to append.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
operations › items › oneOf › 0 › step › type
Use "addTask" for a CRM task; "task" is not a valid step type.
Clear enough to supply this argument.
operations › items › oneOf › 0 › step › name
Optional builder label.
Clear enough to supply this argument.
operations › items › oneOf › 0 › step › subject
Compatibility field. For sendEmail steps, put the subject in settings.subject.
Clear enough to supply this argument.
operations › items › oneOf › 0 › step › content
Compatibility sequenceSteps.content value. For sendEmail steps, put the Tiptap document in settings.content.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
operations › items › oneOf › 0 › step › settings
Channel-specific settings belong here. Message preparationMode is shared or individual. Individual creates per-contact writing slots; set ai.enabled=false and write exact content through participant-message tools. Email mailboxId, from, to, subject, content, draft, replyToStepId, and response behavior must be nested in settings, not placed on the operation. In rich-text content, every contact, company, sender, custom-column, or ai.<part-name> reference must be a separate Tiptap macro node; raw {{...}} inside a text node is invalid and would be sent literally. AI snippet keys must exactly match an enabled parts-mode definition on the same step. AI writing aiContextIds must be exact current workspace AI-context IDs; contexts may contain only the exact built-in contact and company record-context objects documented by the sequence skill. Task title, taskType, numeric priority, assignedToIds, and continueMode must also be nested here; completion-based continuation is "done". For a same-thread email, replyToStepId may be an existing email-step UUID or a command-local "draft:" reference; the builder resolves it to the created step ID.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
Required for delay steps. Incremental wait before the following step, in milliseconds. 1 day = 86400000.
Clear enough to supply this argument.
operations › items › oneOf › 1 › op
Not provided
Missing description. Explain what this value means and how to supply it.
operations › items › oneOf › 1 › stepId
Existing step UUID or command-local reference starting with "draft:".
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
operations › items › oneOf › 1 › patch › name
Optional builder label.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
operations › items › oneOf › 1 › patch › subject
Compatibility field. For sendEmail steps, put the subject in settings.subject.
Clear enough to supply this argument.
operations › items › oneOf › 1 › patch › content
Compatibility sequenceSteps.content value. For sendEmail steps, put the Tiptap document in settings.content.
Clear enough to supply this argument.
operations › items › oneOf › 1 › patch › settings
Channel-specific settings belong here. Message preparationMode is shared or individual. Individual creates per-contact writing slots; set ai.enabled=false and write exact content through participant-message tools. Email mailboxId, from, to, subject, content, draft, replyToStepId, and response behavior must be nested in settings, not placed on the operation. In rich-text content, every contact, company, sender, custom-column, or ai.<part-name> reference must be a separate Tiptap macro node; raw {{...}} inside a text node is invalid and would be sent literally. AI snippet keys must exactly match an enabled parts-mode definition on the same step. AI writing aiContextIds must be exact current workspace AI-context IDs; contexts may contain only the exact built-in contact and company record-context objects documented by the sequence skill. Task title, taskType, numeric priority, assignedToIds, and continueMode must also be nested here; completion-based continuation is "done". For a same-thread email, replyToStepId may be an existing email-step UUID or a command-local "draft:" reference; the builder resolves it to the created step ID.
Shallow partial update merged into the step's existing settings. Prefer this for copy-only or single-setting edits so mailbox, recipient, draft mode, AI configuration, response handling, threading, and every omitted setting remain unchanged. For an email rewrite, normally include only content, and include subject only if the user asked to change it.
Clear enough to supply this argument.
operations › items › oneOf › 2 › op
Not provided
Missing description. Explain what this value means and how to supply it.
operations › items › oneOf › 2 › stepId
Existing step UUID or command-local reference starting with "draft:".
Clear enough to supply this argument.
operations › items › oneOf › 3 › op
Not provided
Missing description. Explain what this value means and how to supply it.
operations › items › oneOf › 3 › stepIds
Complete desired order of user-editable steps.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
operations › items › oneOf › 4 › op
Not provided
Missing description. Explain what this value means and how to supply it.
Sequence-wide sharing override for private LinkedIn accounts. Public accounts create public threads regardless of this flag. Existing thread visibility is preserved unless this flag is true; enabling it can share existing conversation history with workspace members and agents.
Clear enough to supply this argument.
idempotencyKey
Caller-generated key for safe retries. Reuse it only for the exact same mutation arguments.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "sequences_update_draft",
"title": "Update sequence draft",
"description": "Atomically update a draft using the current sequence revision. Activate the managing-sequences skill first, call sequences_get immediately before editing, and submit the complete intended change once. If exact recipient-specific copy has already been written or approved, configure settings.preparationMode=individual with AI disabled and write it directly with sequences_write_messages after participants are prepared; do not configure AI to recreate it. Active and paused sequences are rejected.",
"inputSchema": {
"type": "object",
"required": [
"version",
"sequenceId",
"baseRevision",
"summary",
"operations",
"idempotencyKey"
],
"properties": {
"summary": {
"type": "string",
"description": "Short user-facing description of the proposed changes."
},
"version": {
"enum": [
1
],
"type": "integer"
},
"operations": {
"type": "array",
"items": {
"oneOf": [
{
"type": "object",
"required": [
"op",
"clientId",
"step"
],
"properties": {
"op": {
"enum": [
"insertStep"
],
"type": "string"
},
"step": {
"type": "object",
"required": [
"type"
],
"properties": {
"name": {
"type": [
"string",
"null"
],
"description": "Optional builder label."
},
"type": {
"enum": [
"sendEmail",
"addTask",
"sendLinkedinMessage",
"sendLinkedinConnectionRequest",
"delay",
"startAutomation"
],
"type": "string",
"description": "Use \"addTask\" for a CRM task; \"task\" is not a valid step type."
},
"content": {
"description": "Compatibility sequenceSteps.content value. For sendEmail steps, put the Tiptap document in settings.content."
},
"subject": {
"type": [
"string",
"null"
],
"description": "Compatibility field. For sendEmail steps, put the subject in settings.subject."
},
"settings": {
"type": "object",
"description": "Channel-specific settings belong here. Message preparationMode is shared or individual. Individual creates per-contact writing slots; set ai.enabled=false and write exact content through participant-message tools. Email mailboxId, from, to, subject, content, draft, replyToStepId, and response behavior must be nested in settings, not placed on the operation. In rich-text content, every contact, company, sender, custom-column, or ai.<part-name> reference must be a separate Tiptap macro node; raw {{...}} inside a text node is invalid and would be sent literally. AI snippet keys must exactly match an enabled parts-mode definition on the same step. AI writing aiContextIds must be exact current workspace AI-context IDs; contexts may contain only the exact built-in contact and company record-context objects documented by the sequence skill. Task title, taskType, numeric priority, assignedToIds, and continueMode must also be nested here; completion-based continuation is \"done\". For a same-thread email, replyToStepId may be an existing email-step UUID or a command-local \"draft:\" reference; the builder resolves it to the created step ID.",
"additionalProperties": true
},
"triggerSettings": {
"type": "object",
"properties": {
"delayMs": {
"type": "integer",
"minimum": 1,
"description": "Required for delay steps. Incremental wait before the following step, in milliseconds. 1 day = 86400000."
}
},
"description": "Sequence trigger settings. A delay step must include a positive integer delayMs; never omit it or use zero.",
"additionalProperties": true
}
},
"additionalProperties": false
},
"clientId": {
"type": "string",
"pattern": "^draft:[a-zA-Z0-9][a-zA-Z0-9:_-]{0,127}$",
"description": "Unique command-local reference starting with \"draft:\"."
},
"afterStepId": {
"type": [
"string",
"null"
],
"description": "Step to insert after. Omit or set to null to append."
}
},
"additionalProperties": false
},
{
"type": "object",
"required": [
"op",
"stepId",
"patch"
],
"properties": {
"op": {
"enum": [
"updateStep"
],
"type": "string"
},
"patch": {
"type": "object",
"properties": {
"name": {
"type": [
"string",
"null"
],
"description": "Optional builder label."
},
"content": {
"description": "Compatibility sequenceSteps.content value. For sendEmail steps, put the Tiptap document in settings.content."
},
"subject": {
"type": [
"string",
"null"
],
"description": "Compatibility field. For sendEmail steps, put the subject in settings.subject."
},
"settings": {
"type": "object",
"description": "Channel-specific settings belong here. Message preparationMode is shared or individual. Individual creates per-contact writing slots; set ai.enabled=false and write exact content through participant-message tools. Email mailboxId, from, to, subject, content, draft, replyToStepId, and response behavior must be nested in settings, not placed on the operation. In rich-text content, every contact, company, sender, custom-column, or ai.<part-name> reference must be a separate Tiptap macro node; raw {{...}} inside a text node is invalid and would be sent literally. AI snippet keys must exactly match an enabled parts-mode definition on the same step. AI writing aiContextIds must be exact current workspace AI-context IDs; contexts may contain only the exact built-in contact and company record-context objects documented by the sequence skill. Task title, taskType, numeric priority, assignedToIds, and continueMode must also be nested here; completion-based continuation is \"done\". For a same-thread email, replyToStepId may be an existing email-step UUID or a command-local \"draft:\" reference; the builder resolves it to the created step ID.",
"additionalProperties": true
},
"settingsPatch": {
"type": "object",
"description": "Shallow partial update merged into the step's existing settings. Prefer this for copy-only or single-setting edits so mailbox, recipient, draft mode, AI configuration, response handling, threading, and every omitted setting remain unchanged. For an email rewrite, normally include only content, and include subject only if the user asked to change it.",
"minProperties": 1,
"additionalProperties": true
},
"triggerSettings": {
"type": "object",
"properties": {
"delayMs": {
"type": "integer",
"minimum": 1,
"description": "Required for delay steps. Incremental wait before the following step, in milliseconds. 1 day = 86400000."
}
},
"description": "Sequence trigger settings. A delay step must include a positive integer delayMs; never omit it or use zero.",
"additionalProperties": true
}
},
"description": "Step fields only. Use patch.settingsPatch for narrow settings edits that preserve omitted keys. Use patch.settings only when intentionally replacing the complete settings object. Never put mailboxId, to, draft, replyToStepId, task settings, or delayMs directly in patch.",
"minProperties": 1,
"additionalProperties": false
},
"stepId": {
"type": "string",
"description": "Existing step UUID or command-local reference starting with \"draft:\"."
}
},
"additionalProperties": false
},
{
"type": "object",
"required": [
"op",
"stepId"
],
"properties": {
"op": {
"enum": [
"removeStep"
],
"type": "string"
},
"stepId": {
"type": "string",
"description": "Existing step UUID or command-local reference starting with \"draft:\"."
}
},
"additionalProperties": false
},
{
"type": "object",
"required": [
"op",
"stepIds"
],
"properties": {
"op": {
"enum": [
"reorderSteps"
],
"type": "string"
},
"stepIds": {
"type": "array",
"items": {
"type": "string",
"description": "Existing step UUID or command-local reference starting with \"draft:\"."
},
"minItems": 1,
"description": "Complete desired order of user-editable steps.",
"uniqueItems": true
}
},
"additionalProperties": false
},
{
"type": "object",
"required": [
"op",
"patch"
],
"properties": {
"op": {
"enum": [
"updateSequenceConfig"
],
"type": "string"
},
"patch": {
"type": "object",
"properties": {
"rollMode": {
"enum": [
"auto",
"manual"
],
"type": "string",
"description": "Whether eligible contacts start automatically or await manual scheduling."
},
"activeDays": {
"type": "array",
"items": {
"enum": [
"sun",
"mon",
"tue",
"wed",
"thu",
"fri",
"sat"
],
"type": "string"
},
"minItems": 1,
"description": "Days when contacts may enter and automatic emails may send.",
"uniqueItems": true
},
"dailyStarts": {
"type": "integer",
"maximum": 50,
"minimum": 1,
"description": "Maximum contacts entering the sequence per active day."
},
"sendingWindow": {
"type": "object",
"required": [
"start",
"end",
"timezone"
],
"properties": {
"end": {
"type": "string",
"pattern": "^(?:[01]\\d|2[0-3]):[0-5]\\d$"
},
"start": {
"type": "string",
"pattern": "^(?:[01]\\d|2[0-3]):[0-5]\\d$"
},
"timezone": {
"type": "string",
"maxLength": 200,
"minLength": 1
}
},
"description": "Daily send window in an IANA timezone.",
"additionalProperties": false
},
"staggerMinutes": {
"type": "integer",
"maximum": 120,
"minimum": 1,
"description": "Minimum spacing between automatically sent emails."
},
"linkedinThreadsPublic": {
"type": "boolean",
"description": "Sequence-wide sharing override for private LinkedIn accounts. Public accounts create public threads regardless of this flag. Existing thread visibility is preserved unless this flag is true; enabling it can share existing conversation history with workspace members and agents."
},
"requireManualApproval": {
"type": "boolean",
"description": "Whether AI-generated drafts require approval before sending."
}
},
"minProperties": 1,
"additionalProperties": false
}
},
"additionalProperties": false
}
]
},
"maxItems": 50,
"minItems": 1,
"description": "Finalized atomic changes. Every item must be one operation object with a literal \"op\" field; for example {\"op\":\"insertStep\",...}, never {\"insertStep\":{...}}. Build the complete command before calling the apply tool."
},
"sequenceId": {
"type": "string",
"format": "uuid"
},
"baseRevision": {
"type": "string",
"description": "Required stale-state guard. Copy the exact revision from the current authoritative sequence snapshot."
},
"idempotencyKey": {
"type": "string",
"maxLength": 200,
"minLength": 1,
"description": "Caller-generated key for safe retries. Reuse it only for the exact same mutation arguments."
}
},
"additionalProperties": false
},
"annotations": {
"title": "Update sequence draft",
"readOnlyHint": false,
"openWorldHint": false,
"destructiveHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description97/100
Inspect the current members of a sequence audience with compact status totals and paginated contact rows. Use this before any bulk audience mutation and copy exact contact IDs from the result.
The description explains the capability, when to use it, and what to expect.
Inputs50/100
4 of 6 inputs have descriptions. Add descriptions to the missing inputs, including where to obtain IDs and how to supply values.
sequenceId
Not provided
Missing description. Explain what this value means and how to supply it.
contactId
Optional exact CRM contact ID.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
status
Not provided
Missing description. Explain what this value means and how to supply it.
query
Optional case-insensitive contact-name substring.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
limit
Defaults to 20.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
offset
Defaults to 0.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description86/100
Mutate exact sequence contacts atomically. stage always leaves contacts waiting for explicit approval, even on automatic sequences. approve moves only staged contacts to pickup. reject removes staged contacts from the sequence list. cancel stops active/pending enrollment while retaining history. reenroll means restart from the beginning: it resets an existing enrollment from any current state back to staged approval, clears prior execution state, and does not require a separate cancel first. Call sequences_inspect_audience first and confirm the exact count with expectedCount.
The description explains the capability, when to use it, and what to expect.
Inputs50/100
4 of 6 inputs have descriptions. Add descriptions to the missing inputs, including where to obtain IDs and how to supply values.
sequenceId
Not provided
Missing description. Explain what this value means and how to supply it.
action
Not provided
Missing description. Explain what this value means and how to supply it.
contactIds
Exact CRM contact IDs to mutate. Discover them with find_contacts first, or omit this and pass its resultSetId.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
resultSetId
resultSetId returned by a find_* call (or contactResultSetId / companyResultSetId from import_lead_search_results). Targets every record that call matched (its resultSetCount, up to 10,000), not just the rows shown. Use instead of copying IDs; never combine with an explicit ID array.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
expectedCount
Must exactly match the number of unique contactIds, or the number of contacts in the result set.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
idempotencyKey
Caller-generated key for safe retries. Reuse it only for the exact same mutation arguments.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "sequences_update_audience",
"title": "Update sequence audience",
"description": "Mutate exact sequence contacts atomically. stage always leaves contacts waiting for explicit approval, even on automatic sequences. approve moves only staged contacts to pickup. reject removes staged contacts from the sequence list. cancel stops active/pending enrollment while retaining history. reenroll means restart from the beginning: it resets an existing enrollment from any current state back to staged approval, clears prior execution state, and does not require a separate cancel first. Call sequences_inspect_audience first and confirm the exact count with expectedCount.",
"inputSchema": {
"type": "object",
"required": [
"sequenceId",
"action",
"expectedCount",
"idempotencyKey"
],
"properties": {
"action": {
"enum": [
"stage",
"approve",
"reject",
"cancel",
"reenroll"
],
"type": "string"
},
"contactIds": {
"type": "array",
"items": {
"type": "string",
"format": "uuid"
},
"maxItems": 500,
"minItems": 1,
"description": "Exact CRM contact IDs to mutate. Discover them with find_contacts first, or omit this and pass its resultSetId.",
"uniqueItems": true
},
"sequenceId": {
"type": "string",
"format": "uuid"
},
"resultSetId": {
"type": "string",
"format": "uuid",
"description": "resultSetId returned by a find_* call (or contactResultSetId / companyResultSetId from import_lead_search_results). Targets every record that call matched (its resultSetCount, up to 10,000), not just the rows shown. Use instead of copying IDs; never combine with an explicit ID array."
},
"expectedCount": {
"type": "integer",
"maximum": 500,
"minimum": 1,
"description": "Must exactly match the number of unique contactIds, or the number of contacts in the result set."
},
"idempotencyKey": {
"type": "string",
"maxLength": 200,
"minLength": 1,
"description": "Caller-generated key for safe retries. Reuse it only for the exact same mutation arguments."
}
},
"additionalProperties": false
},
"annotations": {
"title": "Update sequence audience",
"readOnlyHint": false,
"openWorldHint": true,
"destructiveHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description94/100
Skip the current step wait or listener for exact contacts and advance each one to the immediately following step. This can cause the next message or task to execute immediately. Call sequences_inspect_audience first, use only after the user explicitly asks to force or advance the contacts, and confirm the exact count with expectedCount.
The description explains the capability, when to use it, and what to expect.
Inputs65/100
4 of 5 inputs have descriptions. Add descriptions to the missing inputs, including where to obtain IDs and how to supply values.
sequenceId
Not provided
Missing description. Explain what this value means and how to supply it.
contactIds
Exact CRM contact IDs to mutate. Discover them with find_contacts first, or omit this and pass its resultSetId.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
resultSetId
resultSetId returned by a find_* call (or contactResultSetId / companyResultSetId from import_lead_search_results). Targets every record that call matched (its resultSetCount, up to 10,000), not just the rows shown. Use instead of copying IDs; never combine with an explicit ID array.
Clear enough to supply this argument.
expectedCount
Must exactly match the number of unique contactIds, or the number of contacts in the result set.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
idempotencyKey
Caller-generated key for safe retries. Reuse it only for the exact same mutation arguments.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
{
"title": "Force sequence contacts to next step",
"readOnlyHint": false,
"openWorldHint": true,
"destructiveHint": true
}
Output schema0/100
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "sequences_force_next_step",
"title": "Force sequence contacts to next step",
"description": "Skip the current step wait or listener for exact contacts and advance each one to the immediately following step. This can cause the next message or task to execute immediately. Call sequences_inspect_audience first, use only after the user explicitly asks to force or advance the contacts, and confirm the exact count with expectedCount.",
"inputSchema": {
"type": "object",
"required": [
"sequenceId",
"expectedCount",
"idempotencyKey"
],
"properties": {
"contactIds": {
"type": "array",
"items": {
"type": "string",
"format": "uuid"
},
"maxItems": 500,
"minItems": 1,
"description": "Exact CRM contact IDs to mutate. Discover them with find_contacts first, or omit this and pass its resultSetId.",
"uniqueItems": true
},
"sequenceId": {
"type": "string",
"format": "uuid"
},
"resultSetId": {
"type": "string",
"format": "uuid",
"description": "resultSetId returned by a find_* call (or contactResultSetId / companyResultSetId from import_lead_search_results). Targets every record that call matched (its resultSetCount, up to 10,000), not just the rows shown. Use instead of copying IDs; never combine with an explicit ID array."
},
"expectedCount": {
"type": "integer",
"maximum": 500,
"minimum": 1,
"description": "Must exactly match the number of unique contactIds, or the number of contacts in the result set."
},
"idempotencyKey": {
"type": "string",
"maxLength": 200,
"minLength": 1,
"description": "Caller-generated key for safe retries. Reuse it only for the exact same mutation arguments."
}
},
"additionalProperties": false
},
"annotations": {
"title": "Force sequence contacts to next step",
"readOnlyHint": false,
"openWorldHint": true,
"destructiveHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description99/100
Prepare an activation plan after the user has reviewed the audience. It returns the exact contacts eligible to start or resume, approval backlog, sending schedule, channel coverage, and blockers. Do not call sequences_activate until the user explicitly approves this exact result.
The description explains the capability, when to use it, and what to expect.
Inputs0/100
0 of 1 inputs have descriptions. Add descriptions to the missing inputs, including where to obtain IDs and how to supply values.
sequenceId
Not provided
Missing description. Explain what this value means and how to supply it.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "sequences_prepare_activation",
"title": "Prepare sequence activation",
"description": "Prepare an activation plan after the user has reviewed the audience. It returns the exact contacts eligible to start or resume, approval backlog, sending schedule, channel coverage, and blockers. Do not call sequences_activate until the user explicitly approves this exact result.",
"inputSchema": {
"type": "object",
"required": [
"sequenceId"
],
"properties": {
"sequenceId": {
"type": "string",
"format": "uuid"
}
},
"additionalProperties": false
},
"annotations": {
"title": "Prepare sequence activation",
"readOnlyHint": false,
"openWorldHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description88/100
Start or resume a sequence from sequences_prepare_activation. This is a high-impact action: it can begin contact enrollment and automatic outreach. Require explicit user approval of the exact expectedStartCount before calling it. The plan expires quickly and is rejected if the sequence or audience changed.
The description explains the capability, when to use it, and what to expect.
Inputs30/100
2 of 5 inputs have descriptions. Add descriptions to the missing inputs, including where to obtain IDs and how to supply values.
sequenceId
Not provided
Missing description. Explain what this value means and how to supply it.
activationPlanId
Not provided
Missing description. Explain what this value means and how to supply it.
expectedRevision
Not provided
Missing description. Explain what this value means and how to supply it.
expectedStartCount
Must exactly equal the activation plan's eligible start or resume count.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
idempotencyKey
Caller-generated key for safe retries. Reuse it only for the exact same mutation arguments.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "sequences_activate",
"title": "Activate sequence",
"description": "Start or resume a sequence from sequences_prepare_activation. This is a high-impact action: it can begin contact enrollment and automatic outreach. Require explicit user approval of the exact expectedStartCount before calling it. The plan expires quickly and is rejected if the sequence or audience changed.",
"inputSchema": {
"type": "object",
"required": [
"sequenceId",
"activationPlanId",
"expectedRevision",
"expectedStartCount",
"idempotencyKey"
],
"properties": {
"sequenceId": {
"type": "string",
"format": "uuid"
},
"idempotencyKey": {
"type": "string",
"maxLength": 200,
"minLength": 1,
"description": "Caller-generated key for safe retries. Reuse it only for the exact same mutation arguments."
},
"activationPlanId": {
"type": "string",
"format": "uuid"
},
"expectedRevision": {
"type": "string",
"minLength": 1
},
"expectedStartCount": {
"type": "integer",
"minimum": 0,
"description": "Must exactly equal the activation plan's eligible start or resume count."
}
},
"additionalProperties": false
},
"annotations": {
"title": "Activate sequence",
"readOnlyHint": false,
"openWorldHint": true,
"destructiveHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description74/100
Inspect current participant runs, preparation, enrollment, and ordered message previews. Use the returned cursor to continue; preparation does not require activation.
Describe the returned information so the agent knows whether it will answer the request.
Inputs0/100
0 of 6 inputs have descriptions. Add descriptions to the missing inputs, including where to obtain IDs and how to supply values.
sequenceId
Not provided
Missing description. Explain what this value means and how to supply it.
contactId
Not provided
Missing description. Explain what this value means and how to supply it.
participantId
Not provided
Missing description. Explain what this value means and how to supply it.
cursor
Not provided
Missing description. Explain what this value means and how to supply it.
limit
Not provided
Missing description. Explain what this value means and how to supply it.
includeContent
Not provided
Missing description. Explain what this value means and how to supply it.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description91/100
Read a contact’s proposed/generated/written messages, including resolved text, exact IDs and revisions, from any sequence tab. When acceptedMessageAvailable is true, subject/content/preview describe the proposal; deliveryMessage shows the previous copy still selected for delivery and its current readiness. For a selected Drafts contact, supply participantId and set messageIds to null. For known message IDs, supply messageIds and set participantId to null. Never invent message IDs. Current runs only by default; includeHistory explicitly reads older immutable runs.
The description explains the capability, when to use it, and what to expect.
Inputs44/100
2 of 4 inputs have descriptions. Add descriptions to the missing inputs, including where to obtain IDs and how to supply values.
sequenceId
Not provided
Missing description. Explain what this value means and how to supply it.
messageIds
Known message IDs from a previous inspection, or null when looking up a participant. Never use placeholder IDs.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
participantId
The selected sequenceMessages.participantId or an inspected participant ID; null when using messageIds. This is not the contact ID.
Clear enough to supply this argument.
includeHistory
Not provided
Missing description. Explain what this value means and how to supply it.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "sequences_inspect_messages",
"title": "inspect messages",
"description": "Read a contact’s proposed/generated/written messages, including resolved text, exact IDs and revisions, from any sequence tab. When acceptedMessageAvailable is true, subject/content/preview describe the proposal; deliveryMessage shows the previous copy still selected for delivery and its current readiness. For a selected Drafts contact, supply participantId and set messageIds to null. For known message IDs, supply messageIds and set participantId to null. Never invent message IDs. Current runs only by default; includeHistory explicitly reads older immutable runs.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"sequenceId",
"includeHistory"
],
"properties": {
"messageIds": {
"anyOf": [
{
"type": "array",
"items": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
"maxItems": 50,
"minItems": 1
},
{
"type": "null"
}
],
"description": "Known message IDs from a previous inspection, or null when looking up a participant. Never use placeholder IDs."
},
"sequenceId": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
"participantId": {
"anyOf": [
{
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
{
"type": "null"
}
],
"description": "The selected sequenceMessages.participantId or an inspected participant ID; null when using messageIds. This is not the contact ID."
},
"includeHistory": {
"type": "boolean",
"default": false
}
},
"additionalProperties": false
},
"annotations": {
"title": "inspect messages",
"readOnlyHint": true,
"openWorldHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description83/100
Save different personalized subject/body content for up to 50 exact messages atomically. Content is a complete Tiptap doc. Use individual mode for per-contact writing, never custom properties as message storage. Changed content requires explicit acceptance before delivery; saving never approves enrollment. The previously sendable copy can still send until the replacement is accepted. Pause the contact explicitly if delivery must stop while editing.
Describe the returned information so the agent knows whether it will answer the request.
Inputs0/100
0 of 7 inputs have descriptions. Add descriptions to the missing inputs, including where to obtain IDs and how to supply values.
sequenceId
Not provided
Missing description. Explain what this value means and how to supply it.
idempotencyKey
Not provided
Missing description. Explain what this value means and how to supply it.
messages › items › messageId
Not provided
Missing description. Explain what this value means and how to supply it.
messages › items › expectedRevision
Not provided
Missing description. Explain what this value means and how to supply it.
messages › items › subject
Not provided
Missing description. Explain what this value means and how to supply it.
messages › items › content › type
Not provided
Missing description. Explain what this value means and how to supply it.
messages › items › content › content
Not provided
Missing description. Explain what this value means and how to supply it.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description90/100
Regenerate complete AI messages (including LinkedIn connection notes) or a named snippet using saved instructions and feedback. For a whole message set partName to null; feedback is separate text, never a snippet name. Only use a partName returned in the inspected message’s ai.partNames. Replaces customized content and requires explicit acceptance before delivery. Work is asynchronous; inspect the returned IDs for completion. Never activate to trigger generation.
Describe the returned information so the agent knows whether it will answer the request.
Inputs33/100
2 of 6 inputs have descriptions. Add descriptions to the missing inputs, including where to obtain IDs and how to supply values.
sequenceId
Not provided
Missing description. Explain what this value means and how to supply it.
idempotencyKey
Not provided
Missing description. Explain what this value means and how to supply it.
messages › items › messageId
Not provided
Missing description. Explain what this value means and how to supply it.
messages › items › expectedRevision
Not provided
Missing description. Explain what this value means and how to supply it.
feedback
Requested changes to the generated copy; null for no feedback.
Clear enough to supply this argument.
partName
Null to regenerate the whole message, matching the UI Regenerate button. Only supply an exact ai.partNames entry for a single snippet.
Clear enough to supply this argument.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description78/100
Resolve changed Builder defaults for exact messages: keep_custom preserves authored content and existing acceptance using current source settings; reset_to_builder proposes a replacement and may generate AI again. Accept the replacement before delivery; the previously sendable copy remains eligible meanwhile.
Explain mutations, irreversible effects, or prerequisites that matter before calling this tool.
Inputs0/100
0 of 5 inputs have descriptions. Add descriptions to the missing inputs, including where to obtain IDs and how to supply values.
sequenceId
Not provided
Missing description. Explain what this value means and how to supply it.
idempotencyKey
Not provided
Missing description. Explain what this value means and how to supply it.
messages › items › messageId
Not provided
Missing description. Explain what this value means and how to supply it.
messages › items › expectedRevision
Not provided
Missing description. Explain what this value means and how to supply it.
decision
Not provided
Missing description. Explain what this value means and how to supply it.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description80/100
Accept or revoke exact message revisions without approving enrollment. Accept validates and replaces the previously accepted message. Editing does not pause accepted delivery. If sending must stop, pause the contact or sequence in the Sequences UI before writing. Accepted messages in active sequences may become eligible for sending.
The description explains the capability, when to use it, and what to expect.
Inputs0/100
0 of 5 inputs have descriptions. Add descriptions to the missing inputs, including where to obtain IDs and how to supply values.
sequenceId
Not provided
Missing description. Explain what this value means and how to supply it.
idempotencyKey
Not provided
Missing description. Explain what this value means and how to supply it.
messages › items › messageId
Not provided
Missing description. Explain what this value means and how to supply it.
messages › items › expectedRevision
Not provided
Missing description. Explain what this value means and how to supply it.
action
Not provided
Missing description. Explain what this value means and how to supply it.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description84/100
Approve a participant's complete exact message revision set AND release its staged enrollment gate atomically. Requires authorization for both effects. In an active sequence the participant may then start. Inspect every message including content first.
Describe the returned information so the agent knows whether it will answer the request.
Inputs0/100
0 of 6 inputs have descriptions. Add descriptions to the missing inputs, including where to obtain IDs and how to supply values.
sequenceId
Not provided
Missing description. Explain what this value means and how to supply it.
idempotencyKey
Not provided
Missing description. Explain what this value means and how to supply it.
participantId
Not provided
Missing description. Explain what this value means and how to supply it.
expectedRunId
Not provided
Missing description. Explain what this value means and how to supply it.
messages › items › messageId
Not provided
Missing description. Explain what this value means and how to supply it.
messages › items › expectedRevision
Not provided
Missing description. Explain what this value means and how to supply it.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description85/100
Retry preparation or refresh current CRM inputs for exact unstarted participant runs. Refresh retains customized copy but clears acceptance; retry queues failed participant preparation. Work is asynchronous and does not approve enrollment or activate the sequence.
Describe the returned information so the agent knows whether it will answer the request.
Inputs0/100
0 of 5 inputs have descriptions. Add descriptions to the missing inputs, including where to obtain IDs and how to supply values.
sequenceId
Not provided
Missing description. Explain what this value means and how to supply it.
idempotencyKey
Not provided
Missing description. Explain what this value means and how to supply it.
participants › items › participantId
Not provided
Missing description. Explain what this value means and how to supply it.
participants › items › expectedRunId
Not provided
Missing description. Explain what this value means and how to supply it.
action
Not provided
Missing description. Explain what this value means and how to supply it.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description89/100
Start the company-first MCP lead workflow with the same companyFilters, contactFilters, and jobFilters used by Zero's lead-search UI. Activate the searching-leads skill first. Requires at least one meaningful filter. Results are paginated for inspectability, not capped: keep the filters unchanged and set offset to the returned nextOffset until hasMore is false.
Describe the returned information so the agent knows whether it will answer the request.
Inputs59/100
93 of 119 inputs have descriptions. Add descriptions to the missing inputs, including where to obtain IDs and how to supply values.
companyFilters › name
Company name prefix filter.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
companyFilters › id
Exact company profile IDs selected in the lead-search UI.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
companyFilters › location › items › city
Not provided
Missing description. Explain what this value means and how to supply it.
companyFilters › location › items › state
Not provided
Missing description. Explain what this value means and how to supply it.
companyFilters › location › items › country
Not provided
Missing description. Explain what this value means and how to supply it.
companyFilters › location › items › continent
Not provided
Missing description. Explain what this value means and how to supply it.
companyFilters › foundedYear › $gt
Exclusive minimum numeric value.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
companyFilters › foundedYear › $gte
Inclusive minimum numeric value.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
companyFilters › foundedYear › $lt
Exclusive maximum numeric value.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
companyFilters › foundedYear › $lte
Inclusive maximum numeric value.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
companyFilters › employeeAmount › $gt
Exclusive minimum numeric value.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
companyFilters › employeeAmount › $gte
Inclusive minimum numeric value.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
companyFilters › employeeAmount › $lt
Exclusive maximum numeric value.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
companyFilters › employeeAmount › $lte
Inclusive maximum numeric value.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
companyFilters › employeeGrowthRate3mo › $gt
Exclusive minimum numeric value.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
companyFilters › employeeGrowthRate3mo › $gte
Inclusive minimum numeric value.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
companyFilters › employeeGrowthRate3mo › $lt
Exclusive maximum numeric value.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
companyFilters › employeeGrowthRate3mo › $lte
Inclusive maximum numeric value.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
companyFilters › employeeGrowthRate6mo › $gt
Exclusive minimum numeric value.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
companyFilters › employeeGrowthRate6mo › $gte
Inclusive minimum numeric value.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
companyFilters › employeeGrowthRate6mo › $lt
Exclusive maximum numeric value.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
companyFilters › employeeGrowthRate6mo › $lte
Inclusive maximum numeric value.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
companyFilters › employeeGrowthRate12mo › $gt
Exclusive minimum numeric value.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
companyFilters › employeeGrowthRate12mo › $gte
Inclusive minimum numeric value.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
companyFilters › employeeGrowthRate12mo › $lt
Exclusive maximum numeric value.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
companyFilters › employeeGrowthRate12mo › $lte
Inclusive maximum numeric value.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
companyFilters › locations:count › $gt
Exclusive minimum numeric value.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
companyFilters › locations:count › $gte
Inclusive minimum numeric value.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
companyFilters › locations:count › $lt
Exclusive maximum numeric value.
Clear enough to supply this argument.
companyFilters › locations:count › $lte
Inclusive maximum numeric value.
Clear enough to supply this argument.
companyFilters › includeListIds
Only companies already materialized in these workspace lists.
Clear enough to supply this argument.
companyFilters › excludeListIds
Exclude companies already materialized in these workspace lists.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
companyFilters › excludeExisting
Exclude companies that already exist in the workspace CRM, matched by shared domain or enrichment link. Rerunning a search after importing its matches then returns only what is new.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
companyFilters › similarToIds
Company profile IDs to find similar companies to.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
companyFilters › similarToListId
Workspace list ID whose companies seed similarity search.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
companyFilters › companyPrompt
Natural-language company similarity prompt.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
companyFilters › similarityTreshold
Similarity strictness. Uses the UI's existing similarityTreshold field spelling.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
companyFilters › keywords › $overlaps
Not provided
Missing description. Explain what this value means and how to supply it.
companyFilters › keywords › $all
Not provided
Missing description. Explain what this value means and how to supply it.
companyFilters › categories › $overlaps
Match companies in any of these categories.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
companyFilters › categories › $all
Match companies that belong to all of these categories.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
companyFilters › categories › $includes
Match one category exactly. This is the shape used by saved UI search templates.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
companyFilters › lastFundingType › $in
Match companies whose last funding round is any of these types.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
companyFilters › lastFundingDate › $gt
Exclusive minimum ISO date or relative offset such as -90d.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
companyFilters › lastFundingDate › $gte
Inclusive minimum ISO date or relative offset such as -90d.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
companyFilters › lastFundingDate › $lt
Exclusive maximum ISO date or relative offset.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
companyFilters › lastFundingDate › $lte
Inclusive maximum ISO date or relative offset.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
companyFilters › totalFundingAmount › $gt
Exclusive minimum numeric value.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
companyFilters › totalFundingAmount › $gte
Inclusive minimum numeric value.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
companyFilters › totalFundingAmount › $lt
Exclusive maximum numeric value.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
companyFilters › totalFundingAmount › $lte
Inclusive maximum numeric value.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
companyFilters › acquisitionDate › $gt
Exclusive minimum ISO date or relative offset such as -90d.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
companyFilters › acquisitionDate › $gte
Inclusive minimum ISO date or relative offset such as -90d.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
companyFilters › acquisitionDate › $lt
Exclusive maximum ISO date or relative offset.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
companyFilters › acquisitionDate › $lte
Inclusive maximum ISO date or relative offset.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
companyFilters › acquisitionAmount › $gt
Exclusive minimum numeric value.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
companyFilters › acquisitionAmount › $gte
Inclusive minimum numeric value.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
companyFilters › acquisitionAmount › $lt
Exclusive maximum numeric value.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
companyFilters › acquisitionAmount › $lte
Inclusive maximum numeric value.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
companyFilters › investors › $overlaps
Not provided
Missing description. Explain what this value means and how to supply it.
companyFilters › investors › $all
Not provided
Missing description. Explain what this value means and how to supply it.
companyFilters › industries
Exact LinkedIn industry values. SaaS belongs in categories, not here.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
companyFilters › technologies
Website and cloud technologies detected for the company.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
contactFilters › titles
Job titles to match. You don't need to type every combination, Sales will match for also for Head of Sales, Sales Manager, etc.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
contactFilters › excludeTitles
Job titles to exclude.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
contactFilters › keywords › $overlaps
Not provided
Missing description. Explain what this value means and how to supply it.
contactFilters › keywords › $all
Not provided
Missing description. Explain what this value means and how to supply it.
contactFilters › location › items › city
Not provided
Missing description. Explain what this value means and how to supply it.
contactFilters › location › items › state
Not provided
Missing description. Explain what this value means and how to supply it.
contactFilters › location › items › country
Not provided
Missing description. Explain what this value means and how to supply it.
contactFilters › location › items › continent
Not provided
Missing description. Explain what this value means and how to supply it.
contactFilters › currentPositionSince › $gt
Exclusive minimum elapsed months.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
contactFilters › currentPositionSince › $gte
Inclusive minimum elapsed months.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
contactFilters › currentPositionSince › $lt
Exclusive maximum elapsed months.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
contactFilters › currentPositionSince › $lte
Inclusive maximum elapsed months.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
contactFilters › currentCompanySince › $gt
Exclusive minimum elapsed months.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
contactFilters › currentCompanySince › $gte
Inclusive minimum elapsed months.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
contactFilters › currentCompanySince › $lt
Exclusive maximum elapsed months.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
contactFilters › currentCompanySince › $lte
Inclusive maximum elapsed months.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
contactFilters › pastCompanyIds › $overlaps
Not provided
Missing description. Explain what this value means and how to supply it.
contactFilters › pastCompanyIds › $all
Not provided
Missing description. Explain what this value means and how to supply it.
contactFilters › schoolIds › $overlaps
Not provided
Missing description. Explain what this value means and how to supply it.
contactFilters › schoolIds › $all
Not provided
Missing description. Explain what this value means and how to supply it.
contactFilters › languages › $overlaps
Not provided
Missing description. Explain what this value means and how to supply it.
contactFilters › languages › $all
Not provided
Missing description. Explain what this value means and how to supply it.
contactFilters › followsLinkedinPageId
Workspace LinkedIn page IDs the contact follows. Matches any selected page among synced followers.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
contactFilters › connectedToLinkedinAccountId
Workspace LinkedIn account IDs the contact must be connected to.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
contactFilters › includeListIds
Not provided
Missing description. Explain what this value means and how to supply it.
contactFilters › excludeListIds
Not provided
Missing description. Explain what this value means and how to supply it.
contactFilters › $count › $gt
Exclusive minimum numeric value.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
contactFilters › $count › $gte
Inclusive minimum numeric value.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
contactFilters › $count › $lt
Exclusive maximum numeric value.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
contactFilters › $count › $lte
Inclusive maximum numeric value.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
contactFilters › location:distinct › $gt
Exclusive minimum numeric value.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
contactFilters › location:distinct › $gte
Inclusive minimum numeric value.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
contactFilters › location:distinct › $lt
Exclusive maximum numeric value.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
contactFilters › location:distinct › $lte
Inclusive maximum numeric value.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
jobFilters › titles
Job titles to match in postings.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
jobFilters › keywords
Job keyword filter as a string array or operator object.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
jobFilters › postedAt › $gt
Exclusive minimum ISO date or relative offset such as -90d.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
jobFilters › postedAt › $gte
Inclusive minimum ISO date or relative offset such as -90d.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
jobFilters › postedAt › $lt
Exclusive maximum ISO date or relative offset.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
jobFilters › postedAt › $lte
Inclusive maximum ISO date or relative offset.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
jobFilters › types
Job types to include.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
jobFilters › departments
Exact job departments stored on jobs.department, such as Engineering or Sales. Use the catalog values only.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
jobFilters › location › items › city
Not provided
Missing description. Explain what this value means and how to supply it.
jobFilters › location › items › state
Not provided
Missing description. Explain what this value means and how to supply it.
jobFilters › location › items › country
Not provided
Missing description. Explain what this value means and how to supply it.
jobFilters › location › items › continent
Not provided
Missing description. Explain what this value means and how to supply it.
jobFilters › $count › $gt
Exclusive minimum numeric value.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
jobFilters › $count › $gte
Inclusive minimum numeric value.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
jobFilters › $count › $lt
Exclusive maximum numeric value.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
jobFilters › $count › $lte
Inclusive maximum numeric value.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
jobFilters › location:distinct › $gt
Exclusive minimum numeric value.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
jobFilters › location:distinct › $gte
Inclusive minimum numeric value.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
jobFilters › location:distinct › $lt
Exclusive maximum numeric value.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
jobFilters › location:distinct › $lte
Inclusive maximum numeric value.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
limit
Page size. Defaults to 50; use offset to retrieve every matching page.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
offset
Zero-based result offset. Continue with nextOffset until hasMore is false.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description94/100
Search contacts inside an expiring company result set using the same contactFilters and jobFilters as Zero's lead-search UI. Filters may be empty to return any contact at the bounded companies. Results are paginated rather than capped: keep the result set and filters unchanged and set offset to the returned nextOffset until hasMore is false. Newly revealed unique contacts count against the workspace's UTC-month MCP lead quota; the response includes used, remaining, limit, and reset time.
Describe the returned information so the agent knows whether it will answer the request.
Inputs51/100
39 of 58 inputs have descriptions. Add descriptions to the missing inputs, including where to obtain IDs and how to supply values.
companyResultSetId
Not provided
Missing description. Explain what this value means and how to supply it.
companyCandidateIds
Optional exact subset of company candidates; omit for all.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
contactFilters › titles
Job titles to match. You don't need to type every combination, Sales will match for also for Head of Sales, Sales Manager, etc.
Clear enough to supply this argument.
contactFilters › excludeTitles
Job titles to exclude.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
contactFilters › keywords › $overlaps
Not provided
Missing description. Explain what this value means and how to supply it.
contactFilters › keywords › $all
Not provided
Missing description. Explain what this value means and how to supply it.
contactFilters › location › items › city
Not provided
Missing description. Explain what this value means and how to supply it.
contactFilters › location › items › state
Not provided
Missing description. Explain what this value means and how to supply it.
contactFilters › location › items › country
Not provided
Missing description. Explain what this value means and how to supply it.
contactFilters › location › items › continent
Not provided
Missing description. Explain what this value means and how to supply it.
contactFilters › currentPositionSince › $gt
Exclusive minimum elapsed months.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
contactFilters › currentPositionSince › $gte
Inclusive minimum elapsed months.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
contactFilters › currentPositionSince › $lt
Exclusive maximum elapsed months.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
contactFilters › currentPositionSince › $lte
Inclusive maximum elapsed months.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
contactFilters › currentCompanySince › $gt
Exclusive minimum elapsed months.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
contactFilters › currentCompanySince › $gte
Inclusive minimum elapsed months.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
contactFilters › currentCompanySince › $lt
Exclusive maximum elapsed months.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
contactFilters › currentCompanySince › $lte
Inclusive maximum elapsed months.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
contactFilters › pastCompanyIds › $overlaps
Not provided
Missing description. Explain what this value means and how to supply it.
contactFilters › pastCompanyIds › $all
Not provided
Missing description. Explain what this value means and how to supply it.
contactFilters › schoolIds › $overlaps
Not provided
Missing description. Explain what this value means and how to supply it.
contactFilters › schoolIds › $all
Not provided
Missing description. Explain what this value means and how to supply it.
contactFilters › languages › $overlaps
Not provided
Missing description. Explain what this value means and how to supply it.
contactFilters › languages › $all
Not provided
Missing description. Explain what this value means and how to supply it.
contactFilters › followsLinkedinPageId
Workspace LinkedIn page IDs the contact follows. Matches any selected page among synced followers.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
contactFilters › connectedToLinkedinAccountId
Workspace LinkedIn account IDs the contact must be connected to.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
contactFilters › includeListIds
Not provided
Missing description. Explain what this value means and how to supply it.
contactFilters › excludeListIds
Not provided
Missing description. Explain what this value means and how to supply it.
contactFilters › $count › $gt
Exclusive minimum numeric value.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
contactFilters › $count › $gte
Inclusive minimum numeric value.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
contactFilters › $count › $lt
Exclusive maximum numeric value.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
contactFilters › $count › $lte
Inclusive maximum numeric value.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
contactFilters › location:distinct › $gt
Exclusive minimum numeric value.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
contactFilters › location:distinct › $gte
Inclusive minimum numeric value.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
contactFilters › location:distinct › $lt
Exclusive maximum numeric value.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
contactFilters › location:distinct › $lte
Inclusive maximum numeric value.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
jobFilters › titles
Job titles to match in postings.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
jobFilters › keywords
Job keyword filter as a string array or operator object.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
jobFilters › postedAt › $gt
Exclusive minimum ISO date or relative offset such as -90d.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
jobFilters › postedAt › $gte
Inclusive minimum ISO date or relative offset such as -90d.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
jobFilters › postedAt › $lt
Exclusive maximum ISO date or relative offset.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
jobFilters › postedAt › $lte
Inclusive maximum ISO date or relative offset.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
jobFilters › types
Job types to include.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
jobFilters › departments
Exact job departments stored on jobs.department, such as Engineering or Sales. Use the catalog values only.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
jobFilters › location › items › city
Not provided
Missing description. Explain what this value means and how to supply it.
jobFilters › location › items › state
Not provided
Missing description. Explain what this value means and how to supply it.
jobFilters › location › items › country
Not provided
Missing description. Explain what this value means and how to supply it.
jobFilters › location › items › continent
Not provided
Missing description. Explain what this value means and how to supply it.
jobFilters › $count › $gt
Exclusive minimum numeric value.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
jobFilters › $count › $gte
Inclusive minimum numeric value.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
jobFilters › $count › $lt
Exclusive maximum numeric value.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
jobFilters › $count › $lte
Inclusive maximum numeric value.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
jobFilters › location:distinct › $gt
Exclusive minimum numeric value.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
jobFilters › location:distinct › $gte
Inclusive minimum numeric value.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
jobFilters › location:distinct › $lt
Exclusive maximum numeric value.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
jobFilters › location:distinct › $lte
Inclusive maximum numeric value.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
limit
Page size. Defaults to 50; use offset to retrieve every matching page.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
offset
Zero-based result offset. Continue with nextOffset until hasMore is false.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
{
"title": "Search contacts at lead companies",
"readOnlyHint": false,
"openWorldHint": false,
"destructiveHint": false
}
Output schema0/100
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "lead_search_contacts",
"title": "Search contacts at lead companies",
"description": "Search contacts inside an expiring company result set using the same contactFilters and jobFilters as Zero's lead-search UI. Filters may be empty to return any contact at the bounded companies. Results are paginated rather than capped: keep the result set and filters unchanged and set offset to the returned nextOffset until hasMore is false. Newly revealed unique contacts count against the workspace's UTC-month MCP lead quota; the response includes used, remaining, limit, and reset time.",
"inputSchema": {
"type": "object",
"required": [
"companyResultSetId"
],
"properties": {
"limit": {
"type": "integer",
"maximum": 100,
"minimum": 1,
"description": "Page size. Defaults to 50; use offset to retrieve every matching page."
},
"offset": {
"type": "integer",
"minimum": 0,
"description": "Zero-based result offset. Continue with nextOffset until hasMore is false."
},
"jobFilters": {
"type": "object",
"properties": {
"types": {
"type": "array",
"items": {
"type": "string"
},
"description": "Job types to include."
},
"$count": {
"type": "object",
"properties": {
"$gt": {
"type": "number",
"description": "Exclusive minimum numeric value."
},
"$lt": {
"type": "number",
"description": "Exclusive maximum numeric value."
},
"$gte": {
"type": "number",
"description": "Inclusive minimum numeric value."
},
"$lte": {
"type": "number",
"description": "Inclusive maximum numeric value."
}
},
"description": "Number of matching open positions.",
"additionalProperties": false
},
"titles": {
"type": "array",
"items": {
"type": "string"
},
"description": "Job titles to match in postings."
},
"keywords": {
"description": "Job keyword filter as a string array or operator object."
},
"location": {
"type": "array",
"items": {
"type": "object",
"properties": {
"city": {
"type": "string"
},
"state": {
"type": "string"
},
"country": {
"type": "string"
},
"continent": {
"type": "string"
}
},
"additionalProperties": false
}
},
"postedAt": {
"type": "object",
"properties": {
"$gt": {
"type": "string",
"description": "Exclusive minimum ISO date or relative offset such as -90d."
},
"$lt": {
"type": "string",
"description": "Exclusive maximum ISO date or relative offset."
},
"$gte": {
"type": "string",
"description": "Inclusive minimum ISO date or relative offset such as -90d."
},
"$lte": {
"type": "string",
"description": "Inclusive maximum ISO date or relative offset."
}
},
"description": "Date range filter using ISO dates or relative offsets such as -90d.",
"additionalProperties": false
},
"departments": {
"type": "array",
"items": {
"enum": [
"Accounting",
"Administrative",
"Arts and Design",
"Business Development",
"Community and Social Services",
"Consulting",
"Customer Success and Support",
"Education",
"Engineering",
"Entrepreneurship",
"Finance",
"Healthcare Services",
"Human Resources",
"Information Technology",
"Legal",
"Marketing",
"Media and Communication",
"Military and Protective Services",
"Operations",
"Product Management",
"Program and Project Management",
"Purchasing",
"Quality Assurance",
"Real Estate",
"Research",
"Sales"
],
"type": "string"
},
"description": "Exact job departments stored on jobs.department, such as Engineering or Sales. Use the catalog values only."
},
"location:distinct": {
"type": "object",
"properties": {
"$gt": {
"type": "number",
"description": "Exclusive minimum numeric value."
},
"$lt": {
"type": "number",
"description": "Exclusive maximum numeric value."
},
"$gte": {
"type": "number",
"description": "Inclusive minimum numeric value."
},
"$lte": {
"type": "number",
"description": "Inclusive maximum numeric value."
}
},
"description": "Number of distinct matching job locations.",
"additionalProperties": false
}
},
"description": "Job posting filters applied alongside company or contact filters.",
"additionalProperties": false
},
"contactFilters": {
"type": "object",
"properties": {
"$count": {
"type": "object",
"properties": {
"$gt": {
"type": "number",
"description": "Exclusive minimum numeric value."
},
"$lt": {
"type": "number",
"description": "Exclusive maximum numeric value."
},
"$gte": {
"type": "number",
"description": "Inclusive minimum numeric value."
},
"$lte": {
"type": "number",
"description": "Inclusive maximum numeric value."
}
},
"description": "Number of matching contacts per company.",
"additionalProperties": false
},
"titles": {
"type": "array",
"items": {
"type": "string"
},
"description": "Job titles to match. You don't need to type every combination, Sales will match for also for Head of Sales, Sales Manager, etc."
},
"keywords": {
"type": "object",
"properties": {
"$all": {
"type": "array",
"items": {
"type": "string"
}
},
"$overlaps": {
"type": "array",
"items": {
"type": "string"
}
}
},
"description": "Keywords to match in the contact's role description, e.g. machine learning, outbound sales.",
"additionalProperties": false
},
"location": {
"type": "array",
"items": {
"type": "object",
"properties": {
"city": {
"type": "string"
},
"state": {
"type": "string"
},
"country": {
"type": "string"
},
"continent": {
"type": "string"
}
},
"additionalProperties": false
}
},
"languages": {
"type": "object",
"properties": {
"$all": {
"type": "array",
"items": {
"type": "string"
}
},
"$overlaps": {
"type": "array",
"items": {
"type": "string"
}
}
},
"additionalProperties": false
},
"schoolIds": {
"type": "object",
"properties": {
"$all": {
"type": "array",
"items": {
"type": "string"
}
},
"$overlaps": {
"type": "array",
"items": {
"type": "string"
}
}
},
"description": "LinkedIn school IDs (linkedinId). Use search_schools first to find canonical IDs.",
"additionalProperties": false
},
"excludeTitles": {
"type": "array",
"items": {
"type": "string"
},
"description": "Job titles to exclude."
},
"excludeListIds": {
"type": "array",
"items": {
"type": "string"
}
},
"includeListIds": {
"type": "array",
"items": {
"type": "string"
}
},
"pastCompanyIds": {
"type": "object",
"properties": {
"$all": {
"type": "array",
"items": {
"type": "string"
}
},
"$overlaps": {
"type": "array",
"items": {
"type": "string"
}
}
},
"description": "Past company profile IDs to match. Use find_company_profiles first to find canonical IDs.",
"additionalProperties": false
},
"location:distinct": {
"type": "object",
"properties": {
"$gt": {
"type": "number",
"description": "Exclusive minimum numeric value."
},
"$lt": {
"type": "number",
"description": "Exclusive maximum numeric value."
},
"$gte": {
"type": "number",
"description": "Inclusive minimum numeric value."
},
"$lte": {
"type": "number",
"description": "Inclusive maximum numeric value."
}
},
"description": "Number of distinct matching locations.",
"additionalProperties": false
},
"currentCompanySince": {
"type": "object",
"properties": {
"$gt": {
"type": "number",
"minimum": 0,
"description": "Exclusive minimum elapsed months."
},
"$lt": {
"type": "number",
"minimum": 0,
"description": "Exclusive maximum elapsed months."
},
"$gte": {
"type": "number",
"minimum": 0,
"description": "Inclusive minimum elapsed months."
},
"$lte": {
"type": "number",
"minimum": 0,
"description": "Inclusive maximum elapsed months."
}
},
"description": "Elapsed whole months at the current company. Use non-negative numbers only, never dates.",
"additionalProperties": false
},
"currentPositionSince": {
"type": "object",
"properties": {
"$gt": {
"type": "number",
"minimum": 0,
"description": "Exclusive minimum elapsed months."
},
"$lt": {
"type": "number",
"minimum": 0,
"description": "Exclusive maximum elapsed months."
},
"$gte": {
"type": "number",
"minimum": 0,
"description": "Inclusive minimum elapsed months."
},
"$lte": {
"type": "number",
"minimum": 0,
"description": "Inclusive maximum elapsed months."
}
},
"description": "Elapsed whole months in the current role. Use non-negative numbers only, never dates.",
"additionalProperties": false
},
"followsLinkedinPageId": {
"type": "array",
"items": {
"type": "string"
},
"description": "Workspace LinkedIn page IDs the contact follows. Matches any selected page among synced followers."
},
"connectedToLinkedinAccountId": {
"type": "array",
"items": {
"type": "string"
},
"description": "Workspace LinkedIn account IDs the contact must be connected to."
}
},
"description": "Contact profile filters stored on the saved search.",
"additionalProperties": false
},
"companyResultSetId": {
"type": "string",
"format": "uuid"
},
"companyCandidateIds": {
"type": "array",
"items": {
"type": "string",
"format": "uuid"
},
"maxItems": 100,
"description": "Optional exact subset of company candidates; omit for all."
}
},
"additionalProperties": false
},
"annotations": {
"title": "Search contacts at lead companies",
"readOnlyHint": false,
"openWorldHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description98/100
Add to the CRM everything a lead source matches, from exactly one source. The source decides what is written, exactly as the search's own page does: a search set to Contacts, or one carrying contact filters (titles, seniority, keywords), imports the matching people with their companies, the same people the page shows on each company row; a company-filters-only search imports companies. The whole source is added, so narrow the search rather than the call. Existing records are reused (lead profile, domain, or LinkedIn), so importing a search again adds only what is new. listId routes by the list's own entity; sequenceId stages the imported people for explicit approval and never activates the sequence. Returns companyResultSetId and contactResultSetId; pass either as resultSetId to add_companies_to_list, add_contacts_to_list, query_result_set, or sequences_update_audience instead of copying IDs.
The description explains the capability, when to use it, and what to expect.
Inputs97/100
Input documentation gives an agent enough context to populate the arguments.
searchId
Saved lead search to import: user_view.search.searchId, or the id from create_lead_search. It runs server side whatever the page shows and before its results load, so never switch its type, poll the page, or describe manual steps. Exactly one of searchId or resultSetId; null when resultSetId is given.
Clear enough to supply this argument.
resultSetId
Lead result set from lead_search_companies or lead_search_contacts (MCP), instead of a saved search. Exactly one of searchId or resultSetId; null when searchId is given.
Clear enough to supply this argument.
listId
Regular list to add this import to; null for none.
Clear enough to supply this argument.
sequenceId
Sequence to stage the imported people into for explicit approval; never activates it. Needs a source that matches people. null for none.
Clear enough to supply this argument.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
{
"title": "Import lead search results into the CRM",
"readOnlyHint": false,
"openWorldHint": false,
"destructiveHint": true
}
Output schema0/100
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "import_lead_search_results",
"title": "Import lead search results into the CRM",
"description": "Add to the CRM everything a lead source matches, from exactly one source. The source decides what is written, exactly as the search's own page does: a search set to Contacts, or one carrying contact filters (titles, seniority, keywords), imports the matching people with their companies, the same people the page shows on each company row; a company-filters-only search imports companies. The whole source is added, so narrow the search rather than the call. Existing records are reused (lead profile, domain, or LinkedIn), so importing a search again adds only what is new. listId routes by the list's own entity; sequenceId stages the imported people for explicit approval and never activates the sequence. Returns companyResultSetId and contactResultSetId; pass either as resultSetId to add_companies_to_list, add_contacts_to_list, query_result_set, or sequences_update_audience instead of copying IDs.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"listId": {
"anyOf": [
{
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
{
"type": "null"
}
],
"description": "Regular list to add this import to; null for none."
},
"searchId": {
"anyOf": [
{
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
{
"type": "null"
}
],
"description": "Saved lead search to import: user_view.search.searchId, or the id from create_lead_search. It runs server side whatever the page shows and before its results load, so never switch its type, poll the page, or describe manual steps. Exactly one of searchId or resultSetId; null when resultSetId is given."
},
"sequenceId": {
"anyOf": [
{
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
{
"type": "null"
}
],
"description": "Sequence to stage the imported people into for explicit approval; never activates it. Needs a source that matches people. null for none."
},
"resultSetId": {
"anyOf": [
{
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
{
"type": "null"
}
],
"description": "Lead result set from lead_search_companies or lead_search_contacts (MCP), instead of a saved search. Exactly one of searchId or resultSetId; null when searchId is given."
}
},
"additionalProperties": false
},
"annotations": {
"title": "Import lead search results into the CRM",
"readOnlyHint": false,
"openWorldHint": false,
"destructiveHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description80/100
Load the full instructions for a skill listed under Available skills. Call this before attempting a matching task. The complete input is {"name":"<exact listed skill name>"}.
Describe the returned information so the agent knows whether it will answer the request.
Inputs75/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
name
The exact skill identifier listed under Available skills.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description72/100
Read a reference file bundled with an activated skill. The path is relative to the skill directory. The complete input is {"skill":"<exact listed skill name>","path":"<relative path>"}.
Describe the returned information so the agent knows whether it will answer the request.
Inputs75/100
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
skill
The exact skill identifier used in the preceding activate_skill call.
Clear enough to supply this argument.
path
The exact relative file path referenced by the activated skill instructions.
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description96/100
Read records inside a result set returned by find_companies, find_contacts, find_deals, find_tasks, find_notes, or import_lead_search_results. Returns exactly the rows requested (default 20, max 100), so use it when the sample rows on a find result are not enough, when only some fields are needed (returnColumns), or to sort differently. Pass where (the same filter fields as the set entity's find_* tool) to narrow the set: the response then carries a new resultSetId covering only the matches, which any bulk tool accepts. Use where plus limit 1 to count matches via total. Do not page through a set just to collect IDs; pass the resultSetId to the bulk tool instead.
The description explains the capability, when to use it, and what to expect.
Inputs64/100
5 of 7 inputs have descriptions. Add descriptions to the missing inputs, including where to obtain IDs and how to supply values.
resultSetId
resultSetId returned by a find_* call (or contactResultSetId / companyResultSetId from import_lead_search_results). Targets every record that call matched (its resultSetCount, up to 10,000), not just the rows shown. Use instead of copying IDs; never combine with an explicit ID array.
Clear enough to supply this argument.
where
Filters applied inside the set, using the same filter fields as the set entity's find_* tool (for example name, domain, location, ownerIds, stage, value, closeDate, done, custom). Omit to read the set as is. When given, the response includes a new resultSetId covering only the matches. where.id (an id, an array of ids, or { $in: [ids] }) keeps only those ids that are inside the set.
Clear enough to supply this argument.
returnColumns
Same shape as the entity's find_* returnColumns ({ system, custom, relations }). Request only the fields needed. Not supported for tasks and notes.
Clear enough to supply this argument.
orderBy › column
Not provided
Missing description. Explain what this value means and how to supply it.
orderBy › direction
Not provided
Missing description. Explain what this value means and how to supply it.
offset
Row offset for paging within the query.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
limit
Rows to return (default 20, max 100).
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "query_result_set",
"title": "Query result set",
"description": "Read records inside a result set returned by find_companies, find_contacts, find_deals, find_tasks, find_notes, or import_lead_search_results. Returns exactly the rows requested (default 20, max 100), so use it when the sample rows on a find result are not enough, when only some fields are needed (returnColumns), or to sort differently. Pass where (the same filter fields as the set entity's find_* tool) to narrow the set: the response then carries a new resultSetId covering only the matches, which any bulk tool accepts. Use where plus limit 1 to count matches via total. Do not page through a set just to collect IDs; pass the resultSetId to the bulk tool instead.",
"inputSchema": {
"type": "object",
"required": [
"resultSetId"
],
"properties": {
"limit": {
"type": "integer",
"maximum": 100,
"minimum": 1,
"description": "Rows to return (default 20, max 100)."
},
"where": {
"type": "object",
"description": "Filters applied inside the set, using the same filter fields as the set entity's find_* tool (for example name, domain, location, ownerIds, stage, value, closeDate, done, custom). Omit to read the set as is. When given, the response includes a new resultSetId covering only the matches. where.id (an id, an array of ids, or { $in: [ids] }) keeps only those ids that are inside the set.",
"additionalProperties": true
},
"offset": {
"type": "integer",
"minimum": 0,
"description": "Row offset for paging within the query."
},
"orderBy": {
"type": "object",
"required": [
"column"
],
"properties": {
"column": {
"type": "string"
},
"direction": {
"enum": [
"asc",
"desc"
],
"type": "string"
}
},
"description": "Same columns as the entity's find_* orderBy.",
"additionalProperties": false
},
"resultSetId": {
"type": "string",
"format": "uuid",
"description": "resultSetId returned by a find_* call (or contactResultSetId / companyResultSetId from import_lead_search_results). Targets every record that call matched (its resultSetCount, up to 10,000), not just the rows shown. Use instead of copying IDs; never combine with an explicit ID array."
},
"returnColumns": {
"type": "object",
"description": "Same shape as the entity's find_* returnColumns ({ system, custom, relations }). Request only the fields needed. Not supported for tasks and notes.",
"additionalProperties": true
}
},
"additionalProperties": false
},
"annotations": {
"title": "Query result set",
"readOnlyHint": true,
"openWorldHint": false,
"destructiveHint": false
}
}
Loading score analytics…
Put your MCP to the test
A few tasks worth trying with this server, chosen from its reviewed tools. These have not been run.
01Find dashboardsList the workspace's reporting dashboards.
02Find companiesIn Chat, matching rows may include connectedSlackChannels with active customer-channel sync destinations.
03List listsSearch workspace lists and return compact metadata only.
04Search saved reports/charts by name, dashboard, or entity
05Find emailsFind email messages by subject, sender, recipient, linked company/contact, or mailbox.
Want to run these tasks against your MCP server with us?
Zero MCP setup, tools, quality score, publishing readiness, and alternatives.
How do I add Zero MCP to Claude, ChatGPT, or Cursor?
Add Zero MCP to Claude, ChatGPT, or Cursor by connecting its remote MCP URL in each client's MCP settings. In Claude, add a custom connector. In ChatGPT, add an MCP app. In Cursor, add an MCP server under Settings. The MCP URL is https://api.zero.inc/mcp.
Is Zero MCP MCP ready for ChatGPT and Claude?
As of October 15, 2026, Zero MCP scores 96/100 on Manufact's MCP publishing checklist. The scan meets ChatGPT publishing checks and meets Claude publishing checks. Passing these checks does not guarantee marketplace approval.
How clear is Zero MCP's MCP tool documentation?
As of October 15, 2026, Zero MCP scores 74/100 in Manufact's review of tool titles, descriptions, input and output schemas, and behavior annotations. The review covers 100 of 100 discovered tools. The quality score measures documentation clarity; runtime behavior and marketplace readiness require separate checks.
What are the best alternatives to Zero MCP?
As of October 15, 2026, alternatives to Zero MCP in sales-and-marketing on the Manufact MCP catalog include Griddo AX Docs, Rocket Sloth, Datacircle, Tolt, and Affonso.io.
How can Zero MCP improve its MCP documentation?
sequences_inspect_participants is the lowest-scoring reviewed tool at 52/100. 0 of 6 inputs have descriptions. Add descriptions to the missing inputs, including where to obtain IDs and how to supply values. Open its review for feedback and a copyable fix prompt, then rerun the documentation review after updating your tool metadata.
Not your MCP?
Review any public or OAuth MCP server for protocol compatibility, tool documentation, and ChatGPT and Claude publishing readiness. No account required.