Skip to main content
Glama
soil-dev

capsulemcp

by soil-dev

capsulemcp

capsulemcp MCP server

A Model Context Protocol server for Capsule CRM. Connect Claude (Desktop, Code, or web Projects via Custom Connector) to your CRM and let it answer natural-language questions across the full record graph: contacts, organisations, opportunities, projects, tasks, and timeline activity. Beyond the basics it covers structured filters with field/operator conditions, saved searches with sort, workflow tracks (templates and instances), file attachments (read + write), audit of deleted records, and batch fetches up to 50 records per call.

  • 92 tools across the Capsule resource graph (53 in read-only mode) — full read coverage plus careful, confirm-gated writes; 6 batched-write tools (batch_*) for mass-update workflows

  • Two transports: stdio for local installs (Claude Desktop / Code), HTTP+OAuth for hosted Custom Connectors

  • Read-only mode as a one-env-var flag; works alongside read-scoped Capsule tokens

  • MCP tool annotations: 53 read tools carry readOnlyHint: true, 8 destructive ones carry destructiveHint: true — clients that honor these hints can auto-approve safe reads while still prompting for writes/destructive calls

  • Apache 2.0

Pick your install

You want

Read this

Example questions to ask once the connector is running

EXAMPLES.md

To use it locally with Claude Desktop or Claude Code

INSTALL.md

To deploy it once and have your whole team use it via Claude.ai

DEPLOY.md

To wire it into n8n workflows

INTEGRATIONS-n8n.md

To contribute, debug, add a tool, or cut a release

HOWTO.md (procedures) · CONTRIBUTING.md (style & PR checks)

To understand what's intentionally not implemented (and why)

DESIGN.md

To see what performance work has been done (and what's next)

OPTIMIZATIONS.md

To see ideas for features that might land in future versions

IDEAS.md

To learn the surprising parts of Capsule's v2 API (with verbatim doc quotes)

NOTES-ON-CAPSULE-API.md

For most individual users the install is a single JSON snippet pasted into Claude Desktop's config — see INSTALL.md.

Related MCP server: Pipedrive MCP

Quick start (Claude Desktop)

  1. Generate a Capsule API token: My Preferences → API Authentication Tokens → Generate, choose the Read scope for safety.

  2. Add this to your claude_desktop_config.json (~/Library/Application Support/Claude/claude_desktop_config.json on macOS):

    {
      "mcpServers": {
        "capsule": {
          "command": "npx",
          "args": ["-y", "capsulemcp"],
          "env": {
            "CAPSULE_API_TOKEN": "<paste token here>",
            "CAPSULE_MCP_READONLY": "1"
          }
        }
      }
    }
  3. Restart Claude Desktop. The Capsule tools appear in the tool picker.

That's it. The first launch fetches the package from npm (a few seconds); subsequent launches are instant from the npx cache. To pin a specific version, use "capsulemcp@2.3.1" in args. If you're tracking a fork or an unreleased branch, use the GitHub-ref form instead: "github:soil-dev/capsulemcp#v2.3.1" — same arguments, just installs from a git clone rather than the npm registry. See INSTALL.md for the Claude Code path, manual install, and troubleshooting.

Tools

Group

Read

Write

Parties (people/orgs)

search_parties, filter_parties, get_party, get_parties, list_employees, list_party_opportunities, list_party_projects, list_party_entries

create_party, update_party, delete_party, add_party_email_address, remove_party_email_address_by_id, add_party_phone_number, remove_party_phone_number_by_id, add_party_address, remove_party_address_by_id, add_party_website, remove_party_website_by_id

Opportunities

search_opportunities, filter_opportunities, get_opportunity, get_opportunities, list_opportunity_entries, list_associated_projects

create_opportunity, update_opportunity, delete_opportunity

Projects

search_projects, list_projects, filter_projects, get_project, get_projects, list_project_entries

create_project, update_project, delete_project

Additional parties (multi-party deals)

list_additional_parties

add_additional_party, remove_additional_party

Tasks

list_tasks, get_task, get_tasks

create_task, update_task, complete_task, delete_task

Entries (notes / captured emails)

get_entry, list_entries

add_note, update_entry, delete_entry

Attachments (file upload / download)

get_attachment

upload_attachment

Activity feed (tenant-wide)

list_activities

—

Audit (deleted records)

list_deleted_parties, list_deleted_opportunities, list_deleted_projects

—

Pipelines & milestones (opportunities)

list_pipelines, list_milestones

—

Boards & stages (projects)

list_boards, list_stages

—

Tracks (workflow instances)

list_track_definitions, list_entity_tracks, get_track

apply_track, update_track, remove_track

Saved filters

list_saved_filters, run_saved_filter

—

Custom fields (schema)

list_custom_fields, get_custom_field

—

Tags

list_tags

add_tag, remove_tag_by_id, delete_tag_definition

Users & teams

list_users, get_current_user, list_teams

—

Reference metadata

list_lost_reasons, list_activity_types, list_categories, list_goals, list_countries, list_currencies, get_site

—

Most record-list tools default perPage=25; reference-data tools default perPage=100 so small accounts usually fit in one response. All paginated tools cap perPage at 100 and return a nextPage cursor when more results exist. Many GET tools accept an embed parameter (e.g. tags,fields) — each tool's description enumerates its valid tokens (validated per resource; unknown tokens are rejected rather than silently ignored, and the caller-facing project token maps to Capsule's legacy kase on the wire).

The filter_* tools wrap Capsule's structured filter endpoint (POST /<entity>/filters/results) and accept an array of {field, operator, value} conditions ANDed together. Capsule's API does not support ad-hoc sort, so for "most recent X" questions filter by a date condition (e.g. addedOn is within last 7) and pick the highest id from the result — Capsule's numeric IDs are monotonically incrementing.

If you want sortable queries, use saved filters instead. Create the filter once in Capsule's web UI (it lets you set conditions, columns, and orderBy), then call run_saved_filter with its id. Use list_saved_filters to discover what's available.

Read-only mode

Set CAPSULE_MCP_READONLY=1 to disable every write/delete tool at the MCP layer (none of create_*, update_*, complete_task, add_note, or delete_* are registered). Pair it with a Capsule token that has the Read scope for defence in depth — your token's scope is the hard ceiling regardless of the env var.

Delete safety

Every whole-record delete_* tool, plus remove_track and remove_additional_party, requires confirm: true in its arguments. Without it, the schema rejects the call before any HTTP is made. Tool descriptions tell Claude to read the entity first and confirm with the user before invoking. The combined design — read-scoped token, read-only mode flag, schema-level confirm gate — means destructive actions are deliberate, not accidental.

License

Apache License 2.0 — Copyright 2026 Anton Arapov.

Available Tools

92 tools
add_additional_partyA

Link an existing party as an additional (secondary) party on an opportunity or project. The 'main' party is set via update_opportunity / update_project; this adds additional parties beyond the main one. Idempotent — re-adding a linked party is harmless. Response: {linked: true, alreadyLinked: false} on a fresh link, {linked: true, alreadyLinked: true} if the party was already linked (Capsule's 422 'already a contact' / 'already related' is caught internally and converted).

ParametersJSON Schema
NameRequiredDescriptionDefault
entityYesWhich entity has the additional-party links.
partyIdYesID of the party (person or organisation) to link as an additional party.
entityIdYes

TDQS

A4.7/5.0
Behavior5/5

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

Beyond the annotations, the description discloses idempotency, the exact response shapes for fresh and repeated links, and that Capsule's 422 error is caught and converted internally. This is substantial behavioral context that helps an agent predict side effects and interpret results.

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

Conciseness5/5

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

The description is compact and front-loaded. Every sentence adds useful information: the action, the relationship to main-party setup, idempotency, and the response shape. No redundant or filler content is present.

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

Completeness5/5

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

Given there is no output schema, the description does well to document the response behavior in detail. It also covers idempotency and error conversion, which are the main behavioral hazards. Combined with the schema's enum and parameter descriptions, the tool is adequately specified for invocation.

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

Parameters3/5

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

The schema already describes 'entity' and 'partyId', and the description reinforces that the party must be existing and that the target is an opportunity or project. However, the required 'entityId' parameter is not described in either the schema or the description, leaving its meaning to be inferred from context.

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

Purpose5/5

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

The description opens with a specific verb and resource: link an existing party as an additional secondary party on an opportunity or project. It also distinguishes this operation from setting the main party, which is handled by update_opportunity / update_project, so it is clearly differentiated from sibling tools.

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

Usage Guidelines5/5

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

The description explicitly states where the main party is set via update_opportunity / update_project and clarifies that this tool adds additional parties beyond the main one. This gives the agent a clear decision rule for when to use this tool versus the relevant alternatives.

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

add_noteA

Add a note to a party, opportunity, or project. Provide exactly one of partyId, opportunityId, or projectId. The note is always attributed to the API-token owner — there is no override for the author (a creatorId parameter would enable audit-attribution spoofing on shared-connector deployments, so it is intentionally not exposed). Optional entryAt lets you backdate the note's authored-at timestamp for legitimate historical-import workflows.

ParametersJSON Schema
NameRequiredDescriptionDefault
contentYesNote body text. Stored verbatim and treated as MARKDOWN — Capsule's web UI renders the markdown when displaying. Pass markdown source ('# Heading', '**bold**', '- bullet'), not HTML.
entryAtNoISO-8601 timestamp for when this note actually happened (e.g. '2024-03-15T14:30:00Z'). Defaults to now. Use this for backdating historical notes when migrating from another system. `entryAt` is preserved across subsequent update_entry calls; only `updatedAt` advances on edits. Note attribution flows to the API-token owner — there is no way to record a note as authored by a different user via this connector (a `creatorId` parameter would enable audit-attribution spoofing on shared-connector deployments, so it is intentionally not exposed).
partyIdNoLink note to a party (mutually exclusive with opportunityId/projectId)
projectIdNoLink note to a project (mutually exclusive with partyId/opportunityId)
opportunityIdNoLink note to an opportunity (mutually exclusive with partyId/projectId)
activityTypeIdNoCategorise the note under a custom activity type (Meeting, Call, ... — ids from list_activity_types). Omit for a plain Note (Capsule's default, activityType -1). Wire-verified: POST /entries accepts the id and the entry echoes {activityType: {id, name}}.

TDQS

A4.5/5.0
Behavior5/5

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

Annotations only indicate readOnlyHint=false and destructiveHint=false. The description adds critical behavioral detail: note attribution is forced to the API-token owner with no override, explicitly explaining why creatorId is not exposed (security rationale). It also discloses that entryAt persists across updates while updatedAt advances, and that content is treated as markdown. This goes well beyond the schema and annotations.

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

Conciseness4/5

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

The description is slightly lengthy but every sentence conveys necessary information: core purpose, constraint, attribution rationale, and parameter behavior. The most critical constraint (exactly one target) is front-loaded. No redundant filler; just a dense, well-organized paragraph.

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

Completeness4/5

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

For a create operation with no output schema, the description covers all parameters, usage constraints, and key edge cases (backdating, markdown, attribution). It doesn't mention response format, but that's acceptable given no output schema is present. Minor gaps like error handling are not critical for initial invocation. The tool is complete enough for an agent to call correctly.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3. The description adds nuance not present in the schema alone: the mutual exclusivity of the three ID parameters is reinforced but also clarifies the attribution rule for entryAt (preserved across update_entry) and the markdown handling. These are meaningful additions for correct usage, earning a 4.

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

Purpose5/5

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

The description states a clear verb-resource-target relationship: 'Add a note to a party, opportunity, or project.' It immediately distinguishes from sibling tools (e.g., add_party_email_address) by specifying the resource type and the three possible attachment targets. No ambiguity remains.

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

Usage Guidelines4/5

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

It provides a hard constraint ('Provide exactly one of partyId, opportunityId, or projectId') and explains when to use optional parameters (entryAt for backdating, activityTypeId for categorization). It doesn't explicitly contrast with other note-related tools, but the tool is unique enough that the constraint suffices.

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

add_party_addressA

Append a single postal address to a party. Atomic — one PUT to Capsule. Use this instead of update_party.addresses for single-entry adds.

ParametersJSON Schema
NameRequiredDescriptionDefault
zipNo
cityNo
typeNoFree-form label, e.g. 'Office', 'Home'.
stateNo
streetNo
countryNoCountry name. Capsule validates this against a small canonical-English-name dictionary; inputs not in the dictionary are REJECTED with 422 'address.country: unknown country' (NOT silently passed through or normalised). Probed examples — accepted: `United States`, `United Kingdom`, `Czechia`, `Germany`. Aliased: `USA → United States`. Rejected: `United States of America`, `Czech Republic` (use `Czechia`), `UK`/`Britain` (use `United Kingdom`), `Deutschland` (use `Germany`). Empty string is accepted and stored as `null` — a de-facto 'clear' shape. To discover an accepted name, read an existing party that already has the country set.
partyIdYes

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already establish that this is not read-only and not destructive. The description adds useful behavioral detail: the operation is atomic and maps to a single PUT to Capsule, and 'append' implies additive rather than replacing semantics. This goes beyond the boolean annotation hints.

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

Conciseness5/5

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

Two sentences with no filler. The core action is front-loaded, and the sibling-routing guidance is delivered in a single, direct sentence. Every word earns its place.

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

Completeness4/5

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

For a simple append-mutation tool, the description covers purpose, atomicity, and usage guidance, supplemented by rich country-validation details in the schema. Minor gaps remain (e.g., return value, permission prerequisites), but these are not critical for correct invocation of this straightforward operation.

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

Parameters2/5

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

Schema description coverage is only 29% (2 of 7 parameters documented). The description itself provides no parameter-level guidance beyond the schema's country-field validation details. With this low coverage, the description should compensate by explaining key parameters, but it does not.

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

Purpose5/5

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

The description uses a specific verb and resource ('Append a single postal address to a party') and immediately distinguishes itself from update_party.addresses. An agent can tell exactly what this tool does and how it differs from related operations.

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

Usage Guidelines5/5

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

The description explicitly states when to use this tool: 'Use this instead of update_party.addresses for single-entry adds.' This gives a clear decision rule and names the alternative, so an agent knows both when to invoke this tool and when to prefer the sibling.

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

add_party_email_addressA

Append a single email address to a party. Atomic — one PUT to Capsule. Use this instead of update_party.emailAddresses when you want to add exactly one entry; the bulk array on update_party is append-only and won't replace.

ParametersJSON Schema
NameRequiredDescriptionDefault
typeNoFree-form label, e.g. 'Work', 'Home'.
addressYes
partyIdYes

TDQS

A4.4/5.0
Behavior4/5

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

Beyond the annotations (readOnlyHint=false, destructiveHint=false), the description discloses 'Atomic — one PUT to Capsule,' revealing atomicity and the underlying transport operation, which the annotations do not convey. It also clarifies the append-only, non-replacing semantics versus the bulk alternative. A small gap remains: no mention of error behavior or idempotency, but the disclosed traits add real value beyond the structured fields.

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

Conciseness5/5

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

Three sentences, each earning its place: the core action, the atomicity/transport trait, and the routing guidance against the sibling. The most decision-relevant information is front-loaded in the first sentence, and there is no filler or restatement of the tool name.

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

Completeness4/5

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

For a simple 3-parameter append operation with no output schema, the description covers the key decision factors: operation semantics, atomicity, and when to prefer it over update_party. The main omission is the response shape on success or failure, but with annotations already establishing the mutation/safety profile and the operation being low-complexity, nothing an agent needs to select or invoke it correctly is materially missing.

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

Parameters3/5

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

Schema description coverage is only 33% (only `type` has a natural-language description), so the description carries some burden. It contextualizes `address` as a single entry and the operation as append-only, but it does not elaborate on `partyId` or the label semantics of `type` beyond the schema. The parameter names are self-evident, which softens the gap, but the description only partially compensates for the low schema coverage.

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

Purpose5/5

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

The description opens with a specific verb+resource: 'Append a single email address to a party.' The word 'single' scopes the operation precisely, distinguishing it from bulk array updates and from the sibling add_party_phone_number/add_party_address tools, which target different resources. No ambiguity about what this tool does.

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

Usage Guidelines5/5

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

The description explicitly names the alternative ('update_party.emailAddresses'), states the condition that selects this tool ('when you want to add exactly one entry'), and explains the behavioral difference ('the bulk array on update_party is append-only and won't replace'). This is textbook when-to-use/when-not-to-use routing with zero inference required.

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

add_party_phone_numberA

Append a single phone number to a party. Atomic — one PUT to Capsule. Use this instead of update_party.phoneNumbers for single-entry adds.

ParametersJSON Schema
NameRequiredDescriptionDefault
typeNoFree-form label, e.g. 'Work', 'Mobile'.
numberYes
partyIdYes

TDQS

A4.4/5.0
Behavior4/5

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

The annotations already indicate this is a non-read-only, non-destructive operation. The description adds useful behavioral context by stating the operation is atomic and performs a single PUT to Capsule, and by framing it as an append rather than an update. It does not cover error handling or duplicate behavior, but the added atomicity context goes beyond the annotations.

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

Conciseness5/5

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

Two tight sentences with no filler. The core action is front-loaded, and the routing guidance is stated immediately after the behavior. Every word earns its place.

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

Completeness4/5

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

For a simple three-parameter operation with no nested objects or enums, the description covers the action, atomicity, and the key alternative. It does not describe return values, but there is no output schema and the operation is simple enough that this omission is not critical. A minor gap is the lack of any prerequisite note, such as the party needing to exist.

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

Parameters3/5

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

Schema description coverage is only 33%, so the description should compensate. It clarifies that 'number' is a phone number and that the operation appends a single entry, but it does not explain partyId or type beyond what the parameter names and the existing schema description for type already provide. The parameter meanings are recoverable, but the description adds limited per-parameter value.

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

Purpose5/5

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

The description states a specific verb and resource: 'Append a single phone number to a party.' It also differentiates itself from update_party.phoneNumbers, making the tool's distinct purpose immediately clear. The sibling tools include add_party_email_address and remove_party_phone_number_by_id, so this precise action is well separated.

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

Usage Guidelines5/5

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

'Use this instead of update_party.phoneNumbers for single-entry adds' explicitly names the alternative and the condition under which this tool should be chosen. This gives an agent clear routing guidance without needing to inspect update_party's schema.

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

add_party_websiteA

Append a single website / social handle to a party. Atomic — one PUT to Capsule. Use this instead of update_party.websites for single-entry adds. The 'address' field is a URL when service='URL' or a handle (e.g. '@acmeco') for social services.

ParametersJSON Schema
NameRequiredDescriptionDefault
addressYesThe website address. A URL when service='URL', or a handle (e.g. '@acmeco') for social services.
partyIdYes
serviceNoDefaults to 'URL' if omitted.

TDQS

A4.4/5.0
Behavior4/5

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

The annotations only say the tool is not read-only and not destructive. The description adds meaningful behavioral context: 'Append' indicates it does not replace existing data, and 'Atomic — one PUT to Capsule' reveals the underlying operation's scope and side effect. It does not cover duplicate handling or authorization, but what it adds goes clearly beyond the minimal annotations.

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

Conciseness5/5

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

Three sentences carry a large amount of useful information with zero filler. The core action is front-loaded, followed by the atomicity detail and the routing instruction, and then the address semantics. Nothing is extraneous.

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

Completeness4/5

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

For a simple, single-resource append with a fallback to the schema for parameter details, the description covers action, scope, alternative, and parameter semantics. It does not mention the return value or error behavior, but the lack of an output schema makes a small gap. Overall, the information provided is sufficient for correct invocation.

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

Parameters3/5

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

Schema description coverage is 67%, which already documents 'address' and 'service' in detail. The description restates the address semantics (URL vs. handle) but adds no new parameter-level information beyond what the schema provides. PartyId remains documented only by type, not by purpose.

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

Purpose5/5

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

The description uses a specific verb ('Append'), a clear resource ('a single website / social handle to a party'), and immediately distinguishes itself from update_party.websites. An agent can tell exactly what this tool does and how it differs from similar party-update tools.

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

Usage Guidelines5/5

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

The description explicitly routes the agent: 'Use this instead of update_party.websites for single-entry adds.' This names the alternative and defines the exact condition that selects this tool, so no inference is required.

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

add_tagA

Attach a tag to a party, opportunity, or project by NAME. Capsule resolves to an existing tag in the tenant or creates a fresh one with this name. Matching is case-insensitive — 'VIP' and 'vip' attach the same tag, preserving the canonical casing from whichever variant was created first. To avoid creating a genuinely-distinct near-duplicate (e.g. 'VIP' vs 'V.I.P.'), call list_tags first and reuse the exact name. Idempotent — re-attaching an already-attached tag is harmless. To DETACH a tag, use remove_tag_by_id with the tag's id (read via get_party/get_opportunity/get_project with embed='tags').

ParametersJSON Schema
NameRequiredDescriptionDefault
entityYesWhich entity type.
tagNameYesName of the tag to attach. Capsule resolves by name: if a tag with this name already exists in the tenant it is attached to the entity; if not, Capsule creates the tag and attaches it. Names are tenant-global. Capsule matches case-INSENSITIVELY when resolving (so 'VIP' and 'vip' attach the same tag), preserving the canonical casing from whichever variant was created first. To ensure consistent casing in your tag list, call list_tags first and reuse the exact name from there. Idempotent — re-attaching an already-attached tag is harmless.
entityIdYesThe party/opportunity/project id.

TDQS

A4.6/5.0
Behavior5/5

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

Annotations only declare readOnlyHint=false and destructiveHint=false. The description adds crucial behavior beyond that: resolve-or-create semantics, case-insensitive matching with canonical-casing preservation, and explicit idempotency ('re-attaching an already-attached tag is harmless'). No contradiction with annotations; the creation-on-miss side effect is surfaced clearly.

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

Conciseness5/5

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

Every sentence earns its place: core purpose is front-loaded, followed by resolution behavior, case-sensitivity nuance, duplicate-avoidance guidance, idempotency, and the detach alternative. The length is justified by the genuinely non-obvious matching behavior and sibling routing; there is no filler.

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

Completeness4/5

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

For a 3-param tool with a rich description and 100% schema coverage, the definition is nearly complete: it covers what the tool does, side effects, idempotency, and alternatives. The only gap is that, with no output schema present, the description never states what the tool returns (e.g., whether it returns the resolved tag or a success indicator), which the rubric implies the description should cover.

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

Parameters3/5

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

Schema coverage is 100%, and the schema's tagName description is nearly a verbatim copy of the tool description, so the schema already carries full parameter meaning. The description adds marginal value for entity/enum and entityId, which the schema documents adequately. Baseline 3 is appropriate since the description does not compensate for any schema gap (there is none).

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

Purpose5/5

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

The description opens with a specific verb+resource: 'Attach a tag to a party, opportunity, or project by NAME.' It clearly distinguishes this tool from the sibling cluster (remove_tag_by_id, delete_tag_definition, batch_add_tag, list_tags) by emphasizing attach-by-name semantics, so an agent can select it without opening schemas.

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

Usage Guidelines5/5

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

The description gives explicit routing: 'call list_tags first and reuse the exact name' to avoid near-duplicates, and 'To DETACH a tag, use remove_tag_by_id with the tag's id (read via get_party/get_opportunity/get_project with embed="tags")'. This names the alternatives and the conditions that select them, leaving nothing to inference.

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

apply_trackA

Apply a track definition to an opportunity or project. Creates a track instance and auto-creates tasks per the track's task definitions; tasks' dueOn is computed from startDate (defaults to today) plus each task's daysAfter offset. Use list_track_definitions to discover available templates. NOT IDEMPOTENT — applying the same trackDefinitionId twice creates two independent track instances and two sets of auto-tasks (no de-duplication). If you want to apply only once, call list_entity_tracks first and check for an existing instance with the same trackDefinition.id (but mind that list_entity_tracks can include auto-applied tracks from board stage rules, not just manual applies).

ParametersJSON Schema
NameRequiredDescriptionDefault
entityYesWhich entity to apply the track to.
entityIdYes
startDateNoOptional ISO-8601 date (YYYY-MM-DD) the track should start from — drives task due-date calculations (each task's `dueOn` is computed as startDate + the track-definition's `daysAfter` offset). Defaults to today if omitted. Useful for scheduling a renewal-queue track against a future contract end-date, or backfilling tracks for historical projects.
trackDefinitionIdYesThe trackDefinition to apply (from list_track_definitions). Auto-creates task definitions on the target entity per the track's rules.

TDQS

A4.8/5.0
Behavior5/5

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

The description goes well beyond annotations by warning that the operation is NOT IDEMPOTENT, explaining that duplicate applications create duplicate instances/tasks, and detailing how startDate drives dueOn computation. It also discloses a subtle source of noise (auto-applied tracks from board rules). Annotations only indicate it is not read-only and not destructive, so the description carries and fully satisfies the transparency burden.

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

Conciseness5/5

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

Every sentence earns its place: main action, side effects, date calculation, template discovery, idempotency warning, and pre-check guidance. The most critical behavioral warning (non-idempotency) is bolded and placed prominently.

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

Completeness4/5

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

The description covers purpose, side effects, date logic, idempotency, discovery, and pre-check workflow. The only minor gap is that it does not describe the return value, and there is no output schema to fill that void; for a create-style tool this is a small omission.

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

Parameters4/5

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

Schema descriptions already cover entity, startDate, and trackDefinitionId. The tool description adds meaningful semantics by explaining how startDate defaults to today and how it combines with each task's daysAfter offset, and that trackDefinitionId auto-creates task definitions. entityId lacks a schema description and is not elaborated in the tool description, but its purpose is self-evident.

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

Purpose5/5

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

The description opens with a specific verb+resource: 'Apply a track definition to an opportunity or project.' It goes on to clarify the outcome (creates a track instance and auto-creates tasks), which clearly differentiates it from sibling operations like update_track or remove_track and positions it relative to list_track_definitions.

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

Usage Guidelines5/5

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

It explicitly tells the agent to use list_track_definitions to discover templates and to call list_entity_tracks first if single application is desired. The added caveat about board-stage auto-applied tracks provides nuanced guidance about when the pre-check may be unreliable.

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

batch_add_tagA

Attach tags to many entities in parallel — e.g. tag a list of 20 contacts as 'RSAC26' after a conference, or apply the 'Departed' tag to 10 people in a layoff batch. Pass items: [{ entity, entityId, tagName }, ...] (1–50 items). Each item is processed identically to a single add_tag call. Connector fans out parallel HTTP requests, default cap 5 (CAPSULE_MCP_BATCH_CONCURRENCY). Returns { results: [{ok, ...} per item], summary: {total, succeeded, failed} }. The list_tags cache is invalidated for each affected entity type.

ParametersJSON Schema
NameRequiredDescriptionDefault
itemsYesArray of 1–50 add_tag inputs. Useful for mass-tagging — e.g. 'tag these 20 contacts as RSAC26'. Each item is the same shape as a single add_tag call. The list_tags cache is invalidated for each affected entity type. Capped at 50.

TDQS

A4.7/5.0
Behavior5/5

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

Beyond the readOnly/destructive annotations, it discloses parallel fan-out, the default concurrency cap (CAPSULE_MCP_BATCH_CONCURRENCY=5), cache invalidation per entity type, and the exact result/summary shape. These are non-obvious side effects the annotations alone would not convey.

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

Conciseness5/5

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

The description is front-loaded with purpose, then gives usage shape, runtime behavior, return value, and cache side effect in a few sentences with no filler. Each sentence carries distinct information.

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

Completeness5/5

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

With no output schema, the description compensates by specifying the returned { results, summary } shape. It also covers item count limits, concurrency behavior, per-item equivalence to add_tag, and cache invalidation, which is complete for the tool's complexity.

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

Parameters4/5

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

The input schema already documents the item structure fully (100% coverage), so the baseline is 3. The description adds value by showing the exact array shape inline, tying it to realistic mass-tagging examples, and explaining that each item behaves like a standalone add_tag call, going slightly beyond the schema baseline.

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

Purpose5/5

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

The description opens with a specific verb and resource ('Attach tags to many entities in parallel'), supported by concrete scenarios and an explicit comparison to the single add_tag call. This clearly distinguishes batch_add_tag from siblings like add_tag and batch_remove_tag_by_id.

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

Usage Guidelines4/5

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

The examples (RSAC26 conference tagging, layoff batches) define when batch tagging is appropriate, and the 1–50 item cap plus 'each item is processed identically to a single add_tag call' grounds the usage model. It does not explicitly say to use add_tag for a single item, but that alternative is strongly implied.

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

batch_complete_taskA

Mark 1–50 tasks COMPLETED in parallel. Pass ids: [task_id, …]. Natural for end-of-week catchups, 'close all the follow-ups from this campaign', etc. Connector fans out parallel HTTP requests, default cap 5 (CAPSULE_MCP_BATCH_CONCURRENCY). Returns { results: [{ok, ...} per id], summary: {total, succeeded, failed} }. A task that's already completed or deleted shows up as a per-item failure with the Capsule status; the rest still complete.

ParametersJSON Schema
NameRequiredDescriptionDefault
idsYesArray of 1–50 task ids to mark COMPLETED in parallel. Each id resolves to one PUT /tasks/{id}; failures (e.g. 404 for a deleted task) surface per-item in the result array, the rest still complete. Capped at 50.

TDQS

A4.9/5.0
Behavior5/5

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

Discloses parallel execution, concurrency cap (5), per-item failure handling for already completed/deleted tasks, and return format. Annotations only state it's not read-only and not destructive; description adds significant behavioral context.

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

Conciseness5/5

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

Concise, front-loaded with action, then usage, then technical details, then return format. Every sentence adds value, no redundancy.

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

Completeness5/5

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

For a single-parameter tool with no output schema, description fully covers usage, behavior, return format, and error handling. No gaps.

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

Parameters4/5

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

Schema fully covers 'ids' parameter. Description adds context about parallel execution, caps, and error handling, but does not change parameter meaning. High schema coverage gives baseline 3; added value justifies 4.

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

Purpose5/5

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

Description clearly states the action ('Mark...COMPLETED'), resource ('tasks'), and scale ('1–50 tasks'). It distinguishes from sibling 'complete_task' by specifying batch parallelism.

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

Usage Guidelines5/5

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

Provides explicit usage scenarios ('end-of-week catchups', 'close all...') and implies when to use the singular alternative (complete_task). No explicit when-not, but context makes it clear.

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

batch_remove_tag_by_idA

Detach tags from many entities in parallel — cleanup counterpart to batch_add_tag. Pass items: [{ entity, entityId, tagId }, ...] (1–50 items). Each item is processed identically to a single remove_tag_by_id call (already-detached tags are reported as idempotent successes, not failures). Connector fans out parallel HTTP requests, default cap 5. Returns { results: [{ok, ...} per item], summary: {total, succeeded, failed} }.

ParametersJSON Schema
NameRequiredDescriptionDefault
itemsYesArray of 1–50 remove_tag_by_id inputs. Each item is the same shape as a single remove_tag_by_id call. Detaches the tag from each specified entity; the tag definition itself persists in the tenant. Capped at 50.

TDQS

A4.7/5.0
Behavior5/5

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

Discloses idempotent handling of already-detached tags, parallel fan-out with a default cap of 5, and the exact return shape. Annotations only mark not-read-only and not-destructive, so the description supplies all crucial behavioral context beyond what annotations provide.

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

Conciseness5/5

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

Three compact sentences front-load purpose, then input format, then behavior and return value. Every sentence earns its place without duplicating schema details or adding filler.

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

Completeness5/5

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

Covers what the tool does, how to invoke it (items shape, 1–50 limit), parallel execution cap, idempotency semantics, and output structure – essential because there is no output schema. For a batch mutation tool, this is comprehensive and sufficient for safe invocation.

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

Parameters4/5

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

Schema already fully describes the items array with min/max and field constraints. The description adds value by showing the concrete input shape and clarifying that each item is processed identically to a single remove_tag_by_id call, plus mapping output results back to individual items.

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

Purpose5/5

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

Description opens with 'Detach tags from many entities in parallel' – a specific verb, resource, and scope. It explicitly positions itself as 'cleanup counterpart to batch_add_tag' and contrasts with the single 'remove_tag_by_id call', making it clearly distinguishable from siblings.

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

Usage Guidelines4/5

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

Names both the counterpart batch tool (batch_add_tag) and the single-operation equivalent (remove_tag_by_id), giving clear context for when batch removal is appropriate. It doesn't explicitly state exclusion conditions, but the implied usage is strong and unambiguous.

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

batch_update_opportunityA

Update 1–50 opportunities in parallel. Same input shape as update_opportunity but wrapped in an items array. Use this — not N sequential update_opportunity calls — for mass stage transitions (e.g. move a milestone batch to Won), owner reassignments, or value adjustments. Connector fans out parallel HTTP requests, default cap 5 (CAPSULE_MCP_BATCH_CONCURRENCY). Returns { results: [{ok, ...} per item], summary: {total, succeeded, failed} }. Partial failures possible; Capsule has no rollback.

ParametersJSON Schema
NameRequiredDescriptionDefault
itemsYesArray of 1–50 update_opportunity inputs. Each item is the same shape as a single update_opportunity call — id is required, every other field is optional. Capped at 50 so a single tool call can't burn an outsized share of Capsule's hourly per-token rate budget.

TDQS

A4.7/5.0
Behavior5/5

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

Beyond the annotations, the description discloses parallel fan-out, a default concurrency cap of 5, the response shape, the possibility of partial failures, and that Capsule has no rollback. These are significant behavioral details that an agent needs to set expectations and handle errors.

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

Conciseness5/5

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

The description is information-dense with no filler. It front-loads the core capability, then explains when to use it, how it behaves, and what it returns, all in a compact set of sentences.

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

Completeness5/5

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

Given there is no output schema, the description does the necessary work by specifying the return shape, summarizing success/failure counts, and warning about partial failures and lack of rollback. It also explains the relationship to update_opportunity and the practical limits of the batch operation.

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

Parameters3/5

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

Schema description coverage is 100%, and the schema already documents the items array, the 1–50 cap, that each item matches update_opportunity, and that only id is required. The tool description reinforces this but does not add meaningful parameter-level detail beyond what the schema provides.

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

Purpose5/5

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

The description states a specific verb and resource: 'Update 1–50 opportunities in parallel.' It explicitly distinguishes itself from update_opportunity by noting the same input shape wrapped in an `items` array, making its role clear relative to the sibling tool.

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

Usage Guidelines5/5

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

The description explicitly says to use this tool 'not N sequential update_opportunity calls' and names concrete use cases: mass stage transitions, owner reassignments, and value adjustments. This gives an agent clear conditions for choosing this tool over the alternative.

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

batch_update_partyA

Update 1–50 parties in parallel. Same input shape as update_party but wrapped in an items array. Use this — not N sequential update_party calls — for any homogeneous multi-record write (mass owner reassignment, bulk metadata corrections, etc.). Capsule has no batch-write API, so the connector fans out parallel HTTP requests with a default concurrency cap of 5 (configurable via CAPSULE_MCP_BATCH_CONCURRENCY). Returns { results: [{ok, ...} per item], summary: {total, succeeded, failed} }. Partial failures are possible — Capsule has no rollback, so successful items stay applied even if other items 4xx. Read the per-item result array to know which ones need follow-up.

ParametersJSON Schema
NameRequiredDescriptionDefault
itemsYesArray of 1–50 update_party inputs. Each item is the same shape as a single update_party call — id is required, every other field is optional. Capped at 50 so a single tool call can't burn an outsized share of Capsule's hourly per-token rate budget (~4000 req/h).

TDQS

A4.9/5.0
Behavior5/5

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

The annotations only state that the tool is neither read-only nor destructive, but the description goes much further: it discloses that the connector fans out parallel HTTP requests, the configurable concurrency cap of 5, the exact return shape, and critical partial-failure semantics with no rollback. This is far beyond what the annotations or schema reveal and is essential for correctly handling results.

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

Conciseness5/5

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

Despite being information-dense, every sentence earns its place: purpose, usage scenario, implementation detail, return format, and failure semantics are all covered without repetition. Key facts are front-loaded, with the single-record comparison and usage guidance appearing immediately after the first sentence.

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

Completeness5/5

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

For a batch mutation tool with no output schema, the description is remarkably complete. It specifies the return structure, the possibility of partial failures, the absence of rollback, and the need to inspect per-item results for follow-up. Combined with the fully documented items schema, an agent has all the information required to invoke the tool and interpret its response correctly.

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

Parameters4/5

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

Schema coverage is 100% and the items parameter is thoroughly documented in the schema. The description adds value by pointing out that each item is 'the same shape as update_party,' which lets the agent reuse its knowledge of the single-update tool rather than studying the full nested schema. It also explains the 50-item cap in terms of rate-budget protection, giving rationale beyond the schema's validation rules.

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

Purpose5/5

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

Opens with a precise verb, object, and range: 'Update 1–50 parties in parallel.' It immediately distinguishes itself from update_party by explaining the items-array wrapper and explicitly names the sibling it replaces for bulk writes. An agent can tell this apart from update_party and the other batch_update_* tools without examining the schema.

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

Usage Guidelines5/5

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

Explicitly instructs when to use this tool: 'Use this — not N sequential update_party calls — for any homogeneous multi-record write,' with concrete examples like mass owner reassignment and bulk metadata corrections. This provides both the condition and the alternative, leaving no ambiguity about when to prefer batch over sequential calls.

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

batch_update_projectA

Update 1–50 projects in parallel. Same input shape as update_project but wrapped in an items array. Use this — not N sequential update_project calls — for mass stage transitions (e.g. move a board column of projects to a new stage), bulk owner reassignments after a personnel change, or batch closures. Mirrors batch_update_party and batch_update_opportunity — identical fan-out shape across the three entity types. Connector fans out parallel HTTP requests, default cap 5 (CAPSULE_MCP_BATCH_CONCURRENCY). Returns { results: [{ok, ...} per item], summary: {total, succeeded, failed} }. Partial failures possible; Capsule has no rollback.

ParametersJSON Schema
NameRequiredDescriptionDefault
itemsYesArray of 1–50 update_project inputs. Each item is the same shape as a single update_project call — id is required, every other field is optional. Capped at 50 so a single tool call can't burn an outsized share of Capsule's hourly per-token rate budget (~4000 req/h). Mirrors batch_update_party and batch_update_opportunity — same shape across the three entity types.

TDQS

A4.9/5.0
Behavior5/5

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

Annotations only say readOnlyHint=false and destructiveHint=false, so the description carries the burden of behavioral disclosure. It does this well by revealing parallel HTTP fan-out, a default concurrency cap of 5 (with env var), the return shape, possible partial failures, and the absence of rollback. This is exactly the kind of operational context an agent needs.

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

Conciseness5/5

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

The description is dense but every sentence contributes: identity, usage guidance, sibling parity, concurrency behavior, return shape, and failure semantics. It is front-loaded with the core action and scopes the tool before diving into operational details.

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

Completeness5/5

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

For a batch mutation tool with no output schema, the description is unusually complete: it covers the input contract, when to use it, how it executes, what it returns, partial-failure behavior, and lack of rollback. There is no critical operational gap that would prevent correct invocation.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, but the description adds meaningful semantics about the items array: it wraps update_project inputs, is capped at 50 for rate-limit reasons, and mirrors sibling batch tools' shape. This goes beyond the schema's structural definition and explains why the constraint exists.

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

Purpose5/5

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

The description states a specific verb ('Update 1–50 projects in parallel'), names the resource, and explicitly contrasts itself with update_project and sibling batch tools. An agent can immediately distinguish this from sequential project updates and from batch_update_party/batch_update_opportunity without inspecting schemas.

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

Usage Guidelines5/5

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

It gives explicit when-to-use guidance: mass stage transitions, bulk owner reassignments, batch closures — and explicitly says to use this rather than N sequential update_project calls. It also names the sibling batch tools it mirrors, which helps an agent generalize the fan-out shape across entity types.

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

complete_taskA

Mark a task as done / completed / finished. Sets status=COMPLETED on the task, populating completedBy and completedAt while preserving the task in history (unlike delete_task which removes it permanently). Use this whenever a user says 'mark done', 'complete', 'finish', or similar — equivalent to update_task with status:COMPLETED but more discoverable.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already indicate non-read-only and non-destructive behavior. The description adds valuable context by explaining what state it sets, which fields are populated, and that the task is preserved in history. This clarifies the impact beyond the basic annotation hints.

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

Conciseness5/5

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

The description is compact and front-loaded with the action, then efficiently provides behavioral details and sibling relationships. Every clause contributes useful information without redundancy.

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

Completeness4/5

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

For a single-parameter mutation tool with no output schema, the description covers the action, side effects, and usage context well. The only minor gap is not describing what the tool returns or explicitly confirming that id refers to the task being completed.

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

Parameters2/5

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

Schema description coverage is 0% and the description does not explain the 'id' parameter at all. While the parameter name is self-evident, the description fails to compensate for the missing schema-level documentation, and there is no explicit statement that id is the task identifier.

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

Purpose5/5

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

The description states a specific action and resource: 'Mark a task as done / completed / finished' and further specifies the exact state change (status=COMPLETED, completedBy, completedAt). It also differentiates itself from delete_task and update_task, making its purpose unmistakable.

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

Usage Guidelines5/5

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

It explicitly tells the agent when to use the tool ('whenever a user says mark done, complete, finish') and identifies the alternative (update_task with status:COMPLETED) and the contrasting tool (delete_task). This gives clear routing guidance beyond the schema.

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

create_opportunityA

Create a new opportunity linked to a party. Requires partyId and milestoneId (which pins the deal to a specific pipeline stage — pipeline is inferred from the milestone). Value is optional but if amount is set, currency must be set too (3-letter ISO 4217 code, e.g. 'USD'). Discover valid milestone ids via list_pipelines + list_milestones first. For multi-party deals, use add_additional_party after creation.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes
valueNo
fieldsNoSet custom field values on this record. PARTIAL UPDATE: only the definitions you list are touched; any field NOT in this array is left unchanged. Discover available definitions via list_custom_fields; read current values via get_opportunity with embed='fields'. Capsule's POST /opportunities accepts the same `fields[]` shape as PUT (inferred by symmetry with the v1.6.5 wire-trace findings on party and project creation — the tenant probed had no opportunity custom fields configured, so this is unverified empirically). Setting custom fields on creation removes the create-then-update ritual.
teamIdNoAssign to team ID (discover via list_teams). Independent from `ownerId` — setting one does NOT clear the other on create. Three ownership shapes are valid: owner alone, team alone, or owner+team (the owner must be a member of the team; users can belong to multiple teams — 422 'owner is not a member of the team' otherwise).
ownerIdNoAssign to user ID. Defaults to the API-token owner when omitted — note that opportunities do NOT inherit owner from the linked party, even though one might expect it. To clear owner later, call update_opportunity with `ownerId: null`. Discover IDs via list_users. WARNING: tenant pipeline / milestone-reached automation can mutate this field post-create — see the `milestoneId` description for details and the chained-PUT workaround.
partyIdYesID of the party this opportunity belongs to
durationNoHow many durationBasis units the contract runs (e.g. 12 with MONTH). Must be null/omitted when durationBasis is FIXED. Wire-verified: POST stores it, PUT changes it, and PUT duration:null with durationBasis:FIXED clears it.
descriptionNo
milestoneIdYesID of the pipeline milestone to place this opportunity at. The milestone implicitly determines the pipeline — there is no separate pipelineId parameter. Discover via list_pipelines / list_milestones. NOTE: some Capsule tenants configure **pipeline / milestone-reached automation rules** that mutate `owner` and/or `team` immediately after creation — e.g. an 'Assign to a Team' action that fires on entry to a specific milestone and has been observed to clear `owner` as an automation side-effect. If you observe a newly-created opp landing with `owner: null` despite passing `ownerId`, the cause is almost certainly a milestone automation on the destination pipeline rather than the connector. Documented workaround: follow `create_opportunity` with an immediate `batch_update_opportunity({items: [{id, ownerId, teamId}]})` carrying both fields — PUT does not re-fire milestone-reached triggers, so the owner sticks.
probabilityNo
durationBasisNoTime unit of the opportunity's contract duration. FIXED means a one-off (no recurring duration) — `duration` must be omitted/null with FIXED (Capsule 422s otherwise; wire-verified). Recurring deals: pair with `duration`, e.g. durationBasis MONTH + duration 12.
expectedCloseOnNoYYYY-MM-DD
trackDefinitionIdsNoTrack definition ids to apply at creation time (creation-only shortcut; use apply_track for existing records). Discover ids via list_track_definitions. Capsule validates each definition's entity scope and returns 422 on mismatch (e.g. "track definition must be for parties"). Wire-verified: the created record carries the track instances immediately.

TDQS

A4/5.0
Behavior3/5

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

Annotations already declare this is a non-read-only, non-destructive write, and the description does not contradict that. It adds one behavioral nuance (pipeline inferred from milestone) and the value/currency coupling, but does not mention creation side-effects such as milestone automation mutating owner/team or the default-owner behavior (those live only in the schema, not the tool description).

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

Conciseness5/5

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

Three sentences with the main action first, followed by the key constraint and the workflow pointers. No filler or repetition of the full schema; every sentence earns its place.

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

Completeness4/5

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

For a 13-parameter creation tool with no output schema, the definition plus detailed schema gives enough to call it correctly: required fields, cross-parameter validation, discovery steps, and a follow-up sibling for multi-party deals. The only real gap is that the description doesn't state what the successful create returns, which would be useful when there is no output schema.

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

Parameters3/5

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

Schema coverage is moderate (~69%), and the description mostly restates what the schema already documents — partyId and milestoneId are required, milestone determines pipeline, currency must accompany amount. It does add the concise discovery workflow and multi-party follow-up, but does not compensate for undocumented parameters like name, description, or probability.

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

Purpose5/5

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

The description opens with 'Create a new opportunity linked to a party' — a specific verb and resource that clearly distinguishes create_opportunity from update, search, get, and delete siblings. It also states the key linkage requirements (partyId, milestoneId), so an agent can tell what this tool is for before looking at the schema.

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

Usage Guidelines4/5

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

It tells the agent to discover valid milestone ids via list_pipelines/list_milestones first and to use add_additional_party for multi-party deals, giving concrete pre- and post-steps. It does not explicitly state when not to use it or contrast it with update_opportunity, but the creation intent is clear.

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

create_partyA

Create a new person or organisation in Capsule CRM. For type='person', firstName or lastName is required (one suffices); the name field is silently ignored. For type='organisation', name is required and firstName/lastName/title/jobTitle are silently ignored. Passing organisationId pointing at a non-organisation party (e.g. another person's id) returns 404 'organisation not found' — Capsule filters lookups by type. Accepts ownerId and teamId to set ownership at create time; both are optional and Capsule defaults owner to the API-token user when omitted (team has no default).

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNo
typeYes
aboutNo
titleNo
fieldsNoSet custom field values on this record. PARTIAL UPDATE: only the definitions you list are touched; any field NOT in this array is left unchanged. Discover available definitions via list_custom_fields; read current values via get_party with embed='fields'. Verified empirically in v1.6.5 wire-trace: Capsule's POST /parties accepts the same `fields[]` shape as PUT, so callers can set custom field values on creation without a follow-up update.
teamIdNoAssign to team ID (discover via list_teams). Omit to leave team unset on create. To clear an existing team or create a team-owned party with no specific owner, use update_party after creation.
ownerIdNoAssign to user ID. Defaults to the API-token owner when omitted. To create a team-owned party with no specific user, first create the party, then call update_party with `ownerId: null` and `teamId`.
jobTitleNo
lastNameNo
websitesNoAPPEND-ONLY: items are merged into the existing list, never replaced. For atomic add/remove/replace use add_party_website and remove_party_website_by_id.
addressesNoAPPEND-ONLY: items are merged into the existing list, never replaced. For atomic add/remove/replace use add_party_address and remove_party_address_by_id. The `country` field is mapped through Capsule's country dictionary — see `add_party_address.country` for the dictionary edges (small canonical-English-name list; inputs not in the dictionary are REJECTED with 422, not silently dropped).
firstNameNo
phoneNumbersNoAPPEND-ONLY: items are merged into the existing list, never replaced. For atomic add/remove/replace use add_party_phone_number and remove_party_phone_number_by_id.
emailAddressesNoAPPEND-ONLY: items are merged into the existing list, never replaced. For atomic add/remove/replace use add_party_email_address and remove_party_email_address_by_id. Passing `[]` here is a silent no-op (does not clear the list and does not advance updatedAt).
organisationIdNoLink person to an existing organisation ID
trackDefinitionIdsNoTrack definition ids to apply at creation time (creation-only shortcut; use apply_track for existing records). Discover ids via list_track_definitions. Capsule validates each definition's entity scope and returns 422 on mismatch (e.g. "track definition must be for parties"). Wire-verified: the created record carries the track instances immediately.

TDQS

A4.5/5.0
Behavior5/5

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

With only readOnlyHint=false and destructiveHint=false in annotations, the description carries the full burden of behavioral disclosure—and it does so extensively. It details silent field ignoring, owner defaulting, country dictionary rejection (422), BOOLEAN two-state semantics, NUMBER read-back as strings, audit-log noise on null writes, and append-only merges for nested collections. All of this exceeds what annotations reveal and directly helps an agent predict outcomes.

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

Conciseness4/5

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

The description is long but each section earns its place; it is front-loaded with the core purpose and type contract, then methodically walks through nested behaviours vice top-level. The structure is readable (bolded parameters, clear sentences) and avoids redundancy. Slightly overpacked for a reviewer, but not bloated for an agent needing exact behaviour.

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

Completeness4/5

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

Given the tool has 16 parameters, no output schema, and multiple hidden caveats (country dictionary, BOOLEAN two-state, append-only merges), the description is remarkably complete. It covers error cases, defaults, side effects, and creation-time shortcuts. The only omissions are minor (e.g., response shape), and the description is sufficient for a competent agent to call the tool correctly in the vast majority of scenarios.

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

Parameters4/5

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

Schema description coverage is 56%, and while the schema itself documents many parameters, the description adds materially: it explains the type-specific requirements for name vs firstName/lastName, the 404 condition for organisationId, the creation-only nature of trackDefinitionIds, and the append-only semantics for nested arrays. It clearly compensates for the coverage gap and clarifies edge cases that the schema alone would miss.

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

Purpose5/5

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

The description opens with the precise action 'Create a new person or organisation in Capsule CRM' and immediately explains the two type-specific contract rules (required name vs firstName/lastName, silently ignored fields). It also flags a non-obvious 404 for organisationId pointing to a non-organisation, which clearly differentiates this from update_party and other party tools. No ambiguity about what the tool does.

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

Usage Guidelines4/5

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

The description gives targeted when-to-use vs when-not guidance: it points to atomic add/remove/replace for websites/addresses/phones/emails, notes trackDefinitionIds is a creation-only shortcut vs apply_track, and instructs to use update_party after creation for team-owned parties without an owner. It does not have an explicit 'when not to use' blanket statement, but the context is clear enough.

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

create_projectA

Create a new project in Capsule CRM linked to a party. Requires partyId and name; description, status, owner, and starting board/stage are optional. To pin a project to a specific board+stage on creation, pass stageId (which uniquely identifies a stage within a board). Discover valid ids via list_boards + list_stages. Returns the created project including its assigned id.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes
fieldsNoSet custom field values on this record. PARTIAL UPDATE: only the definitions you list are touched; any field NOT in this array is left unchanged. Discover available definitions via list_custom_fields; read current values via get_project with embed='fields'. Verified empirically in v1.6.5 wire-trace: Capsule's project create endpoint accepts the same `fields[]` shape as PUT, so callers can set custom field values on creation without a follow-up update. Project-specific: setting a field whose definition lives under a 'data tag' populates the row's internal tagId but does NOT auto-add the data tag to the project's tags array — use add_tag explicitly if you want it visible via embed=tags.
statusNoDefaults to OPEN when omitted.
teamIdNoAssign to team ID (discover via list_teams). Capsule projects must always have at least one of {owner, team} set — Capsule returns 422 'owner or team is required' otherwise. Three ownership shapes are valid: owner alone, team alone, or owner+team (the user must be a member of the team — users can belong to multiple teams; 422 'owner is not a member of the team' otherwise). Tenant-specific board automations may set the team field on project creation (e.g. 'when project enters board X, set team to T'). If you observe a team set despite omitting `teamId`, check the target board's automation rules.
ownerIdNoAssign to user ID. Defaults to the API-token owner when omitted, same as create_party / create_opportunity / create_task. NOTE: some Capsule tenants configure board-level **automation rules** that mutate `owner` (and `team`) on project creation — e.g. an automation that clears `owner` when a project enters a particular board. If you observe a project landing with unexpected `owner: null` after a create_project with `ownerId`, check the target board's automation configuration. Capsule's API itself does not drop `ownerId` when `stageId` is also supplied.
partyIdYesID of the party linked to this project
stageIdNoStage (board column) to place the project on. Discover IDs via list_stages — each stage belongs to one Board, so picking a stageId implicitly picks the board. If omitted, the project is created with no stage assignment (and won't appear on any board). NOTE: tenant-specific board automation rules may run on project creation and mutate `owner` / `team` fields. See `create_project.ownerId` / `create_project.teamId` for the automation caveat. Capsule's create endpoint itself preserves the `ownerId` / `teamId` you supply — any clearing you observe traces to board automations, not the API.
startOnNoProject start date, YYYY-MM-DD. Verified empirically (v2.0.1 wire probe): Capsule's POST /kases accepts and stores it; reads back as `startOn` on the project.
descriptionNo
expectedCloseOnNoYYYY-MM-DD
trackDefinitionIdsNoTrack definition ids to apply at creation time (creation-only shortcut; use apply_track for existing records). Discover ids via list_track_definitions. Capsule validates each definition's entity scope and returns 422 on mismatch (e.g. "track definition must be for parties"). Wire-verified: the created record carries the track instances immediately.

TDQS

A4/5.0
Behavior3/5

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

Annotations already signal a non-read-only, non-destructive write. The description adds useful observable behavior by stating the return value ('Returns the created project including its assigned id') and the effect of stageId on board placement. However, it does not disclose side effects such as board automations mutating owner/team, the owner-or-team requirement, or failure modes; those live only in parameter descriptions. No contradiction with annotations.

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

Conciseness5/5

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

The description is compact and front-loaded: core creation action, required/optional inputs, conditional board-pinning behavior, ID discovery, and return value. Every sentence earns its place, and there is no padding or needless repetition of the schema.

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

Completeness4/5

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

Given 11 parameters and no output schema, the description covers the high-level call contract: what is created, required inputs, optional board placement, and the returned project with its id. The schema's property descriptions provide the deeper caveats (ownership requirements, board automations, custom-field quirks). A small gap is that the description calls owner/team 'optional' without warning that at least one is required, though the schema covers this.

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

Parameters3/5

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

Schema description coverage is high (82%), so the baseline is 3. The description largely restates information already present in the schema: 'Requires partyId and name' mirrors the required array, and 'stageId uniquely identifies a stage within a board' matches the stageId property description. It adds minimal value beyond pointing to both list_boards and list_stages for ID discovery.

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

Purpose5/5

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

The description states a specific verb and resource: 'Create a new project in Capsule CRM linked to a party.' It clearly distinguishes create_project from sibling creation tools like create_party, create_opportunity, and create_task, and from update_project/get_project by framing the operation as creation with a returned project.

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

Usage Guidelines4/5

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

The description gives clear context: required parameters ('Requires partyId and name'), optional parameters, and conditional guidance for pinning to a board ('To pin a project to a specific board+stage on creation, pass stageId'). It also names discovery tools (list_boards + list_stages). It does not explicitly contrast with update_project or other create_* siblings, so it stops short of full when/when-not guidance.

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

create_taskA

Create a new task, optionally linked to a party, opportunity, or project. Pass at most ONE of partyId / opportunityId / projectId — the connector rejects multi-target inputs before the HTTP call. Omitting all three is also valid: Capsule creates the task as a STANDALONE task (no parent link), useful for personal reminders or workflow tasks that aren't tied to a specific CRM record.

ParametersJSON Schema
NameRequiredDescriptionDefault
dueOnYesYYYY-MM-DD
detailNo
repeatNoMake this a repeating task. Wire-verified on POST /tasks. Recurrence on EXISTING tasks isn't exposed by update_task (unverified on PUT) — recreate the task to change it.
dueTimeNoHH:MM in user's timezone
ownerIdNoAssign to user ID. Defaults to the API-token owner when omitted. Once set, this connector cannot clear the owner back to null — use Capsule's web UI for that.
partyIdNoLink task to a party (mutually exclusive with opportunityId/projectId)
projectIdNoLink task to a project (mutually exclusive with partyId/opportunityId)
descriptionYes
opportunityIdNoLink task to an opportunity (mutually exclusive with partyId/projectId)

TDQS

A4.5/5.0
Behavior5/5

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

Annotations indicate a non-readonly, non-destructive mutation, but the description adds key behaviors: the connector rejects multi-target inputs, repeat.on is derived from dueOn when omitted, and ownerId cannot be cleared once set. These go beyond the annotation hints.

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

Conciseness4/5

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

Three paragraphs, each with a distinct purpose: core action, exclusion rule, and standalone usage. The most critical constraint (mutual exclusion) is prominent. No wasted words.

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

Completeness4/5

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

For a 9-parameter tool with a nested repeat object and no output schema, the description covers linking constraints, repeat derivation, owner behavior, and the connector's validation. It lacks return-value details, but that's typical without an output schema and not critical for invocation.

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

Parameters4/5

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

The description clarifies the mutual exclusivity of partyId/opportunityId/projectId, explains the standalone-task behavior when all are omitted, and adds detail about repeat.on and ownerId limitations, enriching the schema's parameter descriptions (coverage 78%).

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

Purpose5/5

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

States a specific verb and resource, 'Create a new task', and mentions optional links to party, opportunity, or project. Clearly distinguishes from sibling tools like update_task or complete_task by the creation action.

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

Usage Guidelines4/5

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

Explicitly states the mutual-exclusion rule (pass at most ONE of the three IDs) and notes that omitting all is valid, creating a standalone task. It also mentions the rejection before HTTP call. While it doesn't directly compare with alternatives like update_task, the guidance is concrete and scenario-specific.

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

delete_entryA
Destructive

DESTRUCTIVE & IRREVERSIBLE: permanently delete a note (or other entry) by its ID. Requires confirm=true. Idempotent on retry: response is {deleted: true, alreadyDeleted: false, id} on a fresh delete or {deleted: true, alreadyDeleted: true, id} if the entry was already gone.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesEntry (note/email/task-record) ID
confirmYesMust be set to true. Permanently deletes the entry — use this to remove a note from a party/opportunity/project. Irreversible.

TDQS

A4.5/5.0
Behavior5/5

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

The description goes well beyond the destructiveHint annotation by explicitly stating that deletion is irreversible, requires confirm=true, and is idempotent on retry. It even discloses the exact two response variants, so the agent knows what to expect whether the entry existed or was already gone.

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

Conciseness5/5

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

The description is dense and economical: the warning is front-loaded, the precondition is stated in one short sentence, and the idempotency behavior is summarized with concrete response examples. Every sentence earns its place.

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

Completeness5/5

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

For a destructive delete tool with no output schema, the description is unusually complete: it covers what happens on success, what happens when the entry is already deleted, and the required confirmation flag. No critical operational detail is missing.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents both id and confirm. The description reinforces confirm's role but adds no parameter-level meaning beyond what the schema provides, so the baseline score of 3 is appropriate.

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

Purpose5/5

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

The description names a specific verb ('permanently delete'), a specific resource ('a note (or other entry)'), and the means ('by its ID'). This clearly differentiates it from sibling delete tools like delete_party, delete_project, or delete_task by scoping it to entries.

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

Usage Guidelines4/5

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

The description gives clear context: this is the destructive deletion tool for entries and requires confirm=true as a precondition. It does not explicitly compare itself to sibling tools, but the entry scope and confirm requirement provide enough guidance for correct selection.

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

delete_opportunityA
Destructive

DESTRUCTIVE & IRREVERSIBLE: permanently delete an opportunity. Requires confirm=true. Always read the opportunity first with get_opportunity and confirm with the user before calling. Idempotent on retry: response is {deleted: true, alreadyDeleted: false, id} on a fresh delete or {deleted: true, alreadyDeleted: true, id} if the opportunity was already gone.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes
confirmYesMust be set to true. Permanently deletes the opportunity. Irreversible.

TDQS

A4.7/5.0
Behavior5/5

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

Beyond the destructiveHint annotation, the description adds irreversibility, the confirm=true requirement, retry idempotency, and the exact response shape for both fresh deletes and already-deleted cases. This is rich behavioral context that the annotations alone do not provide.

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

Conciseness5/5

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

Three compact sentences: the destructive warning is front-loaded, followed by required preconditions, and then retry behavior. Every sentence earns its place with no filler or repetition.

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

Completeness5/5

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

For a destructive two-parameter tool with no output schema, the description provides the essential workflow, confirmation requirement, return values, and idempotent retry behavior. Nothing critical is missing for an agent to call it correctly.

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

Parameters3/5

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

The schema already documents confirm well. The description reinforces confirm=true and implies id targets an opportunity, but it does not add substantial new meaning for id beyond what the schema's name and constraints convey. Schema coverage is 50%, so this is adequate but not exceptional.

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

Purpose5/5

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

The description states a specific verb and resource: 'permanently delete an opportunity.' It is immediately distinguishable from read tools like get_opportunity, update_opportunity, and list_deleted_opportunities, and it emphasizes the destructive nature clearly.

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

Usage Guidelines5/5

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

The description gives explicit preconditions: read the opportunity first with get_opportunity, confirm with the user, and set confirm=true. It clearly tells the agent when and how to invoke the tool safely, including the required confirmation step.

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

delete_partyA
Destructive

DESTRUCTIVE & IRREVERSIBLE: permanently delete a party (person or organisation). Cascades to all linked notes, tasks, opportunities, AND projects. Deleting an organisation does NOT delete people linked to it via organisationId — their organisation field is silently cleared to null and they survive as standalone records. TRACK INSTANCES applied to cascaded opportunities/projects are NOT cleaned up either — they survive as orphan records reachable only by track id via get_track. Use remove_track on each track explicitly before deleting the parent party if orphan accumulation matters (rare in practice — orphans are unreachable from normal navigation). Requires confirm=true. Always read the party first with get_party and confirm with the user before calling. Idempotent on retry: response is {deleted: true, alreadyDeleted: false, id} on a fresh delete or {deleted: true, alreadyDeleted: true, id} if the party was already gone (Capsule's 404 is caught internally so reconciliation loops can re-issue safely).

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes
confirmYesMust be set to true. Deletes the party AND all linked notes, tasks, opportunities, and projects. Deleting an ORGANISATION does NOT delete people linked to it via organisationId — their `organisation` field is silently cleared to null and they survive as standalone records. Irreversible.

TDQS

A4.9/5.0
Behavior5/5

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

Annotations already signal destructive intent, and the description goes far beyond them by disclosing irreversibility, cascading deletion of linked records, the organisation-vs-person exception, orphaned track instances, and exact retry responses. This is rich, non-contradictory behavioral disclosure.

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

Conciseness5/5

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

The description is long but every sentence carries essential safety, side-effect, or workflow information. The destructive warning and main action are front-loaded, and the detailed caveats are organized in a logical sequence.

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

Completeness5/5

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

With no output schema, the description appropriately covers return values, idempotency, prerequisites, side effects, exceptions, and cleanup alternatives. It gives an agent everything needed to invoke this dangerous operation safely and correctly.

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

Parameters4/5

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

The schema documents confirm's const=true and some cascade effects, but the description adds the silent clearing of organisation fields, orphan track behavior, and the idempotent response shape. The id parameter is not explicitly redefined, though the get_party-first workflow makes its role clear.

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

Purpose5/5

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

The description states a specific verb and resource: permanently delete a party (person or organisation), and names the exact cascading consequences. This clearly distinguishes it from sibling delete tools like delete_opportunity, delete_project, and delete_task.

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

Usage Guidelines5/5

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

It explicitly instructs to read the party first with get_party and confirm with the user before calling. It also tells the agent when to use remove_track instead of proceeding with deletion, and notes that retries are safe due to idempotent behavior.

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

delete_projectA
Destructive

DESTRUCTIVE & IRREVERSIBLE: permanently delete a project. Prefer update_project with status='CLOSED' to close a project while preserving history. Requires confirm=true. Always read the project first with get_project and confirm with the user before calling. Idempotent on retry: response is {deleted: true, alreadyDeleted: false, id} on a fresh delete or {deleted: true, alreadyDeleted: true, id} if the project was already gone.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes
confirmYesMust be set to true. Permanently deletes the project. Consider update_project status='CLOSED' instead. Irreversible.

TDQS

A4.9/5.0
Behavior5/5

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

Annotations already mark destructiveHint=true and readOnlyHint=false, but the description goes beyond them by disclosing irreversibility, the confirm=true requirement, and exact idempotent response shapes for fresh versus already-deleted projects.

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

Conciseness5/5

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

Four sentences, front-loaded with the destructive warning, and every sentence adds operational value: alternative, required flag, precondition, and retry behavior. No filler.

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

Completeness5/5

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

For a destructive two-parameter mutation with no output schema, this is complete: it covers safety, prerequisite workflow, alternative, and even the exact response contract. Nothing an agent needs to call it safely is missing.

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

Parameters4/5

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

The description reinforces the confirm parameter with 'Requires confirm=true' and the destructive consequence, complementing the schema's const=true description. It does not add new meaning for id, but the role of id as the project to delete is unambiguous from the tool name and the get_project-first instruction.

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

Purpose5/5

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

Opens with 'DESTRUCTIVE & IRREVERSIBLE: permanently delete a project,' giving a specific verb, resource, and scope. It explicitly contrasts with update_project status='CLOSED' so an agent can distinguish this tool from the close-preserving-history path.

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

Usage Guidelines5/5

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

States when to prefer update_project with status='CLOSED' and mandates a read-then-confirm workflow: 'Always read the project first with get_project and confirm with the user before calling.' There is no ambiguity about prerequisites or alternatives.

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

delete_tag_definitionA
Destructive

DESTRUCTIVE & TENANT-WIDE: permanently delete a tag DEFINITION from an entity type's tag namespace (parties / opportunities / projects). Unlike remove_tag_by_id — which detaches a tag from ONE record and leaves the definition intact for others — this removes the definition itself, so the tag disappears from EVERY record that shared it. Use it to clean up stray / mistyped / test tag definitions polluting the tenant-global list. Requires confirm=true. Always read the affected tag first via list_tags and confirm with the user; if you only want to untag one record, use remove_tag_by_id instead. Irreversible (re-creating by name via add_tag mints a brand-new id). Idempotent on retry: {deleted: true, alreadyDeleted: false, entity, tagId} on a fresh delete, or {deleted: true, alreadyDeleted: true, entity, tagId} if the definition was already gone (Capsule's 404 is caught). Endpoint verified empirically (DELETE //tags/{id} → 204).

ParametersJSON Schema
NameRequiredDescriptionDefault
tagIdYesThe tag definition's id (from list_tags, or embed='tags' on a record). NOT an entity id.
entityYesWhich entity type.
confirmYesMust be set to true. DESTRUCTIVE & tenant-wide: permanently deletes the tag DEFINITION from this entity type's tag namespace, removing it from EVERY record that shares it — not just one. To detach a tag from a single record while keeping the definition, use remove_tag_by_id instead. Irreversible (the definition is gone; re-creating by name via add_tag mints a new id). Idempotent on retry.

TDQS

A4.9/5.0
Behavior5/5

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

Annotations already declare destructiveHint=true, and the description goes well beyond them: it discloses the tenant-wide blast radius, irreversibility (re-creating mints a new id), idempotency on retry with exact return shapes for both fresh-delete and already-deleted cases, and that the 404 is caught. No contradiction with annotations – all added context is consistent.

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

Conciseness5/5

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

Front-loaded with the critical warning ('DESTRUCTIVE & TENANT-WIDE') before anything else, then proceeds through scope, contrast, use case, workflow, irreversibility, and idempotency. Every sentence earns its place for an operation this dangerous; the only borderline clause (endpoint verification) is a single parenthetical that adds confidence.

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

Completeness5/5

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

For a destructive tenant-wide mutation with no output schema, the description covers everything an agent needs: operation, scope, prerequisites, alternatives, return values for both success paths, and error handling. The input schema covers parameters at 100%, and return behavior is spelled out in the description since no output schema exists.

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

Parameters4/5

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

Schema coverage is 100% and the schema itself is already rich (tagId is clarified as NOT an entity id; confirm's description is detailed). The description adds value beyond that by providing workflow context: reading the tag first via list_tags, confirming with the user, and the return payloads tied to tagId/entity. It reinforces rather than merely repeats.

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

Purpose5/5

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

States a precise verb+resource: 'permanently delete a tag DEFINITION from an entity type's tag namespace', and immediately distinguishes itself from the sibling tool remove_tag_by_id. An agent can tell exactly what this tool does and what it does not do, without needing to open the schema.

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

Usage Guidelines5/5

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

Gives explicit when-to-use ('clean up stray / mistyped / test tag definitions'), explicit when-not-to-use ('if you only want to untag one record, use remove_tag_by_id instead'), and a required precondition workflow ('Always read the affected tag first via list_tags and confirm with the user'). This is fully actionable routing guidance.

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

delete_taskA
Destructive

DESTRUCTIVE & IRREVERSIBLE: permanently delete a task. Prefer complete_task to mark a task done while keeping it in history. Requires confirm=true. Idempotent on retry: response is {deleted: true, alreadyDeleted: false, id} on a fresh delete or {deleted: true, alreadyDeleted: true, id} if the task was already gone.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes
confirmYesMust be set to true. Permanently deletes the task. To mark done without losing history use complete_task. Irreversible.

TDQS

A4.9/5.0
Behavior5/5

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

Beyond the annotations (readOnlyHint=false, destructiveHint=true), the description adds the precise idempotency contract with example response payloads for fresh vs already-deleted tasks. It also warns irreversibility and requires confirm=true, giving the agent full behavioral expectations. No contradiction with annotations.

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

Conciseness5/5

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

Three sentences with the destructive warning and primary purpose front-loaded, followed by the alternative, the precondition, and the idempotency contract. No filler or repetition of schema information that is already present.

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

Completeness5/5

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

With no output schema, the description provides the complete response contract for both fresh and repeated deletes. It covers the core action, the safer alternative, the required flag, and retry semantics, making it self-sufficient for an agent to invoke correctly.

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

Parameters4/5

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

The schema only documents confirm (50% coverage) while id lacks a description. The description compensates by establishing the confirm requirement and defining the response uses id, making the id's role clear. The schema's numeric constraints on id remain the reference for validation, and the description adds just enough semantic context.

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

Purpose5/5

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

The description opens with 'DESTRUCTIVE & IRREVERSIBLE: permanently delete a task,' naming the exact verb, resource, and consequence. It explicitly contrasts with complete_task, which marks a task done while preserving history, so it is easily distinguishable from the sibling that looks most similar.

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

Usage Guidelines5/5

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

Explicitly instructs 'Prefer complete_task to mark a task done while keeping it in history,' giving a clear when-not-to-use condition and naming the alternative. It also states the mandatory confirm=true precondition and documents idempotent retry behavior, leaving no doubt about invocation.

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

filter_opportunitiesA
Read-only

Filter opportunities by structured conditions (milestone, value, close date, tags). Use this — not search_opportunities — for questions like 'last won deal', 'opportunities closed this month', 'pipeline X at milestone Y'. Capsule's API does not support ad-hoc sort, but for 'most recent X' you can filter by a date field (e.g. {field: 'closedOn', operator: 'is within last', value: 90}) and pick the highest-id row — Capsule IDs are monotonic, so newest id = newest record.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNo
embedNoComma-separated embeds. Valid tokens: tags, fields, party, milestone, missingImportantFields.
perPageNo
conditionsYesArray of filter conditions. All conditions are ANDed together. To get newest records, use a date condition like {field: 'addedOn', operator: 'is within last', value: 7} and pick the highest-id row from the result (Capsule IDs are monotonic).

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, so safety is covered. The description adds genuinely useful behavior beyond annotations: Capsule's API does not support ad-hoc sort, IDs are monotonic, and 'most recent X' can be approximated by filtering on a date field and taking the highest ID. This is non-obvious and valuable context.

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

Conciseness5/5

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

The description is two sentences with no wasted words. The purpose is front-loaded, and the second sentence packs a high-value sorting workaround with a concrete example. Every clause earns its place.

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

Completeness4/5

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

For a read-only filter tool with a well-documented schema and no output schema, the description covers the key non-obvious pitfalls: no sort support and how to get newest records. It doesn't describe the return shape or restate AND semantics, but those are either obvious for a filter or already in the schema. Overall, it is complete enough for correct invocation.

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

Parameters3/5

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

Schema description coverage is 50%: conditions and embed are thoroughly documented, while page and perPage are left to their self-explanatory names. The description adds a concrete condition example and summarizes possible condition fields, but the schema already carries most of the semantic weight for conditions. It doesn't compensate for the undocumented pagination params, though those are conventional.

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

Purpose5/5

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

The description opens with a specific verb and resource: 'Filter opportunities by structured conditions (milestone, value, close date, tags).' It clearly enumerates the condition dimensions and explicitly contrasts with search_opportunities, so an agent can tell them apart without inspecting schemas.

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

Usage Guidelines5/5

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

It explicitly says 'Use this — not search_opportunities —' and gives concrete example questions ('last won deal', 'opportunities closed this month', 'pipeline X at milestone Y'). It even provides a workaround for the API's lack of ad-hoc sorting, so the agent knows exactly when and how to use this tool.

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

filter_partiesA
Read-only

Filter parties by structured conditions (date ranges, tags, fields). Use this — not search_parties — for questions like 'most recent client', 'parties added this week', 'parties tagged VIP'. Capsule's API does not support ad-hoc sort, but for 'most recent X' you can filter by a date field (e.g. {field: 'addedOn', operator: 'is within last', value: 30}) and pick the highest-id row from the result — Capsule IDs are monotonic, so newest id = newest record.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNo
embedNoComma-separated embeds. Valid tokens: tags, fields, organisation, missingImportantFields.
perPageNo
conditionsYesArray of filter conditions. All conditions are ANDed together. To get newest records, use a date condition like {field: 'addedOn', operator: 'is within last', value: 7} and pick the highest-id row from the result (Capsule IDs are monotonic).

TDQS

A4.6/5.0
Behavior4/5

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

Annotations already mark this as read-only and non-destructive. The description adds valuable behavioral context beyond annotations: the API does not support ad-hoc sort, Capsule IDs are monotonic, and the recommended workaround for 'most recent X' queries. This helps the agent predict result semantics accurately.

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

Conciseness5/5

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

The description is three dense sentences with no filler. The purpose is front-loaded, routing guidance follows, and the sort workaround is delivered efficiently with a concrete example. Every sentence earns its place.

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

Completeness4/5

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

For a filtering tool with no output schema, the description covers the essential use cases, limitations, and workaround strategy. It doesn't explain pagination or response shape, but those are largely inferable from the schema and the tool's role as a filter operation. The main gap is minimal and non-critical.

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

Parameters4/5

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

The description adds meaningful semantic guidance beyond the schema by showing an actual condition object for date-range filtering and explaining how to derive the newest record. Given the schema already documents field/operator/value options thoroughly, the description supplements rather than repeats, which compensates reasonably for the moderate schema coverage.

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

Purpose5/5

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

The description opens with 'Filter parties by structured conditions (date ranges, tags, fields)', a clear verb-resource-mechanism statement. It also explicitly contrasts itself with search_parties, making the tool's purpose and differentiation immediately obvious.

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

Usage Guidelines5/5

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

It directly says 'Use this — not search_parties — for questions like...' and provides concrete example queries. This is explicit when-to-use guidance with a named alternative, leaving no ambiguity about tool selection.

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

filter_projectsA
Read-only

Filter projects by structured conditions (date ranges, status, tags, owner). Use this — not list_projects — for questions like 'most recent project', 'projects opened this month'. Capsule's API does not support ad-hoc sort, but for 'most recent X' you can filter by a date field and pick the highest-id row — Capsule IDs are monotonic, so newest id = newest record.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNo
embedNoComma-separated embeds. Valid tokens: tags, fields, party, opportunity, missingImportantFields.
perPageNo
conditionsYesArray of filter conditions. All conditions are ANDed together. To get newest records, use a date condition like {field: 'addedOn', operator: 'is within last', value: 7} and pick the highest-id row from the result (Capsule IDs are monotonic).

TDQS

A4.9/5.0
Behavior5/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is known. The description adds important non-obvious behavior beyond annotations: Capsule's API does not support ad-hoc sort, Capsule IDs are monotonic, and the highest-id row after a date-filtered query is the newest record. This is exactly the kind of behavioral context an agent needs to use the tool correctly.

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

Conciseness5/5

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

Two information-dense sentences with no filler. The purpose and key differentiator are front-loaded, and the no-sort workaround is packed efficiently into the second sentence without redundancy.

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

Completeness5/5

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

For a read-only filter tool with a detailed conditions schema and a clear sibling context, this description is complete. It covers the main API limitation, gives a concrete workaround, and tells the agent when not to use list_projects. The return concept is clear from the tool name and sibling set, so the lack of an output schema is not a critical gap.

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

Parameters4/5

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

Schema coverage is 50%: conditions and embed have descriptions, while page and perPage rely on defaults and type constraints. The description adds meaningful value by explaining the conditions-based strategy for achieving 'most recent' without sort, but it does not compensate fully for the un-described pagination parameters. This is a solid improvement over the schema baseline, though not exhaustive.

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

Purpose5/5

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

States a specific verb and resource ('Filter projects by structured conditions') and names the kinds of filters supported: date ranges, status, tags, owner. It explicitly distinguishes itself from list_projects with 'Use this — not list_projects', so an agent can route correctly.

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

Usage Guidelines5/5

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

Gives explicit when-to-use direction with concrete examples ('most recent project', 'projects opened this month') and names the sibling to avoid (list_projects). It also provides a practical strategy for the no-sort limitation, making the usage guidance actionable.

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

get_attachmentA
Read-only

Download an attachment by id. Returns image content for image/* types (Claude can describe it natively); decoded text for text/* and application/json (small files); JSON metadata + base64 payload for other binary types (PDF, Office docs, etc.). Files exceeding maxSizeBytes (default 5MB) return metadata only with a truncated: true flag.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesAttachment ID.
maxSizeBytesNoRefuse to return content over this size (default 5242880 bytes ≈ 5MB; max 26214400 bytes ≈ 25MB). Files exceeding the cap return metadata only with a 'truncated: true' flag.

TDQS

A4.5/5.0
Behavior5/5

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

The description discloses detailed behavioral traits beyond the readOnlyHint and destructiveHint annotations: image/* returns native image content, text/* and application/json return decoded text, other binary types return metadata + base64, and files exceeding maxSizeBytes return truncated metadata only. This is exactly the kind of response behavior an agent needs to handle results correctly.

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

Conciseness5/5

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

Two sentences, front-loaded with the core action and resource, followed by a compact breakdown of return formats for different MIME families. No filler or redundancy; the brief mention of maxSizeBytes default in prose contextualizes the truncation flag without bloating the description.

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

Completeness5/5

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

With no output schema, the description fully carries the burden of explaining return values, and it does so across all relevant cases: images, text/JSON, binary types, and oversize truncation. Parameter semantics are fully covered by the schema, so nothing an agent needs to call the tool correctly is missing.

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

Parameters3/5

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

Schema description coverage is 100%, and the schema already documents both parameters, including maxSizeBytes' default (5242880), maximum (26214400), and truncation behavior. The description repeats the default but adds no new parameter semantics beyond what the schema provides. The baseline 3 is appropriate.

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

Purpose5/5

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

States a specific verb and resource: 'Download an attachment by id.' The type-specific return details reinforce that this is a retrieval tool, not a mutation. It clearly distinguishes itself from the upload_attachment sibling by its download focus.

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

Usage Guidelines4/5

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

The description makes the tool's purpose unambiguous: retrieve attachment content by id. It doesn't explicitly name alternatives or when-not-to-use conditions, but the only related sibling (upload_attachment) is the inverse operation, so there is no genuine alternative for downloading. This provides clear context without needing explicit exclusions.

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

get_current_userA
Read-only

Show the user owning the API token this connector is using. Useful for audit ('under whose Capsule identity is the connector running?') and for confirming a token rotation moved ownership to the expected account. Wraps Capsule's GET /users/current — note the endpoint is /users/current, not /users/me.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false. The description adds context about the specific endpoint ('/users/current') and mentions it is a read operation, which is consistent with annotations. No contradictions.

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

Conciseness5/5

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

The description is two sentences long, front-loaded with the core purpose and use cases, followed by endpoint specificity. Every sentence adds value, and there is no unnecessary fluff.

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

Completeness5/5

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

For a zero-parameter read-only tool with annotations, the description is complete. It covers what the tool does, when to use it, and the underlying endpoint, leaving no ambiguity.

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

Parameters4/5

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

The input schema has no parameters, so the description does not need to add parameter details. It provides enough context about the tool's function without needing to clarify parameters.

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

Purpose5/5

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

The description clearly states the tool shows the user owning the API token, with specific use cases (audit, token rotation confirmation). It distinguishes itself from sibling tools like list_users by focusing on the current authenticated user.

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

Usage Guidelines4/5

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

The description explicitly mentions when to use it (audit, confirming token rotation) but does not explicitly state when not to use it or mention alternatives like list_users. However, the context is clear enough.

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

get_custom_fieldA
Read-only

Show a single custom field DEFINITION by id. Use list_custom_fields first to discover field ids.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesCustom field definition id.
entityYesWhich entity type's custom field schema to inspect.

TDQS

A4.3/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is established. The description adds that this returns a definition rather than a value, but it does not disclose behavior like not-found responses or authorization requirements. Given the annotations cover the main behavioral concerns, a neutral score is appropriate.

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

Conciseness5/5

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

Two short sentences with no filler. The primary action and object are front-loaded, and the discovery instruction is placed second. Every word earns its place.

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

Completeness5/5

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

For a low-complexity read-only tool with two fully documented parameters, the description is complete. It states what the tool does, how to get the required id, and the annotations cover side-effect safety. No output schema exists, but the return value is implied by 'show' and the definition focus.

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

Parameters3/5

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

Schema description coverage is 100%, with both id and entity already described in the input schema. The description only repeats the notion of field ids and adds no new parameter semantics. Baseline 3 is appropriate when the schema fully documents parameters.

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

Purpose5/5

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

The description clearly states the action: show a single custom field definition by id. It explicitly uses 'single' and 'by id', which distinguishes it from listing tools. The uppercase 'DEFINITION' reinforces that this returns the field metadata, not values.

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

Usage Guidelines5/5

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

The description explicitly instructs to use list_custom_fields first to discover field ids, providing a clear precondition and workflow. This effectively differentiates the tool from its sibling list_custom_fields and tells an agent when to call it.

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

get_entryA
Read-only

Fetch a single timeline entry by its numeric id. Returns the full payload — for a note: the body text; for a captured email: subject, body, from/to, and timestamps; for a completed-task record: the original task fields. Useful when you have an entry id from one of the list_*_entries calls and want the full content. To modify the body or activity-type of an existing entry use update_entry; to delete one use delete_entry.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes
embedNoComma-separated embeds. Valid tokens: attachments, participants, party, project, opportunity, creator, activityType.

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is known. The description adds meaningful behavioral detail by specifying what kind of payload is returned depending on entry type, which goes beyond the annotations and helps the agent set expectations.

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

Conciseness5/5

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

The description is front-loaded with the core action, then gives return-value detail, usage context, and sibling alternatives, each sentence earning its place. The enumeration of payload types is relevant because there is no output schema to communicate this otherwise.

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

Completeness5/5

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

Given no output schema, the description compensates by explaining return payload variations for different entry types. It also covers when to use the tool and which sibling to choose for mutations, making it complete for an agent to select and invoke correctly.

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

Parameters3/5

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

Schema coverage is 50%, so the description carries some burden. It does clarify that id is a numeric timeline-entry id and that ids come from list_*_entries calls, which adds context beyond the schema. However, the embed parameter is not mentioned in the description, and the id semantics are only lightly supplemented beyond its integer type.

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

Purpose5/5

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

The description starts with a specific verb and resource: 'Fetch a single timeline entry by its numeric id.' It clearly distinguishes itself from siblings by explaining that it returns full content for notes, emails, and completed tasks, and contrasts with update_entry and delete_entry.

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

Usage Guidelines5/5

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

The description explicitly states when to use the tool: 'when you have an entry id from one of the list_*_entries calls and want the full content.' It also identifies alternatives and their use cases: use update_entry to modify, delete_entry to delete. This leaves no ambiguity about routing.

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

get_opportunitiesA
Read-only

Batch-fetch up to 50 opportunities by id. For 1–10 ids this is a single Capsule round trip (native multi-id endpoint); for 11–50 ids the connector transparently splits into 10-id chunks and fans out parallel Capsule requests, so the caller sees a single tool call with all results merged. Returns each opportunity's full record (value, milestone, owner, party). For a single id, use get_opportunity instead.

ParametersJSON Schema
NameRequiredDescriptionDefault
idsYesArray of opportunity IDs (1–50). Capsule's native batch-fetch endpoint caps at 10 per request; the connector transparently splits larger sets into 10-id chunks and fans out the Capsule calls in parallel.
embedNoComma-separated embeds. Valid tokens: tags, fields, party, milestone, missingImportantFields.

TDQS

A4.9/5.0
Behavior5/5

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

Beyond the readOnlyHint/destructiveHint annotations, the description reveals internal behavior: native endpoint for 1–10 ids, transparent chunking and parallel requests for 11–50, and merged results. It also explains the return record fields (value, milestone, owner, party), giving the agent a solid model of side effects and output.

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

Conciseness5/5

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

The description is three sentences with zero filler. It front-loads the primary purpose, then covers behavioral nuance and the alternative in a logical order. Every sentence earns its place without redundancy.

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

Completeness5/5

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

Given the read-only annotations, the full parameter schema, and the absence of an output schema, the description covers everything needed: purpose, limit, chunking behavior, return contents, and routing to the singular alternative. Nothing critical is missing for correct invocation.

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

Parameters4/5

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

Schema coverage is 100%, so both parameters (ids and embed) are already documented. The description adds the return-record contents (value, milestone, owner, party) and the explicit batch-size breakdown, which gives the agent a fuller understanding of what the ids parameter yields. However, the core parameter meaning is already in the schema, so this is a 4 rather than a 5.

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

Purpose5/5

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

The description states a specific verb and resource ('Batch-fetch up to 50 opportunities by id') with clear scope and even names the alternative for single-id use. This distinguishes it immediately from get_opportunity, search_opportunities, and filter_opportunities without ambiguity.

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

Usage Guidelines5/5

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

It explicitly says 'For a single id, use get_opportunity instead,' which is direct routing guidance. It also implies use for multiple ids by describing the batch behavior, leaving no doubt about when to pick this tool over its siblings.

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

get_opportunityA
Read-only

Fetch a single opportunity by its numeric id. Returns the full record including value, milestone, owner, party, and any embedded tags/custom fields. Use embed='tags,fields' to include those in one round-trip. For batch fetches of up to 50 opportunities at once, use get_opportunities instead.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes
embedNoComma-separated embeds. Valid tokens: tags, fields, party, milestone, missingImportantFields.

TDQS

A4.7/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is covered. The description adds useful behavioral context: it returns the full record, lists the included components (value, milestone, owner, party), and explains how embedding affects round-trip behavior. This goes beyond annotations without contradicting them.

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

Conciseness5/5

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

Three sentences, each earning its place: the first states the core action, the second summarizes return content and embedding tip, the third routes to the batch sibling. Information is front-loaded with the primary purpose, and no filler or redundancy exists.

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

Completeness5/5

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

For a single-record read tool, the description is complete: params are covered by the schema plus description, the return payload is summarized (relevant since there is no output schema), safety is in annotations, and the sibling alternative is named. No critical missing information for an agent to call it correctly.

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

Parameters4/5

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

Schema coverage is only 50%: 'embed' is documented but 'id' is not. The description compensates by clarifying that 'id' is numeric and shows a concrete usage example for 'embed' ('tags,fields'), which adds meaning beyond the raw schema. It doesn't enumerate all valid embed tokens, but the schema already lists them, so the combination is sufficient.

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

Purpose5/5

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

States a specific verb ('Fetch') and resource ('a single opportunity') with a clear scope qualifier ('single', 'by its numeric id'). It names the sibling 'get_opportunities' as the batch alternative, making the distinction explicit.

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

Usage Guidelines5/5

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

Explicitly says when to use this vs the sibling: single fetch here, batch of up to 50 with get_opportunities. It also gives a usage tip for embedding tags/fields in one round-trip. The guidance is direct and leaves no ambiguity about which tool to pick for single-record retrieval.

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

get_partiesA
Read-only

Batch-fetch up to 50 parties by ID. For 1–10 ids this is a single Capsule round trip (native multi-id endpoint); for 11–50 ids the connector transparently splits into 10-id chunks and fans out parallel Capsule requests, so the caller sees a single tool call with all results merged. Use this whenever Claude has several party IDs to avoid N sequential round trips of get_party.

ParametersJSON Schema
NameRequiredDescriptionDefault
idsYesArray of party IDs (1–50). Capsule's native batch-fetch endpoint caps at 10 per request; the connector transparently splits larger sets into 10-id chunks and fans out the Capsule calls in parallel. Result shape is identical regardless of input size.
embedNoComma-separated embeds. Valid tokens: tags, fields, organisation, missingImportantFields.

TDQS

A4.7/5.0
Behavior5/5

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

Annotations only provide readOnlyHint=true and destructiveHint=false. The description goes well beyond that by disclosing the internal behavior: for 11-50 ids the connector splits into 10-id chunks and fans out parallel Capsule requests, with results merged. This level of behavioral detail is valuable and not implied by the annotations.

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

Conciseness5/5

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

Three sentences, zero filler. The core purpose is front-loaded in the first sentence, followed by behavior and usage guidance. Every sentence earns its place, and there is no redundant elaboration.

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

Completeness5/5

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

For a batch-fetch tool with no output schema, the description is complete: it states the limit, explains the round-trip behavior for different id counts, and specifies that results are merged. Combined with readOnly annotations, it gives an agent everything needed to call it correctly.

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

Parameters3/5

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

The schema already describes both parameters in full detail (ids with min/max and the chunking behavior; embed with valid tokens). The tool description adds no additional meaning beyond what the schema provides – it mostly repeats the chunking information. With 100% schema coverage, the baseline of 3 is appropriate.

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

Purpose5/5

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

The description opens with 'Batch-fetch up to 50 parties by ID' – a specific verb, resource, and limit. It clearly distinguishes itself from the sibling get_party by explaining the batching and parallel fan-out behavior, so an agent can tell them apart without opening the schema.

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

Usage Guidelines5/5

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

Explicitly states when to use this tool: 'Use this whenever Claude has several party IDs', and names the alternative (get_party) and the problem it avoids (N sequential round trips). It also describes behavior for different ID counts, which helps the agent decide.

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

get_partyA
Read-only

Fetch a single party (person or organisation) by its numeric id. Returns the full record including type, name fields, emails, phones, addresses, websites, and any embedded tags or custom fields. Use embed='tags,fields' to include those in one round-trip. For batch fetches of up to 50 parties at once, use get_parties instead.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesParty ID
embedNoComma-separated embeds. Valid tokens: tags, fields, organisation, missingImportantFields.

TDQS

A4.7/5.0
Behavior4/5

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

Annotations already indicate readOnlyHint=true and destructiveHint=false, so the safe-read profile is known. The description adds valuable behavioral specifics: it enumerates the fields returned and explains that embed='tags,fields' includes those in a single round-trip. It does not cover not-found behavior or rate limits, but those are not critical for a simple read tool.

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

Conciseness5/5

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

Three sentences, each earning its place: primary action, return contents, and batch alternative. The most important information is front-loaded, and there is no redundancy or filler.

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

Completeness5/5

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

For a single-resource read operation with no output schema, the description compensates by listing the returned fields and explaining embed usage. It also routes the batch case to the correct sibling. The guidance is sufficient for an agent to call the tool correctly in the common scenarios.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3. The description adds meaning beyond the schema by explaining that embed='tags,fields' fetches tags and custom fields in one round-trip, and that id is the numeric party ID. This helps an agent choose parameter values more effectively than the schema alone.

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

Purpose5/5

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

The description clearly states the operation: 'Fetch a single party (person or organisation) by its numeric id.' It also specifies the resource scope and differentiates from the batch sibling get_parties. The returned record contents are listed, leaving no ambiguity about what the tool does.

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

Usage Guidelines5/5

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

The description explicitly names the alternative for batch scenarios: 'For batch fetches of up to 50 parties at once, use get_parties instead.' It also gives practical guidance on using embed to avoid multiple round-trips, making the when-to-use context clear.

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

get_projectA
Read-only

Fetch a single project by its numeric id. Returns the full record including name, description, status (OPEN/CLOSED), owner, stage, board, opportunityId (if linked), and timestamps. Use embed='tags,fields' to include attached tags and custom field values in one round-trip. For batch fetches of up to 50 projects at once, use get_projects instead. For the project's timeline (notes, captured emails, completed-task records) use list_project_entries.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes
embedNoComma-separated embeds. Valid tokens: tags, fields, party, opportunity, missingImportantFields.

TDQS

A4.9/5.0
Behavior5/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, covering the safety profile. The description adds valuable behavioral context beyond the annotations: it lists the returned fields, explains the status values, describes the embed effect, and clarifies what this tool does not provide (timeline data), which is a meaningful distinction.

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

Conciseness5/5

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

The description is four concise sentences with no filler. It front-loads the core purpose, then covers return values, embed usage, and alternative tools in a logical order. Every sentence earns its place and contributes to correct tool invocation.

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

Completeness5/5

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

For a simple read tool with one required parameter and one optional embed parameter, the description is complete. It states what the tool returns, how to enrich the response, and when to use sibling tools instead. The absence of an output schema is mitigated by the explicit list of returned fields.

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

Parameters4/5

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

Schema coverage is only 50% because the required id parameter lacks a description. The description compensates by calling it a 'numeric id' and explicitly tying it to the project. For embed, the description adds semantic meaning by explaining that tags and fields include attached tags and custom field values, going beyond the schema's token list. It doesn't fully describe all embed tokens, but the schema lists them.

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

Purpose5/5

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

The description states a specific verb and resource: 'Fetch a single project by its numeric id.' It clearly distinguishes this from sibling tools by naming get_projects for batch fetches and list_project_entries for timeline data, making its scope unambiguous.

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

Usage Guidelines5/5

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

The description explicitly provides when-to-use alternatives: use get_projects for batch fetches of up to 50 projects, and list_project_entries for the project's timeline. It also gives practical guidance on using embed='tags,fields' to include related data in one round-trip, leaving no ambiguity about tool selection.

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

get_projectsA
Read-only

Batch-fetch up to 50 projects by ID. For 1–10 ids this is a single Capsule round trip; for 11–50 ids the connector transparently splits into 10-id chunks and fans out parallel Capsule requests, so the caller sees a single tool call with all results merged.

ParametersJSON Schema
NameRequiredDescriptionDefault
idsYesArray of project IDs (1–50). Capsule's native batch-fetch endpoint caps at 10 per request; the connector transparently splits larger sets into 10-id chunks and fans out the Capsule calls in parallel.
embedNoComma-separated embeds. Valid tokens: tags, fields, party, opportunity, missingImportantFields.

TDQS

A4.5/5.0
Behavior5/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, so the agent knows this is a safe read. The description adds substantial behavior beyond annotations: the transparent chunking into 10-id requests, parallel fan-out for 11–50 ids, and the merged result view presented as a single tool call. This is exactly the kind of hidden complexity that needs disclosure.

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

Conciseness5/5

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

Two sentences, zero waste. The cap and the chunking behavior are front-loaded. Every sentence earns its place by describing non-obvious behavior.

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

Completeness5/5

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

Complete for a read-only batch tool. The description covers the cap, the internal chunking, and the merged behavior; the schema handles parameters; annotations handle safety. This is effective as written.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents both parameters. The description repeats the ids chunking behavior but does not add meaning beyond what the schema already states — the ids parameter description in the schema already mentions the 10-id cap and transparent splitting. Baseline 3 is appropriate because the schema does the heavy lifting, and the description adds no new parameter semantics.

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

Purpose5/5

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

States a specific verb (batch-fetch) and resource (projects by ID) with an explicit cap of 50, and distinguishes it from the singular get_project by describing the batch behavior. An agent immediately knows it is the bulk variant of get_project.

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

Usage Guidelines4/5

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

The description clarifies the batch context (fetching multiple projects by ID) and the transparent chunking behavior, which implies when to use it over get_project. It does not explicitly name alternatives or say 'use get_project for a single ID', but the batch-fetch framing is clear enough. Lacks an explicit when-not-to-use statement.

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

get_siteA
Read-only

Return the Capsule account this connector is currently authenticated against (subdomain, display name, URL). Diagnostic for 'which Capsule account is this?'. For the PAT owner's user identity, use get_current_user.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.7/5.0
Behavior4/5

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

Annotations already indicate readOnlyHint=true and destructiveHint=false. Description adds specific return fields (subdomain, display name, URL) and diagnostic purpose, enhancing transparency beyond annotations.

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

Conciseness5/5

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

Two concise sentences, front-loaded with purpose, no wasted words.

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

Completeness5/5

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

For a parameterless, read-only diagnostic tool with no output schema, the description fully covers what it returns and its purpose, making it complete.

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

Parameters4/5

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

Input schema has zero parameters with 100% coverage, so description doesn't need to add parameter details. Baseline of 4 is appropriate.

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

Purpose5/5

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

The description clearly states the tool returns the Capsule account (subdomain, display name, URL) the connector is authenticated against, and positions it as a diagnostic tool. It distinguishes itself from get_current_user, which returns the PAT owner's identity.

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

Usage Guidelines5/5

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

Explicitly says 'Diagnostic for which Capsule account is this?' and directs to get_current_user for PAT owner identity, providing clear when-to-use and when-not-to-use guidance.

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

get_taskA
Read-only

Fetch a single task by its numeric id. Returns the task's description, due date, owner, completion state, and the entity it's attached to (party / opportunity / project, if any — standalone tasks not tied to a record are also valid). For batch fetches of up to 50 tasks at once, use get_tasks instead.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesTask ID
embedNoComma-separated embeds. Valid tokens: party, opportunity, project, owner, nextTask.

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already mark this as read-only and non-destructive. The description adds useful behavioral context: it returns specific fields, may return tasks not attached to any entity, and treats standalone tasks as valid. This goes beyond the structured annotations.

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

Conciseness5/5

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

Two sentences with no filler. The primary purpose and return contents come first, and the batch alternative is presented in one clear follow-up sentence.

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

Completeness4/5

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

With no output schema, the description compensates by listing the key returned fields and clarifying the attached-entity behavior. It could have said more about the optional embed parameter's effect on the response, but that is already covered in the schema, so the definition is sufficiently complete for a simple read tool.

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

Parameters3/5

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

Schema description coverage is 100%, with id and embed fully described in the schema. The description itself adds little parameter-level meaning beyond confirming the id is numeric, so baseline 3 is appropriate.

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

Purpose5/5

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

The description clearly states the tool fetches a single task by numeric id, listing the returned fields. It explicitly distinguishes itself from get_tasks by noting batch fetching is the sibling's job, so an agent can select it unambiguously.

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

Usage Guidelines5/5

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

The description explicitly says to use get_tasks instead for batch fetches of up to 50 tasks. This gives a direct when-to-use versus when-not-to-use directive, which is exactly what an agent needs.

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

get_tasksA
Read-only

Batch-fetch up to 50 tasks by ID. For 1–10 ids this is a single Capsule round trip; for 11–50 ids the connector transparently splits into 10-id chunks and fans out parallel Capsule requests, so the caller sees a single tool call with all results merged.

ParametersJSON Schema
NameRequiredDescriptionDefault
idsYesArray of task IDs (1–50). Capsule's native batch-fetch endpoint caps at 10 per request; the connector transparently splits larger sets into 10-id chunks and fans out the Capsule calls in parallel.
embedNoComma-separated embeds. Valid tokens: party, opportunity, project, owner, nextTask.

TDQS

A4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, so safety is covered. The description adds valuable behavioral context: it explains the underlying Capsule API limit of 10 per request, the transparent splitting for larger batches, parallel fan-out, and that the caller sees merged results. This goes beyond the annotations and helps the agent understand performance and consistency implications. No contradiction with annotations.

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

Conciseness4/5

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

The description is a single, focused sentence that front-loads the primary behavior (batch-fetch up to 50 tasks) and then provides the important edge-case detail about splitting. It is neither too long nor verbose, with each clause earning its place. It could be slightly more structured with a bullet or two, but the current format is efficient and clear.

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

Completeness4/5

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

Given the tool's low complexity (2 params, no output schema, no nested objects), the description covers the essential behavioral aspects: batch limit, splitting behavior, and network round-trip implications. The annotations already provide safety context. The description does not mention error handling or rate limits, but these are not explicitly required for this simple read operation. It is largely complete for an agent to call it correctly.

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

Parameters4/5

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

Schema description coverage is 100%, so the schema already documents both parameters. The description adds depth by explaining the 10-id chunking behavior in relation to the 'ids' parameter, which is beyond what the schema says. It also mentions the 'embed' parameter's purpose implicitly through the schema, but the description reinforces the batch context. Since schema coverage is high, a 3 is baseline, but the added chunking detail justifies a 4.

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

Purpose4/5

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

The description clearly states the tool fetches up to 50 tasks by ID, using a specific verb ('batch-fetch') and resource ('tasks'). It distinguishes itself from get_task (which likely fetches a single task) by emphasizing the batch capability. However, it does not explicitly name a sibling alternative, so it loses a point for not being as explicit as possible.

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

Usage Guidelines4/5

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

The description explains the behavior for different batch sizes (1-10 vs 11-50) and mentions the splitting mechanism, giving the agent clear context on what to expect. It does not explicitly state when to use this tool vs alternatives (e.g., get_task for single fetch), but the batch emphasis implies the use case. The lack of explicit exclusions means it's a 4, not a 5.

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

get_trackA
Read-only

Fetch a single track instance by id. Returns the minimal Capsule projection: id, description, trackDateOn, direction, and the array of tasks attached to the track. Capsule's GET /tracks/{id} does NOT include a trackDefinition link, an entity reference, or a completion field — to find the entity a track is applied to, use list_entity_tracks (which lists track instances by their parent entity); to check completion, the track-tasks' own statuses are the proxy.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes

TDQS

A4.9/5.0
Behavior5/5

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

Beyond the annotations' readOnlyHint and destructiveHint, the description discloses important behavioral traits: it returns a minimal Capsule projection, omits trackDefinition and entity references, and lacks a completion field. It also explains the semantic workaround for completion checks, which is genuinely useful context an agent would not otherwise know.

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

Conciseness5/5

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

Every sentence earns its place: purpose first, then the exact return projection, then explicitly what is absent and how to handle those gaps through sibling tools. The description is information-dense but not bloated, and the structure makes the critical caveat about missing fields front and center.

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

Completeness5/5

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

With no output schema, the description fully carries the burden of explaining return values, and it does so clearly by naming the fields and the exclusions. It also covers the practical follow-up actions for entity lookup and completion checks, making it complete for an agent to decide whether and how to call this tool.

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

Parameters4/5

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

Schema coverage is 0%, so the description must compensate for the id parameter. It does, by clarifying that id is a track instance id used in the GET /tracks/{id} endpoint. For a single integer parameter this is sufficient semantic guidance, though it could have added a brief note on id validity or error behavior.

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

Purpose5/5

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

The description opens with a specific verb and resource: 'Fetch a single track instance by id.' It explicitly lists the returned fields (id, description, trackDateOn, direction, tasks), which makes the tool's purpose and scope unmistakable, and it distinguishes itself from sibling tools by stating what the response does NOT include and routing to list_entity_tracks for entity lookup.

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

Usage Guidelines5/5

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

The description gives clear when-to-use guidance and explicit alternatives: use list_entity_tracks to find the entity a track is applied to, and rely on task statuses to check completion. This tells an agent exactly how to choose between get_track and related tools rather than leaving that decision to inference.

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

list_activitiesA
Read-only

Global cross-entity ACTIVITY FEED: everything that happened across the tenant, newest first — typed rows (Note, Task completed, Email sent, Email received, plus custom types) with the acting user, the apiClient that made the change, and refs to the party/opportunity/project/task/entry concerned. Supports since (ISO-8601, server-side filter) and pagination. THE tool for 'what happened this week across the book', 'what did touch today', or 'which emails came in' — one call instead of per-record entry fan-outs. No per-entity server-side filter: filter client-side on the returned refs. CAVEAT: undocumented Capsule endpoint (stable in observation; discovered by live probe) — could change without notice.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNo
sinceNoOnly activities on/after this ISO-8601 timestamp (server-side filter, verified live). Omit for the newest activities.
perPageNo

TDQS

A4.6/5.0
Behavior5/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, so the description adds substantial behavioral context: it specifies ordering (newest first), the content of rows (typed, acting user, apiClient, refs), pagination support, and a critical caveat that this is an undocumented Capsule endpoint 'could change without notice'. This far exceeds the annotations.

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

Conciseness4/5

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

Multi-line but dense and purposeful, front-loading the core definition and then layering filters, use cases, and the caveat. Every sentence contributes value; the caveat at the end is appropriate. Slightly long but not wasteful.

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

Completeness5/5

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

With no output schema, the description fully specifies expected return content (typed rows, user, apiClient, refs), ordering, pagination, and filtering semantics. It also discloses the undocumented nature of the endpoint, which is essential for safe use. Nothing an agent needs to call it correctly is missing.

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

Parameters4/5

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

Schema coverage is only 33% (only `since` is described). The description compensates by explaining `since` as an ISO-8601 server-side filter and mentions pagination generically. It does not detail perPage/page specifics but the schema already provides defaults and bounds, so the description adds semantic meaning beyond the schema.

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

Purpose5/5

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

States a specific verb and resource: 'Global cross-entity ACTIVITY FEED: everything that happened across the tenant, newest first' — it clearly lists the content and distinguishes itself from per-entity list tools by emphasizing the cross-entity scope and the explicit note that there is no per-entity server-side filter.

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

Usage Guidelines4/5

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

Provides explicit example queries ('what happened this week across the book', 'what did <user> touch today', 'which emails came in') and explains when this is the right choice ('one call instead of per-record entry fan-outs'). Does not name specific sibling tools as alternatives, but clearly implies that per-entity filtering is not supported, which routes to other list tools.

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

list_activity_typesA
Read-only

List all configured activity types (e.g. Call, Meeting, Email). These are the categories used when logging timeline entries via add_note. Returns each type's id and name. The set is account-configured rather than a fixed enum, so call this to discover valid values before referencing an activityType in entry creation.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNo
perPageNoPage size, max 100. Defaults to 100 for reference data.

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already declare readOnlyHint true and destructiveHint false, so the description's role is to add beyond that. It explains that the tool returns each type's id and name and that the values are account-configured. It does not contradict annotations and provides useful context, though it could mention pagination behavior more explicitly.

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

Conciseness5/5

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

The description is two sentences with no wasted words. The first sentence states the core purpose, and the second provides usage context. It is front-loaded and every sentence is valuable.

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

Completeness4/5

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

The tool is simple with two optional parameters and no output schema. The description covers purpose, usage context, and output fields (id and name). Annotations are present. It lacks explicit pagination behavior, but overall it is fairly complete for a read-only reference data tool.

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

Parameters2/5

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

Schema coverage is 50% because the 'page' parameter lacks a description; only 'perPage' is described. The description does not elaborate on the parameters (page and perPage) beyond the schema. It mentions 'list all' but doesn't explain how pagination works. Given the low coverage, the description should compensate but fails to do so.

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

Purpose5/5

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

The description clearly states the tool lists all configured activity types, gives examples (Call, Meeting, Email), and explains that it returns id and name. It distinguishes itself by noting these are account-configured, not a fixed enum, and that they are used in add_note, which differentiates it from siblings.

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

Usage Guidelines4/5

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

The description explicitly tells when to use the tool: before referencing an activityType in entry creation via add_note. It explains that the set is account-configured, so calling this is necessary to discover valid values. It does not explicitly mention alternatives or when not to use it, but the context is clear enough.

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

list_additional_partiesA
Read-only

List secondary party links on an opportunity or project. The 'main' party is on the entity itself (opportunity.party); additional parties are e.g. partners, consultants, or referrers also involved in the deal. Set entity to 'opportunities' or 'projects'.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNo
embedNoComma-separated embeds. Valid tokens: tags, fields, organisation, missingImportantFields.
entityYesWhich entity has the additional-party links.
perPageNo
entityIdYesID of the opportunity or project.

TDQS

A3.8/5.0
Behavior3/5

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

The readOnlyHint and destructiveHint annotations already establish this as a safe read operation, so the description does not need to re-state that. It adds useful conceptual context about what additional parties are, but it does not disclose pagination behavior, embed expansion, or response characteristics beyond the tool name.

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

Conciseness4/5

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

The description is compact and front-loaded with the core action, then adds a clarifying distinction and a direct instruction for the key parameter. No filler is present, though the third sentence partly repeats enum information already in the schema.

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

Completeness3/5

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

For a basic call, the required parameters and entity choices are sufficiently described, and annotations cover the safety profile. However, with no output schema, the tool does not explain what the returned secondary-party links look like, nor does it mention pagination defaults or embed usage, so an agent may lack enough detail for more advanced invocations.

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

Parameters3/5

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

The schema already documents entity, entityId, and embed. The description reinforces that entity selects the container and entityId identifies the specific opportunity/project, but it does not add meaning for page or perPage, which lack schema descriptions. With 60% schema coverage, the description only partially compensates for the undocumented parameters.

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

Purpose5/5

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

The description uses a specific verb and resource: 'List secondary party links on an opportunity or project.' It also clarifies the distinction from the main party and gives concrete examples (partners, consultants, referrers), which effectively differentiates this tool from related party-listing siblings.

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

Usage Guidelines4/5

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

The description clearly indicates when to use the tool: when you need secondary party links on an opportunity or project, and it explains how to select the target entity via 'opportunities' or 'projects'. It does not explicitly name alternative tools, but the main-versus-additional distinction provides enough routing context.

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

list_associated_projectsA
Read-only

List projects associated with a given opportunity. Returns the same record shape as list_projects, filtered to one opportunity. The inverse direction (project → opportunity) is on each project's opportunity field directly, so this tool is only needed for opportunity → projects discovery — use list_party_projects for party → projects.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNo
embedNoComma-separated embeds. Valid tokens: tags, fields, party, opportunity, missingImportantFields.
perPageNo
opportunityIdYes

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is covered. The description adds useful behavioral context beyond annotations: the return shape matches list_projects, results are filtered to one opportunity, and the association direction is clarified. It does not discuss pagination behavior, but the schema covers page/perPage parameters.

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

Conciseness4/5

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

The description is three sentences and front-loads the core purpose before contextual details. Each sentence adds distinct value: purpose, return shape, and sibling/direction routing. It is slightly dense but not wasteful.

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

Completeness4/5

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

For a read-only list tool with annotations covering safety, the description provides the essential decision-making context: what it does, what shape results take, and when to prefer alternatives. The lack of an output schema is mitigated by the reference to list_projects' record shape. Some parameter semantics are left to inference, but the core call parameters are evident from the schema.

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

Parameters2/5

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

Schema description coverage is only 25%, so the description must compensate for the 4 parameters. It only indirectly clarifies opportunityId via 'given opportunity' and does not explain page, perPage, or embed beyond what the schema already provides. This is insufficient compensation for the low schema coverage.

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

Purpose5/5

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

The description opens with a specific verb and resource: 'List projects associated with a given opportunity.' It further distinguishes itself by stating it returns the same shape as list_projects but filtered to one opportunity, and clarifies the directionality versus list_party_projects and the project's own opportunity field.

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

Usage Guidelines5/5

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

Usage guidance is explicit and actionable: the description states this tool is 'only needed for opportunity → projects discovery' and directs the agent to 'use list_party_projects for party → projects.' It also notes the inverse direction is available directly on each project's opportunity field, preventing unnecessary calls.

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

list_boardsA
Read-only

List all project boards defined in Capsule. A board is a grouping of stages that projects flow through — the project equivalent of an opportunity pipeline. Returns each board's id, name, and stages. Use this to discover boardId when creating a project, then pick a starting stage via list_stages. Like pipelines, boards are stable per account.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNo
perPageNo

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already indicate readOnlyHint=true and destructiveHint=false. The description adds that it returns board id, name, and stages, and that boards are stable. No contradictions; the added context is helpful but does not cover pagination behavior or other traits.

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

Conciseness5/5

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

The description is three sentences, each serving a purpose: stating the action, defining the resource, and providing usage context. No redundant words; efficient and well-structured.

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

Completeness4/5

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

Given no output schema, the description does specify return fields (id, name, stages), which is adequate. Pagination is supported but not mentioned. The tool is simple and the context provided is sufficient for selection and basic use.

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

Parameters2/5

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

Schema description coverage is 0%, and the description does not mention the pagination parameters (page, perPage) at all. While the parameters are standard and optional, the description misses the opportunity to explain their role, leaving the agent to infer from the schema only.

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

Purpose5/5

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

The description clearly states the tool lists all project boards, explains what a board is (a grouping of stages), and specifies the returned fields (id, name, stages). It differentiates from sibling tool list_pipelines by calling boards the project equivalent of opportunity pipelines.

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

Usage Guidelines4/5

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

The description provides explicit guidance to use this tool to discover boardId when creating a project, and then to use list_stages for stage selection. It notes that boards are stable per account. No explicit when-not-to-use, but the context is clear.

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

list_categoriesA
Read-only

List configured entry/task categories (Call, Email, Meeting, Follow-up, etc.) with their colours. Returns each category's id, name, and colour. The set is account-configured rather than a fixed enum — call this to discover valid category ids before referencing one in add_note or create_task. Used to label and filter timeline entries and tasks.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNo
perPageNoPage size, max 100. Defaults to 100 for reference data.

TDQS

A3.9/5.0
Behavior3/5

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

The description adds behavioral context beyond annotations by noting that the set is account-configured rather than a fixed enum. Annotations already declare readOnlyHint=true and destructiveHint=false, so the description doesn't need to repeat that, but it adds useful information about dynamic data.

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

Conciseness5/5

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

The description is three sentences, no redundancy. It starts with the core action and then provides context and purpose. Every sentence adds value.

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

Completeness4/5

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

For a simple read-only list tool, the description covers the return format (id, name, colour) and purpose. However, it does not mention that the list is paginated (as per schema), which is a minor gap. Overall, it's fairly complete.

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

Parameters2/5

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

The input schema has two parameters (page, perPage) with 50% description coverage (only perPage has a description). The description does not mention any parameters, leaving page undocumented. It should at least indicate that pagination is available.

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

Purpose5/5

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

The description clearly states the tool lists configured entry/task categories with their colours, IDs, and names. It distinguishes itself from sibling list tools by specifying the resource (categories) and provides examples of categories.

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

Usage Guidelines4/5

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

The description explains when to use this tool: to discover valid category IDs before using them in add_note or create_task, and for labeling and filtering. It doesn't explicitly state when not to use it, but the usage context is clear.

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

list_countriesA
Read-only

List Capsule's country dictionary (250 rows: name, alpha2Code, alpha3Code, numericCode, dialCode). The name values are the EXACT spellings accepted by party address country fields — Capsule rejects anything else with 422 'unknown country' (e.g. accepted: 'Czechia', 'United Kingdom'; rejected: 'Czech Republic', 'UK'). Consult this before add_party_address / update_party address writes when unsure of a spelling. Complete list in one response; cached (reference data).

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnly/destructive=false, so the description adds meaningful extras: the complete one-shot listing (no pagination), the exact row count (250), and that the data is cached reference data. This rises above the annotation baseline.

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

Conciseness4/5

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

Dense but not bloated: it packs the row count, field list, usage condition, and error behavior into a single tight sentence. A minor over-elaboration on the exact reject message is acceptable, so a 4, not a 5.

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

Completeness5/5

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

Covers the data set size, field schema, usage trigger, and failure mode. An agent can decide and call this tool correctly without opening the schema or consulting anywhere else.

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

Parameters3/5

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

The tool takes zero parametersthority, so the schema fully covers it. The description adds no parameter explanations because none are needed — a baseline 3 is appropriate; there is simply nothing further to clarify.

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

Purpose5/5

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

States a specific verb and resource (

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

Usage Guidelines5/5

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

Explicitly says when to use it: tie to party addresses, and notes the exact spelling requirement (anything else → 422). It also names an alternative class (add_party_address) where this dictionary is the prerequisite.

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

list_currenciesA
Read-only

List Capsule's currency dictionary (80 rows: ISO 4217 code, symbol, name). Valid codes for opportunity value.currency. Complete list in one response; cached (reference data).

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.7/5.0
Behavior5/5

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

Beyond the read-only annotation, the description discloses that the data is cached (reference data) and that the complete list is returned in one response (no pagination). This gives the agent a clear expectation of the tool's behavior and performance characteristics.

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

Conciseness5/5

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

The description is concise yet information-dense, covering all essential aspects in a single sentence. It is well-structured, starting with the action, then the content, purpose, and behavioral notes, with no wasted words.

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

Completeness5/5

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

Given the tool's simplicity (no parameters, no output schema), the description is fully complete. It explains what the data contains, its intended use, and its delivery characteristics, leaving no ambiguity for the agent.

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

Parameters4/5

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

The tool has no parameters, and the description correctly does not attempt to describe any. Since there are zero parameters, the baseline of 4 is appropriate; the description adds no parameter-related confusion.

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

Purpose5/5

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

The description clearly states the tool lists Capsule's currency dictionary, specifying the exact fields (ISO 4217 code, symbol, name) and row count (80). It also explains its purpose as providing valid codes for the opportunity's `value.currency` field, which is unambiguous.

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

Usage Guidelines4/5

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

The description implies when to use it: whenever valid currency codes are needed for `value.currency`. It also mentions that it is cached reference data, suggesting it can be called infrequently. However, it does not explicitly state 'use this when...', so a small gap remains.

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

list_custom_fieldsA
Read-only

List custom field DEFINITIONS for an entity type (parties, opportunities, or projects). Returns the schema — name, type, options for list-type fields, etc. — NOT the values on any specific record. To read values on a record, use get_party / get_opportunity / get_project with embed=fields.

ParametersJSON Schema
NameRequiredDescriptionDefault
entityYesWhich entity type's custom field schema to inspect.

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already provide readOnlyHint true and destructiveHint false. Description adds that it returns schema and not values, clarifying behavior beyond annotations.

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

Conciseness5/5

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

Two concise sentences, front-loaded with purpose, then clarification. No unnecessary words.

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

Completeness5/5

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

Simple tool with one parameter and good annotations; description fully explains input, output, and boundaries. No output schema needed.

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

Parameters3/5

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

Schema has 100% coverage with enum for entity types. Description repeats the entity types but adds no additional semantic meaning beyond schema.

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

Purpose5/5

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

The description clearly states the tool lists custom field definitions for an entity type, returning schema (name, type, options) not values. It distinguishes from sibling tools like get_custom_field or get_party.

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

Usage Guidelines5/5

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

Explicitly says when to use (to get definitions) and when NOT to use (for values on a record), directing to get_party/get_opportunity/get_project with embed=fields.

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

list_deleted_opportunitiesA
Read-only

Audit feature: list opportunities deleted on or after a given timestamp. The since parameter is REQUIRED. Response also includes a restrictedOpportunities key for records the integration user can't read fully.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNo
sinceYesREQUIRED. ISO-8601 timestamp; only deletions on or after this point are returned. Example: '2026-01-01T00:00:00Z'.
perPageNo

TDQS

A4/5.0
Behavior4/5

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

Annotations already indicate read-only and non-destructive behavior. The description adds transparency by mentioning the `restrictedOpportunities` key in the response, which goes beyond what annotations provide.

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

Conciseness5/5

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

The description is brief and front-loaded with the tool's purpose. Every sentence adds value without unnecessary detail.

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

Completeness3/5

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

Covers the required parameter and a notable response field, but lacks information about pagination parameters (`page`, `perPage`), which are part of the input schema and important for usage.

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

Parameters2/5

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

Only the `since` parameter is described in the tool description, but it already has documentation in the schema. The `page` and `perPage` parameters lack any description, and with low schema description coverage (33%), the description does not compensate adequately.

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

Purpose5/5

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

Clearly states it lists deleted opportunities on or after a timestamp. The phrase 'Audit feature' distinguishes it from other listing tools and indicates a specific use case.

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

Usage Guidelines4/5

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

Explicitly states that the `since` parameter is required, which is a key usage instruction. However, it does not provide guidance on when to use this tool versus siblings like `filter_opportunities` or `delete_opportunity`.

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

list_deleted_partiesA
Read-only

Audit feature: list parties deleted on or after a given timestamp. The since parameter is REQUIRED (Capsule rejects the call without it). Response also includes a restrictedParties key — records the integration user can see were deleted but cannot read fully.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNo
sinceYesREQUIRED. ISO-8601 timestamp; only deletions on or after this point are returned. Example: '2026-01-01T00:00:00Z'.
perPageNo

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already indicate readOnlyHint=true and destructiveHint=false. The description adds value by noting that the `since` parameter is mandatory and that the response includes a `restrictedParties` key for partially inaccessible records. This behavior is not implied by annotations alone.

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

Conciseness5/5

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

The description is two sentences long, front-loaded with 'Audit feature', and contains no superfluous information. Every sentence provides essential context without redundancy.

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

Completeness4/5

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

Given the absence of an output schema, the description helpfully mentions the `restrictedParties` key. It covers the main purpose and a notable response detail. However, pagination behavior (e.g., sorting, maximum results) is not described, which would be useful for a list endpoint.

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

Parameters3/5

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

Schema coverage is only 33% (only `since` has a description). The description reinforces that `since` is required and explains it is an ISO-8601 timestamp. However, it does not add meaning for `page` and `perPage` beyond their schema constraints (defaults and ranges), so the burden of compensating for low schema coverage is only partially met.

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

Purpose5/5

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

The description clearly states it is an 'Audit feature: list parties deleted on or after a given timestamp.' It uses a specific verb ('list') and specific resource ('deleted parties'), and it distinguishes from sibling tools like 'list_deleted_opportunities' by focusing on parties.

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

Usage Guidelines4/5

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

The description explicitly states that the `since` parameter is REQUIRED and that the Capsule API rejects the call without it. It also explains the `restrictedParties` key, which helps the agent understand response behavior. However, it does not explicitly state when to use this tool versus alternatives like 'filter_parties'.

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

list_deleted_projectsA
Read-only

Audit feature: list projects deleted on or after a given timestamp. The since parameter is REQUIRED. Response also includes a restrictedProjects key for records the integration user can't read fully.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNo
sinceYesREQUIRED. ISO-8601 timestamp; only deletions on or after this point are returned. Example: '2026-01-01T00:00:00Z'.
perPageNo

TDQS

A3.5/5.0
Behavior4/5

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

Consistent with annotations (readOnlyHint=true, destructiveHint=false). Adds value by revealing the `restrictedProjects` key in responses, informing the agent about potential partial data access. No contradictions.

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

Conciseness5/5

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

Two sentences, front-loaded with purpose. Every sentence adds unique value with no redundancy. Highly efficient.

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

Completeness3/5

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

Covers purpose, required parameter, and a notable response feature. Lacks details on pagination behavior and full response structure, which would aid agent invocation. Adequate but incomplete for a list tool.

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

Parameters2/5

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

Adds meaning for the `since` parameter (required, ISO-8601 format) beyond the schema. However, it provides no explanation for `page` or `perPage`, which lack schema descriptions, leaving a gap for the agent.

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

Purpose4/5

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

The description clearly identifies this as an audit feature for listing deleted projects by timestamp, distinguishing it from general listing tools like list_projects. However, it could further differentiate from sibling tools list_deleted_opportunities and list_deleted_parties.

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

Usage Guidelines3/5

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

Explicitly states that the `since` parameter is required, providing a clear usage constraint. Does not indicate when to avoid this tool or suggest alternatives, leaving some room for confusion about appropriate context.

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

list_employeesA
Read-only

List the people who work at a given organisation party. Returns the parties whose organisation field references the given partyId. Use this to answer 'who works at X?' rather than enumerating all parties.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNo
embedNoComma-separated embeds. Valid tokens: tags, fields, organisation, missingImportantFields.
partyIdYesThe organisation's party id. Returns the people whose `organisation` field links to this party.
perPageNo

TDQS

A3.9/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is covered. The description adds useful behavioral context about the filtering relationship via the `organisation` field, but it does not disclose other behaviors such as pagination behavior, result limits, or what fields are returned. This is adequate but not particularly rich.

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

Conciseness5/5

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

The description is three short sentences, all of which earn their place. It front-loads the core purpose, follows with the exact filtering behavior, and ends with practical usage guidance. There is no redundant or vague filler.

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

Completeness4/5

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

For a simple read-only list tool with one required parameter, the description gives enough to call it correctly: the target partyId, the meaning of the result, and a use case. It lacks explicit mention of pagination or output shape, but the schema provides defaults and the absence of an output schema lowers the burden on the description. Overall it is sufficiently complete for the tool's complexity.

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

Parameters2/5

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

Schema description coverage is only 50%, yet the description mostly restates what the partyId schema already says: returns parties whose `organisation` field references the partyId. It adds no meaningful documentation for the undocumented pagination parameters `page` and `perPage`, leaving a noticeable gap. The description does not compensate for the incomplete schema coverage.

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

Purpose5/5

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

The description states a specific verb and resource: 'List the people who work at a given organisation party.' It also clarifies the exact mechanics by saying it returns parties whose `organisation` field references the given partyId. This clearly distinguishes it from generic party listing tools like get_parties or filter_parties.

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

Usage Guidelines4/5

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

The description explicitly tells the agent when to use this tool: 'Use this to answer who works at X?' It also provides an exclusion by saying 'rather than enumerating all parties.' However, it does not name specific sibling alternatives or give explicit when-not-to-use scenarios beyond that one contrast.

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

list_entity_tracksA
Read-only

List track INSTANCES on a specific record — i.e., which tracks have been applied to this opportunity / project / party. Distinct from list_track_definitions, which lists the templates. NOTE: some boards have stage-triggered automation that auto-applies tracks when an entity enters specific stages — tracks returned here may include BOTH manually-applied tracks (via apply_track) and auto-applied tracks from Capsule board rules. To distinguish, compare each track's trackDefinition.id against your application's apply_track call history.

ParametersJSON Schema
NameRequiredDescriptionDefault
entityYesWhich entity type.
entityIdYes

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already mark the operation as read-only and non-destructive. The description adds meaningful behavioral detail by warning that results may include both manually-applied and automation-applied tracks, and explains how to distinguish them using trackDefinition.id. This goes beyond what annotations provide.

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

Conciseness5/5

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

The description is efficiently front-loaded with the core purpose, then gives a sibling distinction and a high-value caveat about auto-applied tracks. Every sentence contributes useful information without padding.

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

Completeness4/5

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

Given the absence of an output schema, the description provides key return semantics by mentioning track instances and trackDefinition.id. It covers the main ambiguity around auto-applied tracks. Some additional details such as pagination or full item shape are missing, but for a non-destructive list tool the description is largely complete.

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

Parameters3/5

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

The schema describes entity via an enum and a short description, but entityId has no schema-level description. The description adds domain context by mapping the call to 'this opportunity / project / party', which partially clarifies the parameters, but it does not explain how entityId should be obtained or what it represents beyond a 'specific record'.

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

Purpose5/5

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

The description uses a specific verb and resource: 'List track INSTANCES on a specific record' and explains what those instances mean. It explicitly differentiates from list_track_definitions, making the purpose unambiguous.

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

Usage Guidelines5/5

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

It explicitly names the sibling alternative list_track_definitions and clarifies that this tool returns applied instances, not templates. It also provides important context about auto-applied tracks, helping the agent reason about when and how to interpret results.

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

list_entriesA
Read-only

Global timeline feed: every note, captured email, and completed-task record across the whole Capsule account, paginated. Default order is most-recent-first. Use this for 'what activity happened today/this week across the company?' rather than iterating list_party_entries / list_opportunity_entries / list_project_entries.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNo
embedNoComma-separated embeds. Valid tokens: attachments, participants, party, project, opportunity, creator, activityType.
perPageNo

TDQS

A4.6/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, so an agent knows it is a safe read. The description adds valuable behavior context: pagination is supported, default order is most-recent-first, and it covers multiple record types. It omits specifics like pagination response format or embed details, but given annotations cover the safety profile, this is strong.

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

Conciseness5/5

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

The description is a single, compact sentence that front-loads the purpose, states the ordering, and then gives the usage guidance. Every sentence earns its place; no fluff.

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

Completeness4/5

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

Given no output schema, the description could explain return format, but the tool is a paginated list—an agent can infer the response structure from the schema parameters. The description covers scope, ordering, and alternatives. It doesn't mention embed tokens or pagination details, but that is slightly beyond the minimum for a read-only list tool.

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

Parameters4/5

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

Schema description coverage is only 33% (only 'embed' is described in schema; 'page' and 'perPage' are not). The description does add context by mentioning pagination and the default ordering, and it hints that this is a global feed. However, it doesn't explain the exact semantics of the three parameters beyond what schema provides for 'embed'; but the description's mention of pagination compensates somewhat. Given the description adds some meaning beyond the bare parameter names and types, a 4 is justified.

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

Purpose5/5

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

The description is specific: 'Global timeline feed: every note, captured email, and completed-task record across the whole Capsule account, paginated.' It defines the resource, the verb (list), the scope, and the content type, which clearly distinguishes it from sibling tools that list entries per party/opportunity/project.

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

Usage Guidelines5/5

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

It explicitly states when to use this tool ('what activity happened today/this week across the company?') and points to sibling alternatives that should be used instead for scoped lists, naming them explicitly. This is the optimal pattern for usage guidance.

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

list_goalsA
Read-only

List sales / activity goals configured in the account (per-user or per-team revenue or activity targets). Returns an empty list for accounts that don't use the Goals feature.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNo
perPageNoPage size, max 100. Defaults to 100 for reference data.

TDQS

A4/5.0
Behavior4/5

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

Discloses empty list behavior for accounts not using Goals feature, adding value beyond readOnlyHint and destructiveHint annotations. No contradictions.

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

Conciseness5/5

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

Two efficient sentences, no fluff, front-loaded with purpose. Every sentence adds value.

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

Completeness4/5

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

Covers resource, scope, and edge case. Pagination details are in schema. No output schema needed for a list tool. Minor gap: no example or mention of sorting.

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

Parameters3/5

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

Schema coverage is 50% (only perPage described). Description adds no parameter-specific info beyond schema, meeting baseline but not compensating for missing descriptions.

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

Purpose5/5

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

Clearly states the verb 'list' and resource 'goals', specifying scope as per-user or per-team revenue or activity targets. Distinct from siblings as no other tool lists goals.

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

Usage Guidelines3/5

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

Implies usage for retrieving goals but lacks explicit guidance on when to use vs alternatives or when not to use. No mention of pagination or filtering beyond schema.

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

list_lost_reasonsA
Read-only

List all configured opportunity-loss reasons (e.g. 'Poor Qualification', 'Lost to competitor', 'Price too high'). Returns each reason's id and name; the set is account-configured rather than a fixed enum, so call this to discover valid ids before referencing a lostReason in update_opportunity when closing a deal as lost. Useful for analysing closed-lost opportunities by reason.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNo
perPageNoPage size, max 100. Defaults to 100 for reference data.

TDQS

A3.9/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, so the read-only nature is covered. The description adds that the set is account-configured (dynamic) and returns id and name. This adds useful context beyond annotations, but no additional behavioral details are needed.

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

Conciseness5/5

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

The description is three sentences long, immediately states the main purpose, and contains no superfluous information. Every sentence adds value: what the tool does, what it returns, and why to use it.

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

Completeness4/5

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

Given the simple nature of the tool (list with pagination) and no output schema, the description covers the return format (id and name) and the usage context. It could mention pagination defaults or behavior when no reasons are configured, but the schema partially covers pagination.

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

Parameters2/5

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

Schema description coverage is 50% (page and perPage parameters), but the description does not mention either parameter or their purpose. Since coverage is low, the description should compensate, but it does not, leaving the agent to rely solely on parameter names which may be ambiguous.

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

Purpose5/5

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

The description explicitly states 'List all configured opportunity-loss reasons', provides examples, and explains the resource's purpose (discovering valid ids for update_opportunity). It clearly differentiates itself from sibling tools by its specific focus on lost reasons.

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

Usage Guidelines4/5

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

The description gives explicit guidance: 'call this to discover valid ids before referencing a lostReason in update_opportunity when closing a deal as lost'. It provides context on when to use the tool, but does not explicitly state when not to use it or mention alternatives.

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

list_milestonesA
Read-only

List milestones (deal stages) within a specific opportunity pipeline. Returns each milestone's id, name, probability, and position. Used when creating opportunities (pass milestoneId to create_opportunity) or moving them across stages (set milestoneId in update_opportunity). Discover the pipelineId first via list_pipelines. Milestones are pipeline-scoped — not interchangeable across pipelines.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNo
perPageNo
pipelineIdYes

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, so the positive safety profile is covered. The description adds meaningful behavioral context beyond the annotations: the pipeline-scoping constraint, the exact fields returned, and the fact that milestones are tied to opportunity lifecycle actions. It accurately matches the read-only annotation and discloses that this is a lookup helper.

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

Conciseness5/5

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

The description is four sentences with no filler. It front-loads the primary purpose, then gives return fields, consumer tools, prerequisite, and a critical scoping warning. Every sentence earns its place and supports correct tool selection and invocation.

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

Completeness4/5

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

With no output schema, the description properly lists the returned fields (id, name, probability, position). It also covers usage context, prerequisites, and cross-pipeline constraints. The only minor gap is that pagination behavior is not mentioned, though the optional page/perPage parameters are evident from the schema and are secondary to the core milestone lookup.

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

Parameters3/5

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

Schema description coverage is 0%, so the description must compensate. It clearly explains the key required parameter pipelineId by referencing 'a specific opportunity pipeline' and telling the agent to discover pipelineId via list_pipelines. However, the optional page and perPage parameters are not described at all, leaving their semantics to inference from their names. This is partial compensation, not complete.

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

Purpose5/5

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

The description states a specific verb and resource: 'List milestones (deal stages) within a specific opportunity pipeline.' It also enumerates the returned fields (id, name, probability, position), clearly distinguishing this from generic list operations. The tie-in to create_opportunity and update_opportunity removes any ambiguity about the tool's role.

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

Usage Guidelines5/5

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

The description explicitly explains when to use this tool: when creating opportunities (pass milestoneId to create_opportunity) or moving them across stages (set milestoneId in update_opportunity). It also gives a prerequisite ('Discover the pipelineId first via list_pipelines') and a hard constraint ('Milestones are pipeline-scoped — not interchangeable across pipelines'), which functions as a when-not guidance.

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

list_opportunity_entriesA
Read-only

List timeline entries (notes, captured emails, completed-task records) for an opportunity. Returns entries newest-first. Each entry has a type ('note', 'email', 'task'), free-text content, and timestamps. Use this to answer 'what's the latest on deal X?' For party or project timelines, use list_party_entries or list_project_entries respectively.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNo
embedNoComma-separated embeds. Valid tokens: attachments, participants, party, project, opportunity, creator, activityType.
perPageNo
opportunityIdYes

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already mark the operation as read-only and non-destructive, so the description adds useful behavioral context beyond that: it discloses the sort order, the per-entry structure, and the allowed type values. It does not cover pagination or embed behavior, but for a read-only list operation this is sufficient extra transparency.

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

Conciseness5/5

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

Three sentences deliver the core purpose, return format, ordering, and routing guidance with no filler. The most important scope information is front-loaded, and each sentence earns its place.

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

Completeness4/5

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

For a tool with no output schema, the description usefully summarizes the response contents (type, content, timestamps) and ordering. It could go further by mentioning pagination defaults or embed options, but the essential calling context—what resource, what filters, what result shape—is present.

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

Parameters2/5

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

Schema description coverage is only 25%, and the description does not compensate by explaining page, perPage, or opportunityId semantics. It mentions 'for an opportunity' but not the required identifier format, pagination controls, or how embed affects results. The embed parameter has a schema description, but the other three params are effectively undocumented.

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

Purpose5/5

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

States a specific verb and resource: lists timeline entries for an opportunity, enumerates the entry types (notes, emails, task records), and notes the newest-first ordering. It also explicitly distinguishes itself from list_party_entries and list_project_entries, making the tool's purpose unmistakable.

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

Usage Guidelines4/5

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

Provides clear guidance on when to use this tool ('what's the latest on deal X?') and explicitly points to alternatives for party and project timelines. It does not mention the broader list_entries sibling or other edge cases, but the given use case and exclusions are strong enough for an agent to route correctly.

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

list_party_entriesA
Read-only

List timeline entries (notes, captured emails, completed-task records) for a party. Returns entries newest-first. Each entry has a type ('note', 'email', 'task'), free-text content, and timestamps. Use this to read the conversation history with a contact or organisation — answers questions like 'what's the latest with X?' For opportunity or project timelines, use list_opportunity_entries or list_project_entries respectively. IMPORTANT for organisations: pass includeLinkedPersons: true to surface entries filed against the org's linked people (sales-conversation emails almost always land on a person row, not the org row — Capsule's API files each entry against exactly one party). Without this flag, an org with active customer-facing email will appear quiet here even though its lastContactedAt is current. For any 'what's new with $ORG?' query, set includeLinkedPersons: true.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNo
embedNoComma-separated embeds. Valid tokens: attachments, participants, party, project, opportunity, creator, activityType.
partyIdYes
perPageNo
includeLinkedPersonsNoWhen true AND `partyId` is an ORGANISATION, also include entries filed against the organisation's linked people (the persons whose `organisation` field references this org). The connector enumerates linked persons via `GET /parties/{orgId}/people`, fans out `GET /parties/{personId}/entries` in parallel (concurrency-capped, default 5 / configurable via `CAPSULE_MCP_BATCH_CONCURRENCY`), and merges into a single feed sorted by `entryAt` descending, deduped by entry id. Default is `false` — single GET, existing behaviour unchanged. WHY THIS FLAG EXISTS: Capsule's API files each entry against exactly one party, opportunity, or project row (verified v1.6.6 wire-trace probe 4 — POST /entries rejects multi-party bodies with 422). For an organisation with multiple contacts, captured emails almost always land on a person row, not the org. As a result, `list_party_entries(orgId)` with `includeLinkedPersons: false` will miss recent customer-facing email — even though the org's own `lastContactedAt` is updated by the activity. This flag is the correct call for any 'what's new with $ORG?' question. WHEN `partyId` IS A PERSON: silently no-op — persons have no linked-people relationship in Capsule's data model, so the flag is functionally inert (the connector still issues a cheap `/people` check; the response is empty). LATENCY: 1 + N round trips for an org with N linked people, concurrency-capped (typical: 2-3 waves for N=10). Linked-person enumeration reads the first 100 linked people; use list_employees for explicit pagination when an organisation has more contacts than that. Use `includeLinkedPersons: false` for fast pre-screen reads where you only need the org-row entries (e.g. invoice/contract notes that are typically filed at the org level). PAGINATION CAVEAT: `page` and `perPage` apply to the MERGED window, and the merge has a hard ceiling — it reliably orders only the most-recent ~100 entries across the org + its people (each party is fetched at Capsule's per-party cap of 100, and a top-100-per-party merge is correct only up to global position 100). Windows that cross the ceiling are truncated to the entries still inside that top-100 set; windows starting beyond it return no entries and end the feed. It does NOT continue into older history. To read a specific contact's full timeline beyond the merged ceiling, call `list_party_entries` on that person's id directly (the default single-GET path paginates natively with no ceiling). For the LLM-driven 'what's the latest with $ORG' query this is the typical use of, the first page is exact and the ceiling is never reached.

TDQS

A4.8/5.0
Behavior5/5

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

Beyond the readOnlyHint/destructiveHint annotations, the description reveals meaningful runtime behavior: newest-first ordering, entry shape, the one-party filing rule, the linked-persons fan-out/no-op behavior, and the pagination ceiling. No contradiction with annotations.

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

Conciseness4/5

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

The description is front-loaded with the core purpose and usage, then adds important caveats. It is longer than strictly necessary, with some repetition of the includeLinkedPersons guidance, but every section contributes genuinely useful information and the structure is logical.

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

Completeness5/5

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

For a tool with no output schema, the description covers the return shape (type, content, timestamps) and ordering. It also handles the most complex behavioral aspect—linked-person inclusion—with explicit rationale, fallback behavior, latency notes, and pagination limits. An agent has enough to select and invoke this tool correctly.

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

Parameters4/5

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

Schema coverage is low at 40%, and the description compensates strongly for the most important parameters by explaining why includeLinkedPersons should be true for org queries and what happens when partyId is a person. It does not add much beyond the schema for page, perPage, or embed, but their roles are reasonably inferable and the critical parameter is thoroughly explained.

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

Purpose5/5

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

The description states a clear verb and resource: 'List timeline entries ... for a party' and specifies the entry kinds (notes, captured emails, completed-task records). It also differentiates itself from siblings by explicitly pointing to list_opportunity_entries and list_project_entries for non-party timelines.

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

Usage Guidelines5/5

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

It explicitly says when to use this tool ('read the conversation history with a contact or organisation', 'what's the latest with X?') and when not to ('For opportunity or project timelines, use ...'). It also gives detailed guidance on setting includeLinkedPersons for org-level queries and even names a fast pre-screen alternative behavior.

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

list_party_opportunitiesA
Read-only

List opportunities linked to a given party. Returns the same record shape as get_opportunity, filtered to one party — use this to answer 'what deals do we have with X?' without enumerating all opportunities. Accepts optional embed (e.g. 'tags,fields') to include those in one round-trip.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNo
embedNoComma-separated embeds. Valid tokens: tags, fields, party, milestone, missingImportantFields.
partyIdYes
perPageNo

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, covering the safety profile. The description adds useful behavioral detail beyond annotations: the returned records match get_opportunity's shape, results are filtered by party, and embed enables including related data in one round-trip. This is meaningful context for an agent.

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

Conciseness5/5

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

Three sentences, each earning its place: the core action, the output shape and filtering behavior, and the embed capability with an example. The main purpose is front-loaded and there is no filler or repetition.

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

Completeness4/5

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

For a list tool with no output schema, referencing get_opportunity's record shape is a strong substitute for documenting return fields. The embed option and pagination parameters are at least recognizable from the schema. Some detail about pagination behavior or result limits could improve completeness, but the core invocation context is covered.

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

Parameters3/5

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

Schema coverage is low at 25%, with only embed described in the schema. The description partially compensates by clarifying that partyId identifies the party and that embed accepts examples like 'tags,fields.' However, it does not explain page or perPage pagination semantics, leaving those to their schema defaults and names.

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

Purpose5/5

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

The description states a specific verb and resource: 'List opportunities linked to a given party.' It further clarifies the scope by saying the result is 'filtered to one party,' which distinguishes it from broader list/search opportunity tools. Naming get_opportunity for record shape also anchors the tool's expected output.

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

Usage Guidelines4/5

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

The description gives a clear use case: answer 'what deals do we have with X?' without enumerating all opportunities. This is strong context, though it does not explicitly name the alternative tool for enumerating all opportunities or exclude cases where search/filter opportunities would be better.

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

list_party_projectsA
Read-only

List projects linked to a given party. Returns the same record shape as get_project, filtered to one party — use this to answer 'what projects is X involved in?' without enumerating all projects. Accepts optional embed (e.g. 'tags,fields'). For the opportunity-side analogue, use list_party_opportunities.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNo
embedNoComma-separated embeds. Valid tokens: tags, fields, party, opportunity, missingImportantFields.
partyIdYes
perPageNo

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already establish readOnlyHint=true and destructiveHint=false, so the read-only behavior is covered. The description adds useful behavioral context beyond that: results are filtered to one party, share the get_project record shape, and support optional embeds, including a concrete example.

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

Conciseness5/5

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

Two sentences pack the core purpose, scoping, return-shape relationship, embed usage, and an alternative tool pointer with no filler. Important facts are front-loaded.

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

Completeness4/5

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

For a read-only list operation, the description is largely complete: it names the input (party), explains the output shape by referencing get_project, and mentions embeds. Minor ambiguity remains about what 'linked' means (primary party vs additional/associated parties), but the description's use-case phrasing mitigates this.

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

Parameters3/5

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

Schema description coverage is only 25%, so the description should compensate for undocumented parameters. It clarifies partyId's role ('given party') and marks embed as optional with an example, but it does not add much semantic detail for page and perPage or go beyond the schema's embed description.

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

Purpose5/5

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

The description uses a specific verb and resource: 'List projects linked to a given party.' It also distinguishes itself from get_project by noting it returns the same record shape but filtered to one party, and positions it as the way to answer 'what projects is X involved in?' without enumerating all projects.

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

Usage Guidelines5/5

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

It explicitly tells the agent when to use it: to answer the involvement question without listing every project. It also routes to the alternative for the opportunity side, list_party_opportunities, which makes the choice between tools clear.

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

list_pipelinesA
Read-only

List all sales pipelines defined in Capsule CRM. Returns each pipeline's id, name, and milestones (deal stages, ordered by position). Use this to discover the pipelineId when creating an opportunity, then pick a milestone from the same pipeline via list_milestones. Pipelines are stable per Capsule account — list once and cache; they rarely change.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNo
perPageNo

TDQS

A4.4/5.0
Behavior5/5

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

Annotations declare readOnlyHint=true and destructiveHint=false, and the description confirms it's a read operation listing all pipelines. Adds context that pipelines are stable and rarely change, which is beyond what annotations provide.

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

Conciseness5/5

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

Three sentences: purpose and output, usage guidance, caching advice. No redundant words, front-loaded with the most important information.

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

Completeness4/5

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

Given no output schema, the description explains the return fields (id, name, milestones). However, it lacks explanation of pagination parameters, though the tool is simple and the context signals indicate zero required parameters.

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

Parameters2/5

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

Schema description coverage is 0%, and the description does not mention the page or perPage parameters. The agent must infer pagination from parameter names alone, which is insufficient for proper invocation.

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

Purpose5/5

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

The description clearly states it lists all sales pipelines and returns id, name, and milestones. It distinguishes itself from sibling tools like list_milestones and create_opportunity by specifying the use case.

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

Usage Guidelines5/5

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

Explicitly says use this to discover pipelineId for creating opportunities and to pick a milestone from the same pipeline via list_milestones. Also advises caching since pipelines rarely change, providing clear when-to-use and optimization guidance.

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

list_project_entriesA
Read-only

List timeline entries (notes, captured emails, completed-task records) for a project. Returns entries newest-first. Each entry has a type ('note', 'email', 'task'), free-text content, and timestamps. Use this to answer 'what's the latest on project X?' For party or opportunity timelines, use list_party_entries or list_opportunity_entries respectively.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNo
embedNoComma-separated embeds. Valid tokens: attachments, participants, party, project, opportunity, creator, activityType.
perPageNo
projectIdYes

TDQS

A4.3/5.0
Behavior4/5

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

With readOnlyHint=true and destructiveHint=false already provided by annotations, the description adds useful behavioral context beyond them: results are sorted newest-first, and each entry contains a type, free-text content, and timestamps. It does not discuss pagination behavior, but the safety profile is already covered by annotations.

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

Conciseness5/5

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

Every sentence earns its place: purpose, return behavior, and sibling routing are all front-loaded without redundancy. It is appropriately sized for the tool's complexity.

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

Completeness4/5

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

There is no output schema, so the description's summary of entry fields and ordering helps fill that gap. It lacks explicit pagination/embed guidance, but schema defaults and the embed token list cover some of that. The description is sufficient for basic correct invocation and selection.

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

Parameters2/5

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

Schema description coverage is only 25%, and the description does not compensate for the undocumented page, perPage, or projectId parameters. The tool name and description imply projectId's role and the embed parameter has a schema description, but pagination semantics are left entirely to inference.

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

Purpose5/5

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

The description opens with a specific verb and resource: 'List timeline entries ... for a project.' It clarifies the entry types (notes, captured emails, completed-task records) and explicitly distinguishes the tool from list_party_entries and list_opportunity_entries, making the scope unambiguous.

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

Usage Guidelines5/5

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

The description gives a concrete use case ('what's the latest on project X?') and explicitly routes the agent away from this tool for party or opportunity timelines by naming the appropriate siblings. That is clear when-to-use and when-not-to-use guidance.

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

list_projectsA
Read-only

List projects in Capsule CRM, optionally filtered by status. Returns results in Capsule's default order (no sort parameter is supported here). For free-text matching use search_projects; for structured queries — 'most recent project', 'projects opened this month', 'projects tagged X' — use filter_projects instead.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNo
embedNoComma-separated embeds. Valid tokens: tags, fields, party, opportunity, missingImportantFields.
sinceNoOnly records CHANGED on/after this ISO-8601 timestamp (incremental sync; pairs with the list_deleted_* audit tools). Wire-verified on the plain list endpoints. Ignored by Capsule when q triggers the /search sub-resource — omit q when using since.
statusNo
perPageNo

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, so safety is covered. The description adds the default ordering and the lack of a sort parameter, which is useful behavioral context beyond annotations.

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

Conciseness5/5

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

Two sentences, front-loaded with the core purpose, then a concise routing note. No wasted words or redundancy.

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

Completeness4/5

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

The description covers the core use, alternatives, and a limitation (no sort). It doesn't explain pagination or embeds, but those are captured in the schema. For a simple list tool, this is sufficient.

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

Parameters3/5

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

The description clarifies the status parameter (optional filtering) but leaves page, perPage, and since undocumented in text. With only 40% schema coverage, the description only partially compensates for the uncovered parameters.

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

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool lists projects with an optional status filter, and explicitly contrasts it with search_projects and filter_projects. This distinguishes it from siblings and leaves no ambiguity about what it does.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It provides explicit routing: use search_projects for free-text, filter_projects for structured queries, and notes that sorting is not supported here. This tells the agent exactly when to use this tool versus alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_saved_filtersA
Read-only

List all filters that users have saved in Capsule's web UI for an entity type. Saved filters are reusable — they bundle conditions, columns, and (importantly) sort. Use this to discover what queries are already configured before building a one-off filter_* call.

ParametersJSON Schema
NameRequiredDescriptionDefault
entityYesWhich entity type the filter operates over.

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare read-only and non-destructive behavior. The description adds context that filters are saved in the web UI and bundle sort, enhancing transparency beyond annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two concise sentences with the verb and resource front-loaded. Every sentence adds value with no wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple list tool with one parameter, annotations covering safety, and no output schema, the description provides sufficient context including the tool's purpose, source of filters, and usage tip.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% with a single parameter fully documented. The description does not add additional semantic meaning beyond what the schema provides.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it lists saved filters for an entity type, distinguishing from one-off filter_* calls by noting they are reusable and bundle conditions, columns, and sort.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly advises to use this tool to discover existing queries before building a new filter_* call, providing clear when-to-use guidance and implicitly suggesting alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_stagesA
Read-only

List project stages. Without arguments returns every stage across every board (each entry carries a .board reference so you can tell them apart). Pass boardId to scope the result to one specific board's stages. Use this to discover the numeric stage.id that create_project / update_project consume — stage names alone won't do, Capsule resolves by id. For opportunity (deal) stages, use list_pipelines instead — opportunities don't have stages in the project sense.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNo
boardIdNoOptional. If provided, returns only the stages defined on that specific board (uses /boards/{id}/stages). Omit to get all stages across all boards in one call.
perPageNo

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and destructiveHint=false. The description adds context: listing behavior (all vs. scoped), the inclusion of .board reference, and the requirement for ID over name. This adds value beyond annotations, though it doesn't detail pagination or rate limits.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four sentences covering all essential aspects: core function, default behavior, parameter use, specific use case, and sibling differentiation. No redundant words; information is front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers purpose, usage, and key parameter, and hints at return structure (board reference). Lacks explicit mention of pagination or output format. Given no output schema, slightly more detail on return shape would improve completeness, but it's still adequate for a list tool with clear annotations.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is low (33%). The description explains boardId well: optional, scoping effect, and API endpoint. However, page and perPage are not elaborated beyond schema (which has no descriptions for them). The description mentions default behavior (list all without args) but no pagination details. Partial compensation but room for improvement.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly defines the tool's action: listing project stages. It distinguishes between full listing and board-scoped listing, and explicitly contrasts with opportunity stages, directing to list_pipelines. The verb 'list' and resource 'stages' are specific and unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit guidance: use to discover stage.id for create_project/update_project, and use list_pipelines for opportunity stages. It also explains that stage names are insufficient, reinforcing the purpose. No ambiguity about when to use this tool vs. siblings.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_tagsA
Read-only

List all tags available for a given entity type (parties, opportunities, or projects). Returns each tag's id, name, and any data-tag field schema. Tags are entity-specific — a party tag is not interchangeable with an opportunity tag. Use this to discover valid tag ids before calling add_tag, or to display the tag catalogue to the user when they ask 'what tags do we use?'

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNo
entityYesThe resource type to list tags for
perPageNo

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations indicate readOnlyHint=true and destructiveHint=false. Description adds behavioral detail about entity-specificity of tags, which is not in annotations. No contradictions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three concise sentences with no redundant information. Front-loaded with the core purpose, then usage guidance.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Describes return fields (id, name, data-tag schema) and entity specificity. No output schema, so this coverage is useful. Pagination behavior is implicit but could be more explicit. Consider adding info about pagination defaults or limits.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 33% with only 'entity' described. Description does not add meaning for 'page' or 'perPage' parameters. While entity is reinforced, the lack of pagination explanation reduces clarity.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description clearly states the tool lists tags for specific entity types and returns id, name, and data-tag schema. It distinguishes itself from sibling tools like add_tag by explicitly mentioning its use for discovering valid tag IDs.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states when to use: before calling add_tag or to display tag catalogue. Provides clear context, though does not explicitly mention when not to use.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_tasksA
Read-only

List tasks in Capsule CRM. Defaults to OPEN tasks; pass status to broaden. Optionally filter to a specific owner via ownerId. Capsule does not expose a due-date filter on this endpoint — for that use filter_* tools elsewhere or iterate.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNo
embedNoComma-separated embeds. Valid tokens: party, opportunity, project, owner, nextTask.
statusNoDefaults to OPEN when omitted. Pass COMPLETED to filter to completed tasks, or 'OPEN' explicitly.
ownerIdNoFilter to tasks owned by this user ID
perPageNo

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already provide readOnlyHint=true and destructiveHint=false, so the safety profile is covered. The description adds further behavioral context beyond annotations: the default status, optional owner narrowing, and the endpoint's missing due-date filter. It does not cover pagination behavior or response details, preventing a 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three tight sentences. The first sentence states the action, the second conveys defaults and filters, and the third calls out a relevant API limitation. Every sentence earns its place with no redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only list operation, the description plus schema cover the default behavior, filtering options, pagination parameters, and a well-advertised endpoint limitation. The lack of an output schema is not a meaningful gap for this kind of listing tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema already documents status and ownerId with descriptions, and the description mostly paraphrases those rather than adding new semantic meaning. page and perPage have schema defaults and constraints but no descriptive semantics, and the description does not clarify them. So it lands at the adequate baseline without fully compensating for the 60% schema coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the operation: listing tasks in Capsule CRM. It also establishes the default scope (OPEN tasks) and the distinct owner filtering capability, making it unambiguous next to sibling task and filter tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives concrete when-to-use guidance: default to OPEN, pass status to broaden, and filter by owner via ownerId. It also explicitly names the limitation (no due-date filter) and tells the agent to use filter_* tools or iterate instead, which is strong alternative routing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_teamsA
Read-only

List all teams configured in the Capsule account. Useful as input for filter_* queries that scope by team, and for reporting. LIMITATION: returns team identity only (id, name, description, timestamps). Capsule's v2 API does not expose team↔user membership through any endpoint — GET /teams/{id}/users 404s, embed=users is silently ignored, and GET /users/{id} doesn't include a teams field. To determine whether a given user belongs to a given team, either check Capsule's web UI Team Membership page, or probe via update_project { ownerId: U, teamId: T } / batch_update_opportunity { items: [{ id: <any opp>, ownerId: U, teamId: T }] } and read the response — 422 'owner is not a member of the team' means U ∉ T. Both probe paths apply the same membership constraint server-side.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNo
perPageNoPage size, max 100. Defaults to 100 for reference data.

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and destructiveHint=false. The description adds transparency about the API's membership limitation and provides concrete probe methods, going well beyond annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core purpose, then provides usage guidance, and finally details the limitation. Every sentence adds value, and the structure is logical despite length.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's simplicity (list with pagination) and the critical membership limitation, the description is complete. It covers return data, usage context, and the workaround for the missing endpoint.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 50% (perPage has description, page does not). The description adds no information about parameters, leaving users without guidance on the 'page' parameter or how to use pagination effectively.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool lists all teams, with specific verb and resource. It distinguishes from sibling filter_* tools by noting its utility as input for those queries.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states when to use (for filtering/reporting) and provides a detailed workaround for membership checking, which is a significant limitation. This gives clear guidance on alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_track_definitionsB
Read-only

List workflow track definitions: reusable templates that auto-create tasks at configured intervals when applied to an opportunity or project. Each track includes nested taskDefinitions specifying what to create and when. Use this to understand what automations exist.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNo
perPageNoPage size, max 100. Defaults to 100 for reference data.

TDQS

B3.3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and destructiveHint=false, so the description does not need to repeat that. It adds context about tracks being reusable templates with nested tasks, which is helpful but does not cover behavioral traits like pagination behavior or rate limits.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is three sentences, front-loaded with the main purpose, and every sentence adds value. No fluff.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the simple schema (2 optional params, no output schema) and annotations present, the description is fairly complete but missing parameter explanations and return value structure. It covers the 'what' and 'why' but not the 'how to use' details.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description does not mention the parameters (page, perPage) or their meaning. With 50% schema description coverage (perPage documented, page undocumented), the description should compensate but fails to add any semantic value beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool lists workflow track definitions, explaining they are reusable templates that auto-create tasks. It also hints at the contents (nested taskDefinitions). However, it does not explicitly differentiate from sibling tools like 'list_entity_tracks' or 'show_track'.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage by saying 'Use this to understand what automations exist.' It gives a clear context but lacks explicit guidance on when to use versus alternatives or when not to use.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_usersA
Read-only

List all users in the Capsule account. Returns each user's id, username, optional first/last name, role, and party reference. Some users may have null first/last name fields (only username set) — fall back to username for display. Use this to discover user ids for owner-filtered queries against opportunities, projects, and tasks, or to map a user to their party record via user.party.id.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNo
perPageNo

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare safe read operation. Description adds important detail about null first/last name fields, guiding display fallback. Does not mention pagination behavior, but parameters imply pagination.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, front-loaded with purpose and return fields, followed by usage advice. Every sentence adds value without redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Describes return fields and null handling well. Lacks pagination details, but given low complexity and pagination parameters, it is mostly complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so description must explain parameters, but it does not mention 'page' or 'perPage' at all. This is a significant gap for agent understanding.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states 'list all users in the Capsule account' with specific verb and resource. Lists returned fields, distinguishing it from sibling tools like list_employees.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit usage: discover user IDs for owner-filtered queries and mapping to party records. Lacks guidance on when not to use it or alternatives, but context is sufficient.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

remove_additional_partyA
Destructive

Remove an additional-party link between an opportunity/project and a party. The party itself is NOT deleted. Requires confirm=true. Reversible by re-adding via add_additional_party. Idempotent on retry: response is {removed: true, alreadyRemoved: false, entity, entityId, partyId} on a fresh remove or {removed: true, alreadyRemoved: true, ...} if the link was already gone (Capsule's 404 is caught and converted).

ParametersJSON Schema
NameRequiredDescriptionDefault
entityYesWhich entity has the additional-party links.
confirmYesMust be set to true. Removes the link between the entity and the additional party. The party itself is not deleted. Reversible by re-adding the link.
partyIdYes
entityIdYes

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already mark this as destructive, but the description goes well beyond that by disclosing the confirm requirement, reversibility, idempotent retry behavior, exact response shapes for both fresh and already-removed cases, and the internal handling of Capsule's 404. This is rich, behavior-relevant context that an agent would not otherwise know.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three tight sentences front-load the core action and non-deletion caveat, then cover reversal, idempotence, and response details. Every sentence earns its place with no filler or repetition of annotation data.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description still fully covers return values, error handling, required confirm flag, and the action's reversible/idempotent nature. An agent has everything needed to invoke this destructive operation correctly, and the annotations cover the safety profile.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema provides descriptions for entity and confirm but leaves partyId and entityId undocumented. The description clarifies that a link exists between an entity and a party, and the response shape includes entityId and partyId, which helps infer their roles. However, it does not directly explain how these IDs map or compensate fully for the missing schema descriptions, so it only partially adds meaning.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('Remove') and resource ('additional-party link between an opportunity/project and a party'), and clarifies what it does NOT do ('The party itself is NOT deleted'). This clearly distinguishes it from delete_party and other remove_* siblings, giving an agent immediate understanding of its scope.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description names the counterpart operation (add_additional_party) as the way to reverse the action, and the 'party itself is NOT deleted' clause implicitly tells the agent it is not for party deletion. It lacks an explicit 'when-not-to-use' statement against other delete/remove tools, but the context is clear enough for correct selection among siblings.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

remove_party_address_by_idA

Remove one address entry from a party by its row id. Atomic and reversible — no confirm: true gate (re-add with add_party_address). Discover the id via get_party. Idempotent on retry: response is {removed: true, alreadyRemoved: false, partyId, addressId, party} on a fresh remove or {removed: true, alreadyRemoved: true, partyId, addressId} if the row was already gone.

ParametersJSON Schema
NameRequiredDescriptionDefault
partyIdYes
addressIdYesCapsule's id for the address row. Read it from get_party (each entry in addresses carries an id).

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description discloses atomicity, reversibility, the absence of a confirm gate, idempotent retry behavior, and the exact response shape for both fresh and already-removed cases. This substantially exceeds the annotations and is consistent with readOnlyHint=false and destructiveHint=false.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Each sentence earns its place: purpose, atomicity/reversibility, id discovery, and response semantics. The inline response examples are justified because there is no output schema.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a two-parameter, no-output-schema mutating tool, the description covers prerequisites, side effects, reversal, and return values. Only the partyId semantics are thin, and that is minor given the rest of the context.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

addressId is well explained both in the schema and through the get_party discovery instruction. However, partyId has no schema description and the description never defines how to find or use it, leaving a real gap at 50% schema coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Remove one address entry from a party by its row id.' This distinguishes it from sibling address/email/phone/website removers and says exactly what is operated on.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives clear workflow context: discover the id via get_party and re-add with add_party_address. It does not explicitly enumerate when-not-to-use alternatives, but the address-specific scope and named re-add alternative make the intended usage clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

remove_party_email_address_by_idA

Remove one email-address entry from a party by its row id. Atomic and reversible — no confirm: true gate (re-add with add_party_email_address). Discover the id via get_party — each entry in the emailAddresses array carries one. Use this to replace an existing entry: remove the old id, then call add_party_email_address with the new value (any associated server-side metadata on the old row is discarded along with the row). Idempotent on retry: response is {removed: true, alreadyRemoved: false, partyId, emailAddressId, party} on a fresh remove (the updated party shape is included) or {removed: true, alreadyRemoved: true, partyId, emailAddressId} if the row was already gone (Capsule's 404 is caught).

ParametersJSON Schema
NameRequiredDescriptionDefault
partyIdYes
emailAddressIdYesCapsule's id for the email-address row. Read it from get_party (each entry in emailAddresses carries an id).

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With annotations limited to readOnlyHint=false and destructiveHint=false, the description carries the behavioral burden and excels: it discloses atomicity, reversibility, the absence of a confirm:true gate, idempotency on retry, exact response shapes for both fresh and already-removed cases, Capsule's 404 being caught, and the side effect that server-side metadata on the old row is discarded. This is far beyond what the annotations provide.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense — roughly four sentences — but each clause earns its place given the tool's genuinely complex behavior (idempotency, dual response shapes, metadata side effects, error handling). It is front-loaded with the core purpose before layering workflow and idempotency details; only minor restructuring could tighten it further.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema and thin annotations, the description must explain return values and it does so exhaustively, covering both success shapes and the caught-404 case. For a two-parameter removal tool, nothing an agent needs to invoke it correctly or interpret its response is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is only 50% (partyId has no schema description), and the description compensates by explaining how to obtain both values: the id is discovered via get_party, where each entry in the emailAddresses array carries one. This adds concrete provenance for the parameters that the sparse schema lacks.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The opening sentence, 'Remove one email-address entry from a party by its row id,' names a specific verb, resource, and identifier mechanism. This cleanly distinguishes it from sibling removal tools like remove_party_phone_number_by_id and remove_party_address_by_id without needing to open any other schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives an explicit replacement workflow — 'remove the old id, then call add_party_email_address with the new value' — and names get_party as the discovery mechanism for the id. It clearly establishes when to use this tool as a step, though it stops short of explicitly listing exclusion cases or comparing against the phone/address/website removal siblings.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

remove_party_phone_number_by_idA

Remove one phone-number entry from a party by its row id. Atomic and reversible — no confirm: true gate (re-add with add_party_phone_number). Discover the id via get_party. Idempotent on retry: response is {removed: true, alreadyRemoved: false, partyId, phoneNumberId, party} on a fresh remove or {removed: true, alreadyRemoved: true, partyId, phoneNumberId} if the row was already gone.

ParametersJSON Schema
NameRequiredDescriptionDefault
partyIdYes
phoneNumberIdYesCapsule's id for the phone-number row. Read it from get_party (each entry in phoneNumbers carries an id).

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description goes far beyond the annotations by disclosing atomicity, reversibility, absence of a confirm gate, idempotency, and the exact response shapes for both fresh and repeated removals. This rich behavioral detail clarifies why destructiveHint is false despite the remove operation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three dense sentences carry all essential information: operation, behavioral traits, id discovery, and idempotency semantics. The action is front-loaded, and every clause earns its place without redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the absence of an output schema, the description fully specifies return values for both success and already-removed scenarios. It also covers how to obtain the required id and how to revert the operation, leaving little ambiguity for an agent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description adds meaning by explaining that phoneNumberId is a row id discoverable via get_party, complementing the schema's existing note. partyId is self-evident from its name and the required fields; with 50% schema coverage, the description effort is adequate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('Remove'), a precise resource ('phone-number entry'), and the targeting mechanism ('by its row id'), making the tool's scope unmistakable. This clearly differentiates it from sibling removal tools like remove_party_email_address_by_id or remove_party_address_by_id.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear context: discover the id via get_party, and re-add with add_party_phone_number if needed. It does not explicitly contrast with sibling removal tools, but the specificity of 'phone-number entry by row id' makes the usage context unambiguous.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

remove_party_website_by_idA

Remove one website entry from a party by its row id. Atomic and reversible — no confirm: true gate (re-add with add_party_website). Discover the id via get_party. Idempotent on retry: response is {removed: true, alreadyRemoved: false, partyId, websiteId, party} on a fresh remove or {removed: true, alreadyRemoved: true, partyId, websiteId} if the row was already gone.

ParametersJSON Schema
NameRequiredDescriptionDefault
partyIdYes
websiteIdYesCapsule's id for the website row. Read it from get_party (each entry in websites carries an id).

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description discloses atomicity, reversibility, lack of a confirm gate, idempotent retry behavior, and the exact response shapes for fresh removals versus already-removed rows. This goes well beyond the sparse annotations and gives the agent an accurate mental model of side effects.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences with no filler. The first sentence front-loads the action and the second packs the idempotency and response details efficiently.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given there is no output schema, the description provides the response shapes for both fresh and repeated removals, explains id discovery, and confirms reversibility. An agent has everything needed to invoke and interpret the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

websiteId is richly explained as Capsule's id for the website row, discoverable from get_party where each entry carries an id. partyId's meaning is conveyed by its name and the 'party' context. The description adds useful guidance beyond the schema's partial documentation.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states 'Remove one website entry from a party by its row id' — a specific verb, resource, and unit of work. It distinguishes the tool from sibling tools like remove_party_email_address_by_id and remove_party_phone_number_by_id by targeting website entries specifically.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly says how to discover the id via get_party and notes that the operation is reversible via add_party_website. It does not enumerate when not to use it, but the tool's role among siblings is clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

remove_tag_by_idA

Detach a tag from a party, opportunity, or project. Atomic — one PUT to Capsule. Reversible — no confirm: true gate (re-attach with add_tag using the same tag name). The tagId parameter is the tag's id, readable via get_party/get_opportunity/get_project with embed='tags' (list_tags returns the same ids and also works, but reading via embed first confirms the tag is actually attached to this entity). The tag definition itself remains in the tenant for other entities that still share it. Idempotent on retry: response is {removed: true, alreadyRemoved: false, entity, entityId, tagId, ...<updated entity>} on a fresh detach or {removed: true, alreadyRemoved: true, entity, entityId, tagId} if the tag was already detached (Capsule's 422 'tag not found to delete' is caught and converted).

ParametersJSON Schema
NameRequiredDescriptionDefault
tagIdYesThe tag's id. Read via get_party / get_opportunity / get_project with embed='tags' — each tag entry in the response has an `id` field. list_tags returns the same ids for the same tags, so either source works; reading via embed first is the safer pattern because it confirms the tag is actually attached to this entity before you try to remove it (otherwise Capsule returns 422 'tag not found to delete'). Removing detaches the tag from this entity only; the tag definition itself persists in the tenant for other entities that share it.
entityYesWhich entity type.
entityIdYesThe party/opportunity/project id.

TDQS

A5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description goes well beyond the annotations by disclosing that the operation is atomic (one PUT), reversible, has no confirm gate, is idempotent on retry, converts Capsule's 422 into an alreadyRemoved response, and leaves the tag definition intact. This is rich behavioral context that the annotations alone do not provide.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense but every sentence earns its place: purpose, atomicity, reversibility, idempotency, response shape, and persistence of the tag definition. The main action is front-loaded, and the details are organized logically.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description supplies concrete response examples for both fresh detach and already-detached cases, explains the error-handling behavior, and covers side effects on the tag definition. This is complete enough for an agent to invoke the tool correctly without guessing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Although schema coverage is 100%, the description adds meaningful guidance beyond the schema: how to source tagId via embed='tags', why reading via embed is the safer pattern, and the exact behavior when the tag is already detached. This materially helps the agent provide correct parameter values.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description begins with a specific verb and resource: 'Detach a tag from a party, opportunity, or project.' It clearly identifies the operation and distinguishes it from related tools like add_tag and delete_tag_definition by explaining what this tool does not do (the tag definition persists).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly states when to use this tool and names alternatives: re-attach via add_tag, confirm attachment via get_party/get_opportunity/get_project with embed='tags', and notes that list_tags returns the same ids. It also clarifies that removing a tag is not the same as deleting the tag definition, which helps an agent choose correctly among sibling tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

remove_trackA
Destructive

Remove a track instance from its entity. Capsule also deletes the auto-tasks the track created when it was applied; copy any task details you need before removing the track. Requires confirm=true. Idempotent on retry: response is {removed: true, alreadyRemoved: false, trackId} on a fresh remove or {removed: true, alreadyRemoved: true, trackId} if the track was already gone.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes
confirmYesMust be set to true. Removes the track instance from its entity. **Capsule also deletes the auto-tasks the track created when it was applied** — they go with the track and become unreachable (404 on GET /tasks/{id}, gone from list_tasks on the parent entity). If you need any of those tasks to outlive the track, copy their content into fresh tasks (or use the web UI) before calling remove_track.

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Despite annotations already indicating destructiveHint=true, the description adds valuable detail: removing the track also deletes its auto-tasks, they become unreachable (404 on GET /tasks/{id}), and users should copy needed details first. It also discloses idempotency and exact response shapes for fresh vs already-removed calls, which annotations cannot convey.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is three sentences with no filler: core action, destructive side effect, and prerequisite/idempotent response. The most important operational facts are front-loaded, and every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a destructive mutation with no output schema, the definition covers the essential ground: side effects, confirmation requirement, retry semantics, and response format. The only material gap is that id is not explicitly defined as the track-instance identifier, which could cause confusion in a tool with many id-bearing siblings.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The confirm parameter is thoroughly documented in the schema, so the description adds little there. However, the id parameter has no schema description, and the main description only indirectly indicates that id refers to the track instance via the response field trackId and the phrase 'Remove a track instance.' This is adequate but leaves some inference to the agent.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and object: 'Remove a track instance from its entity.' This clearly distinguishes remove_track from siblings like apply_track, update_track, get_track, and list_entity_tracks. It states both the operation and the resource affected without ambiguity.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear context for use: removing a track instance from an entity. It also provides a critical precondition ('Requires confirm=true') and describes retry behavior, which guides correct invocation. It does not explicitly name alternatives or when-not-to-use, but the purpose is specific enough that an agent can select it appropriately among the sibling tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

run_saved_filterA
Read-only

Run a saved filter by id and return its results, paginated. Unlike filter_parties / filter_opportunities / filter_projects (which use the ad-hoc filter endpoint and CANNOT sort), saved filters DO support sort — the orderBy is configured in Capsule's web UI when the filter is created. So 'most recent X by Y' questions are answerable in one call IF a saved filter exists; use list_saved_filters first to find one.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesThe saved filter id (from list_saved_filters).
pageNo
embedNoComma-separated embeds. Valid tokens depend on entity — parties: tags, fields, organisation, missingImportantFields; opportunities: tags, fields, party, milestone, missingImportantFields; projects: tags, fields, party, opportunity, missingImportantFields.
entityYesWhich entity type the filter operates over.
perPageNo

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already signal readOnly/destructive safety; the description adds important behavior beyond that: results are paginated, saved filters support sort with orderBy fixed in the web UI, and the one-call shortcut only works if a saved filter exists. No contradictions with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core operation, then adds a crisp distinction and a concrete use case. Every sentence earns its place; no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only filter tool, it covers purpose, pagination, sorting caveat, and prerequisite discovery via list_saved_filters. Combined with the schema's param constraints and default values, an agent has enough to select and invoke the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema covers id, entity, and embed with descriptions; page and perPage rely on names/defaults/constraints. The description adds key id provenance ('from list_saved_filters') and pagination context, but does not explain page/perPage values beyond what the schema already conveys.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific action ('Run a saved filter by id'), the resource ('saved filter'), and the output ('return its results, paginated'). It also explicitly distinguishes itself from filter_parties/filter_opportunities/filter_projects, so an agent can tell it apart without inspecting schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives precise usage context: use saved filters when sort is needed because the ad-hoc filter endpoint cannot sort, and use list_saved_filters first to find the id. This directly answers when-to-use versus alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_opportunitiesA
Read-only

Free-text search or list opportunities in Capsule CRM. Returns results in Capsule's default order (no sort parameter is supported here). For structured queries — 'most recent', 'won this quarter', 'in pipeline X at milestone Y' — use filter_opportunities instead.

ParametersJSON Schema
NameRequiredDescriptionDefault
qNoFree-text search query
pageNo
embedNoComma-separated embeds. Valid tokens: tags, fields, party, milestone, missingImportantFields.
sinceNoOnly records CHANGED on/after this ISO-8601 timestamp (incremental sync; pairs with the list_deleted_* audit tools). Wire-verified on the plain list endpoints. Ignored by Capsule when q triggers the /search sub-resource — omit q when using since.
perPageNo

TDQS

A4.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The readOnlyHint and destructiveHint annotations already cover the safety profile. The description adds the useful behavioral constraint that results are returned in Capsule's default order and no sort parameter is supported. However, it does not describe response format or pagination behavior, so the added transparency is moderate but not exceptional.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences with no filler: first states the action, then the ordering constraint, then the alternative for structured queries. Every sentence earns its place and the most important information is front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool has 5 parameters, annotations for safety, and no output schema, the description covers tool selection and a key behavioral constraint. The main missing element is an explicit return-shape description, but for a search/list tool this is loosely inferable. The schema covers the subtle 'since' behavior, so the overall definition is nearly complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 60%; q, embed, and since have descriptions, but page and perPage do not. The tool description does not explain the missing pagination parameters, though it does imply q is optional via 'search or list' and communicates that sorting is not available. It partially compensates for schema gaps but does not fully carry the load.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description states a specific verb-resource pair: 'Free-text search or list opportunities in Capsule CRM.' It also distinguishes itself from filter_opportunities for structured queries, so an agent can tell which tool is appropriate without opening schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly names the alternative tool and the conditions that select it: 'For structured queries — most recent, won this quarter, in pipeline X at milestone Y — use filter_opportunities instead.' This leaves no ambiguity about when to use this tool versus its sibling.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_partiesA
Read-only

Free-text search or list people and organisations in Capsule CRM. Returns results in Capsule's default order (no sort parameter is supported here). For structured queries — 'most recent', 'tagged X', 'added this month' — use filter_parties instead.

ParametersJSON Schema
NameRequiredDescriptionDefault
qNoFree-text search query
pageNo
embedNoComma-separated embeds. Valid tokens: tags, fields, organisation, missingImportantFields.
sinceNoOnly records CHANGED on/after this ISO-8601 timestamp (incremental sync; pairs with the list_deleted_* audit tools). Wire-verified on the plain list endpoints. Ignored by Capsule when q triggers the /search sub-resource — omit q when using since.
perPageNo

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and destructiveHint=false, so the description only needs to add behavior beyond safety. It adds the key behavioral fact that results come in Capsule's default order and no sort parameter is supported, which is not visible in the schema or annotations. It doesn't overpromise details like result formatting, but the added ordering note is genuine behavioral disclosure.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two compact sentences with no filler. The first sentence states the core action and resource; the second adds the caveat and the alternative. This is appropriately front-loaded and every clause earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple read-only search/list tool, the combination of the description and the input schema covers what the tool does, when to use the sibling filter_parties, the supported ordering behavior, and pagination parameters. There is no output schema, so an agent does not get a result shape, but the description's 'returns results' plus the tool's plain object domain is sufficient for selection and invocation. Minor gaps like exact result fields exist but are not critical here.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema already documents q, embed, and since with meaningful descriptions, so the description only clarifies that q can be omitted to list all parties ('search or list') and that sorting is not an available parameter. With moderate schema coverage (60%), the description contributes a little but leaves page/perPage and the interaction between q and since to the schema. This is adequate but does not reach significant added param semantics.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('search or list'), names the resource ('people and organisations in Capsule CRM'), and immediately clarifies its scope. It also distinguishes itself from filter_parties by saying structured queries belong there, so no sibling ambiguity remains.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly tells the agent when not to use this tool: structured queries like 'most recent', 'tagged X', or 'added this month' should go to filter_parties instead. It also states the sorting limitation, which helps an agent decide whether this tool can satisfy a request. This is explicit routing guidance rather than implied context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_projectsA
Read-only

Free-text search projects in Capsule CRM (matches name and description). Returns results in Capsule's default order (no sort parameter is supported here). Omit q to list all projects. For structured queries — 'most recent project', 'projects opened this month', 'projects tagged X' — use filter_projects instead.

ParametersJSON Schema
NameRequiredDescriptionDefault
qNoFree-text search query
pageNo
embedNoComma-separated embeds. Valid tokens: tags, fields, party, opportunity, missingImportantFields.
sinceNoOnly records CHANGED on/after this ISO-8601 timestamp (incremental sync; pairs with the list_deleted_* audit tools). Wire-verified on the plain list endpoints. Ignored by Capsule when q triggers the /search sub-resource — omit q when using since.
perPageNo

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and destructiveHint=false, so safety is covered. The description adds valuable behavioral context: results come in Capsule's default order (no sort parameter), omitting q lists all projects, and the since parameter is ignored when q triggers the /search sub-resource. This goes beyond the schema and provides actionable knowledge. A 4 is appropriate because it doesn't describe edge cases like empty results or response structure, but it does disclose the key behaviors.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and well-structured: it leads with the core purpose, then adds the order caveat, then the q-omission behavior, and finally the routing to filter_projects. Every sentence provides distinct value with no redundancy or fluff.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only search tool with 5 parameters, 0 required, and no output schema, this description covers all essential aspects: what it searches, how to list all, how times and embeds work, and when to use the alternative. Pagination is handled by schema defaults and constraints. Nothing an agent needs to call it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 60%, so q, embed, and since already have descriptions. The description adds further meaning: q is a free-text search that also covers the case of omitting it (list all), and since explicitly warns about its interaction with q. These clarifications help the agent understand parameter semantics beyond the schema. The remaining parameters (page, perPage) are self-explanatory with defaults and constraints in the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('Free-text search') and resource ('projects in Capsule CRM'), specifies that it matches name and description, and explicitly differentiates from filter_projects by naming the alternative and the condition for using it. This makes the tool's purpose unambiguous even without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives clear guidance on when to use this tool (free-text search) vs filter_projects (structured queries like 'most recent project'), and notes the special behavior of omitting q to list all projects. It also warns about the since parameter interaction, which is critical for correct usage. No inference is required.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_entryA

Edit an existing timeline entry — typically a note. Provide the entry id plus the fields you want to change (content, subject). Only the fields you supply are modified; other fields keep their current values. Cannot change the entry's type. Use this to correct or extend a note added previously.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesEntry ID to update
contentNoNew body text for the entry. For notes, this is the markdown content; for emails, the body. Provide only if you want to change it.
subjectNoNew subject line. Mostly meaningful on email-type entries; on plain notes Capsule accepts the call (HTTP 200) but **does not store the subject and does not advance `updatedAt`** — a true no-op for inapplicable fields. `entryAt` (when the note was authored) is preserved across edits; `updatedAt` advances only when an applicable field actually changes. To sort/filter by 'when did this happen', use `entryAt`; for 'last touched', use `updatedAt`.
removeAttachmentIdsNoAttachment ids to detach from this entry (ids from the entry's attachments array; wire shape {id, _delete: true}, verified live — removal returns the entry with the attachment gone). Other attachments are untouched. Capsule rejects removing the LAST attachment from an entry that has no content. To ADD an attachment to an existing entry, use upload_attachment with entryId.

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare readOnlyHint=false and destructiveHint=false, so the tool is known to mutate without being destructive. The description adds meaningful behavioral detail beyond that: 'Only the fields you supply are modified; other fields keep their current values' (partial-update/PATCH semantics) and 'Cannot change the entry's type.' It does not describe side effects like updatedAt behavior or return values, but the annotations lower the bar, and the added constraints are valuable.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences with no wasted words. The purpose is front-loaded, followed by required inputs, update semantics, a hard constraint, and a usage cue. Every sentence contributes to selection or invocation.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description is largely complete for an update tool: it covers purpose, required input, partial-update behavior, type immutability, and typical usage. However, it omits the removeAttachmentIds capability entirely and over-rotates on 'note' even though the schema shows the tool also handles email-type entries. The rich schema descriptions compensate for these gaps, so this is not a major defect.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3. The description adds a useful cross-parameter semantic: only supplied fields are modified, which is a global PATCH rule not stated in any individual schema description. It also names content and subject as the changeable fields, though it omits removeAttachmentIds, which the schema itself documents well.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Edit an existing timeline entry — typically a note.' This clearly distinguishes it from sibling tools like add_note (create), delete_entry (delete), and get_entry (read). Stating 'Cannot change the entry's type' further sharpens the purpose boundary.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase 'Use this to correct or extend a note added previously' provides clear context for when to invoke the tool. It does not explicitly name sibling alternatives like add_note for creation or delete_entry for deletion, and the only exclusion mentioned is type immutability. The schema's removeAttachmentIds description does point to upload_attachment for adding attachments, which helps, but that is not in the main description.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_opportunityA

Update fields on an existing opportunity, including the parent-reference field partyId to reassign the opp to a different primary party. ownerId and teamId both accept null to unassign (verified empirically in v1.6.5 wire-trace — brings update_opportunity into parity with update_party and update_project). The combination {ownerId: null, teamId: <id>} puts an opportunity into 'team-owned, no specific user' state, matching the pattern available on parties and projects. Only the fields you provide are changed. Closed (Won/Lost) opportunities ARE editable — Capsule does not enforce closed-record immutability, so value, description, etc. can be changed on a Won opp without warning. If the workflow needs historical revenue numbers to be stable, enforce that caller-side. Capsule requires every opportunity to have a party — passing partyId: null is rejected with 422 'party is required' (Unlike update_task.partyId which IS nullable — tasks can be orphaned in Capsule's model).

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes
nameNo
valueNo
fieldsNoSet custom field values on this record. PARTIAL UPDATE: only the definitions you list are touched; any field NOT in this array is left unchanged. Discover available definitions via list_custom_fields; read current values via get_opportunity with embed='fields'.
teamIdNoReassign team: pass a team ID (discover via list_teams) to set, or `null` to unassign. Capsule preserves the existing owner across a team change (server-side), so `update_opportunity { teamId }` alone is safe — the owner is carried through. Owner must be a member of the new team or Capsule returns 422 'owner is not a member of the team'. Independent from `ownerId` — setting `teamId` does NOT clear the owner.
ownerIdNoReassign owner: pass a user ID to set, or `null` to unassign (verified empirically in v1.6.5 wire-trace — Capsule accepts `owner: null` on PUT /opportunities/:id, mirroring the v1.6.4 finding on /parties; brings update_opportunity into parity with update_party and update_project). When you supply `ownerId` and omit `teamId`, the connector fetches the opportunity's current team and includes it in the PUT body to preserve it across the owner change. Without this defensive read, Capsule's PUT would clear the existing team (see NOTES-ON-CAPSULE-API.md §27 — same asymmetric semantic as project updates). Supply `teamId` explicitly on the same call to change the team instead. Combine `ownerId: null` + `teamId: <T>` in one call to transfer an opportunity to team-ownership with no specific user (verified empirically in v1.6.5; the owner-clears-team semantic doesn't fire when owner is being cleared to null).
partyIdNoReassign the opportunity to a different primary party. Capsule requires every opportunity to have a party — passing `null` is rejected with 422 'party is required' (use Capsule's web UI if you need to dissolve the link entirely). Discover ids via search_parties / filter_parties. No defensive read-modify-write needed: this connector verified empirically (v1.6.3 wire-trace) that `party` is a standalone PUT field on /opportunities and does not interact with the asymmetric owner/team semantic from NOTES-ON-CAPSULE-API.md §27. NOTE: parent-ref nullability differs by entity — `update_task.partyId` IS nullable (orphan task), but opportunities and projects must always have a parent party. The same applies to `update_project.partyId`.
durationNoHow many durationBasis units the contract runs (e.g. 12 with MONTH). Must be null/omitted when durationBasis is FIXED. Wire-verified: POST stores it, PUT changes it, and PUT duration:null with durationBasis:FIXED clears it.
descriptionNo
milestoneIdNoMove the opportunity to this milestone. Side effects depend on the target: closing milestones (Won/Lost) auto-set `closedOn` to today and `probability` to the milestone default (100/0), preserving `lastOpenMilestone` as the previous open stage; moving back to an open milestone clears `closedOn` and re-applies the milestone's default probability (Won/Lost is reversible — no separate reopen tool). WARNING: Capsule does NOT validate that the new milestone belongs to the opportunity's current pipeline. Passing a milestoneId from a different pipeline silently relocates the opportunity across pipelines, and `lastOpenMilestone` may then reference a milestone in the previous pipeline. Verify against the opportunity's current pipeline (read the opp first, list its pipeline's milestones via list_milestones) before passing a cross-pipeline id. NOTE: changing `milestoneId` can fire **pipeline / milestone-reached automations** that mutate `owner` / `team` on the destination milestone (same shape as `create_opportunity` — see its `milestoneId` description for the owner-clearing automation caveat). If a milestone-change-and-owner-set in the same call lands with `owner: null`, follow up with a second `update_opportunity` (or `batch_update_opportunity`) carrying both `ownerId` and `teamId` — milestone-reached triggers only fire on the transition, so a subsequent PUT preserves your values.
probabilityNoWin probability 0–100. On an open milestone this overrides the milestone's default probability. CANNOT be set in the same call as a closing milestone (Won/Lost) — Capsule processes the milestone change first, the opportunity becomes closed, then the probability update is rejected as edit-on-closed-opp with 422 'probability can be updated only for open opportunity'. To close an opportunity, leave probability out of the call: it auto-snaps to 100% (Won) or 0% (Lost).
lostReasonIdNoReason the opportunity was lost. Only meaningful when transitioning to a Lost milestone — Capsule silently drops it for other milestones. Without this set, a connector-driven Lost-close leaves `lostReason: null`. Discover IDs via list_lost_reasons.
durationBasisNoTime unit of the opportunity's contract duration. FIXED means a one-off (no recurring duration) — `duration` must be omitted/null with FIXED (Capsule 422s otherwise; wire-verified). Recurring deals: pair with `duration`, e.g. durationBasis MONTH + duration 12.
expectedCloseOnNo

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the basic readOnlyHint=false and destructiveHint=false annotations, the description discloses several non-obvious behaviors: `ownerId` and `teamId` accept null to unassign, `{ownerId: null, teamId: <id>}` creates a team-owned state, only provided fields change, closed opportunities remain editable, and `partyId: null` is rejected with 422. This is substantial behavioral disclosure that an agent could not infer from annotations alone.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The first sentence states the core purpose, and every subsequent sentence carries a real behavioral caveat or differentiation. Although dense, there is no filler or tautology; the empirical verification notes and parity references all aid correct invocation. The structure is front-loaded and informative.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a complex 14-parameter update tool with no output schema, the description covers the critical context: partial-update semantics, closed-opportunity editability, owner/team interaction, and the required party constraint. Per-parameter details are delegated to the schema, which is appropriately rich. The only minor gap is that return-value expectations are not described, but that is not essential for selecting and invoking this tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 64% schema description coverage, the schema already documents many parameters in detail. The top-level description adds valuable cross-parameter and semantic context: the owner/team null combination, partyId non-nullability, and the closed-opportunity editability affecting `value` and `description`. It does not enumerate every remaining parameter, but given the rich schema-level descriptions this is more than adequate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Update fields on an existing opportunity', clearly distinguishing it from creation or listing tools. It also names the distinguishing parent-reference field `partyId` and contrasts nullability with `update_task.partyId`, so an agent can disambiguate it from similar update tools without opening schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear context for when to use this tool: partial update of a single existing opportunity, with explicit caveats about closed Won/Lost opportunities being editable and the caller needing to enforce revenue stability. It does not explicitly call out batch_update_opportunity or create_opportunity as alternatives, but the single-record update context is strong and no misleading exclusions are present.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_partyA

Update top-level fields on an existing party (about, firstName/lastName/name/title/jobTitle, ownerId, teamId, organisationId). ownerId and teamId both accept null to unassign — the combination {ownerId: null, teamId: <id>} puts a party into 'team-owned, no specific user' state (the common pattern when transferring ownership to a team after a user departs). For PERSON parties, organisationId links to an organisation or null unlinks; for ORGANISATION parties Capsule silently ignores organisationId. Only the fields you provide are changed. Child arrays (emailAddresses / phoneNumbers / addresses / websites) on this tool are APPEND-ONLY: items are merged into the existing list, not replaced. For surgical changes — replacing one email, removing one phone number, fixing the type on one address — use the dedicated atomic tools: add_party_email_address / remove_party_email_address_by_id (and the phone/address/website equivalents).

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes
nameNo
aboutNo
titleNo
fieldsNoSet custom field values on this record. PARTIAL UPDATE: only the definitions you list are touched; any field NOT in this array is left unchanged. Discover available definitions via list_custom_fields; read current values via get_party with embed='fields'.
teamIdNoAssign to team ID (discover via list_teams). Pass a team ID to set, or `null` to unassign. Capsule enforces the owner∈team membership constraint — passing a team the current owner doesn't belong to returns 422 'owner is not a member of the team'. Combine `ownerId: null` + `teamId: <T>` in one call to transfer a party to team-ownership with no specific user (verified empirically in v1.6.4 wire-trace; the membership rule doesn't fire when owner is null).
ownerIdNoPass a user ID to set, or `null` to unassign (verified empirically in v1.6.4 wire-trace — Capsule accepts `owner: null` on PUT /parties/:id for both persons and organisations). Discover IDs via list_users. WARNING: Capsule's PUT on parties has the same asymmetric owner/team semantic documented in NOTES-ON-CAPSULE-API.md §27 for project updates — setting `owner` while omitting `team` is plausibly clearing-prone. When you supply `ownerId` and omit `teamId`, this connector reads the party's current team and includes it in the PUT body to preserve it across the owner change. Supply `teamId` explicitly to change it.
jobTitleNo
lastNameNo
websitesNoAPPEND-ONLY: items are merged into the existing list, never replaced. For atomic add/remove/replace use add_party_website and remove_party_website_by_id.
addressesNoAPPEND-ONLY: items are merged into the existing list, never replaced. For atomic add/remove/replace use add_party_address and remove_party_address_by_id. The `country` field is mapped through Capsule's country dictionary — see `add_party_address.country` for the dictionary edges (small canonical-English-name list; inputs not in the dictionary are REJECTED with 422, not silently dropped).
firstNameNo
phoneNumbersNoAPPEND-ONLY: items are merged into the existing list, never replaced. For atomic add/remove/replace use add_party_phone_number and remove_party_phone_number_by_id.
emailAddressesNoAPPEND-ONLY: items are merged into the existing list, never replaced. For atomic add/remove/replace use add_party_email_address and remove_party_email_address_by_id. Passing `[]` here is a silent no-op (does not clear the list and does not advance updatedAt).
organisationIdNoFor PERSON parties: link to an organisation by id, or `null` to unlink (the person becomes an orphan / standalone record). Discover org IDs via search_parties / filter_parties with type=organisation. For ORGANISATION parties: silently ignored by Capsule's API — organisations don't have a parent organisation in the data model. Empirically verified in v1.6.3 wire-trace; no client-side type guard since the no-op is harmless.

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The annotations only supply readOnlyHint=false and destructiveHint=false, so the description carries the full burden of behavior. It discloses append-only child-array semantics, partial-update behavior, silent ignoring of organisationId for ORGANISATION parties, and the team-owned null-owner combination - all non-obvious behaviors an agent needs to avoid data loss.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Six dense sentences, each carrying a distinct decision-relevant fact: the fields, null/unassignment semantics, organisation-type behavior, partial updates, append-only child arrays, and a pointer to atomic tools. No boilerplate, no repetition of what the schema already says clearly.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 15-parameter mutating tool with no output schema, the description covers the hard parts - ownership transfer, append-only boundaries, and atomic alternatives - that determine correctness. The only material gap is an explicit statement of the return payload (updated party vs. 204/empty), which the agent cannot infer from the description alone.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is only 53%, so the description compensates by grouping parameters (top-level, owner/team/org, child arrays) and adding cross-parameter semantics like partial update and append-only behavior. The complex parameters already have detailed schema descriptions, and the remaining plain ones (name, title, firstName) are self-explanatory values, so the description adds the right sort of meta-semantics.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a precise verb and resource ('Update top-level fields on an existing party') and then lists the exact fields it touches, making it clearly distinct from create_party, batch_update_party, and the atomic add/remove party-address tools. An agent can select it without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives explicit when-not-to-use guidance: for surgical changes it names the dedicated atomic tools (add_party_email_address / remove_party_email_address_by_id and equivalents) because child arrays are append-only. It also explains the ownerId/teamId null-combination pattern, so the agent knows both when to use this tool and when to go elsewhere.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_projectA

Update fields on an existing project, including the parent-reference field partyId to reassign the project to a different primary party. ownerId, teamId, and stageId all accept null to unassign (the latter removes the project from all stages — verified empirically in v1.6.5 wire-trace). Constraint: a project must always have at least one of {owner, team} set, so teamId: null on a project with no owner returns 422. Only the fields you provide are changed. Use status='CLOSED' to close a project. CLOSED projects remain fully editable — Capsule does not enforce closed-record immutability. Stage moves and description edits on a CLOSED project are accepted without warning. Capsule requires every project to have a party — passing partyId: null is rejected with 422 'party is required' (Unlike update_task.partyId which IS nullable — tasks can be orphaned in Capsule's model).

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes
nameNo
fieldsNoSet custom field values on this record. PARTIAL UPDATE: only the definitions you list are touched; any field NOT in this array is left unchanged. Discover available definitions via list_custom_fields; read current values via get_project with embed='fields'. Project-specific: setting a field whose definition lives under a 'data tag' populates the row's internal tagId but does NOT auto-add the data tag to the project's tags array — use add_tag explicitly if you want it visible via embed=tags.
statusNo
teamIdNoReassign team: pass a team ID (discover via list_teams) to set, or `null` to unassign. Capsule preserves the existing owner across a team change (server-side), so `update_project { teamId }` alone is safe — the owner is carried through. Owner must be a member of the new team or Capsule returns 422 'owner is not a member of the team'. A project must always have at least one of {owner, team} set — `teamId: null` on a project whose owner is already null returns 422 'owner or team is required'.
ownerIdNoReassign owner: pass a user ID to set, or `null` to unassign (matches the 'Unassign' option in Capsule's web UI). When you supply `ownerId` and omit `teamId` and/or `stageId`, the connector fetches the project's current omitted fields and includes them in the PUT body — this preserves them across the owner change (without it, Capsule's PUT would clear team; stage carry is defensive against the symmetric clear). Supply `teamId` and/or `stageId` explicitly on the same call to change them instead. `teamId: null` clears the team as part of an owner change. Constraints (Capsule enforces, 422 on violation): owner must be a member of the team if both are set; a project must always have at least one of {owner, team} set (cannot clear both).
partyIdNoReassign the project to a different primary party. Capsule requires every project to have a party — passing `null` is rejected with 422 'party is required' (verified empirically in v1.6.3 wire-trace). Discover ids via search_parties / filter_parties. NOTE: parent-ref nullability differs by entity — `update_task.partyId` IS nullable (orphan task), but opportunities and projects must always have a parent party. The same applies to `update_opportunity.partyId`.
stageIdNoMove the project to this stage (board column), or `null` to remove from all stages (verified empirically in v1.6.5 wire-trace — Capsule accepts `stage: null` on project update and the project no longer appears on any board). Discover IDs via list_stages. Owner and team are preserved across stage-only updates (Capsule's PUT semantic). WARNING (cross-board): Capsule does NOT validate that the new stage belongs to the project's current board — passing a stageId from a different board silently relocates the project across boards. Team and other board-derived defaults are NOT updated to match the new board. Verify against the project's current board (read the project first, list its board's stages) before passing a cross-board id.
startOnNoSet the project start date (YYYY-MM-DD), or `null` to clear it. Verified empirically (v2.0.1 wire probe): PUT accepts both the set and the null-clear. `undefined` leaves the field untouched.
descriptionNo
expectedCloseOnNoYYYY-MM-DD

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description goes far beyond the annotations by disclosing partial-update semantics, null unassignment behavior, CLOSED-project editability, server-side owner preservation, cross-board stage relocation risks, custom-field clearing quirks, and audit-log noise. This is exactly the kind of behavioral context an agent needs.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but dense and front-loaded with the core purpose before edge cases. Nearly every sentence contributes behavioral value, though a few points such as party requiredness and null behavior are repeated across the tool description and schema, making it slightly less concise than ideal.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a complex 11-parameter update tool with no output schema, the description is remarkably complete. It covers update semantics, validation constraints, null behavior, custom-field edge cases, CLOSED-project behavior, and empirically verified quirks, giving an agent sufficient context to invoke the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 64%, so the description does meaningful compensatory work by explaining cross-parameter invariants like the owner/team requirement, party non-nullability, and stage null removal. It adds value beyond the schema, though individual parameter meanings are mostly already documented in the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Update fields on an existing project', and immediately adds the key parent-reference capability. It also differentiates from sibling tools by contrasting `update_task.partyId` nullability with project behavior, so an agent can distinguish this from related update tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description clearly indicates when to use the tool: for updating an existing project, closing it with status='CLOSED', reassigning owner/team/stage, and editing custom fields. It provides strong context and constraints, though it does not explicitly name alternatives like batch_update_project or state when not to use this tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_taskA

Update fields on an existing task: description, dueOn, dueTime, detail, status (OPEN or COMPLETED), ownerId, and the parent-reference fields partyId, opportunityId, projectId. Pass a parent id to re-link the task, or null on a parent field to orphan/unlink it; at most one parent id may be set in a single call, though null+id swaps are allowed. Only the fields you provide are changed. To mark a task done, prefer the dedicated complete_task tool — it's idempotent (a no-op success on an already-completed task) and semantically clearer than update_task status=COMPLETED. Capsule rejects directly setting status=PENDING (which exists only internally for track-driven tasks); use OPEN or COMPLETED. Completed tasks remain fully editable — Capsule does not enforce closed-record immutability.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes
dueOnNoYYYY-MM-DD
detailNo
statusNoSet to OPEN or COMPLETED. (PENDING exists internally for track-driven tasks but cannot be set directly via this tool — Capsule rejects it.) Setting status: OPEN on an already-open task is a true no-op (does not advance updatedAt).
dueTimeNoHH:MM in user's timezone
ownerIdNoReassign owner to user ID. Once set, this connector cannot clear an owner back to null — use Capsule's web UI for that.
partyIdNoRe-link the task to a party by id, or `null` to orphan it. Mutually exclusive with `opportunityId` / `projectId` — Capsule enforces 'task can be related to at most one entity' server-side (422 if two parent-refs are set at once, verified in v1.6.3 wire-trace). To swap parent type atomically, pass the old one as `null` and the new one as an id in the same call. NOTE: orphaning is unique to tasks — `update_opportunity.partyId` and `update_project.partyId` are NOT nullable (Capsule rejects with 422 'party is required'). Tasks are the only entity in Capsule's data model that can exist without any parent.
projectIdNoRe-link the task to a project by id, or `null` to orphan it. Mutually exclusive with `partyId` / `opportunityId` — see `partyId` for the XOR semantic.
descriptionNo
opportunityIdNoRe-link the task to an opportunity by id, or `null` to orphan it. Mutually exclusive with `partyId` / `projectId` — see `partyId` for the XOR semantic.

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only indicate a non-readonly, non-destructive mutation; the description goes far beyond by disclosing partial updates, no-op success semantics, that completed tasks remain editable, and that parent fields support null-orphaning with at-most-one-parent enforcement. This is valuable behavioral context that annotations do not provide, and there is no contradiction.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Although the description is dense, every sentence earns its place: the opening sentence enumerates fields, the middle clarifies parent semantics and partial updates, and the closing sentences give routing and status constraints. It is front-loaded with the primary purpose before diving into edge cases.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 10-parameter mutation tool with no output schema and minimal annotations, the description covers the critical invocation context: updatable fields, parent re-linking/orphaning, status limitations, and post-update mutability. No key behavior an agent would need to call it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 70%, and the description reinforces and extends parameter meaning by explicitly stating the parent-field XOR rule, null+id swap behavior, and 'only the fields you provide are changed.' It relies on the schema for field-level details like patterns and owner clearing, but the body description still adds group-level semantics not obvious from individual parameter definitions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource ('Update fields on an existing task') and enumerates the exact fields, so an agent knows precisely what the tool does. It also distinguishes itself from the sibling complete_task by naming it and explaining the semantic difference for marking tasks done.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly says to prefer complete_task for marking a task done, providing a clear routing rule to an alternative. It also specifies when not to use certain values (status=PENDING is rejected) and describes the partial-update behavior so an agent knows only provided fields are changed.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_trackA

Update a track instance. Capsule's PUT semantics are partial — provide only the fields you want to change in fields. Common: { complete: true } to mark a track completed.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes
fieldsYesObject of fields to update on the track. Capsule's PUT semantics are partial — only the fields you provide are changed. Common: { complete: true } to mark a track completed. Capsule rejects unknown keys; consult Capsule's docs for the full updatable set.

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate this is a mutating operation. The description adds important behavioral context by clarifying Capsule's PUT semantics are partial, meaning only provided fields are changed. This goes beyond the annotation and helps the agent avoid assuming full replacement semantics.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise and well-structured. It front-loads the core purpose, then explains the key partial-update behavior, and finishes with a practical example. Every sentence earns its place with no redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a two-parameter update tool with annotations present, the description covers the essential behavior and provides a concrete example. It lacks explicit return-value or error information, but the low complexity and schema details make it sufficiently complete for an agent to call it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description meaningfully discusses the 'fields' parameter with partial-update semantics and a common usage example, but it does not clarify the 'id' parameter beyond the name. Schema coverage is only 50%, so the missing id semantics are not fully compensated.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Update a track instance.' This clearly identifies the operation and distinguishes it from related sibling tools like apply_track or remove_track, though it does not explicitly name them.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage: you use this tool when you want to partially update an existing track instance. It provides a common example with { complete: true }, but it does not explicitly state when to use this tool over alternatives or when not to use it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

upload_attachmentC

Upload a file as a new note attachment, linked to a party, opportunity, or project. Provide the file as base64-encoded dataBase64 along with filename and contentType (MIME). Also provide exactly one of partyId / opportunityId / projectId to anchor the note. Optionally pass content to set the note body (defaults to '[attachment]'). Two-step orchestration server-side: bytes upload → token → note creation. Adding to an existing entry is not supported.

ParametersJSON Schema
NameRequiredDescriptionDefault
contentNoBody text for the note that will hold the attachment. Defaults to '[attachment]' if omitted.
entryIdNoATTACH TO AN EXISTING ENTRY instead of creating a new note: the id of the note/email entry to attach the file to (wire: PUT /entries/{id} with an upload token; verified live). Mutually exclusive with partyId/opportunityId/projectId and content — when entryId is set, no new entry is created.
partyIdNoLink the new note to a party (mutually exclusive with opportunityId / projectId).
filenameYesFilename Capsule should record (e.g. 'contract.pdf'). Capsule does NOT validate consistency between filename, contentType, and the actual bytes — a typo in either is accepted and the file is stored as labelled.
projectIdNo
dataBase64YesFile contents, base64-encoded. Decoded server-side and uploaded as the request body. PRACTICAL LIMIT: the base64 must be produced inline as tool-call output, so uploads driven by an LLM are only viable for small files (a few tens of KB) — a 500 KB file is ~660K characters, far beyond a chat model's output budget. Do not attempt to inline large files; tell the user the file is too large to route through the model. The 25 MB maximum (Capsule's documented limit) applies to programmatic MCP clients that construct the call directly; the connector rejects oversized base64 before uploading.
contentTypeYesMIME type of the file (e.g. 'application/pdf', 'image/png', 'text/plain'). Trusted by Capsule verbatim; not cross-checked against `filename` or the actual bytes.
opportunityIdNo

TDQS

C2.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description adds valuable behavior beyond annotations, including the server-side two-step orchestration (bytes upload → token → note creation) and the default note body. But it also makes a false behavioral claim about existing-entry attachment being unsupported, and the sparse annotations leave the description with the burden of accurately describing mutation behavior. This undermines trust despite the useful detail.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is short, front-loaded, and generally efficient, with no redundant background or fluff. It does contain one misleading sentence about existing-entry attachment, which does not earn its place, but the overall structure is clear and scannable.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For an 8-parameter tool with no output schema, the description covers the new-note mode in reasonable detail but omits the entire existing-entry attachment mode documented in the schema. It also does not describe what the tool returns after the two-step orchestration. The contradiction with entryId is a significant completeness gap for agent invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 75%, so the schema already explains most parameters, and the description repeats dataBase64, filename, contentType, and content without adding much new meaning. Worse, it asserts a mutually exclusive constraint ('exactly one of partyId / opportunityId / projectId') that ignores the schema's entryId option, and it omits entryId entirely. This is a negative contribution rather than a compensating one.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose3/5

Does the description clearly state what the tool does and how it differs from similar tools?

The opening sentence clearly states a specific action: uploading a file as a new note attachment linked to a party, opportunity, or project, which helps distinguish it from add_note and get_attachment. However, the description then claims 'Adding to an existing entry is not supported,' directly contradicting the schema's entryId parameter, which explicitly supports attaching to an existing entry. This makes the stated purpose incomplete and partly misleading.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit invocation steps: pass dataBase64, filename, contentType, exactly one of partyId/opportunityId/projectId, and optionally content. It does not discuss when to prefer upload_attachment over sibling tools like add_note or update_entry, and the 'exactly one' and 'not supported' statements conflict with the schema's entryId path. The guidance is useful for the main mode but incorrect for a supported alternative.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 4 tool updatesv2.3.1
    • Changedadd_party_email_address1 field changed
      • changedInput schema / properties / address / pattern
        Previous value: -"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"New value: +"^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"
    • Changedbatch_update_party1 field changed
      • changedInput schema / properties / items / items / properties / emailAddresses / items / properties / address / pattern
        Previous value: -"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"New value: +"^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"
    • Changedcreate_party1 field changed
      • changedInput schema / properties / emailAddresses / items / properties / address / pattern
        Previous value: -"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"New value: +"^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"
    • Changedupdate_party1 field changed
      • changedInput schema / properties / emailAddresses / items / properties / address / pattern
        Previous value: -"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"New value: +"^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"
  2. 57 tool updatesv2.3.0
    • Changedadd_additional_party1 field changed
      • changedInput schema / required
        Previous value: -[
        -  "entity"
        -]New value: +[
        +  "entity",
        +  "entityId",
        +  "partyId"
        +]
    • Changedadd_party_address1 field changed
      • addedInput schema / required
        Added value: +[
        +  "partyId"
        +]
    • Changedadd_party_email_address1 field changed
      • changedInput schema / required
        Previous value: -[
        -  "address"
        -]New value: +[
        +  "partyId",
        +  "address"
        +]
    • Changedadd_party_phone_number1 field changed
      • changedInput schema / required
        Previous value: -[
        -  "number"
        -]New value: +[
        +  "partyId",
        +  "number"
        +]
    • Changedadd_party_website1 field changed
      • changedInput schema / required
        Previous value: -[
        -  "address"
        -]New value: +[
        +  "partyId",
        +  "address"
        +]
    • Changedadd_tag1 field changed
      • changedInput schema / required
        Previous value: -[
        -  "entity",
        -  "tagName"
        -]New value: +[
        +  "entity",
        +  "entityId",
        +  "tagName"
        +]
    • Changedapply_track1 field changed
      • changedInput schema / required
        Previous value: -[
        -  "entity"
        -]New value: +[
        +  "entity",
        +  "entityId",
        +  "trackDefinitionId"
        +]
    • Changedbatch_add_tag1 field changed
      • changedInput schema / properties / items / items / required
        Previous value: -[
        -  "entity",
        -  "tagName"
        -]New value: +[
        +  "entity",
        +  "entityId",
        +  "tagName"
        +]
    • Changedbatch_remove_tag_by_id1 field changed
      • changedInput schema / properties / items / items / required
        Previous value: -[
        -  "entity"
        -]New value: +[
        +  "entity",
        +  "entityId",
        +  "tagId"
        +]
    • Changedbatch_update_opportunity4 fields changed
      • removedInput schema / properties / items / items / properties / fields / items / properties / value / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "boolean"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / items / items / properties / fields / items / properties / value / type
        Added value: +[
        +  "string",
        +  "number",
        +  "boolean",
        +  "null"
        +]
      • changedInput schema / properties / items / items / properties / fields / items / required
        Previous value: -[
        -  "value"
        -]New value: +[
        +  "definitionId",
        +  "value"
        +]
      • addedInput schema / properties / items / items / required
        Added value: +[
        +  "id"
        +]
    • Changedbatch_update_party4 fields changed
      • removedInput schema / properties / items / items / properties / fields / items / properties / value / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "boolean"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / items / items / properties / fields / items / properties / value / type
        Added value: +[
        +  "string",
        +  "number",
        +  "boolean",
        +  "null"
        +]
      • changedInput schema / properties / items / items / properties / fields / items / required
        Previous value: -[
        -  "value"
        -]New value: +[
        +  "definitionId",
        +  "value"
        +]
      • addedInput schema / properties / items / items / required
        Added value: +[
        +  "id"
        +]
    • Changedbatch_update_project4 fields changed
      • removedInput schema / properties / items / items / properties / fields / items / properties / value / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "boolean"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / items / items / properties / fields / items / properties / value / type
        Added value: +[
        +  "string",
        +  "number",
        +  "boolean",
        +  "null"
        +]
      • changedInput schema / properties / items / items / properties / fields / items / required
        Previous value: -[
        -  "value"
        -]New value: +[
        +  "definitionId",
        +  "value"
        +]
      • addedInput schema / properties / items / items / required
        Added value: +[
        +  "id"
        +]
    • Changedcomplete_task1 field changed
      • addedInput schema / required
        Added value: +[
        +  "id"
        +]
    • Changedcreate_opportunity4 fields changed
      • removedInput schema / properties / fields / items / properties / value / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "boolean"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / fields / items / properties / value / type
        Added value: +[
        +  "string",
        +  "number",
        +  "boolean",
        +  "null"
        +]
      • changedInput schema / properties / fields / items / required
        Previous value: -[
        -  "value"
        -]New value: +[
        +  "definitionId",
        +  "value"
        +]
      • changedInput schema / required
        Previous value: -[
        -  "name"
        -]New value: +[
        +  "name",
        +  "partyId",
        +  "milestoneId"
        +]
    • Changedcreate_party3 fields changed
      • removedInput schema / properties / fields / items / properties / value / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "boolean"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / fields / items / properties / value / type
        Added value: +[
        +  "string",
        +  "number",
        +  "boolean",
        +  "null"
        +]
      • changedInput schema / properties / fields / items / required
        Previous value: -[
        -  "value"
        -]New value: +[
        +  "definitionId",
        +  "value"
        +]
    • Changedcreate_project4 fields changed
      • removedInput schema / properties / fields / items / properties / value / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "boolean"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / fields / items / properties / value / type
        Added value: +[
        +  "string",
        +  "number",
        +  "boolean",
        +  "null"
        +]
      • changedInput schema / properties / fields / items / required
        Previous value: -[
        -  "value"
        -]New value: +[
        +  "definitionId",
        +  "value"
        +]
      • changedInput schema / required
        Previous value: -[
        -  "name"
        -]New value: +[
        +  "name",
        +  "partyId"
        +]
    • Changeddelete_entry1 field changed
      • changedInput schema / required
        Previous value: -[
        -  "confirm"
        -]New value: +[
        +  "id",
        +  "confirm"
        +]
    • Changeddelete_opportunity1 field changed
      • changedInput schema / required
        Previous value: -[
        -  "confirm"
        -]New value: +[
        +  "id",
        +  "confirm"
        +]
    • Changeddelete_party1 field changed
      • changedInput schema / required
        Previous value: -[
        -  "confirm"
        -]New value: +[
        +  "id",
        +  "confirm"
        +]
    • Changeddelete_project1 field changed
      • changedInput schema / required
        Previous value: -[
        -  "confirm"
        -]New value: +[
        +  "id",
        +  "confirm"
        +]
    • Changeddelete_tag_definition1 field changed
      • changedInput schema / required
        Previous value: -[
        -  "entity",
        -  "confirm"
        -]New value: +[
        +  "entity",
        +  "tagId",
        +  "confirm"
        +]
    • Changeddelete_task1 field changed
      • changedInput schema / required
        Previous value: -[
        -  "confirm"
        -]New value: +[
        +  "id",
        +  "confirm"
        +]
    • Changedfilter_opportunities2 fields changed
      • removedInput schema / properties / conditions / items / properties / value / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "boolean"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / conditions / items / properties / value / type
        Added value: +[
        +  "string",
        +  "number",
        +  "boolean",
        +  "null"
        +]
    • Changedfilter_parties2 fields changed
      • removedInput schema / properties / conditions / items / properties / value / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "boolean"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / conditions / items / properties / value / type
        Added value: +[
        +  "string",
        +  "number",
        +  "boolean",
        +  "null"
        +]
    • Changedfilter_projects2 fields changed
      • removedInput schema / properties / conditions / items / properties / value / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "boolean"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / conditions / items / properties / value / type
        Added value: +[
        +  "string",
        +  "number",
        +  "boolean",
        +  "null"
        +]
    • Changedget_attachment1 field changed
      • addedInput schema / required
        Added value: +[
        +  "id"
        +]
    • Changedget_custom_field1 field changed
      • changedInput schema / required
        Previous value: -[
        -  "entity"
        -]New value: +[
        +  "entity",
        +  "id"
        +]
    • Changedget_entry1 field changed
      • addedInput schema / required
        Added value: +[
        +  "id"
        +]
    • Changedget_opportunity1 field changed
      • addedInput schema / required
        Added value: +[
        +  "id"
        +]
    • Changedget_party1 field changed
      • addedInput schema / required
        Added value: +[
        +  "id"
        +]
    • Changedget_project1 field changed
      • addedInput schema / required
        Added value: +[
        +  "id"
        +]
    • Changedget_task1 field changed
      • addedInput schema / required
        Added value: +[
        +  "id"
        +]
    • Changedget_track1 field changed
      • addedInput schema / required
        Added value: +[
        +  "id"
        +]
    • Changedlist_additional_parties1 field changed
      • changedInput schema / required
        Previous value: -[
        -  "entity"
        -]New value: +[
        +  "entity",
        +  "entityId"
        +]
    • Changedlist_associated_projects1 field changed
      • addedInput schema / required
        Added value: +[
        +  "opportunityId"
        +]
    • Changedlist_employees1 field changed
      • addedInput schema / required
        Added value: +[
        +  "partyId"
        +]
    • Changedlist_entity_tracks1 field changed
      • changedInput schema / required
        Previous value: -[
        -  "entity"
        -]New value: +[
        +  "entity",
        +  "entityId"
        +]
    • Changedlist_milestones1 field changed
      • addedInput schema / required
        Added value: +[
        +  "pipelineId"
        +]
    • Changedlist_opportunity_entries1 field changed
      • addedInput schema / required
        Added value: +[
        +  "opportunityId"
        +]
    • Changedlist_party_entries1 field changed
      • addedInput schema / required
        Added value: +[
        +  "partyId"
        +]
    • Changedlist_party_opportunities1 field changed
      • addedInput schema / required
        Added value: +[
        +  "partyId"
        +]
    • Changedlist_party_projects1 field changed
      • addedInput schema / required
        Added value: +[
        +  "partyId"
        +]
    • Changedlist_project_entries1 field changed
      • addedInput schema / required
        Added value: +[
        +  "projectId"
        +]
    • Changedremove_additional_party1 field changed
      • changedInput schema / required
        Previous value: -[
        -  "entity",
        -  "confirm"
        -]New value: +[
        +  "entity",
        +  "entityId",
        +  "partyId",
        +  "confirm"
        +]
    • Changedremove_party_address_by_id1 field changed
      • addedInput schema / required
        Added value: +[
        +  "partyId",
        +  "addressId"
        +]
    • Changedremove_party_email_address_by_id1 field changed
      • addedInput schema / required
        Added value: +[
        +  "partyId",
        +  "emailAddressId"
        +]
    • Changedremove_party_phone_number_by_id1 field changed
      • addedInput schema / required
        Added value: +[
        +  "partyId",
        +  "phoneNumberId"
        +]
    • Changedremove_party_website_by_id1 field changed
      • addedInput schema / required
        Added value: +[
        +  "partyId",
        +  "websiteId"
        +]
    • Changedremove_tag_by_id1 field changed
      • changedInput schema / required
        Previous value: -[
        -  "entity"
        -]New value: +[
        +  "entity",
        +  "entityId",
        +  "tagId"
        +]
    • Changedremove_track1 field changed
      • changedInput schema / required
        Previous value: -[
        -  "confirm"
        -]New value: +[
        +  "id",
        +  "confirm"
        +]
    • Changedrun_saved_filter1 field changed
      • changedInput schema / required
        Previous value: -[
        -  "entity"
        -]New value: +[
        +  "entity",
        +  "id"
        +]
    • Changedupdate_entry1 field changed
      • addedInput schema / required
        Added value: +[
        +  "id"
        +]
    • Changedupdate_opportunity4 fields changed
      • removedInput schema / properties / fields / items / properties / value / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "boolean"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / fields / items / properties / value / type
        Added value: +[
        +  "string",
        +  "number",
        +  "boolean",
        +  "null"
        +]
      • changedInput schema / properties / fields / items / required
        Previous value: -[
        -  "value"
        -]New value: +[
        +  "definitionId",
        +  "value"
        +]
      • addedInput schema / required
        Added value: +[
        +  "id"
        +]
    • Changedupdate_party4 fields changed
      • removedInput schema / properties / fields / items / properties / value / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "boolean"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / fields / items / properties / value / type
        Added value: +[
        +  "string",
        +  "number",
        +  "boolean",
        +  "null"
        +]
      • changedInput schema / properties / fields / items / required
        Previous value: -[
        -  "value"
        -]New value: +[
        +  "definitionId",
        +  "value"
        +]
      • addedInput schema / required
        Added value: +[
        +  "id"
        +]
    • Changedupdate_project4 fields changed
      • removedInput schema / properties / fields / items / properties / value / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "boolean"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / fields / items / properties / value / type
        Added value: +[
        +  "string",
        +  "number",
        +  "boolean",
        +  "null"
        +]
      • changedInput schema / properties / fields / items / required
        Previous value: -[
        -  "value"
        -]New value: +[
        +  "definitionId",
        +  "value"
        +]
      • addedInput schema / required
        Added value: +[
        +  "id"
        +]
    • Changedupdate_task1 field changed
      • addedInput schema / required
        Added value: +[
        +  "id"
        +]
    • Changedupdate_track1 field changed
      • changedInput schema / required
        Previous value: -[
        -  "fields"
        -]New value: +[
        +  "id",
        +  "fields"
        +]
  3. 39 tool updatesv2.2.0
    • Changedadd_note1 field changed
      • addedInput schema / properties / activityTypeId
        Added value: +{
        +  "description": "Categorise the note under a custom activity type (Meeting, Call, ... — ids from list_activity_types). Omit for a plain Note (Capsule's default, activityType -1). Wire-verified: POST /entries accepts the id and the entry echoes {activityType: {id, name}}.",
        +  "exclusiveMinimum": 0,
        +  "maximum": 9007199254740991,
        +  "type": "integer"
        +}
    • Changedbatch_update_opportunity2 fields changed
      • addedInput schema / properties / items / items / properties / duration
        Added value: +{
        +  "anyOf": [
        +    {
        +      "exclusiveMinimum": 0,
        +      "maximum": 9007199254740991,
        +      "type": "integer"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ]
        +}
      • addedInput schema / properties / items / items / properties / durationBasis
        Added value: +{
        +  "enum": [
        +    "FIXED",
        +    "HOUR",
        +    "DAY",
        +    "WEEK",
        +    "MONTH",
        +    "QUARTER",
        +    "YEAR"
        +  ],
        +  "type": "string"
        +}
    • Changedcreate_opportunity3 fields changed
      • addedInput schema / properties / duration
        Added value: +{
        +  "anyOf": [
        +    {
        +      "exclusiveMinimum": 0,
        +      "maximum": 9007199254740991,
        +      "type": "integer"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "description": "How many durationBasis units the contract runs (e.g. 12 with MONTH). Must be null/omitted when durationBasis is FIXED. Wire-verified: POST stores it, PUT changes it, and PUT duration:null with durationBasis:FIXED clears it."
        +}
      • addedInput schema / properties / durationBasis
        Added value: +{
        +  "description": "Time unit of the opportunity's contract duration. FIXED means a one-off (no recurring duration) — `duration` must be omitted/null with FIXED (Capsule 422s otherwise; wire-verified). Recurring deals: pair with `duration`, e.g. durationBasis MONTH + duration 12.",
        +  "enum": [
        +    "FIXED",
        +    "HOUR",
        +    "DAY",
        +    "WEEK",
        +    "MONTH",
        +    "QUARTER",
        +    "YEAR"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / trackDefinitionIds
        Added value: +{
        +  "description": "Track definition ids to apply at creation time (creation-only shortcut; use apply_track for existing records). Discover ids via list_track_definitions. Capsule validates each definition's entity scope and returns 422 on mismatch (e.g. \"track definition must be for parties\"). Wire-verified: the created record carries the track instances immediately.",
        +  "items": {
        +    "exclusiveMinimum": 0,
        +    "maximum": 9007199254740991,
        +    "type": "integer"
        +  },
        +  "type": "array"
        +}
    • Changedcreate_party1 field changed
      • addedInput schema / properties / trackDefinitionIds
        Added value: +{
        +  "description": "Track definition ids to apply at creation time (creation-only shortcut; use apply_track for existing records). Discover ids via list_track_definitions. Capsule validates each definition's entity scope and returns 422 on mismatch (e.g. \"track definition must be for parties\"). Wire-verified: the created record carries the track instances immediately.",
        +  "items": {
        +    "exclusiveMinimum": 0,
        +    "maximum": 9007199254740991,
        +    "type": "integer"
        +  },
        +  "type": "array"
        +}
    • Changedcreate_project1 field changed
      • addedInput schema / properties / trackDefinitionIds
        Added value: +{
        +  "description": "Track definition ids to apply at creation time (creation-only shortcut; use apply_track for existing records). Discover ids via list_track_definitions. Capsule validates each definition's entity scope and returns 422 on mismatch (e.g. \"track definition must be for parties\"). Wire-verified: the created record carries the track instances immediately.",
        +  "items": {
        +    "exclusiveMinimum": 0,
        +    "maximum": 9007199254740991,
        +    "type": "integer"
        +  },
        +  "type": "array"
        +}
    • Changedcreate_task1 field changed
      • addedInput schema / properties / repeat
        Added value: +{
        +  "description": "Make this a repeating task. Wire-verified on POST /tasks. Recurrence on EXISTING tasks isn't exposed by update_task (unverified on PUT) — recreate the task to change it.",
        +  "properties": {
        +    "frequency": {
        +      "description": "How often the task recurs.",
        +      "enum": [
        +        "YEARLY",
        +        "MONTHLY",
        +        "WEEKLY"
        +      ],
        +      "type": "string"
        +    },
        +    "interval": {
        +      "description": "Every N frequency units (e.g. 2 with WEEKLY = every two weeks).",
        +      "exclusiveMinimum": 0,
        +      "maximum": 9007199254740991,
        +      "type": "integer"
        +    },
        +    "on": {
        +      "description": "Day the task repeats on (day-of-week/month depending on frequency; -1 = last day of the month). Derived from dueOn when omitted — Capsule fills it in (wire-verified: repeat {WEEKLY, interval 2} echoes back with `on` populated).",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "frequency"
        +  ],
        +  "type": "object"
        +}
    • Changedfilter_opportunities1 field changed
      • changedInput schema / properties / embed / description
        Previous value: -"Comma-separated embeds. Valid tokens: tags, fields, missingImportantFields."New value: +"Comma-separated embeds. Valid tokens: tags, fields, party, milestone, missingImportantFields."
    • Changedfilter_parties1 field changed
      • changedInput schema / properties / embed / description
        Previous value: -"Comma-separated embeds. Valid tokens: tags, fields, missingImportantFields."New value: +"Comma-separated embeds. Valid tokens: tags, fields, organisation, missingImportantFields."
    • Changedfilter_projects1 field changed
      • changedInput schema / properties / embed / description
        Previous value: -"Comma-separated embeds. Valid tokens: tags, fields, missingImportantFields."New value: +"Comma-separated embeds. Valid tokens: tags, fields, party, opportunity, missingImportantFields."
    • Changedget_entry1 field changed
      • changedInput schema / properties / embed / description
        Previous value: -"Comma-separated embeds. Valid tokens: attachments, participants."New value: +"Comma-separated embeds. Valid tokens: attachments, participants, party, project, opportunity, creator, activityType."
    • Changedget_opportunities1 field changed
      • changedInput schema / properties / embed / description
        Previous value: -"Comma-separated embeds. Valid tokens: tags, fields, missingImportantFields."New value: +"Comma-separated embeds. Valid tokens: tags, fields, party, milestone, missingImportantFields."
    • Changedget_opportunity1 field changed
      • changedInput schema / properties / embed / description
        Previous value: -"Comma-separated embeds. Valid tokens: tags, fields, missingImportantFields."New value: +"Comma-separated embeds. Valid tokens: tags, fields, party, milestone, missingImportantFields."
    • Changedget_parties1 field changed
      • changedInput schema / properties / embed / description
        Previous value: -"Comma-separated embeds. Valid tokens: tags, fields, missingImportantFields."New value: +"Comma-separated embeds. Valid tokens: tags, fields, organisation, missingImportantFields."
    • Changedget_party1 field changed
      • changedInput schema / properties / embed / description
        Previous value: -"Comma-separated embeds. Valid tokens: tags, fields, missingImportantFields."New value: +"Comma-separated embeds. Valid tokens: tags, fields, organisation, missingImportantFields."
    • Changedget_project1 field changed
      • changedInput schema / properties / embed / description
        Previous value: -"Comma-separated embeds. Valid tokens: tags, fields, missingImportantFields."New value: +"Comma-separated embeds. Valid tokens: tags, fields, party, opportunity, missingImportantFields."
    • Changedget_projects1 field changed
      • changedInput schema / properties / embed / description
        Previous value: -"Comma-separated embeds. Valid tokens: tags, fields, missingImportantFields."New value: +"Comma-separated embeds. Valid tokens: tags, fields, party, opportunity, missingImportantFields."
    • Changedget_task1 field changed
      • addedInput schema / properties / embed
        Added value: +{
        +  "description": "Comma-separated embeds. Valid tokens: party, opportunity, project, owner, nextTask.",
        +  "type": "string"
        +}
    • Changedget_tasks1 field changed
      • addedInput schema / properties / embed
        Added value: +{
        +  "description": "Comma-separated embeds. Valid tokens: party, opportunity, project, owner, nextTask.",
        +  "type": "string"
        +}
    • Addedlist_activities
    • Changedlist_additional_parties1 field changed
      • changedInput schema / properties / embed / description
        Previous value: -"Comma-separated embeds. Valid tokens: tags, fields, missingImportantFields."New value: +"Comma-separated embeds. Valid tokens: tags, fields, organisation, missingImportantFields."
    • Changedlist_associated_projects1 field changed
      • changedInput schema / properties / embed / description
        Previous value: -"Comma-separated embeds. Valid tokens: tags, fields, missingImportantFields."New value: +"Comma-separated embeds. Valid tokens: tags, fields, party, opportunity, missingImportantFields."
    • Addedlist_countries
    • Addedlist_currencies
    • Changedlist_employees1 field changed
      • changedInput schema / properties / embed / description
        Previous value: -"Comma-separated embeds. Valid tokens: tags, fields, missingImportantFields."New value: +"Comma-separated embeds. Valid tokens: tags, fields, organisation, missingImportantFields."
    • Changedlist_entries1 field changed
      • changedInput schema / properties / embed / description
        Previous value: -"Comma-separated embeds. Valid tokens: attachments, participants."New value: +"Comma-separated embeds. Valid tokens: attachments, participants, party, project, opportunity, creator, activityType."
    • Changedlist_opportunity_entries1 field changed
      • changedInput schema / properties / embed / description
        Previous value: -"Comma-separated embeds. Valid tokens: attachments, participants."New value: +"Comma-separated embeds. Valid tokens: attachments, participants, party, project, opportunity, creator, activityType."
    • Changedlist_party_entries1 field changed
      • changedInput schema / properties / embed / description
        Previous value: -"Comma-separated embeds. Valid tokens: attachments, participants."New value: +"Comma-separated embeds. Valid tokens: attachments, participants, party, project, opportunity, creator, activityType."
    • Changedlist_party_opportunities1 field changed
      • addedInput schema / properties / embed
        Added value: +{
        +  "description": "Comma-separated embeds. Valid tokens: tags, fields, party, milestone, missingImportantFields.",
        +  "type": "string"
        +}
    • Changedlist_party_projects1 field changed
      • addedInput schema / properties / embed
        Added value: +{
        +  "description": "Comma-separated embeds. Valid tokens: tags, fields, party, opportunity, missingImportantFields.",
        +  "type": "string"
        +}
    • Changedlist_project_entries1 field changed
      • changedInput schema / properties / embed / description
        Previous value: -"Comma-separated embeds. Valid tokens: attachments, participants."New value: +"Comma-separated embeds. Valid tokens: attachments, participants, party, project, opportunity, creator, activityType."
    • Changedlist_projects2 fields changed
      • changedInput schema / properties / embed / description
        Previous value: -"Comma-separated embeds. Valid tokens: tags, fields, missingImportantFields."New value: +"Comma-separated embeds. Valid tokens: tags, fields, party, opportunity, missingImportantFields."
      • addedInput schema / properties / since
        Added value: +{
        +  "description": "Only records CHANGED on/after this ISO-8601 timestamp (incremental sync; pairs with the list_deleted_* audit tools). Wire-verified on the plain list endpoints. Ignored by Capsule when q triggers the /search sub-resource — omit q when using since.",
        +  "type": "string"
        +}
    • Changedlist_tasks1 field changed
      • addedInput schema / properties / embed
        Added value: +{
        +  "description": "Comma-separated embeds. Valid tokens: party, opportunity, project, owner, nextTask.",
        +  "type": "string"
        +}
    • Changedrun_saved_filter1 field changed
      • changedInput schema / properties / embed / description
        Previous value: -"Comma-separated embeds. Valid tokens: tags, fields, missingImportantFields."New value: +"Comma-separated embeds. Valid tokens depend on entity — parties: tags, fields, organisation, missingImportantFields; opportunities: tags, fields, party, milestone, missingImportantFields; projects: tags, fields, party, opportunity, missingImportantFields."
    • Changedsearch_opportunities2 fields changed
      • changedInput schema / properties / embed / description
        Previous value: -"Comma-separated embeds. Valid tokens: tags, fields, missingImportantFields."New value: +"Comma-separated embeds. Valid tokens: tags, fields, party, milestone, missingImportantFields."
      • addedInput schema / properties / since
        Added value: +{
        +  "description": "Only records CHANGED on/after this ISO-8601 timestamp (incremental sync; pairs with the list_deleted_* audit tools). Wire-verified on the plain list endpoints. Ignored by Capsule when q triggers the /search sub-resource — omit q when using since.",
        +  "type": "string"
        +}
    • Changedsearch_parties2 fields changed
      • changedInput schema / properties / embed / description
        Previous value: -"Comma-separated embeds. Valid tokens: tags, fields, missingImportantFields."New value: +"Comma-separated embeds. Valid tokens: tags, fields, organisation, missingImportantFields."
      • addedInput schema / properties / since
        Added value: +{
        +  "description": "Only records CHANGED on/after this ISO-8601 timestamp (incremental sync; pairs with the list_deleted_* audit tools). Wire-verified on the plain list endpoints. Ignored by Capsule when q triggers the /search sub-resource — omit q when using since.",
        +  "type": "string"
        +}
    • Changedsearch_projects2 fields changed
      • changedInput schema / properties / embed / description
        Previous value: -"Comma-separated embeds. Valid tokens: tags, fields, missingImportantFields."New value: +"Comma-separated embeds. Valid tokens: tags, fields, party, opportunity, missingImportantFields."
      • addedInput schema / properties / since
        Added value: +{
        +  "description": "Only records CHANGED on/after this ISO-8601 timestamp (incremental sync; pairs with the list_deleted_* audit tools). Wire-verified on the plain list endpoints. Ignored by Capsule when q triggers the /search sub-resource — omit q when using since.",
        +  "type": "string"
        +}
    • Changedupdate_entry1 field changed
      • addedInput schema / properties / removeAttachmentIds
        Added value: +{
        +  "description": "Attachment ids to detach from this entry (ids from the entry's attachments array; wire shape {id, _delete: true}, verified live — removal returns the entry with the attachment gone). Other attachments are untouched. Capsule rejects removing the LAST attachment from an entry that has no content. To ADD an attachment to an existing entry, use upload_attachment with entryId.",
        +  "items": {
        +    "exclusiveMinimum": 0,
        +    "maximum": 9007199254740991,
        +    "type": "integer"
        +  },
        +  "minItems": 1,
        +  "type": "array"
        +}
    • Changedupdate_opportunity2 fields changed
      • addedInput schema / properties / duration
        Added value: +{
        +  "anyOf": [
        +    {
        +      "exclusiveMinimum": 0,
        +      "maximum": 9007199254740991,
        +      "type": "integer"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "description": "How many durationBasis units the contract runs (e.g. 12 with MONTH). Must be null/omitted when durationBasis is FIXED. Wire-verified: POST stores it, PUT changes it, and PUT duration:null with durationBasis:FIXED clears it."
        +}
      • addedInput schema / properties / durationBasis
        Added value: +{
        +  "description": "Time unit of the opportunity's contract duration. FIXED means a one-off (no recurring duration) — `duration` must be omitted/null with FIXED (Capsule 422s otherwise; wire-verified). Recurring deals: pair with `duration`, e.g. durationBasis MONTH + duration 12.",
        +  "enum": [
        +    "FIXED",
        +    "HOUR",
        +    "DAY",
        +    "WEEK",
        +    "MONTH",
        +    "QUARTER",
        +    "YEAR"
        +  ],
        +  "type": "string"
        +}
    • Changedupload_attachment1 field changed
      • addedInput schema / properties / entryId
        Added value: +{
        +  "description": "ATTACH TO AN EXISTING ENTRY instead of creating a new note: the id of the note/email entry to attach the file to (wire: PUT /entries/{id} with an upload token; verified live). Mutually exclusive with partyId/opportunityId/projectId and content — when entryId is set, no new entry is created.",
        +  "exclusiveMinimum": 0,
        +  "maximum": 9007199254740991,
        +  "type": "integer"
        +}
  4. 55 tool updatesv2.1.2
    • Changedadd_additional_party2 fields changed
      • changedInput schema / properties / entity / description
        Previous value: -"Which entity has the additional-party links. Use 'kases' for projects."New value: +"Which entity has the additional-party links."
      • changedInput schema / properties / entity / enum
        Previous value: -[
        -  "opportunities",
        -  "kases"
        -]New value: +[
        +  "opportunities",
        +  "projects"
        +]
    • Changedadd_tag3 fields changed
      • changedInput schema / properties / entity / description
        Previous value: -"Which entity type. Use 'kases' for projects (Capsule's legacy path name)."New value: +"Which entity type."
      • changedInput schema / properties / entity / enum
        Previous value: -[
        -  "parties",
        -  "opportunities",
        -  "kases"
        -]New value: +[
        +  "parties",
        +  "opportunities",
        +  "projects"
        +]
      • changedInput schema / properties / entityId / description
        Previous value: -"The party/opportunity/kase id."New value: +"The party/opportunity/project id."
    • Changedapply_track2 fields changed
      • changedInput schema / properties / entity / description
        Previous value: -"Which entity to apply the track to. Use 'kases' for projects."New value: +"Which entity to apply the track to."
      • changedInput schema / properties / entity / enum
        Previous value: -[
        -  "opportunities",
        -  "kases"
        -]New value: +[
        +  "opportunities",
        +  "projects"
        +]
    • Changedbatch_add_tag4 fields changed
      • removedInput schema / properties / items / items / properties / entity / description
        Removed value: -"Which entity type. Use 'kases' for projects (Capsule's legacy path name)."
      • changedInput schema / properties / items / items / properties / entity / enum
        Previous value: -[
        -  "parties",
        -  "opportunities",
        -  "kases"
        -]New value: +[
        +  "parties",
        +  "opportunities",
        +  "projects"
        +]
      • removedInput schema / properties / items / items / properties / entityId / description
        Removed value: -"The party/opportunity/kase id."
      • removedInput schema / properties / items / items / properties / tagName / description
        Removed value: -"Name of the tag to attach. Capsule resolves by name: if a tag with this name already exists in the tenant it is attached to the entity; if not, Capsule creates the tag and attaches it. Names are tenant-global. Capsule matches case-INSENSITIVELY when resolving (so 'VIP' and 'vip' attach the same tag), preserving the canonical casing from whichever variant was created first. To ensure consistent casing in your tag list, call list_tags first and reuse the exact name from there. Idempotent — re-attaching an already-attached tag is harmless."
    • Changedbatch_remove_tag_by_id4 fields changed
      • removedInput schema / properties / items / items / properties / entity / description
        Removed value: -"Which entity type. Use 'kases' for projects (Capsule's legacy path name)."
      • changedInput schema / properties / items / items / properties / entity / enum
        Previous value: -[
        -  "parties",
        -  "opportunities",
        -  "kases"
        -]New value: +[
        +  "parties",
        +  "opportunities",
        +  "projects"
        +]
      • removedInput schema / properties / items / items / properties / entityId / description
        Removed value: -"The party/opportunity/kase id."
      • removedInput schema / properties / items / items / properties / tagId / description
        Removed value: -"The tag's id. Read via get_party / get_opportunity / get_project with embed='tags' — each tag entry in the response has an `id` field. list_tags returns the same ids for the same tags, so either source works; reading via embed first is the safer pattern because it confirms the tag is actually attached to this entity before you try to remove it (otherwise Capsule returns 422 'tag not found to delete'). Removing detaches the tag from this entity only; the tag definition itself persists in the tenant for other entities that share it."
    • Changedbatch_update_opportunity10 fields changed
      • removedInput schema / properties / items / items / properties / fields / description
        Removed value: -"Set custom field values on this record. PARTIAL UPDATE: only the definitions you list are touched; any field NOT in this array is left unchanged. Discover available definitions via list_custom_fields; read current values via get_opportunity with embed='fields'."
      • removedInput schema / properties / items / items / properties / fields / items / properties / definitionId / description
        Removed value: -"The custom-field definition id from list_custom_fields. Identifies which field on the entity to set."
      • removedInput schema / properties / items / items / properties / fields / items / properties / value / description
        Removed value: -"The new value. String for TEXT / DATE / LIST / LARGE_TEXT / LINK fields, number for NUMBER fields, boolean for BOOLEAN fields. Clearing: pass null for TEXT / NUMBER / DATE / LIST (Capsule removes the row). BOOLEAN does NOT accept null (Capsule returns 422 'invalid type for field'); use `value: false` instead. Note BOOLEAN fields are observably **two-state**: a row exists with `value: true`, or no row exists. Setting `value: false` removes the row entirely — readers should treat absent BOOLEAN rows as equivalent to false. Tri-state BOOLEAN semantics (true / false / unknown) are not achievable through Capsule's API. Audit-log noise: sending value=null on a field that's already empty/cleared is accepted by Capsule but still bumps the parent entity's `updatedAt`. Read the current value via embed='fields' first if `updatedAt` is being used as a 'last meaningful change' signal. NUMBER quirks: Capsule stores numerics correctly but the read-back via embed=fields returns them as STRINGS (e.g. value=3 reads as '3'); callers comparing values must coerce. TEXT quirks: value='' has the same observable effect as value=null (row removed); empty-string and never-set are indistinguishable."
      • removedInput schema / properties / items / items / properties / lostReasonId / description
        Removed value: -"Reason the opportunity was lost. Only meaningful when transitioning to a Lost milestone — Capsule silently drops it for other milestones. Without this set, a connector-driven Lost-close leaves `lostReason: null`. Discover IDs via list_lostreasons."
      • removedInput schema / properties / items / items / properties / milestoneId / description
        Removed value: -"Move the opportunity to this milestone. Side effects depend on the target: closing milestones (Won/Lost) auto-set `closedOn` to today and `probability` to the milestone default (100/0), preserving `lastOpenMilestone` as the previous open stage; moving back to an open milestone clears `closedOn` and re-applies the milestone's default probability (Won/Lost is reversible — no separate reopen tool). WARNING: Capsule does NOT validate that the new milestone belongs to the opportunity's current pipeline. Passing a milestoneId from a different pipeline silently relocates the opportunity across pipelines, and `lastOpenMilestone` may then reference a milestone in the previous pipeline. Verify against the opportunity's current pipeline (read the opp first, list its pipeline's milestones via list_milestones) before passing a cross-pipeline id. NOTE: changing `milestoneId` can fire **pipeline / milestone-reached automations** that mutate `owner` / `team` on the destination milestone (same shape as `create_opportunity` — see its `milestoneId` description for the owner-clearing automation caveat). If a milestone-change-and-owner-set in the same call lands with `owner: null`, follow up with a second `update_opportunity` (or `batch_update_opportunity`) carrying both `ownerId` and `teamId` — milestone-reached triggers only fire on the transition, so a subsequent PUT preserves your values."
      • removedInput schema / properties / items / items / properties / ownerId / description
        Removed value: -"Reassign owner: pass a user ID to set, or `null` to unassign (verified empirically in v1.6.5 wire-trace — Capsule accepts `owner: null` on PUT /opportunities/:id, mirroring the v1.6.4 finding on /parties; brings update_opportunity into parity with update_party and update_project). When you supply `ownerId` and omit `teamId`, the connector fetches the opportunity's current team and includes it in the PUT body to preserve it across the owner change. Without this defensive read, Capsule's PUT would clear the existing team (see NOTES-ON-CAPSULE-API.md §27 — same asymmetric semantic as /kases). Supply `teamId` explicitly on the same call to change the team instead. Combine `ownerId: null` + `teamId: <T>` in one call to transfer an opportunity to team-ownership with no specific user (verified empirically in v1.6.5; the owner-clears-team semantic doesn't fire when owner is being cleared to null)."
      • removedInput schema / properties / items / items / properties / partyId / description
        Removed value: -"Reassign the opportunity to a different primary party. Capsule requires every opportunity to have a party — passing `null` is rejected with 422 'party is required' (use Capsule's web UI if you need to dissolve the link entirely). Discover ids via search_parties / filter_parties. No defensive read-modify-write needed: this connector verified empirically (v1.6.3 wire-trace) that `party` is a standalone PUT field on /opportunities and does not interact with the asymmetric owner/team semantic from NOTES-ON-CAPSULE-API.md §27. NOTE: parent-ref nullability differs by entity — `update_task.partyId` IS nullable (orphan task), but opportunities and projects must always have a parent party. The same applies to `update_project.partyId`."
      • removedInput schema / properties / items / items / properties / probability / description
        Removed value: -"Win probability 0–100. On an open milestone this overrides the milestone's default probability. CANNOT be set in the same call as a closing milestone (Won/Lost) — Capsule processes the milestone change first, the opportunity becomes closed, then the probability update is rejected as edit-on-closed-opp with 422 'probability can be updated only for open opportunity'. To close an opportunity, leave probability out of the call: it auto-snaps to 100% (Won) or 0% (Lost)."
      • removedInput schema / properties / items / items / properties / teamId / description
        Removed value: -"Reassign team: pass a team ID (discover via list_teams) to set, or `null` to unassign. Capsule preserves the existing owner across a team change (server-side), so `update_opportunity { teamId }` alone is safe — the owner is carried through. Owner must be a member of the new team or Capsule returns 422 'owner is not a member of the team'. Independent from `ownerId` — setting `teamId` does NOT clear the owner."
      • removedInput schema / properties / items / items / properties / value / properties / currency / description
        Removed value: -"ISO 4217 currency code (3 letters), e.g. 'GBP', 'USD', 'EUR'. Required when amount is set."
    • Changedbatch_update_party13 fields changed
      • removedInput schema / properties / items / items / properties / addresses / description
        Removed value: -"APPEND-ONLY: items are merged into the existing list, never replaced. For atomic add/remove/replace use add_party_address and remove_party_address_by_id. The `country` field is mapped through Capsule's country dictionary — see `add_party_address.country` for the dictionary edges (small canonical-English-name list; inputs not in the dictionary are REJECTED with 422, not silently dropped)."
      • removedInput schema / properties / items / items / properties / addresses / items / properties / country / description
        Removed value: -"Country name. Capsule validates this against a small canonical-English-name dictionary; inputs not in the dictionary are REJECTED with 422 'address.country: unknown country' (NOT silently passed through or normalised). Probed examples — accepted: `United States`, `United Kingdom`, `Czechia`, `Germany`. Aliased: `USA → United States`. Rejected: `United States of America`, `Czech Republic` (use `Czechia`), `UK`/`Britain` (use `United Kingdom`), `Deutschland` (use `Germany`). Empty string is accepted and stored as `null` — a de-facto 'clear' shape. To discover an accepted name, read an existing party that already has the country set."
      • removedInput schema / properties / items / items / properties / emailAddresses / description
        Removed value: -"APPEND-ONLY: items are merged into the existing list, never replaced. For atomic add/remove/replace use add_party_email_address and remove_party_email_address_by_id. Passing `[]` here is a silent no-op (does not clear the list and does not advance updatedAt)."
      • removedInput schema / properties / items / items / properties / fields / description
        Removed value: -"Set custom field values on this record. PARTIAL UPDATE: only the definitions you list are touched; any field NOT in this array is left unchanged. Discover available definitions via list_custom_fields; read current values via get_party with embed='fields'."
      • removedInput schema / properties / items / items / properties / fields / items / properties / definitionId / description
        Removed value: -"The custom-field definition id from list_custom_fields. Identifies which field on the entity to set."
      • removedInput schema / properties / items / items / properties / fields / items / properties / value / description
        Removed value: -"The new value. String for TEXT / DATE / LIST / LARGE_TEXT / LINK fields, number for NUMBER fields, boolean for BOOLEAN fields. Clearing: pass null for TEXT / NUMBER / DATE / LIST (Capsule removes the row). BOOLEAN does NOT accept null (Capsule returns 422 'invalid type for field'); use `value: false` instead. Note BOOLEAN fields are observably **two-state**: a row exists with `value: true`, or no row exists. Setting `value: false` removes the row entirely — readers should treat absent BOOLEAN rows as equivalent to false. Tri-state BOOLEAN semantics (true / false / unknown) are not achievable through Capsule's API. Audit-log noise: sending value=null on a field that's already empty/cleared is accepted by Capsule but still bumps the parent entity's `updatedAt`. Read the current value via embed='fields' first if `updatedAt` is being used as a 'last meaningful change' signal. NUMBER quirks: Capsule stores numerics correctly but the read-back via embed=fields returns them as STRINGS (e.g. value=3 reads as '3'); callers comparing values must coerce. TEXT quirks: value='' has the same observable effect as value=null (row removed); empty-string and never-set are indistinguishable."
      • removedInput schema / properties / items / items / properties / organisationId / description
        Removed value: -"For PERSON parties: link to an organisation by id, or `null` to unlink (the person becomes an orphan / standalone record). Discover org IDs via search_parties / filter_parties with type=organisation. For ORGANISATION parties: silently ignored by Capsule's API — organisations don't have a parent organisation in the data model. Empirically verified in v1.6.3 wire-trace; no client-side type guard since the no-op is harmless."
      • removedInput schema / properties / items / items / properties / ownerId / description
        Removed value: -"Pass a user ID to set, or `null` to unassign (verified empirically in v1.6.4 wire-trace — Capsule accepts `owner: null` on PUT /parties/:id for both persons and organisations). Discover IDs via list_users. WARNING: Capsule's PUT on /parties has the same asymmetric owner/team semantic documented in NOTES-ON-CAPSULE-API.md §27 for /kases — setting `owner` while omitting `team` is plausibly clearing-prone. When you supply `ownerId` and omit `teamId`, this connector reads the party's current team and includes it in the PUT body to preserve it across the owner change. Supply `teamId` explicitly to change it."
      • removedInput schema / properties / items / items / properties / phoneNumbers / description
        Removed value: -"APPEND-ONLY: items are merged into the existing list, never replaced. For atomic add/remove/replace use add_party_phone_number and remove_party_phone_number_by_id."
      • removedInput schema / properties / items / items / properties / teamId / description
        Removed value: -"Assign to team ID (discover via list_teams). Pass a team ID to set, or `null` to unassign. Capsule enforces the owner∈team membership constraint — passing a team the current owner doesn't belong to returns 422 'owner is not a member of the team'. Combine `ownerId: null` + `teamId: <T>` in one call to transfer a party to team-ownership with no specific user (verified empirically in v1.6.4 wire-trace; the membership rule doesn't fire when owner is null)."
      • removedInput schema / properties / items / items / properties / websites / description
        Removed value: -"APPEND-ONLY: items are merged into the existing list, never replaced. For atomic add/remove/replace use add_party_website and remove_party_website_by_id."
      • removedInput schema / properties / items / items / properties / websites / items / properties / address / description
        Removed value: -"The website address. A URL when service='URL', or a handle (e.g. '@acmeco') for social services like 'TWITTER', 'INSTAGRAM'. Capsule names this field `address` regardless of service type."
      • removedInput schema / properties / items / items / properties / websites / items / properties / service / description
        Removed value: -"Service type. One of: URL, SKYPE, TWITTER, LINKED_IN, FACEBOOK, XING, FEED, GOOGLE_PLUS, FLICKR, GITHUB, YOUTUBE, INSTAGRAM, PINTEREST, TIKTOK, THREADS, BLUESKY, SNAPCHAT. Defaults to 'URL' if omitted."
    • Changedbatch_update_project9 fields changed
      • removedInput schema / properties / items / items / properties / expectedCloseOn / description
        Removed value: -"YYYY-MM-DD"
      • removedInput schema / properties / items / items / properties / fields / description
        Removed value: -"Set custom field values on this record. PARTIAL UPDATE: only the definitions you list are touched; any field NOT in this array is left unchanged. Discover available definitions via list_custom_fields; read current values via get_project with embed='fields'. Project-specific: setting a field whose definition lives under a 'data tag' populates the row's internal tagId but does NOT auto-add the data tag to the project's tags array — use add_tag explicitly if you want it visible via embed=tags."
      • removedInput schema / properties / items / items / properties / fields / items / properties / definitionId / description
        Removed value: -"The custom-field definition id from list_custom_fields. Identifies which field on the entity to set."
      • removedInput schema / properties / items / items / properties / fields / items / properties / value / description
        Removed value: -"The new value. String for TEXT / DATE / LIST / LARGE_TEXT / LINK fields, number for NUMBER fields, boolean for BOOLEAN fields. Clearing: pass null for TEXT / NUMBER / DATE / LIST (Capsule removes the row). BOOLEAN does NOT accept null (Capsule returns 422 'invalid type for field'); use `value: false` instead. Note BOOLEAN fields are observably **two-state**: a row exists with `value: true`, or no row exists. Setting `value: false` removes the row entirely — readers should treat absent BOOLEAN rows as equivalent to false. Tri-state BOOLEAN semantics (true / false / unknown) are not achievable through Capsule's API. Audit-log noise: sending value=null on a field that's already empty/cleared is accepted by Capsule but still bumps the parent entity's `updatedAt`. Read the current value via embed='fields' first if `updatedAt` is being used as a 'last meaningful change' signal. NUMBER quirks: Capsule stores numerics correctly but the read-back via embed=fields returns them as STRINGS (e.g. value=3 reads as '3'); callers comparing values must coerce. TEXT quirks: value='' has the same observable effect as value=null (row removed); empty-string and never-set are indistinguishable."
      • removedInput schema / properties / items / items / properties / ownerId / description
        Removed value: -"Reassign owner: pass a user ID to set, or `null` to unassign (matches the 'Unassign' option in Capsule's web UI). When you supply `ownerId` and omit `teamId` and/or `stageId`, the connector fetches the project's current omitted fields and includes them in the PUT body — this preserves them across the owner change (without it, Capsule's PUT would clear team; stage carry is defensive against the symmetric clear). Supply `teamId` and/or `stageId` explicitly on the same call to change them instead. `teamId: null` clears the team as part of an owner change. Constraints (Capsule enforces, 422 on violation): owner must be a member of the team if both are set; a project must always have at least one of {owner, team} set (cannot clear both)."
      • removedInput schema / properties / items / items / properties / partyId / description
        Removed value: -"Reassign the project to a different primary party. Capsule requires every project to have a party — passing `null` is rejected with 422 'party is required' (verified empirically in v1.6.3 wire-trace). Discover ids via search_parties / filter_parties. NOTE: parent-ref nullability differs by entity — `update_task.partyId` IS nullable (orphan task), but opportunities and projects must always have a parent party. The same applies to `update_opportunity.partyId`."
      • removedInput schema / properties / items / items / properties / stageId / description
        Removed value: -"Move the project to this stage (board column), or `null` to remove from all stages (verified empirically in v1.6.5 wire-trace — Capsule accepts `stage: null` on PUT /kases/:id and the project no longer appears on any board). Discover IDs via list_stages. Owner and team are preserved across stage-only updates (Capsule's PUT semantic). WARNING (cross-board): Capsule does NOT validate that the new stage belongs to the project's current board — passing a stageId from a different board silently relocates the project across boards. Team and other board-derived defaults are NOT updated to match the new board. Verify against the project's current board (read the project first, list its board's stages) before passing a cross-board id."
      • addedInput schema / properties / items / items / properties / startOn
        Added value: +{
        +  "anyOf": [
        +    {
        +      "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ]
        +}
      • removedInput schema / properties / items / items / properties / teamId / description
        Removed value: -"Reassign team: pass a team ID (discover via list_teams) to set, or `null` to unassign. Capsule preserves the existing owner across a team change (server-side), so `update_project { teamId }` alone is safe — the owner is carried through. Owner must be a member of the new team or Capsule returns 422 'owner is not a member of the team'. A project must always have at least one of {owner, team} set — `teamId: null` on a project whose owner is already null returns 422 'owner or team is required'."
    • Changedcreate_opportunity1 field changed
      • changedInput schema / properties / fields / description
        Previous value: -"Set custom field values on this record. PARTIAL UPDATE: only the definitions you list are touched; any field NOT in this array is left unchanged. Discover available definitions via list_custom_fields; read current values via get_opportunity with embed='fields'. Capsule's POST /opportunities accepts the same `fields[]` shape as PUT (inferred by symmetry with the v1.6.5 wire-trace findings on POST /parties and POST /kases — the tenant probed had no opportunity custom fields configured, so this is unverified empirically). Setting custom fields on creation removes the create-then-update ritual."New value: +"Set custom field values on this record. PARTIAL UPDATE: only the definitions you list are touched; any field NOT in this array is left unchanged. Discover available definitions via list_custom_fields; read current values via get_opportunity with embed='fields'. Capsule's POST /opportunities accepts the same `fields[]` shape as PUT (inferred by symmetry with the v1.6.5 wire-trace findings on party and project creation — the tenant probed had no opportunity custom fields configured, so this is unverified empirically). Setting custom fields on creation removes the create-then-update ritual."
    • Changedcreate_project2 fields changed
      • changedInput schema / properties / fields / description
        Previous value: -"Set custom field values on this record. PARTIAL UPDATE: only the definitions you list are touched; any field NOT in this array is left unchanged. Discover available definitions via list_custom_fields; read current values via get_project with embed='fields'. Verified empirically in v1.6.5 wire-trace: Capsule's POST /kases accepts the same `fields[]` shape as PUT, so callers can set custom field values on creation without a follow-up update. Project-specific: setting a field whose definition lives under a 'data tag' populates the row's internal tagId but does NOT auto-add the data tag to the project's tags array — use add_tag explicitly if you want it visible via embed=tags."New value: +"Set custom field values on this record. PARTIAL UPDATE: only the definitions you list are touched; any field NOT in this array is left unchanged. Discover available definitions via list_custom_fields; read current values via get_project with embed='fields'. Verified empirically in v1.6.5 wire-trace: Capsule's project create endpoint accepts the same `fields[]` shape as PUT, so callers can set custom field values on creation without a follow-up update. Project-specific: setting a field whose definition lives under a 'data tag' populates the row's internal tagId but does NOT auto-add the data tag to the project's tags array — use add_tag explicitly if you want it visible via embed=tags."
      • addedInput schema / properties / startOn
        Added value: +{
        +  "description": "Project start date, YYYY-MM-DD. Verified empirically (v2.0.1 wire probe): Capsule's POST /kases accepts and stores it; reads back as `startOn` on the project.",
        +  "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
        +  "type": "string"
        +}
    • Changeddelete_party1 field changed
      • changedInput schema / properties / confirm / description
        Previous value: -"Must be set to true. Deletes the party AND all linked notes, tasks, opportunities, and projects (kases). Deleting an ORGANISATION does NOT delete people linked to it via organisationId — their `organisation` field is silently cleared to null and they survive as standalone records. Irreversible."New value: +"Must be set to true. Deletes the party AND all linked notes, tasks, opportunities, and projects. Deleting an ORGANISATION does NOT delete people linked to it via organisationId — their `organisation` field is silently cleared to null and they survive as standalone records. Irreversible."
    • Changeddelete_project1 field changed
      • changedInput schema / properties / confirm / description
        Previous value: -"Must be set to true. Permanently deletes the project (case). Consider update_project status='CLOSED' instead. Irreversible."New value: +"Must be set to true. Permanently deletes the project. Consider update_project status='CLOSED' instead. Irreversible."
    • Changeddelete_tag_definition2 fields changed
      • changedInput schema / properties / entity / description
        Previous value: -"Which entity type. Use 'kases' for projects (Capsule's legacy path name)."New value: +"Which entity type."
      • changedInput schema / properties / entity / enum
        Previous value: -[
        -  "parties",
        -  "opportunities",
        -  "kases"
        -]New value: +[
        +  "parties",
        +  "opportunities",
        +  "projects"
        +]
    • Changedfilter_opportunities1 field changed
      • changedInput schema / properties / embed / description
        Previous value: -"Comma-separated embeds, e.g. 'tags,fields'"New value: +"Comma-separated embeds. Valid tokens: tags, fields, missingImportantFields."
    • Changedfilter_parties1 field changed
      • changedInput schema / properties / embed / description
        Previous value: -"Comma-separated embeds, e.g. 'tags,fields'"New value: +"Comma-separated embeds. Valid tokens: tags, fields, missingImportantFields."
    • Changedfilter_projects1 field changed
      • changedInput schema / properties / embed / description
        Previous value: -"Comma-separated embeds, e.g. 'tags,fields'"New value: +"Comma-separated embeds. Valid tokens: tags, fields, missingImportantFields."
    • Changedget_custom_field4 fields changed
      • changedInput schema / properties / entity / description
        Previous value: -"Which entity type's custom field schema to inspect. Use 'kases' for projects."New value: +"Which entity type's custom field schema to inspect."
      • changedInput schema / properties / entity / enum
        Previous value: -[
        -  "parties",
        -  "opportunities",
        -  "kases"
        -]New value: +[
        +  "parties",
        +  "opportunities",
        +  "projects"
        +]
      • removedInput schema / properties / fieldId
        Removed value: -{
        -  "description": "Custom field definition id.",
        -  "exclusiveMinimum": 0,
        -  "maximum": 9007199254740991,
        -  "type": "integer"
        -}
      • addedInput schema / properties / id
        Added value: +{
        +  "description": "Custom field definition id.",
        +  "exclusiveMinimum": 0,
        +  "maximum": 9007199254740991,
        +  "type": "integer"
        +}
    • Changedget_entry1 field changed
      • changedInput schema / properties / embed / description
        Previous value: -"Comma-separated embeds, e.g. 'attachments,participants'"New value: +"Comma-separated embeds. Valid tokens: attachments, participants."
    • Changedget_opportunities1 field changed
      • changedInput schema / properties / embed / description
        Previous value: -"Comma-separated embeds, e.g. 'tags,fields'"New value: +"Comma-separated embeds. Valid tokens: tags, fields, missingImportantFields."
    • Changedget_opportunity1 field changed
      • changedInput schema / properties / embed / description
        Previous value: -"Comma-separated embeds, e.g. 'tags,fields'"New value: +"Comma-separated embeds. Valid tokens: tags, fields, missingImportantFields."
    • Changedget_parties1 field changed
      • changedInput schema / properties / embed / description
        Previous value: -"Comma-separated embeds, e.g. 'tags,fields'"New value: +"Comma-separated embeds. Valid tokens: tags, fields, missingImportantFields."
    • Changedget_party1 field changed
      • changedInput schema / properties / embed / description
        Previous value: -"Comma-separated embeds, e.g. 'tags,fields'"New value: +"Comma-separated embeds. Valid tokens: tags, fields, missingImportantFields."
    • Changedget_project1 field changed
      • changedInput schema / properties / embed / description
        Previous value: -"Comma-separated embeds, e.g. 'tags,fields'"New value: +"Comma-separated embeds. Valid tokens: tags, fields, missingImportantFields."
    • Changedget_projects1 field changed
      • changedInput schema / properties / embed / description
        Previous value: -"Comma-separated embeds, e.g. 'tags,fields'"New value: +"Comma-separated embeds. Valid tokens: tags, fields, missingImportantFields."
    • Addedget_track
    • Addedlist_activity_types
    • Removedlist_activitytypes
    • Changedlist_additional_parties3 fields changed
      • changedInput schema / properties / embed / description
        Previous value: -"Comma-separated embeds, e.g. 'tags,fields'"New value: +"Comma-separated embeds. Valid tokens: tags, fields, missingImportantFields."
      • changedInput schema / properties / entity / description
        Previous value: -"Which entity has the additional-party links. Use 'kases' for projects."New value: +"Which entity has the additional-party links."
      • changedInput schema / properties / entity / enum
        Previous value: -[
        -  "opportunities",
        -  "kases"
        -]New value: +[
        +  "opportunities",
        +  "projects"
        +]
    • Changedlist_associated_projects1 field changed
      • changedInput schema / properties / embed / description
        Previous value: -"Comma-separated embeds, e.g. 'tags,fields'"New value: +"Comma-separated embeds. Valid tokens: tags, fields, missingImportantFields."
    • Changedlist_custom_fields2 fields changed
      • changedInput schema / properties / entity / description
        Previous value: -"Which entity type's custom field schema to inspect. Use 'kases' for projects."New value: +"Which entity type's custom field schema to inspect."
      • changedInput schema / properties / entity / enum
        Previous value: -[
        -  "parties",
        -  "opportunities",
        -  "kases"
        -]New value: +[
        +  "parties",
        +  "opportunities",
        +  "projects"
        +]
    • Changedlist_employees1 field changed
      • changedInput schema / properties / embed / description
        Previous value: -"Comma-separated embeds, e.g. 'tags,fields'"New value: +"Comma-separated embeds. Valid tokens: tags, fields, missingImportantFields."
    • Changedlist_entity_tracks2 fields changed
      • changedInput schema / properties / entity / description
        Previous value: -"Use 'kases' for projects."New value: +"Which entity type."
      • changedInput schema / properties / entity / enum
        Previous value: -[
        -  "parties",
        -  "opportunities",
        -  "kases"
        -]New value: +[
        +  "parties",
        +  "opportunities",
        +  "projects"
        +]
    • Changedlist_entries1 field changed
      • changedInput schema / properties / embed / description
        Previous value: -"Comma-separated embeds, e.g. 'attachments,participants'"New value: +"Comma-separated embeds. Valid tokens: attachments, participants."
    • Addedlist_lost_reasons
    • Removedlist_lostreasons
    • Changedlist_opportunity_entries1 field changed
      • changedInput schema / properties / embed / description
        Previous value: -"Comma-separated embeds, e.g. 'attachments,participants'"New value: +"Comma-separated embeds. Valid tokens: attachments, participants."
    • Changedlist_party_entries2 fields changed
      • changedInput schema / properties / embed / description
        Previous value: -"Comma-separated embeds, e.g. 'attachments,participants'"New value: +"Comma-separated embeds. Valid tokens: attachments, participants."
      • changedInput schema / properties / includeLinkedPersons / description
        Previous value: -"When true AND `partyId` is an ORGANISATION, also include entries filed against the organisation's linked people (the persons whose `organisation` field references this org). The connector enumerates linked persons via `GET /parties/{orgId}/people`, fans out `GET /parties/{personId}/entries` in parallel (concurrency-capped, default 5 / configurable via `CAPSULE_MCP_BATCH_CONCURRENCY`), and merges into a single feed sorted by `entryAt` descending, deduped by entry id. Default is `false` — single GET, existing behaviour unchanged. WHY THIS FLAG EXISTS: Capsule's API files each entry against exactly one party row (verified v1.6.6 wire-trace probe 4 — POST /entries rejects multi-party bodies with 422 'entry must be linked to either a party, opportunity or kase'). For an organisation with multiple contacts, captured emails almost always land on a person row, not the org. As a result, `list_party_entries(orgId)` with `includeLinkedPersons: false` will miss recent customer-facing email — even though the org's own `lastContactedAt` is updated by the activity. This flag is the correct call for any 'what's new with $ORG?' question. WHEN `partyId` IS A PERSON: silently no-op — persons have no linked-people relationship in Capsule's data model, so the flag is functionally inert (the connector still issues a cheap `/people` check; the response is empty). LATENCY: 1 + N round trips for an org with N linked people, concurrency-capped (typical: 2-3 waves for N=10). Linked-person enumeration reads the first 100 linked people; use list_employees for explicit pagination when an organisation has more contacts than that. Use `includeLinkedPersons: false` for fast pre-screen reads where you only need the org-row entries (e.g. invoice/contract notes that are typically filed at the org level). PAGINATION CAVEAT: `page` and `perPage` apply to the MERGED window, and the merge has a hard ceiling — it reliably orders only the most-recent ~100 entries across the org + its people (each party is fetched at Capsule's per-party cap of 100, and a top-100-per-party merge is correct only up to global position 100). Windows that cross the ceiling are truncated to the entries still inside that top-100 set; windows starting beyond it return no entries and end the feed. It does NOT continue into older history. To read a specific contact's full timeline beyond the merged ceiling, call `list_party_entries` on that person's id directly (the default single-GET path paginates natively with no ceiling). For the LLM-driven 'what's the latest with $ORG' query this is the typical use of, the first page is exact and the ceiling is never reached."New value: +"When true AND `partyId` is an ORGANISATION, also include entries filed against the organisation's linked people (the persons whose `organisation` field references this org). The connector enumerates linked persons via `GET /parties/{orgId}/people`, fans out `GET /parties/{personId}/entries` in parallel (concurrency-capped, default 5 / configurable via `CAPSULE_MCP_BATCH_CONCURRENCY`), and merges into a single feed sorted by `entryAt` descending, deduped by entry id. Default is `false` — single GET, existing behaviour unchanged. WHY THIS FLAG EXISTS: Capsule's API files each entry against exactly one party, opportunity, or project row (verified v1.6.6 wire-trace probe 4 — POST /entries rejects multi-party bodies with 422). For an organisation with multiple contacts, captured emails almost always land on a person row, not the org. As a result, `list_party_entries(orgId)` with `includeLinkedPersons: false` will miss recent customer-facing email — even though the org's own `lastContactedAt` is updated by the activity. This flag is the correct call for any 'what's new with $ORG?' question. WHEN `partyId` IS A PERSON: silently no-op — persons have no linked-people relationship in Capsule's data model, so the flag is functionally inert (the connector still issues a cheap `/people` check; the response is empty). LATENCY: 1 + N round trips for an org with N linked people, concurrency-capped (typical: 2-3 waves for N=10). Linked-person enumeration reads the first 100 linked people; use list_employees for explicit pagination when an organisation has more contacts than that. Use `includeLinkedPersons: false` for fast pre-screen reads where you only need the org-row entries (e.g. invoice/contract notes that are typically filed at the org level). PAGINATION CAVEAT: `page` and `perPage` apply to the MERGED window, and the merge has a hard ceiling — it reliably orders only the most-recent ~100 entries across the org + its people (each party is fetched at Capsule's per-party cap of 100, and a top-100-per-party merge is correct only up to global position 100). Windows that cross the ceiling are truncated to the entries still inside that top-100 set; windows starting beyond it return no entries and end the feed. It does NOT continue into older history. To read a specific contact's full timeline beyond the merged ceiling, call `list_party_entries` on that person's id directly (the default single-GET path paginates natively with no ceiling). For the LLM-driven 'what's the latest with $ORG' query this is the typical use of, the first page is exact and the ceiling is never reached."
    • Changedlist_project_entries1 field changed
      • changedInput schema / properties / embed / description
        Previous value: -"Comma-separated embeds, e.g. 'attachments,participants'"New value: +"Comma-separated embeds. Valid tokens: attachments, participants."
    • Changedlist_projects1 field changed
      • changedInput schema / properties / embed / description
        Previous value: -"Comma-separated embeds, e.g. 'tags,fields'"New value: +"Comma-separated embeds. Valid tokens: tags, fields, missingImportantFields."
    • Changedlist_saved_filters2 fields changed
      • changedInput schema / properties / entity / description
        Previous value: -"Which entity type the filter operates over. Use 'kases' for projects (Capsule's legacy name)."New value: +"Which entity type the filter operates over."
      • changedInput schema / properties / entity / enum
        Previous value: -[
        -  "parties",
        -  "opportunities",
        -  "kases"
        -]New value: +[
        +  "parties",
        +  "opportunities",
        +  "projects"
        +]
    • Changedlist_tags1 field changed
      • changedInput schema / properties / entity / enum
        Previous value: -[
        -  "parties",
        -  "opportunities",
        -  "kases"
        -]New value: +[
        +  "parties",
        +  "opportunities",
        +  "projects"
        +]
    • Changedremove_additional_party2 fields changed
      • changedInput schema / properties / entity / description
        Previous value: -"Which entity has the additional-party links. Use 'kases' for projects."New value: +"Which entity has the additional-party links."
      • changedInput schema / properties / entity / enum
        Previous value: -[
        -  "opportunities",
        -  "kases"
        -]New value: +[
        +  "opportunities",
        +  "projects"
        +]
    • Changedremove_tag_by_id3 fields changed
      • changedInput schema / properties / entity / description
        Previous value: -"Which entity type. Use 'kases' for projects (Capsule's legacy path name)."New value: +"Which entity type."
      • changedInput schema / properties / entity / enum
        Previous value: -[
        -  "parties",
        -  "opportunities",
        -  "kases"
        -]New value: +[
        +  "parties",
        +  "opportunities",
        +  "projects"
        +]
      • changedInput schema / properties / entityId / description
        Previous value: -"The party/opportunity/kase id."New value: +"The party/opportunity/project id."
    • Changedremove_track2 fields changed
      • addedInput schema / properties / id
        Added value: +{
        +  "exclusiveMinimum": 0,
        +  "maximum": 9007199254740991,
        +  "type": "integer"
        +}
      • removedInput schema / properties / trackId
        Removed value: -{
        -  "exclusiveMinimum": 0,
        -  "maximum": 9007199254740991,
        -  "type": "integer"
        -}
    • Changedrun_saved_filter3 fields changed
      • changedInput schema / properties / embed / description
        Previous value: -"Comma-separated embeds, e.g. 'tags,fields'"New value: +"Comma-separated embeds. Valid tokens: tags, fields, missingImportantFields."
      • changedInput schema / properties / entity / description
        Previous value: -"Which entity type the filter operates over. Use 'kases' for projects (Capsule's legacy name)."New value: +"Which entity type the filter operates over."
      • changedInput schema / properties / entity / enum
        Previous value: -[
        -  "parties",
        -  "opportunities",
        -  "kases"
        -]New value: +[
        +  "parties",
        +  "opportunities",
        +  "projects"
        +]
    • Changedsearch_opportunities1 field changed
      • changedInput schema / properties / embed / description
        Previous value: -"Comma-separated embeds, e.g. 'tags,fields'"New value: +"Comma-separated embeds. Valid tokens: tags, fields, missingImportantFields."
    • Changedsearch_parties1 field changed
      • changedInput schema / properties / embed / description
        Previous value: -"Comma-separated embeds, e.g. 'tags,fields'"New value: +"Comma-separated embeds. Valid tokens: tags, fields, missingImportantFields."
    • Addedsearch_projects
    • Removedshow_track
    • Changedupdate_opportunity2 fields changed
      • changedInput schema / properties / lostReasonId / description
        Previous value: -"Reason the opportunity was lost. Only meaningful when transitioning to a Lost milestone — Capsule silently drops it for other milestones. Without this set, a connector-driven Lost-close leaves `lostReason: null`. Discover IDs via list_lostreasons."New value: +"Reason the opportunity was lost. Only meaningful when transitioning to a Lost milestone — Capsule silently drops it for other milestones. Without this set, a connector-driven Lost-close leaves `lostReason: null`. Discover IDs via list_lost_reasons."
      • changedInput schema / properties / ownerId / description
        Previous value: -"Reassign owner: pass a user ID to set, or `null` to unassign (verified empirically in v1.6.5 wire-trace — Capsule accepts `owner: null` on PUT /opportunities/:id, mirroring the v1.6.4 finding on /parties; brings update_opportunity into parity with update_party and update_project). When you supply `ownerId` and omit `teamId`, the connector fetches the opportunity's current team and includes it in the PUT body to preserve it across the owner change. Without this defensive read, Capsule's PUT would clear the existing team (see NOTES-ON-CAPSULE-API.md §27 — same asymmetric semantic as /kases). Supply `teamId` explicitly on the same call to change the team instead. Combine `ownerId: null` + `teamId: <T>` in one call to transfer an opportunity to team-ownership with no specific user (verified empirically in v1.6.5; the owner-clears-team semantic doesn't fire when owner is being cleared to null)."New value: +"Reassign owner: pass a user ID to set, or `null` to unassign (verified empirically in v1.6.5 wire-trace — Capsule accepts `owner: null` on PUT /opportunities/:id, mirroring the v1.6.4 finding on /parties; brings update_opportunity into parity with update_party and update_project). When you supply `ownerId` and omit `teamId`, the connector fetches the opportunity's current team and includes it in the PUT body to preserve it across the owner change. Without this defensive read, Capsule's PUT would clear the existing team (see NOTES-ON-CAPSULE-API.md §27 — same asymmetric semantic as project updates). Supply `teamId` explicitly on the same call to change the team instead. Combine `ownerId: null` + `teamId: <T>` in one call to transfer an opportunity to team-ownership with no specific user (verified empirically in v1.6.5; the owner-clears-team semantic doesn't fire when owner is being cleared to null)."
    • Changedupdate_party1 field changed
      • changedInput schema / properties / ownerId / description
        Previous value: -"Pass a user ID to set, or `null` to unassign (verified empirically in v1.6.4 wire-trace — Capsule accepts `owner: null` on PUT /parties/:id for both persons and organisations). Discover IDs via list_users. WARNING: Capsule's PUT on /parties has the same asymmetric owner/team semantic documented in NOTES-ON-CAPSULE-API.md §27 for /kases — setting `owner` while omitting `team` is plausibly clearing-prone. When you supply `ownerId` and omit `teamId`, this connector reads the party's current team and includes it in the PUT body to preserve it across the owner change. Supply `teamId` explicitly to change it."New value: +"Pass a user ID to set, or `null` to unassign (verified empirically in v1.6.4 wire-trace — Capsule accepts `owner: null` on PUT /parties/:id for both persons and organisations). Discover IDs via list_users. WARNING: Capsule's PUT on parties has the same asymmetric owner/team semantic documented in NOTES-ON-CAPSULE-API.md §27 for project updates — setting `owner` while omitting `team` is plausibly clearing-prone. When you supply `ownerId` and omit `teamId`, this connector reads the party's current team and includes it in the PUT body to preserve it across the owner change. Supply `teamId` explicitly to change it."
    • Changedupdate_project2 fields changed
      • changedInput schema / properties / stageId / description
        Previous value: -"Move the project to this stage (board column), or `null` to remove from all stages (verified empirically in v1.6.5 wire-trace — Capsule accepts `stage: null` on PUT /kases/:id and the project no longer appears on any board). Discover IDs via list_stages. Owner and team are preserved across stage-only updates (Capsule's PUT semantic). WARNING (cross-board): Capsule does NOT validate that the new stage belongs to the project's current board — passing a stageId from a different board silently relocates the project across boards. Team and other board-derived defaults are NOT updated to match the new board. Verify against the project's current board (read the project first, list its board's stages) before passing a cross-board id."New value: +"Move the project to this stage (board column), or `null` to remove from all stages (verified empirically in v1.6.5 wire-trace — Capsule accepts `stage: null` on project update and the project no longer appears on any board). Discover IDs via list_stages. Owner and team are preserved across stage-only updates (Capsule's PUT semantic). WARNING (cross-board): Capsule does NOT validate that the new stage belongs to the project's current board — passing a stageId from a different board silently relocates the project across boards. Team and other board-derived defaults are NOT updated to match the new board. Verify against the project's current board (read the project first, list its board's stages) before passing a cross-board id."
      • addedInput schema / properties / startOn
        Added value: +{
        +  "anyOf": [
        +    {
        +      "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "description": "Set the project start date (YYYY-MM-DD), or `null` to clear it. Verified empirically (v2.0.1 wire probe): PUT accepts both the set and the null-clear. `undefined` leaves the field untouched."
        +}
    • Changedupdate_task1 field changed
      • changedInput schema / properties / projectId / description
        Previous value: -"Re-link the task to a project (kase) by id, or `null` to orphan it. Mutually exclusive with `partyId` / `opportunityId` — see `partyId` for the XOR semantic."New value: +"Re-link the task to a project by id, or `null` to orphan it. Mutually exclusive with `partyId` / `opportunityId` — see `partyId` for the XOR semantic."
    • Changedupdate_track2 fields changed
      • addedInput schema / properties / id
        Added value: +{
        +  "exclusiveMinimum": 0,
        +  "maximum": 9007199254740991,
        +  "type": "integer"
        +}
      • removedInput schema / properties / trackId
        Removed value: -{
        -  "exclusiveMinimum": 0,
        -  "maximum": 9007199254740991,
        -  "type": "integer"
        -}
    • Changedupload_attachment1 field changed
      • changedInput schema / properties / dataBase64 / description
        Previous value: -"File contents, base64-encoded. Decoded server-side and uploaded as the request body. Maximum 25 MB per attachment (Capsule's documented limit); the connector rejects oversized base64 before uploading. The inbound HTTP body limit is ~35 MB which leaves room for the base64 expansion of a 25 MB binary."New value: +"File contents, base64-encoded. Decoded server-side and uploaded as the request body. PRACTICAL LIMIT: the base64 must be produced inline as tool-call output, so uploads driven by an LLM are only viable for small files (a few tens of KB) — a 500 KB file is ~660K characters, far beyond a chat model's output budget. Do not attempt to inline large files; tell the user the file is too large to route through the model. The 25 MB maximum (Capsule's documented limit) applies to programmatic MCP clients that construct the call directly; the connector rejects oversized base64 before uploading."
  5. 88 tool updatesv1.7.0
    • Addedadd_additional_party
    • Addedadd_note
    • Addedadd_party_address
    • Addedadd_party_email_address
    • Addedadd_party_phone_number
    • Addedadd_party_website
    • Addedadd_tag
    • Addedapply_track
    • Addedbatch_add_tag
    • Addedbatch_complete_task
    • Addedbatch_remove_tag_by_id
    • Addedbatch_update_opportunity
    • Addedbatch_update_party
    • Addedbatch_update_project
    • Addedcomplete_task
    • Addedcreate_opportunity
    • Addedcreate_party
    • Addedcreate_project
    • Addedcreate_task
    • Addeddelete_entry
    • Addeddelete_opportunity
    • Addeddelete_party
    • Addeddelete_project
    • Addeddelete_tag_definition
    • Addeddelete_task
    • Addedfilter_opportunities
    • Addedfilter_parties
    • Addedfilter_projects
    • Addedget_attachment
    • Addedget_current_user
    • Addedget_custom_field
    • Addedget_entry
    • Addedget_opportunities
    • Addedget_opportunity
    • Addedget_parties
    • Addedget_party
    • Addedget_project
    • Addedget_projects
    • Addedget_site
    • Addedget_task
    • Addedget_tasks
    • Addedlist_activitytypes
    • Addedlist_additional_parties
    • Addedlist_associated_projects
    • Addedlist_boards
    • Addedlist_categories
    • Addedlist_custom_fields
    • Addedlist_deleted_opportunities
    • Addedlist_deleted_parties
    • Addedlist_deleted_projects
    • Addedlist_employees
    • Addedlist_entity_tracks
    • Addedlist_entries
    • Addedlist_goals
    • Addedlist_lostreasons
    • Addedlist_milestones
    • Addedlist_opportunity_entries
    • Addedlist_party_entries
    • Addedlist_party_opportunities
    • Addedlist_party_projects
    • Addedlist_pipelines
    • Addedlist_project_entries
    • Addedlist_projects
    • Addedlist_saved_filters
    • Addedlist_stages
    • Addedlist_tags
    • Addedlist_tasks
    • Addedlist_teams
    • Addedlist_track_definitions
    • Addedlist_users
    • Addedremove_additional_party
    • Addedremove_party_address_by_id
    • Addedremove_party_email_address_by_id
    • Addedremove_party_phone_number_by_id
    • Addedremove_party_website_by_id
    • Addedremove_tag_by_id
    • Addedremove_track
    • Addedrun_saved_filter
    • Addedsearch_opportunities
    • Addedsearch_parties
    • Addedshow_track
    • Addedupdate_entry
    • Addedupdate_opportunity
    • Addedupdate_party
    • Addedupdate_project
    • Addedupdate_task
    • Addedupdate_track
    • Addedupload_attachment
  6. 86 tool updatesv1.6.2
    • Removedadd_additional_party
    • Removedadd_note
    • Removedadd_party_address
    • Removedadd_party_email_address
    • Removedadd_party_phone_number
    • Removedadd_party_website
    • Removedadd_tag
    • Removedapply_track
    • Removedbatch_add_tag
    • Removedbatch_complete_task
    • Removedbatch_remove_tag_by_id
    • Removedbatch_update_opportunity
    • Removedbatch_update_party
    • Removedcomplete_task
    • Removedcreate_opportunity
    • Removedcreate_party
    • Removedcreate_project
    • Removedcreate_task
    • Removeddelete_entry
    • Removeddelete_opportunity
    • Removeddelete_party
    • Removeddelete_project
    • Removeddelete_task
    • Removedfilter_opportunities
    • Removedfilter_parties
    • Removedfilter_projects
    • Removedget_attachment
    • Removedget_current_user
    • Removedget_custom_field
    • Removedget_entry
    • Removedget_opportunities
    • Removedget_opportunity
    • Removedget_parties
    • Removedget_party
    • Removedget_project
    • Removedget_projects
    • Removedget_site
    • Removedget_task
    • Removedget_tasks
    • Removedlist_activitytypes
    • Removedlist_additional_parties
    • Removedlist_associated_projects
    • Removedlist_boards
    • Removedlist_categories
    • Removedlist_custom_fields
    • Removedlist_deleted_opportunities
    • Removedlist_deleted_parties
    • Removedlist_deleted_projects
    • Removedlist_employees
    • Removedlist_entity_tracks
    • Removedlist_entries
    • Removedlist_goals
    • Removedlist_lostreasons
    • Removedlist_milestones
    • Removedlist_opportunity_entries
    • Removedlist_party_entries
    • Removedlist_party_opportunities
    • Removedlist_party_projects
    • Removedlist_pipelines
    • Removedlist_project_entries
    • Removedlist_projects
    • Removedlist_saved_filters
    • Removedlist_stages
    • Removedlist_tags
    • Removedlist_tasks
    • Removedlist_teams
    • Removedlist_track_definitions
    • Removedlist_users
    • Removedremove_additional_party
    • Removedremove_party_address_by_id
    • Removedremove_party_email_address_by_id
    • Removedremove_party_phone_number_by_id
    • Removedremove_party_website_by_id
    • Removedremove_tag_by_id
    • Removedremove_track
    • Removedrun_saved_filter
    • Removedsearch_opportunities
    • Removedsearch_parties
    • Removedshow_track
    • Removedupdate_entry
    • Removedupdate_opportunity
    • Removedupdate_party
    • Removedupdate_project
    • Removedupdate_task
    • Removedupdate_track
    • Removedupload_attachment
  7. 9 tool updatesv1.6.0
    • Addedbatch_add_tag
    • Addedbatch_complete_task
    • Addedbatch_remove_tag_by_id
    • Addedbatch_update_opportunity
    • Addedbatch_update_party
    • Changedget_opportunities2 fields changed
      • changedInput schema / properties / ids / description
        Previous value: -"Array of opportunity IDs (1–10). Capsule caps batch fetches at 10."New value: +"Array of opportunity IDs (1–50). Capsule's native batch-fetch endpoint caps at 10 per request; the connector transparently splits larger sets into 10-id chunks and fans out the Capsule calls in parallel."
      • changedInput schema / properties / ids / maxItems
        Previous value: -10New value: +50
    • Changedget_parties2 fields changed
      • changedInput schema / properties / ids / description
        Previous value: -"Array of party IDs (1–10). Capsule caps batch fetches at 10."New value: +"Array of party IDs (1–50). Capsule's native batch-fetch endpoint caps at 10 per request; the connector transparently splits larger sets into 10-id chunks and fans out the Capsule calls in parallel. Result shape is identical regardless of input size."
      • changedInput schema / properties / ids / maxItems
        Previous value: -10New value: +50
    • Changedget_projects2 fields changed
      • changedInput schema / properties / ids / description
        Previous value: -"Array of project IDs (1–10). Capsule caps batch fetches at 10."New value: +"Array of project IDs (1–50). Capsule's native batch-fetch endpoint caps at 10 per request; the connector transparently splits larger sets into 10-id chunks and fans out the Capsule calls in parallel."
      • changedInput schema / properties / ids / maxItems
        Previous value: -10New value: +50
    • Changedget_tasks2 fields changed
      • changedInput schema / properties / ids / description
        Previous value: -"Array of task IDs (1–10). Capsule caps batch fetches at 10."New value: +"Array of task IDs (1–50). Capsule's native batch-fetch endpoint caps at 10 per request; the connector transparently splits larger sets into 10-id chunks and fans out the Capsule calls in parallel."
      • changedInput schema / properties / ids / maxItems
        Previous value: -10New value: +50
  8. 81 tool updatesv1.0.0
    • First observedadd_additional_party
    • First observedadd_note
    • First observedadd_party_address
    • First observedadd_party_email_address
    • First observedadd_party_phone_number
    • First observedadd_party_website
    • First observedadd_tag
    • First observedapply_track
    • First observedcomplete_task
    • First observedcreate_opportunity
    • First observedcreate_party
    • First observedcreate_project
    • First observedcreate_task
    • First observeddelete_entry
    • First observeddelete_opportunity
    • First observeddelete_party
    • First observeddelete_project
    • First observeddelete_task
    • First observedfilter_opportunities
    • First observedfilter_parties
    • First observedfilter_projects
    • First observedget_attachment
    • First observedget_current_user
    • First observedget_custom_field
    • First observedget_entry
    • First observedget_opportunities
    • First observedget_opportunity
    • First observedget_parties
    • First observedget_party
    • First observedget_project
    • First observedget_projects
    • First observedget_site
    • First observedget_task
    • First observedget_tasks
    • First observedlist_activitytypes
    • First observedlist_additional_parties
    • First observedlist_associated_projects
    • First observedlist_boards
    • First observedlist_categories
    • First observedlist_custom_fields
    • First observedlist_deleted_opportunities
    • First observedlist_deleted_parties
    • First observedlist_deleted_projects
    • First observedlist_employees
    • First observedlist_entity_tracks
    • First observedlist_entries
    • First observedlist_goals
    • First observedlist_lostreasons
    • First observedlist_milestones
    • First observedlist_opportunity_entries
    • First observedlist_party_entries
    • First observedlist_party_opportunities
    • First observedlist_party_projects
    • First observedlist_pipelines
    • First observedlist_project_entries
    • First observedlist_projects
    • First observedlist_saved_filters
    • First observedlist_stages
    • First observedlist_tags
    • First observedlist_tasks
    • First observedlist_teams
    • First observedlist_track_definitions
    • First observedlist_users
    • First observedremove_additional_party
    • First observedremove_party_address_by_id
    • First observedremove_party_email_address_by_id
    • First observedremove_party_phone_number_by_id
    • First observedremove_party_website_by_id
    • First observedremove_tag_by_id
    • First observedremove_track
    • First observedrun_saved_filter
    • First observedsearch_opportunities
    • First observedsearch_parties
    • First observedshow_track
    • First observedupdate_entry
    • First observedupdate_opportunity
    • First observedupdate_party
    • First observedupdate_project
    • First observedupdate_task
    • First observedupdate_track
    • First observedupload_attachment

TDQS

A3.9/5.0

Scored across 92 tools

Disambiguation5/5

Each tool targets a clear, distinct action on a specific entity (party, opportunity, project, task, etc.), with no obvious overlap. Even closely related tools like search_parties vs filter_parties are clearly differentiated by their descriptions, and batch variants are explicitly marked for multi-item operations.

Naming Consistency5/5

Tool names consistently follow a verb_noun pattern (e.g., create_party, get_party, update_party, delete_party). Batch operations are uniformly prefixed with 'batch_', and entity-specific list operations follow a consistent 'list_<entity>_<subresource>' structure. Minor deviations like 'add_party_address' vs 'remove_party_address_by_id' are still systematic.

Tool Count2/5

With 92 tools, the server is far beyond the typical well-scoped range. While the domain is broad (parties, opportunities, projects, tasks, entries, tracks, reference data), the number is excessive. Many tools are batch variants and atomic child-entity operations that could be consolidated, making the tool surface overwhelming for an agent to navigate.

Completeness5/5

The tool set covers the full lifecycle for all core entities: create, read, update, delete, batch operations, search/filter, tags, tracks, entries, and reference data. It even includes audit features (deleted entities) and diagnostics (get_current_user). There are no obvious missing operations for a Capsule CRM integration; the surface is comprehensive.

Maintenance

ActivityMaintained
ResponsivenessResponsive

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    B
    maintenance
    Loomio tools for Claude. Local install via npx, org-wide via Custom Connectors. Read-only mode supported.
    12
    11 npm
    Apache 2.0
  • A
    license
    B
    quality
    F
    maintenance
    Enables natural language interaction with Pipedrive CRM via Claude Code, allowing users to manage deals, contacts, activities, and more through conversational commands.
    26
    11 npm
    MIT
  • F
    license
    Not graded
    quality
    D
    maintenance
    Enables querying and managing a CRM database through natural language conversations with Claude Desktop.
    -
  • F
    license
    Not graded
    quality
    D
    maintenance
    Integrates Zero CRM with Claude Desktop, providing 16 tools for full CRUD operations on companies, contacts, and deals with filtering and pagination.
    -