DIDWW MCP
Server Details
Official DIDWW MCP connector for managing phone numbers, inbound voice and SMS routing, and voice capacity. Review billing information, prepare data exports, and manage supported compliance workflows. Uses OAuth and existing DIDWW account permissions, with explicit confirmation for significant account changes.
- Status
- Healthy
- OAuth
- Works in Glama
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
TDQS
Scored across 82 tools
Despite an enormous surface, the descriptions draw careful boundaries and cross-reference siblings explicitly (e.g. create_proof_upload_link vs create_regulation_upload_link, validate_address vs create_address_verification, the three create_*_trunk variants, assign_did_to_trunk vs assign_did_to_sms_trunk). A handful of interrelated regulation/verification tools (list_requirements, list_address_verifications, create_emergency_verification) require reading the detail to keep straight, but genuine purpose overlap is rare.
Nearly every tool follows a strict snake_case verb_noun pattern (list_dids, create_sip_trunk, update_did, delete_identity, assign_did_to_trunk, unassign_did_from_capacity_group). Naming is predictable and consistent across all sub-domains, with only the expected read-only oddities like current_account and search_coverage.
82 tools is far beyond the 50+ threshold for an extreme mismatch and imposes a heavy selection/context burden on any agent. Many tools are near-parameterizations of others (create/update for each of SIP/PSTN/phone.systems/SMS trunks, per-type groups, and parallel list/get/delete sets) that could be consolidated.
The surface covers essentially the whole domain lifecycle: CRUD for DIDs, trunks, trunk groups, SMS trunks, capacity pools/groups, identities, addresses, proofs and number lists, plus billing, exports and account switching. Minor intentional gaps remain (accepted user accesses and refunds cannot be modified via MCP), but these are deliberate and documented.
Available Tools
82 toolsassign_dedicated_channels_to_didAssign dedicated channels to DIDADestructiveIdempotentInspect
Reserve dedicated inbound channels for one of the customer's DIDs out of a Capacity Pool. Provide did_id, capacity_pool_id and channels_count (the number of dedicated channels). The DID's country must be covered by the Capacity Pool, the pool must have that many free channels, and the DID Group must allow additional channels. Pass channels_count: 0 to release the reservation (capacity_pool_id is then optional). This is not a purchase: it allocates channels already bought into the pool, reversibly — only buy_capacity_channels spends money. Returns the DID number, the reserved channel count and the Capacity Pool, or a readable error.
| Name | Required | Description | Default |
|---|---|---|---|
| did_id | Yes | UUID of the DID to configure (must belong to the customer). | |
| channels_count | Yes | Number of dedicated channels to reserve; 0 releases the reservation. | |
| capacity_pool_id | No | UUID of the Capacity Pool to draw dedicated channels from. Required unless channels_count is 0. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With annotations present, this still adds substantial context: success preconditions, the non-purchase/reversible nature of the operation, the release semantics of channels_count:0, and the return payload. These behavioral traits are not derivable from the annotations alone. There is only mild tension with destructiveHint=true (the release path), which the description actually explains rather than contradicts.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the purpose, then parameters, preconditions, release semantics, the not-a-purchase clarification, and returns. Every sentence carries distinct information; none is filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with no output schema, the description covers what is mutated, preconditions, reversibility, the alternative purchasing path, and the return payload (DID number, reserved count, pool). Nothing an agent needs to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents all three parameters and their formats, giving a baseline of 3. The description adds semantic meaning by tying capacity_pool_id and channels_count to the pool's free-channel and country-coverage constraints, going slightly beyond the schema text.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Reserve dedicated inbound channels for one of the customer's DIDs out of a Capacity Pool') and explicitly distinguishes itself from buy_capacity_channels, which it names. An agent can tell it apart from the assign_did_to_trunk/capacity_group siblings by the 'dedicated channels out of a pool' scope.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use (reserving dedicated channels) and when-not (purchasing, which is buy_capacity_channels), plus the prerequisites for success: country must be covered by the pool, the pool must have free channels, and the DID Group must allow additional channels. It also explains the channels_count:0 release case, which is a distinct usage mode.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
assign_did_to_capacity_groupAssign DID to Shared Capacity GroupADestructiveIdempotentInspect
Assign one of the customer's DIDs to a Shared Capacity Group (capacity group) so the DID draws inbound channels from the group's Capacity Pool. Provide the did_id and the capacity_group_id. The DID's country must be covered by the Capacity Pool and its DID Group must allow additional channels. This is not a purchase: it allocates channels already bought into the pool, reversibly — only buy_capacity_channels spends money. Returns the DID number and the group it is now assigned to, or a readable error.
| Name | Required | Description | Default |
|---|---|---|---|
| did_id | Yes | UUID of the DID to assign (must belong to the customer). | |
| capacity_group_id | Yes | UUID of the Shared Capacity Group to assign the DID to. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the mutation/idempotency/no-cost safety profile, and the description reinforces cost behavior and reversibility plus return semantics. It does not, however, warn about the destructiveHint=true angle — that moving the DID into a group may displace its previous channel allocation — so the destructive side is under-communicated relative to the annotation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose and effect, then parameters, then preconditions, then the cost clarification and return value. Each sentence carries distinct information with no filler or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description correctly covers the return value (DID number and new group, or a readable error) and all call preconditions. The only shortfall is that the destructive/reassignment behavior implied by destructiveHint=true is not spelled out.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and both parameters are fully documented there (including the 'must belong to the customer' constraint). The description restates the two parameter names but adds no format or syntax detail beyond what the schema provides, so it meets the baseline rather than exceeding it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource+target (assign a DID to a Shared Capacity Group) and immediately explains the effect: the DID draws inbound channels from the group's Capacity Pool. It distinguishes itself from siblings by contrasting with buy_capacity_channels and by the unassign counterpart, so an agent can route correctly without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit preconditions for use (DID's country must be covered by the Capacity Pool; its DID Group must allow additional channels) and names the alternative that money-spending cases should use ('only buy_capacity_channels spends money'). It clearly frames this as allocation of already-purchased channels rather than a purchase.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
assign_did_to_sms_trunkAssign DIDs to SMS trunkADestructiveIdempotentInspect
Route incoming SMS of one or MANY of the customer's purchased DIDs to an SMS trunk in a single call: did_ids takes 1..100 DID UUIDs and sms_trunk_id the target trunk — or pass null / omit sms_trunk_id to bulk UNASSIGN them (incoming SMS is then disabled). The batch is all-or-nothing: every id must resolve to a DID in the customer account and every DID must pass validation (the SMS trunk must be inbound-capable and each DID in an SMS-enabled group), otherwise NOTHING is changed and the error names the offending ids or number. Returns the SMS trunk (or null when unassigning), the affected DID numbers and their count; a number whose incoming SMS already routed elsewhere is reported as re-routed FROM its previous trunk (assigning replaces the existing routing).
| Name | Required | Description | Default |
|---|---|---|---|
| did_ids | Yes | UUIDs of the DIDs to configure (1..100, all must belong to the customer). | |
| sms_trunk_id | No | UUID of the SMS trunk to route incoming SMS to. Pass null (or omit) to unassign the DIDs (disable incoming SMS). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructive=true and idempotent=true, and the description corroborates rather than contradicts them. It adds substantial beyond-annotation detail: all-or-nothing batch atomicity, the validation preconditions (inbound-capable trunk, SMS-enabled group), error behavior naming offending ids, and the re-routing side effect when a number was already routed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single dense but front-loaded passage leading with the core action and immediately following with the batch/unassign mechanics. Some validation detail is packed into parentheticals, but every clause carries operational information rather than filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter mutation with no output schema, the description covers return values (the trunk or null, affected numbers, count), batch failure semantics, and the disabled-incoming-SMS outcome of unassigning. An agent has everything needed to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds real meaning: the interdependence that every id must belong to the customer account and pass group/trunk validation, and that omitting sms_trunk_id is an unassign rather than an error. The 1..100 range itself is already in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource — routing incoming SMS for one or many DIDs to an SMS trunk — plus the scope (single batch call) and the inverse operation (bulk unassign). The 'incoming SMS ... SMS trunk' framing distinguishes it from voice-oriented siblings like assign_did_to_trunk and assign_did_to_capacity_group.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Clear context for both directions of use: assign by providing sms_trunk_id, or unassign by passing null/omitting it, with the consequence (incoming SMS disabled) spelled out. It never explicitly names a sibling alternative to defer to, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
assign_did_to_trunkAssign DIDs to Voice IN TrunkADestructiveIdempotentInspect
Assign one or more of the customer's DIDs (did_ids, max 100 per call) to a Voice IN Trunk so inbound calls route to it. trunk_id accepts ANY trunk id returned by list_trunks — SIP, PSTN, phone.systems™ or a trunk group. Pass trunk_id null (or omit it) to UNASSIGN the listed DIDs instead (they then route inbound calls nowhere). The batch is all-or-nothing: every id must resolve to a DID in the account and every assignment must be valid, otherwise NOTHING is changed and a readable error explains why. Returns the trunk (name and type) plus the assigned/unassigned numbers and count; a number that was already routed elsewhere is reported as re-routed FROM its previous trunk (assigning replaces the existing routing).
| Name | Required | Description | Default |
|---|---|---|---|
| did_ids | Yes | UUIDs of the DIDs to configure (1..100, must all belong to the customer). | |
| trunk_id | No | UUID of the target Voice IN Trunk — any type from list_trunks (SIP, PSTN, phone.systems™ or trunk group). Pass null (or omit) to unassign the DIDs. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover the safety profile (destructiveHint=true, idempotentHint=true), and the description adds substantial extra context: all-or-nothing batch semantics, that assigning replaces existing routing (reported as re-routed FROM the previous trunk), the null-to-unassign overload, and what the response contains. This is far beyond what annotations provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded paragraph where each sentence carries distinct information (routing, accepted ids, unassign mode, atomicity, return shape). It is dense but no sentence is wasted; only the length of the single block slightly hurts scanability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description proactively documents return contents (trunk name/type, assigned/unassigned numbers and count, re-routed reporting). Combined with atomicity and unassign behavior, an agent has 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.
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 real meaning beyond the schema: trunk_id accepts any type returned by list_trunks (SIP, PSTN, phone.systems, trunk group), and null/omit means unassign rather than a normal target.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (assign) and resource (DIDs → Voice IN Trunk) plus the routing consequence. It is clearly distinguishable from siblings like assign_did_to_sms_trunk and assign_did_to_capacity_group by naming the Voice IN Trunk target.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear context: which trunk ids are acceptable, the null/omit path that turns the call into an unassign, and the max-100 batch constraint. It doesn't explicitly name the sibling assignment tools to steer between them, but the routing scenario is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
buy_capacity_channelsBuy Capacity ChannelsADestructiveInspect
Purchase additional channels into one of the customer's Capacity Pools by creating an Order. Provide the capacity_pool_id (from list_capacity_pools) and qty — the number of channels to add to the pool. The price is prorated to the pool's renew date. Charges the customer's balance; the channels are added to the pool immediately and can then be distributed across Shared Capacity Groups or dedicated-channel reservations. A DID can only draw channels from a pool that covers its country — pass the optional country_iso to fail fast on a mismatched pool before any money is spent. All amounts are in USD. This spends real money.
| Name | Required | Description | Default |
|---|---|---|---|
| qty | Yes | Number of channels to purchase into the pool. | |
| country_iso | No | Optional pre-check: ISO 3166-1 alpha-2 country code of the DIDs this capacity is for. The purchase fails BEFORE any confirmation/charge if the pool does not cover that country (a DID can only draw channels from a pool covering its country — see covered_country_isos in list_capacity_pools). | |
| capacity_pool_id | Yes | UUID of the Capacity Pool to buy channels into (from list_capacity_pools). | |
| confirmation_token | No | Leave empty on the first call — the tool returns a confirmation_token + preview and charges nothing. Re-call with that confirmation_token to execute the purchase. If the confirming call's response is lost, it is safe to retry with the SAME confirmation_token — a repeat returns the original result and never purchases twice. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Far exceeds the annotations (which only flag non-readOnly, destructive, non-idempotent): it discloses prorated pricing to the renew date, immediate balance charge, immediate channel availability, and the confirmation_token preview-then-execute flow with safe retry semantics. 'This spends real money' makes the financial consequence unmistakable.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action, then layers pricing, delivery, and pre-check details in order. It is somewhat long, but nearly every sentence carries actionable information for a money-spending operation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive, irreversible money-spending tool with no output schema, the description covers prerequisites, preview/confirm flow, retry safety, and downstream usage of purchased channels. An agent has everything needed to call it correctly without accidental double purchases.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3; the description adds value beyond the schema by explaining why country_iso exists (fail fast before any charge) and reinforcing the capacity_pool_id source. The confirmation_token two-call semantics are covered richly in the description, though mostly duplicating the schema text.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (purchase/add channels) and resource (Capacity Pools via an Order), and distinguishes itself from siblings like buy_did and list_capacity_pools. An agent immediately understands this is a capacity-purchase operation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides clear context: the pool_id comes from list_capacity_pools, qty is the number to add, and country_iso is an optional fail-fast pre-check for mismatched pools. It does not explicitly name alternatives or exclusions, but the workflow and preconditions are well-telegraphed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
buy_didBuy DIDADestructiveInspect
Purchase one or more DIDs by creating an Order. Pass the sku_id from search_coverage — this is the Stock Keeping Unit (SKU) UUID, NOT the group_id. The first (token-less) call charges nothing and returns a preview: DID group location and type, included channels, per-DID and total prices, balance impact and any DID-group service restrictions. All amounts are in USD. Confirming with the returned confirmation_token executes the purchase AND constitutes acceptance of the service restrictions shown in the preview. Charges the customer's balance, creates an Order and returns the purchased DID ids and numbers. Occasionally some numbers are allocated asynchronously — when the response carries a note about pending DIDs, tell the user and check list_dids after a minute or later. When the response contains a registration_required block the numbers need end-user registration before they work — follow its next_steps instead of stopping at the purchase. An out-of-stock purchase is accepted by default as a back-order (the preview warns about it): the order is charged now and the missing numbers are provisioned later. Pass allow_back_ordering false to refuse instead. This spends real money.
| Name | Required | Description | Default |
|---|---|---|---|
| qty | No | Quantity of DIDs to purchase (default 1). | |
| sku_id | Yes | The `sku_id` field from search_coverage (a Stock Keeping Unit UUID, not group_id). | |
| description | No | Free-text description set on every purchased DID (back-ordered ones too), overriding the DID configuration profile's. Omit to keep the profile's. | |
| confirmation_token | No | Leave empty on the first call — it returns a preview + confirmation_token and charges nothing; re-call with the token to execute the purchase. | |
| allow_back_ordering | No | Default true (same as a User Panel order): when the group has no (or not enough) DIDs in stock the order is still accepted and charged, and the missing numbers are provisioned later — they appear in list_dids once assigned, and a pending order can be canceled if the customer prefers not to wait. Set false to reject an out-of-stock purchase instead. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=false, but the description adds substantial context beyond them: the token-less call charges nothing, confirmation executes the purchase and constitutes acceptance of restrictions, the balance is charged, out-of-stock defaults to a charged back-order, and async allocation/registration cases are spelled out. 'This spends real money' is a clear final warning.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose, then layered edge cases in a logical order, closing on the money warning. Long but every sentence carries distinct behavioral information an agent needs before spending funds.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema, yet the description previews the return shape (location/type, channels, prices, balance impact, restrictions, confirmation_token, purchased ids/numbers) and covers the async and registration branches. Nothing essential to correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3, but the description adds genuine cross-field meaning: it warns sku_id is the SKU UUID and NOT group_id, explains confirmation_token as empty-then-execute, and clarifies allow_back_ordering's default semantics. It stops short of restating qty/description, which the schema already covers.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a precise verb+resource: 'Purchase one or more DIDs by creating an Order.' This distinguishes it cleanly from siblings like buy_capacity_channels and from read tools such as get_did/search_coverage.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent to search_coverage for the sku_id, prescribes the two-step token flow, and states when to act on pending DIDs (tell user, then list_dids) and registration_required (follow next_steps). It also names the condition for passing allow_back_ordering=false.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cancel_invite_requestCancel Invite RequestADestructiveInspect
Revoke a PENDING invitation by id (see list_invite_requests) so the invitee can no longer accept it — the invitation link in the email they received stops working; no further email is sent. Only pending invitations can be canceled: an already accepted invitation has become a user access (see list_user_accesses) and revoking, like removing an existing user access, is not available through MCP — use the DIDWW panel for that. To invite the same person again later, call create_invite_request anew.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | UUID of the pending invitation to revoke, as returned by list_invite_requests. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations (destructive/not idempotent) by disclosing concrete side effects: the email link stops working, no notification email is sent, and only pending invites are eligible. It also explains that re-inviting requires a new call, which the 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, all front-loaded and free of filler, with the core action first and caveats after. Slightly dense with parenthetical cross-references, but every clause carries routing or behavioral information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter destructive mutation with no output schema, it fully covers eligibility constraints, side effects, unavailable alternatives, and the re-invite path. Nothing an agent needs to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and already documents the id as a UUID from list_invite_requests, so the description's restatement adds little. Basline would be 3, but referencing the discovery tool in prose gives marginal routing value.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (revoke) and resource (a PENDING invitation) with the qualifying state front-loaded. It cites list_invite_requests as the source of the id, so an agent can distinguish it from create_invite_request and list_invite_requests at a glance.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly names when not to use it: accepted invitations are now user access and cannot be revoked via MCP, directing the agent to the DIDWW panel. It also points to list_invite_requests for discovery and create_invite_request for re-inviting, covering the full decision path.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
check_upload_statusCheck upload statusARead-onlyIdempotentInspect
Check whether the user finished a secure document upload link. Pass the token returned by create_regulation_upload_link or create_proof_upload_link. Returns pending (user has not submitted yet), completed (with the created proof / verification ids) or expired (issue a fresh link with the tool that issued this one). Call it when the user says they are done uploading.
| Name | Required | Description | Default |
|---|---|---|---|
| token | Yes | The upload link token returned by create_regulation_upload_link or create_proof_upload_link. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover safety (readOnly, idempotent, non-destructive), but the description adds the meaningful behavioral detail that is not in annotations: the three possible outcomes (pending/completed/expired) and what 'completed' carries. It does not mention polling/retry behavior, which is a minor gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action, then token sourcing, then return states, then the call trigger. Every sentence carries distinct information with no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, and the description compensates by enumerating the return states and their meaning, including what to do on 'expired'. For a single-parameter read tool this is complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single token parameter is fully described in the schema. The description restates the token source, adding no syntax or format detail beyond what the schema already provides, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource (check upload link status) and immediately ties it to the two sibling tools that produce the token, so an agent can distinguish it from create_* and list_* siblings 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit trigger ('Call it when the user says they are done uploading') and, for the expired case, routes the agent to the alternative ('issue a fresh link with the tool that issued this one'). When-to-use and the alternative path are both spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_addressCreate addressAInspect
Create a regulation address under an existing identity of the authenticated customer — step 4 of the DID registration flow (after list_requirements, create_identity and uploading identity proofs via create_regulation_upload_link). The address country usually must match the DID country from the requirement. After creating the address, upload its proof documents via create_regulation_upload_link, then link DIDs with create_address_verification. The address routinely belongs to the account holder's own end customer (standard carrier / reseller subscriber registration — the normal case, not an exception). Never invent address data: supply real values or ask the user for them. Pass requirement_id to pre-check the address against the requirement immediately — mismatches (e.g. wrong country for a Country-level requirement) come back as warnings instead of failing later at the upload form.
| Name | Required | Description | Default |
|---|---|---|---|
| address | Yes | Street address (street, building, apartment). | |
| city_name | Yes | City name. | |
| country_iso | Yes | Address country as ISO 3166-1 alpha-2 code (e.g. UA, DE), case-insensitive. | |
| description | No | Optional free-form description of the address. | |
| identity_id | Yes | UUID of the identity the address belongs to (must belong to the customer, see list_identities). | |
| postal_code | Yes | Postal / ZIP code. | |
| address_area | No | Optional area/region name — needed for countries with area-level regulation (see the requirement address_area_level). | |
| requirement_id | No | Optional regulation requirement UUID (from list_requirements) the address is being created for. When passed, the new address (and its identity) is pre-checked against the requirement (address/identity area levels, country, mandatory fields) and the response carries warnings naming anything to fix BEFORE uploading documents — catching e.g. a country mismatch at the cheapest point instead of at the upload form. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (write, non-idempotent, closed-world, non-destructive), and the description adds real value on top: the requirement_id pre-check returns warnings instead of failing later, the country normally must match the DID country, and address data must never be invented. It still does not say what happens on duplicate submissions or describe auth/rate constraints, so it stops short of 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose and flow position, and nearly every sentence carries actionable guidance (sequencing, pre-check, data-integrity rule). It is on the long side for a create tool, but the density is justified rather than padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description still explains the return behavior (warnings from the requirement pre-check) and covers prerequisites, ordering, and constraints an agent needs to invoke it correctly in the DID flow.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3, but the description adds a constraint the schema does not state — country_iso usually must match the DID country from the requirement — and reinforces the pre-check semantics of requirement_id.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (create) plus the exact resource (a regulation address under an existing identity of the authenticated customer) and situates it as step 4 of the DID registration flow. This cleanly distinguishes it from update_address, delete_address and validate_address among the siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly sequences the tool: comes after list_requirements, create_identity and proof upload via create_regulation_upload_link, and must be followed by create_regulation_upload_link and create_address_verification. It also names the fallback (ask the user for real data) and clarifies the end-customer case is normal, not an exception.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_address_verificationCreate address verificationAInspect
Submit DIDs that are awaiting registration for verification against a regulation address — the FINAL step of the DID registration flow (list_requirements -> create_identity -> create_regulation_upload_link -> create_address -> this tool). Use it ONLY when all required identity and address proof documents are already uploaded (see list_identities / list_addresses) and the requirement needs NO one-time or missing permanent supporting document; if such a document is required, use create_regulation_upload_link with the did_ids instead. Provide service_description when the requirement demands one. Returns the verification id and its status (verifications start as New and are reviewed/auto-approved asynchronously).
| Name | Required | Description | Default |
|---|---|---|---|
| did_ids | Yes | UUIDs of the DIDs awaiting registration to link to the verification. All DIDs must be from the same country and DID Group type. | |
| address_id | Yes | UUID of the regulation address to verify against (see list_addresses). | |
| service_description | No | Description of the intended service usage. REQUIRED when the requirement has service_description_required = true. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark this as a non-read-only, idempotent=false, non-destructive write. The description adds real context beyond them: the verification starts in status New and is processed asynchronously, and the call returns a verification id plus status. It does not state permission/authorization requirements or what happens to already-linked DIDs, so it stops short of 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the action and its flow position, then the gating condition and the return behavior. Every sentence carries information, though the parenthetical flow chain and the doubled service_description guidance make it denser than needed.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a write tool with no output schema, the description covers prerequisites (documents uploaded, no pending one-time document), the alternative path, the optional-field trigger, and the asynchronous outcome/status model. An agent has everything required to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so all three parameters are already documented, including the service_description_required condition. The description repeats the same conditional guidance without adding format, batch-limit, or cross-parameter constraints beyond the schema's 'same country and DID Group type' note. Baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Submit DIDs ... for verification against a regulation address') and pins its position in the DID registration flow. It also contrasts itself with the sibling create_regulation_upload_link, so the agent can distinguish the two without reading either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when-to-use ('ONLY when all required identity and address proof documents are already uploaded') and an explicit when-not with the named alternative ('if such a document is required, use create_regulation_upload_link with the did_ids instead'). Prerequisite state is spelled out rather than implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_capacity_groupCreate Shared Capacity GroupADestructiveInspect
Create a Shared Capacity Group (capacity group) inside one of the customer's Capacity Pools. Provide a name and the capacity_pool_id, plus shared_channels_count and/or metered_channels_count (at least one must be greater than 0; shared channels are drawn from the Capacity Pool's free channels, metered channels bill per use at the pool's metered rate — all amounts are in USD). Shared channels are not a second purchase — they allocate channels already bought into the pool — but metered channels DO bill per use, which is why this tool is confirmation-gated. Raising metered_channels_count on an existing group has the same effect. A pool covers specific countries and DIDs can only be assigned to a group whose pool covers their country — pass the optional country_iso of the DIDs you plan to assign to verify coverage BEFORE the group is created (see covered_country_isos in list_capacity_pools). Returns the created group id and key attributes, or a readable error.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Friendly name of the Shared Capacity Group (unique within the pool). | |
| country_iso | No | Optional ISO 3166-1 alpha-2 country code (e.g. "GB") of the DIDs this group is meant for. When given, the tool verifies the Capacity Pool covers that country BEFORE creating the group — a group in a non-covering pool is useless because those DIDs can never be assigned to it. | |
| capacity_pool_id | Yes | UUID of the Capacity Pool to create the group in. | |
| confirmation_token | No | Leave empty on the first call — it returns a preview + confirmation_token and creates nothing; re-call with the token to create the group. | |
| shared_channels_count | No | Number of shared channels drawn from the Capacity Pool for this group. A COUNT, not a boolean: pass N to allow up to N concurrent shared channels, 0 for none (default 0). | |
| metered_channels_count | No | Number of metered (overload) channels for this group. A COUNT, not a boolean: pass N to allow up to N metered channels, 0 to disable metered usage (default 0). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructiveHint=true and idempotentHint=false; the description goes well beyond by explaining WHY (metered channels bill per use in USD, hence confirmation-gated), the allocation-vs-purchase distinction for shared channels, the preview-then-confirm mechanism, and the country-coverage validation that runs before creation. This is exactly the behavioral context an agent needs for a billing-affecting mutation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action, then layers the constraint, billing rationale, and coverage pre-check in a logical order; every sentence carries information. It is a dense paragraph and slightly long, but no sentence is filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description still states the return ('created group id and key attributes, or a readable error'), covers all six parameters' semantics, the confirmation flow, and the billing/destructive implications. 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.
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, but the description adds real meaning beyond the schema: the interaction constraint that at least one of shared/metered must be > 0, that amounts are in USD, and that country_iso triggers a pre-creation coverage check. The 'count not boolean' semantics are in the schema, so this is additive but not exhaustive.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Create a Shared Capacity Group') and scopes it precisely ('inside one of the customer's Capacity Pools'). This clearly distinguishes it from create/update/delete/assign siblings like update_capacity_group and assign_did_to_capacity_group without needing to open any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit preconditions (provide name + capacity_pool_id, at least one channel count > 0), describes the confirmation-gated two-step flow, and routes the agent to list_capacity_pools for covered_country_isos and to the existing-group update path ('raising metered_channels_count on an existing group has the same effect'). When and how to use it is fully specified.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_emergency_verificationCreate Emergency VerificationADestructiveInspect
Submit an emergency verification for staff review. Two modes: (1) NEW calling service — pass address_id plus did_ids (DIDs of the same country and DID group type as the emergency requirement); this creates an Emergency Calling Service covering those numbers and its first pending verification. (2) Resubmit/update an existing service — pass address_id plus emergency_calling_service_id (do NOT pass did_ids); allowed when the service is in new, changes required or active status. New-service mode is a PAID subscription billed per attached number every month (rates come from your emergency plan — see them via list_emergency_requirements; all amounts are in USD). Billing starts when staff activate the service, not at submission. That mode is two-call confirmation-gated: the first call returns the cost preview plus a confirmation_token and submits nothing; show the user that preview, then re-call with the token. Resubmit mode adds no charge and is not gated. To stop the charges, unassign all numbers from the service — an emergency service left with zero numbers is auto-canceled, no separate cancellation step is needed. BEFORE calling, run list_emergency_requirements for the DID country to see the required identity type and mandatory identity/address fields, and fill any missing identity fields with update_identity. No files are uploaded here — staff reviews the identity/address regulation proofs, so if proofs are missing use create_regulation_upload_link with purpose "emergency" instead (it creates the verification on upload). Returns the pending verification id, or a readable error when validation fails.
| Name | Required | Description | Default |
|---|---|---|---|
| did_ids | No | DID UUIDs to cover with a NEW Emergency Calling Service. Required in new-service mode; must be OMITTED when emergency_calling_service_id is given. | |
| address_id | Yes | Regulation address UUID (the emergency service address). Required in both modes; its identity must satisfy the emergency requirement. | |
| confirmation_token | No | New-service mode only. Leave empty on the first call — the tool returns a confirmation_token plus a preview of the recurring cost and creates nothing. Re-call with that confirmation_token to submit. If the confirming call's response is lost, it is safe to retry with the SAME confirmation_token — a repeat returns the original result and never submits twice. | |
| emergency_calling_service_id | No | Existing Emergency Calling Service UUID for resubmit/update mode (service must be in new, changes required or active status). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only give a coarse safety profile (readOnlyHint=false, destructiveHint=true, non-idempotent), while the description discloses the consequential traits: new-service mode is a PAID monthly per-number subscription billed at staff activation, the two-call confirmation gating that submits nothing on the first call, that resubmit is free and ungated, and that zero assigned numbers auto-cancels the service. It also explains token retry safety, none of which the annotations convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose and mode selection are front-loaded, then billing, gating and prerequisites follow in a logical order. It is dense rather than padded, though the length is substantial for a single tool and a few billing/auto-cancel details could be tightened.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a billing-affecting mutation with no output schema, the description covers what an agent needs: prerequisites, mode selection, cost implications, the confirmation round-trip, and the return contract ('pending verification id, or a readable error when validation fails'). Nothing material is left for the agent to guess.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3; the description goes beyond it by stating the cross-parameter mode constraint and adding a qualifier the schema omits — DIDs must be 'of the same country and DID group type as the emergency requirement'. It also frames confirmation_token as a preview-then-confirm handshake rather than just a field.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence states a specific verb and resource ('Submit an emergency verification for staff review'), then splits the tool's two distinct modes (new service vs. resubmit) with the exact parameters that select each. An agent can distinguish this from siblings like create_address_verification or create_regulation_upload_link 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when-to-use for each mode, including status preconditions ('allowed when the service is in new, changes required or active status') and mandatory pre-steps ('BEFORE calling, run list_emergency_requirements ... fill any missing identity fields with update_identity'). It also names the alternative route when proofs are missing (create_regulation_upload_link with purpose "emergency"), which is genuine routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_exportCreate ExportAInspect
Start an asynchronous CSV export of the authenticated customer's data. export_type: "cdr" (inbound call detail records), "outbound_cdr" (outbound call detail records), "did" (the customer's phone numbers), "order", "payment", "inbound_sms" or "outbound_sms" (SMS logs). "legacy_inbound_sms" is the deprecated per-delivery-attempt view of the same inbound SMS data — prefer "inbound_sms", which has one row per SMS. date_from/date_to (ISO 8601, interpreted as UTC) are REQUIRED for cdr/outbound_cdr/inbound_sms/legacy_inbound_sms/outbound_sms and limited to the current and 2 previous months; optional for order/payment; not accepted for did. A date_to in the future (e.g. today end of day for "export this month") is clamped to the current time — the response then carries date_to_clamped_to; a date_from in the future is an error. The export runs in the background (typically up to 5 minutes); poll get_export with the returned export_id until it is completed, then give the user the download link.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Optional friendly name shown in the panel Exports list. | |
| date_to | No | End of the period (exclusive for CDR/SMS types), ISO 8601 date-time (UTC). REQUIRED for cdr, outbound_cdr, inbound_sms, legacy_inbound_sms and outbound_sms; a value in the future is clamped to the current time. | |
| date_from | No | Start of the period, ISO 8601 date-time (UTC), e.g. "2026-07-01T00:00:00Z". REQUIRED for cdr, outbound_cdr, inbound_sms, legacy_inbound_sms and outbound_sms. | |
| did_number | No | Optional DID phone number filter, digits only. For "cdr"/"did" it matches the DID number, for "inbound_sms"/"legacy_inbound_sms" the receiving number, for "outbound_sms"/"outbound_cdr" the sending number (caller ID). Not accepted for order/payment. | |
| export_type | Yes | What to export. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare the safety profile (non-read-only, non-destructive, non-idempotent, closed-world). The description adds the behavior that actually matters here: the export runs in the background for up to ~5 minutes, date ranges are limited to the current and 2 previous months, future date_to is silently clamped (surfaced as date_to_clamped_to) while a future date_from is an error, and the final output is a download link. This is substantial disclosure 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the purpose, then ordered by enum semantics, date rules, and polling workflow, with no filler sentences. It is a dense single block without visual breaks, which slightly hurts scanability for a description this long, but every sentence carries load-bearing information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the return-value burden and does so: it promises an export_id, warns about the date_to_clamped_to field, and explains the terminal download link. Combined with the polling instruction and per-type date rules, an agent has everything needed to call this correctly and handle the response.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description genuinely adds meaning the schema lacks: the semantics of every export_type enum value (including the deprecated legacy view and its row-granularity distinction), the current-plus-2-months window that appears nowhere in the schema, and the error/clamp asymmetry between date_from and date_to. Some date-requirement text duplicates the schema, which keeps this from a 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource+format+scope: "Start an asynchronous CSV export of the authenticated customer's data." An agent can immediately separate this from siblings like get_export (poll status) and list_exports (enumerate existing exports), both of which are named or implied.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use guidance per export_type, states which types require/accept/forbid date ranges, deprecates legacy_inbound_sms in favor of inbound_sms, and names the follow-up tool and workflow: "poll get_export with the returned export_id until it is completed." Nothing about selection is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_identityCreate identityAInspect
Create a regulation identity for the authenticated customer — step 2 of the DID registration flow (after list_requirements). Set identity_type to "personal" or "business" per the requirement; a business identity needs company_name. Fill the mandatory identity fields the requirement listed (birth_date, id_number, country_iso for Country of Tax Residence, personal_tax_id, contact_email, company_reg_number, vat_id, ...). phone_number accepts digits only. After creating the identity, upload its proof documents via create_regulation_upload_link, then create an address with create_address. The identity subject is routinely the account holder's own end customer (standard carrier / reseller subscriber registration — the normal case, not an exception); first_name/last_name on a business identity denote the authorized representative of record, not necessarily someone affiliated with the caller. Never invent field values or documents: supply real data or leave the field out. Pass requirement_id to pre-check the identity against the requirement immediately — mismatches (e.g. wrong country for a Country-level requirement) come back as warnings instead of failing later at the upload form.
| Name | Required | Description | Default |
|---|---|---|---|
| vat_id | No | VAT number / tax code. Business identities only. | |
| id_number | No | Personal/company ID number. | |
| last_name | Yes | Last name of the person (for business: the representative). | |
| birth_date | No | Birth date in ISO format (YYYY-MM-DD). Personal identities only. | |
| first_name | Yes | First name of the person (for business: the representative). | |
| country_iso | No | Country of tax residence as ISO 3166-1 alpha-2 code (e.g. UA, DE), case-insensitive. | |
| description | No | Optional free-form description of the identity. | |
| company_name | No | Company name. REQUIRED when identity_type is "business". | |
| phone_number | Yes | Contact phone number, digits only (e.g. "380441234567"). | |
| contact_email | No | Contact email address. | |
| identity_type | Yes | Identity type: "personal" or "business" (see list_requirements for which the country accepts). | |
| requirement_id | No | Optional regulation requirement UUID (from list_requirements) the identity is being created for. When passed, the new identity is pre-checked against the requirement (identity type, area level / country, mandatory fields) and the response carries warnings naming anything to fix BEFORE uploading documents — catching e.g. a country mismatch at the cheapest point instead of at the upload form. | |
| personal_tax_id | No | Personal tax ID (for business: the representative tax ID). | |
| company_reg_number | No | Company registration number. Business identities only. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover mutation/safety hints (readOnlyHint=false, destructiveHint=false, idempotentHint=false), and the description adds non-obvious behavioral context: the identity subject is routinely the caller's own end customer, first_name/last_name denote the authorized representative for business identities, and requirement_id returns warnings instead of failing later. It does not cover permissions or duplicate-creation behavior, but this is well beyond 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core purpose and workflow, then layers conditional rules and the subject/representative caveat. It is longer than typical but each block earns its place; minor redundancy with the schema on phone_number digits and business-only fields keeps it from a 5.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 14-parameter mutation tool with no output schema, the description supplies the full workflow, conditional field rules, data-authenticity guidance, and what requirement_id returns (warnings). Enough for an agent to call it correctly, though it could say more about the created-identity response fields.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so parameters are already documented (including company_name requirement for business and digits-only phone). The description adds cross-field conditional context (company_name needed for business, mandatory fields from the requirement) and the requirement_id pre-check effect, but largely restates what the schema already carries. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource (create a regulation identity) and positions it precisely in the DID registration flow as step 2 after list_requirements, which distinguishes it from sibling creation tools like create_address and create_regulation_upload_link.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit sequencing (after list_requirements, then create_regulation_upload_link, then create_address), tells when to use identity_type values per the requirement, and explains the optional requirement_id pre-check. Alternatives and ordering are unambiguously stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_invite_requestInvite UserADestructiveInspect
Invite a new user by email to access the authenticated customer account with a chosen set of panel roles. Confirming the invitation SENDS AN EMAIL to the invitee. Invite lifecycle: this tool creates a pending invitation and emails the invitee -> the invitation is listed in list_invite_requests (and can be revoked with cancel_invite_request) while unanswered -> once the invitee accepts, their access appears in list_user_accesses with the granted roles. Valid role names: Billing, Commercial, Compliance, Porting, SuperAdmin, Technical (SuperAdmin grants full access including user management). Returns the created invitation (id, email, name, roles, status, created_at).
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Invitee's full name, shown in the invitation and the user list. | |
| Yes | Email address the invitation is sent to — the invitee will sign in with it. | ||
| roles | Yes | Panel roles to grant when the invitee accepts, by role name. Valid names: Billing, Commercial, Compliance, Porting, SuperAdmin, Technical. At least one is required. | |
| confirmation_token | No | Leave empty on the first call — the tool returns a confirmation_token + preview and sends nothing. Re-call with that confirmation_token to create the invitation and send the email. If the confirming call's response is lost, it is safe to retry with the SAME confirmation_token — a repeat returns the original result and never emails twice. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, the description discloses that confirming SENDS AN EMAIL, explains the two-step confirmation_token flow (first call returns a preview and sends nothing), and states that retrying the confirming call with the same token never emails twice. These are exactly the side-effect and retry semantics an agent needs and are not derivable from the 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with purpose, then the email side effect, then lifecycle, then return shape — a logical order. It is somewhat dense with the lifecycle chain, but every sentence carries information an agent needs, so only minor trimming is possible.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description compensates by naming the returned fields (id, email, name, roles, status, created_at), and it covers the destructive/email side effect and the token flow. Nothing required to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents email, name, roles, and confirmation_token. The description largely restates what the schema provides (role names, confirmation flow), adding no syntax or format detail beyond it; baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('Invite a new user by email to access the authenticated customer account with a chosen set of panel roles') and immediately disambiguates from siblings by naming list_invite_requests and cancel_invite_request. An agent can distinguish it from every other create_* tool 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It lays out the full invite lifecycle and explicitly routes the agent to list_invite_requests for pending invites and cancel_invite_request for revocation, so the surrounding context is clear. It stops short of stating a hard when-not-to-use condition, but there is no competing invitation-creation tool to exclude.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_phone_systems_trunkCreate phone.systems™ Voice IN TrunkAInspect
Create a phone.systems™ (PBX) Voice IN Trunk for the authenticated customer, routing the assigned DIDs' inbound calls to the customer's phone.systems™ cloud PBX. Requires the phone.systems™ feature to be enabled on the account (otherwise an error is returned and nothing is created). No host or destination is needed. For a SIP trunk use create_sip_trunk; for a PSTN call-forwarding trunk use create_pstn_trunk. Returns the created trunk id and key attributes.
| Name | Required | Description | Default |
|---|---|---|---|
| pop | No | DIDWW Point of Presence the trunk is served from. Omit to let DIDWW pick. | |
| name | Yes | Friendly name of the Voice IN Trunk (must be unique for the customer). | |
| weight | No | Load-balancing weight among trunk-group members of the same priority; higher is preferred (default 65535). | |
| priority | No | Priority of this trunk; DIDWW contacts the lowest-numbered priority first. Range 0-65535. | |
| cli_format | No | Format of the caller ID sent to the customer equipment (default e164). | |
| cli_prefix | No | Prefix prepended to the caller ID. Letters, digits, "+" and "#" only, up to 7 characters. | |
| cnam_lookup | No | Optional. Enable CNAM lookup on the trunk (default false/disabled). | |
| description | No | Description of the Voice IN Trunk. | |
| capacity_limit | No | Maximum number of simultaneous calls for the Voice IN Trunk. | |
| trunk_group_id | No | Optional Voice IN Trunk Group UUID to assign the trunk to. | |
| ringing_timeout | No | Seconds to wait for a 200 OK after a 18x ringing response before ending the routing attempt with the "Ringing timeout" disconnect code. Omit to use the platform default. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this is a non-read-only, non-destructive, non-idempotent write. The description adds real value beyond that: the feature-gate precondition and its failure mode ('error is returned and nothing is created'), and that no host/destination is required. It stops short of noting that a non-idempotent create with a unique name can fail on retry.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four tight sentences: purpose first, then the precondition, then the 'no host/destination' clarification, then routing alternatives, then return value. No filler, and the constraints are front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite 11 parameters and no output schema, the description covers precondition behavior, siblings, and return shape ('created trunk id and key attributes'), while the schema handles all field semantics. Nothing an agent needs to invoke this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so every parameter including enums, ranges, defaults and patterns is already documented in the schema. The description only adds the negative fact that no host or destination parameter is needed. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Create a phone.systems™ Voice IN Trunk') and clarifies the routing scope (assigned DIDs' inbound calls to the customer's cloud PBX). It explicitly distinguishes itself from create_sip_trunk and create_pstn_trunk, so an agent can pick it without opening sibling schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Names both alternative tools and the condition that selects them, and adds an explicit when-not: the phone.systems™ feature must be enabled or nothing is created. This is exactly the routing guidance an agent needs.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_proof_upload_linkCreate proof upload linkAInspect
Generate a one-time browser link (URL + QR code) to upload proof documents of EXPLICITLY chosen types to one identity or address, independent of any regulation requirement. Use it for voluntary / preventive uploads and for REPLACING an existing document: uploading a proof type the entity already has automatically replaces the old proof — no delete_proof call is needed. Pass exactly one of identity_id / address_id plus proof_types. The USER opens the link to submit the actual files (documents never travel through the chat). Returns upload_url and qr_code_url (plus qr_svg when qr: "svg" is requested). Priority #1: show upload_url as a clickable link — it always works. The QR lets the user continue on a phone and photograph documents with the camera: offer qr_code_url as a plain link, but do NOT rely on it as a markdown image — some clients (incl. claude.ai) gate external images behind a click. Request qr: "svg" ONLY if your client can render SVG through an HTML/artifact/widget capability; never paste raw SVG markup into plain reply text — chat clients escape it into a wall of code. Files are encrypted in the browser; the server never sees plaintext. The link works once; its lifetime is account-specific — quote expires_in_minutes from the response, never assume a fixed value. After the user says they are done, call check_upload_status with the returned token. For documents a requirement still demands (and to create verifications), use create_regulation_upload_link instead.
| Name | Required | Description | Default |
|---|---|---|---|
| qr | No | QR delivery: "url_only" (default) returns qr_code_url only; "svg" additionally includes qr_svg — ~7 KB of inline SVG markup. Request "svg" ONLY when your client can render SVG through an HTML/artifact/widget capability — raw SVG pasted into chat text gets escaped, not rendered. | |
| address_id | No | Address UUID the proofs attach to. Pass exactly one of identity_id / address_id. | |
| identity_id | No | Identity UUID the proofs attach to. Pass exactly one of identity_id / address_id. | |
| proof_types | Yes | Proof type names (case-insensitive) or UUIDs — one upload slot opens per listed type. Identity proof types go with identity_id, address proof types with address_id. Uploading a type the entity already has replaces the old proof. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only cover the safety profile (not read-only, not destructive, not idempotent), and the description adds substantial behavior beyond that: one-time link, browser-side encryption with the server never seeing plaintext, account-specific lifetime that must be read from expires_in_minutes rather than assumed, and automatic replacement of an existing proof. This is exactly the kind of context annotations cannot carry.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded in the first sentence, and most sentences carry operational weight (QR delivery, lifetime, follow-up call). It is dense and long, with several sentences devoted to client-specific rendering warnings, but those warnings are actionable rather than filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description carries the burden of describing returns — it does so explicitly (upload_url, qr_code_url, and qr_svg when requested) and tells the agent which value to prioritize. Combined with the sibling routing and follow-up call, nothing needed to invoke this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description earns a bump by restating and contextualizing the exclusivity rule (exactly one of identity_id/address_id plus proof_types) and the replacement semantics of proof_types within the workflow. It does not add syntax-level detail the schema lacks, so it falls short of a 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource — generate a one-time browser link (URL + QR code) for uploading proof documents — and immediately scopes it to explicitly chosen proof types on one identity or address. It also names the sibling it is not (create_regulation_upload_link), so an agent can route between them without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when-to-use (voluntary/preventive uploads, replacing an existing document), when-not (documents a requirement still demands → create_regulation_upload_link), and the follow-up step (call check_upload_status with the returned token once the user is done). It even pre-empts the delete_proof detour by explaining replacement is automatic.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_pstn_trunkCreate PSTN Voice IN TrunkADestructiveInspect
Create a PSTN / call-forwarding Voice IN Trunk for the authenticated customer: inbound calls to the assigned DIDs are forwarded to destination — a phone number in digits, e.g. "48452006332". Forwarding is billed per minute, so this tool is confirmation-gated: the preview shows the forwarding rate (amounts are in USD) — show the price to the user before confirming. If the destination has no rate, the trunk cannot be created. For a SIP trunk use create_sip_trunk; for a phone.systems™ trunk use create_phone_systems_trunk.
| Name | Required | Description | Default |
|---|---|---|---|
| pop | No | DIDWW Point of Presence the trunk is served from. Omit to let DIDWW pick. | |
| name | Yes | Friendly name of the Voice IN Trunk (must be unique for the customer). | |
| weight | No | Load-balancing weight among trunk-group members of the same priority; higher is preferred (default 65535). | |
| priority | No | Priority of this trunk; DIDWW contacts the lowest-numbered priority first. Range 0-65535. | |
| cli_format | No | Format of the caller ID sent to the customer equipment (default e164). | |
| cli_prefix | No | Prefix prepended to the caller ID. Letters, digits, "+" and "#" only, up to 7 characters. | |
| description | No | Description of the Voice IN Trunk. | |
| destination | Yes | Phone number to forward calls to, digits only (e.g. "48452006332"). | |
| capacity_limit | No | Maximum number of simultaneous calls for the Voice IN Trunk. | |
| trunk_group_id | No | Optional Voice IN Trunk Group UUID to assign the trunk to. | |
| ringing_timeout | No | Seconds to wait for a 200 OK after a 18x ringing response before ending the routing attempt with the "Ringing timeout" disconnect code. Omit to use the platform default. | |
| confirmation_token | No | Leave empty on the first call — it returns the per-minute rate preview + a confirmation_token and creates nothing; re-call with the token to create the trunk. | |
| src_number_list_id | No | Optional Voice IN Number List UUID (from list_voice_in_number_lists) to apply as the caller-ID (source number) filter on this trunk. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only flag destructiveHint/idempotentHint, but the description goes well beyond them: per-minute billing, a confirmation-gated two-step flow where the first call creates nothing and returns a rate preview plus token, and USD-denominated amounts. It also discloses a failure mode (no rate = no trunk), which the annotations cannot express.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the action and its effect, then billing/gating, then failure condition, then sibling routing. Every sentence carries new information; nothing is repeated from the schema or annotations.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 13-parameter mutation tool with no output schema, the description covers the workflow, cost implications, preconditions, and sibling routing well. It stops short of describing what a successful creation returns (trunk ID/handle) or any authorization requirements, which leaves a small gap for a creation tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3, and the description adds genuine meaning on top: the destination format is restated with a concrete example, and confirmation_token's 'leave empty on first call' semantics are explained in workflow terms rather than field terms. It does not explain the routing parameters (priority, weight, pop, ringing_timeout), but those are already fully documented in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Create a PSTN / call-forwarding Voice IN Trunk') and immediately scopes the behavior (inbound calls to assigned DIDs are forwarded to `destination`). It explicitly distinguishes itself from the two nearest siblings, create_sip_trunk and create_phone_systems_trunk, so an agent can route correctly 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Names both alternatives with their selection conditions ('For a SIP trunk use create_sip_trunk; for a phone.systems™ trunk use create_phone_systems_trunk') and states a hard precondition ('If the destination has no rate, the trunk cannot be created'). It also prescribes the two-call confirmation workflow, which is exactly the when-to-use guidance an agent needs.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_regulation_upload_linkCreate document upload linkAInspect
Generate a one-time browser link (URL + QR code) for encrypted document upload. Pass identity_id and/or address_id (+ requirement_id) — the page will show upload slots only for the proofs that are still missing. Pass did_ids to also create the verification automatically when the user submits: purpose "registration" creates an address verification, purpose "emergency" creates an emergency verification. Returns upload_url and qr_code_url (plus qr_svg when qr: "svg" is requested). Priority #1: show upload_url as a clickable link — it always works. The QR lets the user continue on a phone and photograph documents with the camera: offer qr_code_url as a plain link, but do NOT rely on it as a markdown image — some clients (incl. claude.ai) gate external images behind a click. Request qr: "svg" ONLY if your client can render SVG through an HTML/artifact/widget capability; never paste raw SVG markup into plain reply text — chat clients escape it into a wall of code. Files are encrypted in the browser; the server never sees plaintext. The link works once; its lifetime is account-specific — quote expires_in_minutes from the response, never assume a fixed value. After the user says they are done, call check_upload_status with the returned token. If nothing is missing, skip the link and call create_address_verification / create_emergency_verification directly. To upload a document the requirement does NOT demand (voluntary/preventive upload, or replacing an existing document), use the create_proof_upload_link tool instead.
| Name | Required | Description | Default |
|---|---|---|---|
| qr | No | QR delivery: "url_only" (default) returns qr_code_url only; "svg" additionally includes qr_svg — ~7 KB of inline SVG markup. Request "svg" ONLY when your client can render SVG through an HTML/artifact/widget capability — raw SVG pasted into chat text gets escaped, not rendered. | |
| did_ids | No | DID UUIDs to verify. Presence means the verification is created automatically on upload. All DIDs must share one country and group type. | |
| purpose | No | What the upload is for: "registration" (default, DID address verification) or "emergency" (emergency calling verification). | |
| address_id | No | Address UUID — include to collect missing address proofs. Required when did_ids is passed. | |
| identity_id | No | Identity UUID — include to collect missing identity proofs. | |
| requirement_id | No | Regulation requirement UUID (from list_requirements). Optional when did_ids is passed (then it is derived from the DIDs). | |
| emergency_calling_service_id | No | For purpose "emergency": existing Emergency Calling Service UUID to resubmit the verification for — did_ids is not needed then (omit when verifying new DIDs). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations (readOnly=false, idempotent=false, destructive=false): one-time link, browser-side encryption so the server never sees plaintext, account-specific lifetime with an instruction to quote expires_in_minutes rather than assume a fixed value, and the side effect that did_ids auto-creates the verification on submission. That is meaningful mutation-behavior context annotations alone do not convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose, then params, then return values, then an explicit 'Priority #1' rendering instruction — the structure is deliberate. It is long and includes client-specific QR/markdown-image guidance that borders on verbose, but each block is operational and earns its place for an agent handling link delivery.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description fully documents the return values (upload_url, qr_code_url, and qr_svg when qr:'svg'), and it covers all 7 parameters plus the follow-up tool call. Nothing an agent needs to invoke and then use the result correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3, but the description adds combination logic the per-field schema text does not: the interplay of identity_id/address_id/requirement_id, how did_ids plus purpose ('registration' vs 'emergency') selects which verification is created, and when emergency_calling_service_id substitutes for did_ids. Useful cross-parameter meaning beyond the schema's field-by-field descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Generate a one-time browser link (URL + QR code) for encrypted document upload') and immediately distinguishes itself from create_proof_upload_link, create_address_verification, and create_emergency_verification. An agent can pick this tool apart from its closest siblings 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit conditional routing: pass identity_id/address_id/requirement_id to collect missing proofs, 'If nothing is missing, skip the link and call create_address_verification / create_emergency_verification directly,' use create_proof_upload_link for voluntary uploads, and call check_upload_status after the user finishes. Both the when and the when-not are stated with named alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_sip_trunkCreate SIP Voice IN TrunkAInspect
Create a SIP Voice IN Trunk (inbound voice trunk) for the authenticated customer. A minimal trunk only needs name and host (the host part of R-URI in the INVITE request). Set ONLY the parameters the user explicitly asked for and never invent values — every omitted field keeps the same default the customer panel applies. To register a SIP endpoint instead of pointing at a host, set enabled_sip_registration to true and omit host/port — registration credentials are generated server-side and returned in the configuration (password masked). For a PSTN call-forwarding trunk use create_pstn_trunk; for a phone.systems™ trunk use create_phone_systems_trunk. Returns the created trunk id and its configuration, or a readable error if the configuration is invalid.
| Name | Required | Description | Default |
|---|---|---|---|
| pop | No | DIDWW Point of Presence the trunk is served from. Omit to let DIDWW pick. | |
| host | No | Host part of R-URI in the INVITE request (SIP host/IP). Required unless enabled_sip_registration is true. | |
| name | Yes | Friendly name of the Voice IN Trunk (must be unique for the customer). | |
| port | No | Optional. Port part of R-URI in the INVITE request (default 5060; if omitted, the SRV/A record is resolved). | |
| codecs | No | Optional. Codecs which will be sent with the SDP Offer, in order of preference. Replaces the whole list, so keep "telephone-event" in it unless the user asked otherwise — it carries RFC 2833 DTMF, and dropping it stops DTMF from reaching the customer equipment. | |
| weight | No | Load-balancing weight among trunk-group members of the same priority; higher is preferred (default 65535). | |
| priority | No | Priority of this trunk; DIDWW contacts the lowest-numbered priority first. Range 0-65535. | |
| rtp_ping | No | Optional. Send RTP keep-alive packets to the customer equipment (default false). | |
| username | No | Optional. User part of R-URI in the INVITE request. You may use the "{DID}" pattern, which is replaced by the called DID number in E.164 format. | |
| auth_user | No | Optional. Username for outgoing SIP authentication. Only with auth_enabled true. | |
| cli_format | No | Format of the caller ID sent to the customer equipment (default e164). | |
| cli_prefix | No | Prefix prepended to the caller ID. Letters, digits, "+" and "#" only, up to 7 characters. | |
| cnam_lookup | No | Optional. Enable CNAM lookup on the trunk (default false/disabled). | |
| description | No | Description of the Voice IN Trunk. | |
| rtp_timeout | No | Optional. Drop the call after this many seconds without inbound RTP (default 30). | |
| sip_timer_b | No | Optional. INVITE transaction timeout in MILLISECONDS (default 8000). | |
| sst_enabled | No | Optional. Enable SIP Session Timers (default false). Requires sst_min_timer and sst_max_timer. | |
| auth_enabled | No | Optional. Enable outgoing SIP digest authentication (requires auth_user and auth_password). | |
| resolve_ruri | No | Optional. Resolve the R-URI host to an IP before sending the INVITE (default false). | |
| auth_password | No | Optional. Password for outgoing SIP authentication. Only with auth_enabled true. | |
| max_transfers | No | Optional. Maximum number of SIP transfers (REFER) to follow (default 0). | |
| sst_max_timer | No | Optional. Maximum session timer in seconds (default 900); must be >= sst_min_timer. | |
| sst_min_timer | No | Optional. Minimum session timer in seconds (default 600). Only with sst_enabled. | |
| auth_from_user | No | Optional. Custom From-header user part used with outgoing authentication. | |
| capacity_limit | No | Maximum number of simultaneous calls for the Voice IN Trunk. | |
| rx_dtmf_format | No | Optional. How DTMF is RECEIVED from the DIDWW network. | |
| sst_accept_501 | No | Optional. Treat a 501 answer to the session refresh as success (default true). | |
| trunk_group_id | No | Optional Voice IN Trunk Group UUID to assign the trunk to. | |
| tx_dtmf_format | No | Optional. How DTMF is SENT to the customer equipment. | |
| allowed_rtp_ips | No | Optional. Restrict the RTP source to these IPs/subnets (CIDR notation, e.g. "203.0.113.0/24"). Up to 10 entries; 0.0.0.0/0 and ::/0 are rejected. Omit to accept RTP from any address. | |
| ringing_timeout | No | Seconds to wait for a 200 OK after a 18x ringing response before ending the routing attempt with the "Ringing timeout" disconnect code. Omit to use the platform default. | |
| use_did_in_ruri | No | Optional. Only with enabled_sip_registration: put the called DID (instead of the registered username) in the R-URI user part. | |
| auth_from_domain | No | Optional. Custom From-header domain part used with outgoing authentication. | |
| stir_shaken_mode | No | Optional. How STIR/SHAKEN attestation is passed to the customer equipment. | |
| max_30x_redirects | No | Optional. Maximum number of 3xx redirects to follow (default 0). | |
| src_number_list_id | No | Optional Voice IN Number List UUID (from list_voice_in_number_lists) to apply as the caller-ID (source number) filter on this trunk. | |
| sst_refresh_method | No | Optional. SIP method used to refresh the session (default Invite). | |
| transport_protocol | No | Optional. SIP transport protocol (default UDP). | |
| force_symmetric_rtp | No | Optional. Send RTP back to the source address of the received stream instead of the SDP address (default false). | |
| sst_session_expires | No | Optional. Session-Expires value in seconds; must be between sst_min_timer and sst_max_timer. | |
| diversion_relay_mode | No | Optional. How the Diversion header is relayed to the customer equipment. | |
| diversion_inject_mode | No | Optional. Whether to add a Diversion header with the called DID number. | |
| media_encryption_mode | No | Optional. SRTP media encryption mode (default Disable). | |
| dns_srv_failover_timer | No | Optional. Milliseconds before failing over to the next DNS SRV record (default 2000). Must not exceed sip_timer_b. | |
| enabled_sip_registration | No | Optional. When true the trunk accepts a SIP registration instead of forwarding to a fixed host: incoming registration credentials are generated server-side and host/port must be omitted. | |
| network_protocol_priority | No | Optional. IP version preference when resolving the host (default "force IPv4"). | |
| symmetric_rtp_ignore_rtcp | No | Optional. With force_symmetric_rtp, ignore RTCP when learning the source address (default false). | |
| rerouting_disconnect_codes | No | Optional. SIP response codes that trigger rerouting to the next trunk-group member ("486" Busy Here, "503" Service Unavailable, ...), plus "Ringing timeout" — the no-answer disconnect reason, which has no SIP code and is not a timeout setting. Replaces the whole list; omit the argument to keep the platform defaults. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare it is a non-readOnly, non-destructive, non-idempotent mutation. The description adds context beyond that: registration credentials are generated server-side and returned masked, omitted fields keep panel defaults, and an invalid configuration yields a readable error. It does not mention auth scopes or rate limits, keeping it just short of 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core purpose, then scope guidance, the registration variant, sibling alternatives, and return behavior. Four sentences, each doing work, though the sibling-routing and registration details make it slightly dense for a single paragraph.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 48-parameter creation tool with no output schema, the description covers the essential edges: minimal viable call, registration-mode constraint, defaults behavior, sibling alternatives, and return/error format. The schema handles the exhaustive parameter detail, so the description is appropriately complete without being redundant.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% across all 48 parameters, so the schema already carries full parameter semantics. The description reinforces a few key meanings (host as R-URI host, minimal required fields, registration mode) but adds little beyond what the schema documents, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Create') and resource ('SIP Voice IN Trunk (inbound voice trunk)') for the authenticated customer. It explicitly distinguishes itself from sibling creators by naming create_pstn_trunk and create_phone_systems_trunk, so an agent can route correctly 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides clear when-to-use guidance ('minimal trunk only needs name and host'), an explicit guardrail ('Set ONLY the parameters the user explicitly asked for and never invent values'), and names the alternative tools for PSTN forwarding and phone.systems trunks. It also explains the registration-mode branch (set enabled_sip_registration true and omit host/port).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_sms_trunkCreate SMS trunkAInspect
Create an inbound SMS destination trunk for the authenticated customer, then optionally route a DID to it with assign_did_to_sms_trunk. Choose the delivery mode with type: type "http_in" (an HTTP IN trunk, default) → DIDWW pushes each incoming SMS to a webhook; pass name and url (defaults to an HTTP GET webhook), or http_method "POST"/"PUT" with a body and body_type for a request body. type "smtp" (an SMS to Email trunk) → DIDWW delivers each incoming SMS as an email; pass name and send_to (recipient email, e.g. "test@example.com" or "John Doe test@example.com"). subject, message and use_smtp_relay have sensible defaults. Available placeholders (substituted per incoming SMS): {SMS_TIME} received time, {SMS_SRC_ADDR} sender, {SMS_DST_ADDR} receiver, {SMS_TEXT} message text, {SMS_TEXT_BASE64_ENCODED} message text base64-encoded. Placeholders work in the smtp subject/message and in http_in query_parameters/headers/body. Returns the created trunk id and key attributes, or a readable error if the configuration is invalid.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | http_in only: webhook URL DIDWW pushes each incoming SMS to. | |
| body | No | http_in only: request body, required for POST/PUT. May use {SMS_*} placeholders, e.g. {"time":"{SMS_TIME}","text":"{SMS_TEXT}"}. | |
| name | Yes | Trunk name (must be unique for the customer). | |
| type | No | Delivery mode: "http_in" (webhook, default) or "smtp" (email delivery). | |
| blocked | No | Whether the trunk is blocked. Defaults to false. | |
| headers | No | http_in only: HTTP headers (string => string). Values may use {SMS_*} placeholders. | |
| message | No | smtp only: email body text, may use {SMS_*} placeholders. Defaults to "{SMS_TIME}" and "{SMS_TEXT}" on separate lines. | |
| send_to | No | smtp only (required): recipient email, e.g. "test@example.com" or "Name <test@example.com>". | |
| subject | No | smtp only: email subject, may use {SMS_*} placeholders. Defaults to "SMS received from {SMS_SRC_ADDR} to {SMS_DST_ADDR}". | |
| priority | No | Optional routing priority. | |
| body_type | No | http_in only: body encoding, required for POST/PUT. | |
| http_method | No | http_in only: HTTP method used for the webhook. Defaults to "GET". | |
| use_smtp_relay | No | smtp only: use the DIDWW SMTP relay. Defaults to true. | |
| query_parameters | No | http_in only: query string parameters (string => string). Values may use {SMS_*} placeholders. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With annotations covering the safety profile, the description adds substantial behavioral detail: what each type does, default methods/values, placeholder substitution rules, and that it returns the created trunk id or a readable error. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose and mode selection are front-loaded, and the dense paragraph avoids fluff. It is long for a single paragraph, but the length is justified by two delivery modes and 14 parameters.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 14 parameters, two modes, nested objects, and no output schema, the description covers the critical setup paths, defaults, placeholders, and return/error behavior. Minor fields like priority and blocked are left to the schema, which is reasonable.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3; the description still adds cross-parameter mode conditions (http_in uses url/body/http_method; smtp uses send_to/subject/message) and the full placeholder list that applies across query_parameters, headers, and body.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Create an inbound SMS destination trunk') and scopes it to the authenticated customer. It distinguishes the tool from the related routing sibling assign_did_to_sms_trunk and explains the two delivery modes.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says to route a DID afterward with assign_did_to_sms_trunk and gives clear conditions for choosing type http_in vs smtp. It does not explicitly exclude create_sms_trunk_group or state when not to use this tool, so it stops short of full when/when-not coverage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_sms_trunk_groupCreate SMS trunk groupADestructiveInspect
Create an SMS trunk group for the authenticated customer — a group bundles several inbound SMS trunks into one routing destination, so a DID assigned to the group delivers its incoming SMS through the member trunks. Pass a name and optionally sms_trunk_ids — the member trunk ids (uuids from list_sms_trunks). Only inbound-capable HTTP IN, SMTP, SMSC or ESME trunks can be members: a group cannot be nested and MSGP / OTP system trunks cannot be members. Manage membership later with update_sms_trunk_group; delete a group with delete_sms_trunk (WARNING: that also deletes its member trunks). Returns the created group with its member trunks, or a readable error.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Group name (must be unique for the customer). | |
| sms_trunk_ids | No | Member SMS trunk ids (uuids, as returned by list_sms_trunks). Each must be an inbound-capable HTTP IN, SMTP, SMSC or ESME trunk not already inside another group. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false and destructiveHint=true, so the mutation profile is covered structurally. The description adds real context beyond that: membership validation rules, the no-nesting constraint, and the return shape ('returns the created group with its member trunks, or a readable error'). It does not discuss whether a duplicate group name fails or whether the call is retry-safe, which is the remaining gap given idempotentHint=false and the schema's uniqueness note.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and the concept, then constraints, then lifecycle alternatives and return value — a sensible ordering. It is dense, and the membership-rule sentence is long, but essentially every clause carries distinct information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, so the description correctly explains the return payload and error behavior itself. Combined with the membership constraints and pointers to the update/delete siblings, an agent has everything needed to call this correctly and to plan follow-up operations.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and both parameters are already documented with types and constraints, so the baseline is 3. The description restates name/sms_trunk_ids and points at list_sms_trunks as the id source, but adds no format or syntax detail the schema does not already carry.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource (create an SMS trunk group) and immediately defines what the resource is: a bundle of inbound SMS trunks feeding one routing destination. This distinguishes it from create_sms_trunk, create_trunk_group, and list_sms_trunks 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent: manage membership later with update_sms_trunk_group, delete with delete_sms_trunk (with a warning attached). It also gives preconditions for the member ids (must be inbound-capable HTTP IN/SMTP/SMSC/ESME, not nested, no MSGP/OTP). It does not, however, say when to prefer this over create_trunk_group or create_sms_trunk, so it stops short of full when/when-not coverage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_trunk_groupCreate Voice IN Trunk GroupADestructiveInspect
Create a Voice IN Trunk Group for the authenticated customer — a failover / load-balancing container of existing Voice IN Trunks. A DID assigned to the group is routed to the member trunks by priority (lowest tried first) and, among equal priorities, by weight (higher preferred). Pass members to add existing SIP / PSTN / phone.systems™ trunks (by trunk id from list_trunks) with optional per-member priority and weight; a trunk group cannot contain another trunk group, and a group holds at most 10 member trunks. A member already in another group is moved. Returns the created group with its members in routing order, or a readable error if the configuration is invalid (nothing is created).
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Friendly name of the Voice IN Trunk Group (must be unique for the customer). | |
| members | No | Optional. Member trunks to place in the group (max 10). Each entry: trunk_id (required, a Voice IN Trunk UUID from list_trunks) plus optional priority / weight. | |
| capacity_limit | No | Optional. Maximum number of simultaneous calls for the whole group. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations flag this as destructive/non-idempotent, and the description goes well beyond them: it discloses the 10-member cap, the no-nested-group rule, and the important side effect that a member already in another group is moved. It also states atomicity ('nothing is created' on invalid config), which is exactly the kind of behavior an agent needs before calling a mutating tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Single dense paragraph that is well front-loaded with the action and resource. Every clause carries information (routing rule, member rules, constraints, return/error behavior), though the block is long enough that an agent must parse carefully.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description correctly states the return value (created group with members in routing order) and the failure mode (readable error, nothing created). Constraints on members and routing are fully covered, so nothing material is missing for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds real meaning: it explains the routing semantics of priority (lowest tried first) and weight (higher preferred among equal priorities, which together imply failover vs. load-balancing intent), plus the source of trunk_id values. It does not cover capacity_limit, which is left to the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Create a Voice IN Trunk Group') and immediately defines it as a failover/load-balancing container of existing trunks, including the routing rule. This clearly distinguishes it from siblings like create_sip_trunk, create_sms_trunk_group, or create_capacity_group.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear operational context: pass `members` to add existing trunks by id from list_trunks, with the explicit constraint that a group cannot contain another group and holds at most 10 members. It names no exclusion against sibling tools (e.g., when to prefer create_sms_trunk_group), so it stops short of 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_voice_in_number_listCreate Voice IN Number ListAInspect
Create a Voice IN Number List — a caller-ID (source number) filter for inbound calls. Choose mode: "full_number" (entries match the caller's number exactly) or "prefix" (entries match by prefix). Choose default_action: "allow" (calls pass unless an entry rejects them — a deny-list) or "reject" (calls are rejected unless an entry allows them — an allow-list). Optionally seed the list with numbers (full numbers or prefixes; allowed characters: digits, letters, "+", "-", "." — stored EXACTLY as passed, no normalization); by default those entries carry the OPPOSITE action of default_action (the usual deny-list / allow-list shape) — override with numbers_action. Creating a list does NOT filter anything by itself: attach it to a SIP or PSTN Voice IN Trunk via src_number_list_id on create_sip_trunk / create_pstn_trunk / update_sip_trunk / update_pstn_trunk. Returns the created list, or a readable error (in which case nothing is created).
| Name | Required | Description | Default |
|---|---|---|---|
| mode | Yes | How entries match the caller's number: "full_number" (exact match) or "prefix" (prefix match). Cannot be mixed within one list. | |
| name | Yes | Name of the Voice IN Number List (must be unique for the customer). | |
| numbers | No | Optional initial entries — full caller numbers (mode "full_number") or prefixes (mode "prefix"). Allowed characters: digits, letters, "+", "-", "."; max 20 chars each, up to 500. Stored exactly as passed (whitespace trimmed, nothing else normalized) and unique within the list. | |
| default_action | Yes | What happens to a call whose caller number matches NO entry: "allow" (deny-list style) or "reject" (allow-list style). | |
| numbers_action | No | Action the initial `numbers` entries carry: "allow" or "reject". Default: the opposite of default_action. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantial behavior beyond annotations: the atomicity guarantee ('returns... or a readable error, in which case nothing is created'), the no-normalization storage rule, and the crucial warning that creation alone is inert until attached to a trunk. Annotations only cover the safety profile, so this contextual disclosure is valuable.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long and dense, but it is front-loaded with the definition and every sentence carries distinct, non-redundant information (mode, default_action, numbers, numbers_action, attachment requirement, return behavior). No filler, though the single dense paragraph is heavier than strictly necessary.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, and the description compensates by stating what is returned (the created list or a readable error and the resulting no-op). With annotations covering safety and the schema covering every parameter, nothing an agent needs to call this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all five parameters and the default-3 baseline applies. The description nonetheless adds conceptual meaning the schema doesn't carry — the deny-list/allow-list framing for default_action and the rule that numbers carry the opposite action by default.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (create) and resource (Voice IN Number List) and immediately defines what the resource is: a caller-ID/source-number filter for inbound calls. It is clearly differentiated from the sibling trunk tools, which are named as the place where the list is actually attached.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly explains when this tool is and isn't sufficient: creating a list does NOT filter anything on its own, and routes the agent to create_sip_trunk / create_pstn_trunk / update_sip_trunk / update_pstn_trunk via src_number_list_id. The mode and default_action choices come with the conditions that select each option.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
current_accountShow the active accountARead-onlyInspect
Show the DIDWW account (customer) the session is currently acting as, including the customer, the roles held on it and the tools it may NOT call (everything else is allowed).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false and openWorldHint=false, so the safety profile is covered. The description adds genuinely useful authorization context beyond that: it reveals the roles held on the account and the set of tools the session may NOT call, which tells the agent how permissions are scoped.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence that identifies the resource first and enumerates its contents without filler. Every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description must convey the return shape, and it does name the three things returned (customer, roles, disallowed tools). It omits return formatting/pagination details, but for a zero-parameter read-only introspection tool that is a minor gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is nothing for the description to disambiguate; the baseline for a parameterless tool applies. No misleading parameter hints are present.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Show') and resource ('the DIDWW account (customer) the session is currently acting as'), plus the exact contents returned (customer, roles, disallowed tools). The phrase 'currently acting as' implicitly separates it from list_accounts (all accounts) and switch_account (change account), so an agent can distinguish it without reading another schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the 'when' through 'the session is currently acting as', but never states explicitly when to call this instead of list_accounts or switch_account, nor any prerequisite. Usage is inferable rather than spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_addressDelete addressADestructiveInspect
Delete one of the authenticated customer's regulation addresses by id, together with its uploaded proof documents. This is destructive and cannot be undone. An address with New/Pending verifications, with unfinished emergency calling services or SMS campaigns, or used as the account billing address cannot be deleted — the error says which blocker applies. Numbers already registered through this address stay registered and working, but the address (and its documents) can no longer be used for new verifications. Returns a confirmation message on success.
| Name | Required | Description | Default |
|---|---|---|---|
| address_id | Yes | UUID of the address to delete (see list_addresses). | |
| confirmation_token | No | Leave empty on the first call — the tool returns a confirmation_token + preview and deletes nothing. Re-call with that confirmation_token to delete. If the confirming call's response is lost, it is safe to retry with the SAME confirmation_token — a repeat returns the original result. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, the description discloses that deletion cannot be undone, that proof documents are removed too, the exact blocker categories that prevent deletion, and what happens to already-registered numbers. It also describes the confirmation-token retry behavior, which is valuable operational context not captured by destructiveHint alone.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the action and resource, then efficiently layers in destructive scope, blockers, side effects, and return behavior. Every sentence carries operational weight with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the rich schema, destructive annotations, and absence of an output schema, the description is complete. It covers safety, prerequisites, failure modes, post-deletion effects, and the success response, leaving no critical ambiguity for an agent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters are already well documented in the input schema. The description adds only marginal parameter meaning, mainly reinforcing that deletion is by id and affects associated documents, so the baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: delete an authenticated customer's regulation address by id, along with its proof documents. It clearly distinguishes this destructive removal from neighboring tools like update_address, list_addresses, and delete_proof.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear context for when deletion is possible and enumerates several blockers that cause the operation to fail. It does not explicitly route the agent to alternatives such as update_address or delete_proof, but the usage context is strong enough to avoid confusion.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_capacity_groupDelete Shared Capacity GroupADestructiveInspect
Delete one of the customer's Shared Capacity Groups (capacity groups) by id (the uuid returned by list_capacity_groups). This is destructive and cannot be undone. A group with DIDs still assigned to it cannot be deleted — unassign them first (unassign_did_from_capacity_group) or move them to another group. On deletion the group's reserved shared channels return to its Capacity Pool as free channels. Returns a confirmation message on success.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | UUID of the Shared Capacity Group to delete (from list_capacity_groups). | |
| confirmation_token | No | Leave empty on the first call — the tool returns a confirmation_token + preview and deletes nothing. Re-call with that confirmation_token to delete. If the confirming call's response is lost, it is safe to retry with the SAME confirmation_token — a repeat returns the original result. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=false, but the description adds material context beyond them: deletion is irreversible, the hard DIDs-assigned prerequisite, and the side effect that reserved shared channels return to the Capacity Pool as free channels. This is exactly the behavioral detail annotations cannot express.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four sentences, front-loaded with the purpose and id source, then the destructiveness, the prerequisite, the side effect, and the return. 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.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive tool with no output schema, the definition covers prerequisite state, irreversibility, side effects, and even the confirmation return. Nothing an agent needs to invoke it safely is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and both parameters (id, confirmation_token) are fully documented in the schema, including the two-phase confirmation flow. The description echoes the id provenance (list_capacity_groups) already stated in the schema but adds no new parameter-level syntax or format detail. Baseline 3 applies when the schema carries the load.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Delete) and resource (Shared Capacity Group), notes it operates by id sourced from list_capacity_groups, and is clearly distinguishable from sibling operations like create_capacity_group, update_capacity_group, or unassign_did_from_capacity_group. An agent can identify it 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit preconditions and routing: a group with DIDs assigned cannot be deleted, so the agent must first use unassign_did_from_capacity_group or move DIDs to another group. It also points to list_capacity_groups as the id source. When/why-to-use is fully covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_didTerminate DIDADestructiveInspect
Terminate (cancel) one of the authenticated customer's DIDs by id. PREFER THE SOFTER ALTERNATIVE FIRST: if the user just wants to stop paying for the number, call update_did with billing_cycles_count: 0 instead — the DID then simply stops renewing, stays fully usable until the end of the already-paid billing cycle, and the decision is reversible at any time before expiry. Only terminate when the user explicitly wants the number gone NOW. Terminating releases the number: inbound calls and SMS to it stop immediately, and it can only be restored (restore_did) within roughly 35 days while it remains in the terminated state — after that it returns to public stock and is lost. A DID on a still-pending order is cancelled with a refund instead; a DID from a Bulk Order cannot be terminated. Destructive and confirmation-gated.
| Name | Required | Description | Default |
|---|---|---|---|
| did_id | Yes | UUID of the DID to terminate (from list_dids). | |
| confirmation_token | No | Leave empty on the first call — it returns a preview + confirmation_token and terminates nothing; re-call with the token to terminate. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=false, but the description goes well beyond them: releases the number, inbound calls/SMS stop immediately, ~35-day restore_did window before it returns to public stock, pending-order DIDs cancelled with refund, and Bulk Order DIDs cannot be terminated. It also discloses the confirmation-gating behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the action, then the alternative, then consequences, then edge cases. Every sentence carries decision-relevant content, though the block is dense and slightly long for a two-parameter tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With annotations covering the safety profile and a 100%-covered schema, the description fills the remaining gaps: recovery window, immediate service impact, refund behavior, and non-terminable cases. Nothing an agent needs to call this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both did_id and confirmation_token are already documented in the schema, including the two-call preview-then-confirm flow. The description adds the 'confirmation-gated' framing but no syntax or format beyond the schema, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Terminate (cancel) one of the authenticated customer's DIDs by id') and explicitly distinguishes the action from its softer sibling update_did and its reversal sibling restore_did. An agent can identify exactly what this tool does and how it differs from the surrounding tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when/when-not routing: 'PREFER THE SOFTER ALTERNATIVE FIRST... call update_did with billing_cycles_count: 0 instead' versus 'Only terminate when the user explicitly wants the number gone NOW.' Names the alternative tool, the parameter to use, and the decision condition, 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.
delete_identityDelete identityADestructiveInspect
Delete one of the authenticated customer's regulation identities by id, together with ALL its addresses, uploaded proof documents and permanent supporting documents. This is destructive and cannot be undone. An identity cannot be deleted while it is linked to DIDs (as their main or porting identity), has New/Pending address verifications, unfinished emergency calling services or SMS campaigns, or is the account (system) identity — the error says which blocker applies. A user holding only the porting_manage rule cannot delete an identity that has permanent supporting documents (regulation rule required, as in the panel). Returns a confirmation message on success.
| Name | Required | Description | Default |
|---|---|---|---|
| identity_id | Yes | UUID of the identity to delete (see list_identities). | |
| confirmation_token | No | Leave empty on the first call — the tool returns a confirmation_token + preview and deletes nothing. Re-call with that confirmation_token to delete. If the confirming call's response is lost, it is safe to retry with the SAME confirmation_token — a repeat returns the original result. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and readOnlyHint=false, and the description goes well beyond them: it names exactly what is destroyed (all addresses, uploaded proof documents, permanent supporting documents), states the action is irreversible, lists the blockers that prevent it, and discloses an authorization constraint tied to permanent supporting documents.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the destructive action and cascade, then blockers, then permission caveat. Dense and every sentence carries information, though the single long paragraph is somewhat run-on and could be broken up.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive, non-idempotent tool with no output schema, the description covers side effects, irreversibility, precondition blockers, permission requirements, and the success return ('confirmation message'), leaving nothing material for the agent to infer.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so identity_id and confirmation_token are already fully documented, including the two-phase confirmation flow. The description adds no additional parameter meaning beyond what the schema provides, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (delete) and resource (regulation identity by id) and enumerates the cascade of dependent resources destroyed with it. It is clearly distinguishable from siblings like delete_did, delete_address and delete_proof.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-not conditions: deletion is blocked while the identity is linked to DIDs, has New/Pending address verifications, unfinished emergency calling services or SMS campaigns, or is the system identity. It also names a permission prerequisite (regulation rule vs porting_manage). It does not, however, point to any alternative tool for the blocked cases, only that the error names the blocker.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_proofDelete proof documentADestructiveInspect
Delete (soft-delete) one of the authenticated customer's uploaded regulation proof documents by id — proof ids come from list_identities / list_addresses. Use it to REPLACE an existing document: delete the old proof first, then call create_regulation_upload_link — the freed document slot is offered again. This is destructive and cannot be undone. A proof linked to a pending address verification cannot be deleted. Returns the deleted proof info on success.
| Name | Required | Description | Default |
|---|---|---|---|
| proof_id | Yes | UUID of the proof document to delete. | |
| confirmation_token | No | Leave empty on the first call — the tool returns a confirmation_token + preview and deletes nothing. Re-call with that confirmation_token to delete. If the confirming call's response is lost, it is safe to retry with the SAME confirmation_token — a repeat returns the original result. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare only destructiveHint=true and idempotentHint=false; the description adds far more: soft-delete semantics, irreversibility ('cannot be undone'), the blocked-deletion precondition, the two-phase confirmation_token preview flow with safe-retry-on-lost-response semantics, and the success return shape. The retry guidance concerns the confirming call, not delete idempotency, so it does not contradict idempotentHint=false.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core action and scope in the first clause, then layers id sourcing, the replace workflow, the destructive warning, the precondition, and the return value in descending order of importance. Every sentence carries distinct operational information; no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite having no output schema, the description states what a successful call returns (deleted proof info) and documents the confirmation-token response behavior. Combined with the precondition and workflow, an agent has everything needed to invoke this destructive tool safely.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3; the description still adds value by telling the agent where proof_id values originate (list_identities / list_addresses) and by framing confirmation_token as a two-step preview-then-confirm handshake rather than an ordinary input. It does not add format details, but the schema already supplies the UUID type and description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Delete (soft-delete) ... regulation proof documents by id') and scopes it to the authenticated customer's uploads. The parenthetical 'soft-delete' immediately distinguishes the operation's nature from a hard delete performed by sibling tools like delete_did or delete_identity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly names the sibling tools that supply ids (list_identities / list_addresses) and prescribes the replace workflow: delete first, then call create_regulation_upload_link. It also states a hard precondition (a proof tied to a pending address verification cannot be deleted), which is exactly the kind of when-not guidance that prevents failed calls.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_sms_trunkDelete SMS trunkADestructiveInspect
Delete one of the authenticated customer's SMS trunks by id (the uuid returned by list_sms_trunks). This is destructive and cannot be undone. A trunk that DIDs still route incoming SMS to cannot be deleted — unassign those DIDs first (assign_did_to_sms_trunk with a null sms_trunk_id, or route them to another trunk). Deleting a GROUP trunk also deletes its member trunks. Returns a confirmation message on success.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The SMS trunk id (uuid), as returned by list_sms_trunks. | |
| confirmation_token | No | Leave empty on the first call — the tool returns a confirmation_token + preview and deletes nothing. Re-call with that confirmation_token to delete. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=false, but the description goes further: it warns the action cannot be undone, discloses the cascade behavior for group trunks, and states the DID-routing blocker that will cause failure. These are behavioral traits the agent cannot derive from the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four tight sentences ordered by importance: what it does, that it is irreversible, what blocks it and how to unblock, then the cascade caveat and return value. No filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive, non-idempotent tool with no output schema, the description covers safety, preconditions, alternatives, cascade semantics, and the success response. Nothing an agent needs in order 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.
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 id and the two-step confirmation_token flow. The description's restatement of the uuid source adds little beyond the schema, so the baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (delete) and resource (SMS trunk), scoped to the authenticated customer and identified by the uuid from list_sms_trunks. It also distinguishes itself from the nearby delete_trunk and delete_sms_trunk_group siblings by explaining that deleting a GROUP trunk cascades to member trunks.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit precondition (a trunk with DIDs still routing SMS cannot be deleted) and names the remedy with the exact alternative call: assign_did_to_sms_trunk with a null sms_trunk_id, or rerouting to another trunk. This is when-to-use and when-not-to-use guidance with the alternative named.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_trunkDelete Voice IN TrunkADestructiveInspect
Delete one of the authenticated customer's Voice IN Trunks (inbound voice trunks) by id. This is destructive and cannot be undone. Trunks that are still assigned to DIDs cannot be deleted. Returns a confirmation message on success.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | UUID of the Voice IN Trunk to delete. | |
| confirmation_token | No | Leave empty on the first call — the tool returns a confirmation_token + preview and deletes nothing. Re-call with that confirmation_token to delete. If the confirming call's response is lost, it is safe to retry with the SAME confirmation_token — a repeat returns the original result. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructiveHint=true, so the safety profile is covered; the description adds valuable context — irreversibility ('cannot be undone'), the DID-assignment precondition, and a return indication. It omits any mention of the two-phase confirmation_token workflow, but that is documented in the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with the action and identifier, then the destructive warning and precondition. Efficient overall, though the trailing 'Returns a confirmation message on success' is thin and slightly at odds with the two-step flow described in the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive no-output-schema tool, the description covers identity, irreversibility, and the DID precondition. It does not surface the non-obvious two-call confirmation flow, which an agent must infer from the schema, leaving a modest gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both id and confirmation_token are fully documented in the schema itself, including the two-phase confirm/retry semantics. The description adds nothing beyond 'by id', so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource: delete a Voice IN Trunk (inbound voice trunk) by id. It explicitly scopes the resource type, distinguishing it from sibling deleters like delete_sms_trunk and delete_trunk_group, and names the identifier used to target it.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear precondition for use: trunks still assigned to DIDs cannot be deleted, implying the caller must unassign first. It does not, however, name an alternative tool or describe the unassign path, so it stops short of full when/when-not routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_trunk_groupDelete Voice IN Trunk GroupADestructiveInspect
Delete one of the authenticated customer's Voice IN Trunk Groups by id. This is destructive and cannot be undone. A group that still has DIDs routed to it cannot be deleted (re-route those DIDs first). By default the member trunks are only detached and survive as standalone trunks; set delete_member_trunks to true to also permanently delete the member trunks (refused if any member still carries DIDs). Returns a confirmation message on success.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | UUID of the Voice IN Trunk Group to delete (from list_trunk_groups). | |
| confirmation_token | No | Leave empty on the first call — the tool returns a confirmation_token + preview and deletes nothing. Re-call with that confirmation_token to delete. | |
| delete_member_trunks | No | Default false — member trunks are detached and kept. Set true to ALSO permanently delete every member trunk. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and readOnlyHint=false, yet the description adds substantial context beyond them: irreversibility, the DID-routing precondition, the default detach-vs-delete behavior for member trunks, the refusal condition when a member still carries DIDs, and the two-step confirmation_token flow. This is exactly the extra behavioral detail 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Five tight sentences, front-loaded with the destructive warning and identity of the resource; each remaining sentence carries a distinct constraint or default with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema needed (return value is described as a confirmation message on success), the description covers everything required to invoke safely: target identification, precondition checks, default member-trunk behavior, and the confirmation-token round trip.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds meaning the schema lacks — notably that delete_member_trunks=true is refused if any member trunk still carries DIDs, and that confirmation_token is a preview-then-confirm safety gate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a precise verb+resource ('Delete ... Voice IN Trunk Groups by id') and scopes it to the authenticated customer's own groups, which cleanly separates it from siblings like delete_trunk, delete_sms_trunk, and delete_capacity_group.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit preconditions and when-not conditions: a group with DIDs routed to it cannot be deleted until those DIDs are re-routed, and member trunks are only detached by default. It does not name a sibling alternative explicitly, but the gating conditions are unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_voice_in_number_listDelete Voice IN Number ListADestructiveInspect
Delete one of the authenticated customer's Voice IN Number Lists (caller-ID filters for inbound calls) by id, together with all its entries. This is destructive and cannot be undone. A list that is still attached to Voice IN Trunks (as their source number filter) cannot be deleted — the error names those trunks; detach it first via update_sip_trunk / update_pstn_trunk with src_number_list_id set to null. Returns a confirmation message on success.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | UUID of the Voice IN Number List to delete (from list_voice_in_number_lists). | |
| confirmation_token | No | Leave empty on the first call — the tool returns a confirmation_token + preview and deletes nothing. Re-call with that confirmation_token to delete. If the confirming call's response is lost, it is safe to retry with the SAME confirmation_token — a repeat returns the original result. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, but the description goes well beyond them: it says all entries are destroyed with the list, that the action cannot be undone, that failures name the blocking trunks, and that a lost confirm response is safe to retry with the same token. This is exactly the extra behavioral context 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four tight sentences, front-loaded with what is deleted and its destructive nature, then the precondition, then the recovery path. No sentence is filler; each adds an operational fact.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, and the description compensates by stating the return value ('a confirmation message on success') plus the two-phase preview/confirm protocol. Combined with the annotations and full schema coverage, nothing an agent needs is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and both parameters are fully documented in the schema, including the confirmation_token protocol and the provenance of 'id'. The description adds no syntax or format detail beyond that, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a precise verb+resource ('Delete ... Voice IN Number Lists') and disambiguates the resource itself as 'caller-ID filters for inbound calls', which separates it cleanly from the sibling delete_trunk / delete_sms_trunk / delete_did tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states the blocking condition (a list still attached to Voice IN Trunks cannot be deleted), names the fix and the exact alternative tools (update_sip_trunk / update_pstn_trunk with src_number_list_id set to null), and describes the required two-call confirmation flow. An agent has everything needed to decide and proceed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_balanceGet BalanceARead-onlyIdempotentInspect
Get the authenticated customer's current prepaid account balance and billing standing. Returns balance (current funds), credit (allowed negative balance / credit line), available_balance (balance + credit), debt (outstanding amount owed, 0 when none), is_debtor (whether the account is in debt), currency and last_activity (timestamp of the last balance change). All amounts are in USD.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive/closed-world, so the safety bar is covered. The description goes well beyond them by defining the semantics of each returned value (credit as allowed negative balance, available_balance as balance + credit, debt, is_debtor, last_activity) and noting the USD denomination. That is real behavioral context an agent would otherwise have to discover.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the purpose before the field enumeration. The second sentence is dense but every clause defines a distinct returned field, which is warranted given there is no output schema. Slightly list-like but no waste.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the full burden of documenting the response, and it does so field by field, including units and edge conditions (debt 0 when none). Combined with annotations covering the safety profile, nothing an agent needs to call and interpret this tool is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the baseline of 4 applies. The description correctly adds no parameter guidance because none is needed, and instead spends its words on output semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource with scope: 'Get the authenticated customer's current prepaid account balance and billing standing.' An agent immediately knows what it retrieves. It does not, however, differentiate itself from potentially overlapping siblings such as current_account, get_dashboard, or get_invoice.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'authenticated customer's' implies the context in which it applies, but there is no explicit when-to-use or when-not-to-use guidance, and no routing to alternatives like current_account or get_dashboard. Usage is inferable for a zero-parameter read, but nothing is spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_dashboardGet DashboardARead-onlyIdempotentInspect
Get the authenticated customer's account summary / dashboard. Returns a set of named cells the customer is allowed to see, such as last_invoice (amount), last_payment (amount), terminated_dids, dids_awaiting_registration, porting requests requiring attention/resubmit, porting FOC numbers, recently canceled verifications and whether channels exist. Each cell has a name and a value; a cell holding an amount also carries its currency. All amounts are in USD.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, so safety is covered. The description goes beyond them by disclosing the authorization filter ('cells the customer is allowed to see'), the cell shape (name + value, currency attached to amounts), and the USD normalization — genuinely useful 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the purpose in the first sentence, then a structured enumeration of returned cells and amount semantics. Slightly dense in the cell listing, but every clause carries information an agent would otherwise have to guess.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, so the description must carry the return contract, and it does so reasonably well by naming the cell set, the name/value pair shape, and currency rules. Missing only the container structure and whether absent cells are omitted versus null.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is nothing for the description to disambiguate. The baseline of 4 applies; the description correctly spends its space on the return payload instead of inventing parameter detail.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Get the authenticated customer's account summary / dashboard') and enumerates the cell types returned, so the agent knows exactly what this yields. It does not distinguish itself from similar siblings like current_account, get_balance, or list_invoices, which is the only gap.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description never says when to reach for this tool versus alternatives such as current_account, get_balance, get_invoice, or list_payments, all of which live in the same domain. Usage is only implied by the word 'dashboard'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_didGet DIDARead-onlyIdempotentInspect
Return the full details of one of the authenticated customer's DIDs by id (the uuid returned by list_dids). Includes the number, location (country, DID group area, DID group type, city), status flags (terminated, blocked, awaiting_registration, pending order, expired), inbound routing (voice trunk / trunk group and SMS trunk, by id + name), capacity (included channels, dedicated channels, capacity pool, shared capacity group, capacity_limit), billing (creation / activation / expiration dates, billing_cycles_count renewal state, monthly and setup price, next renewal price, the currency — all amounts are in USD — and, for an expired DID, the restore price), regulation state (registration deadline, identity, address verification status), emergency calling (E911) assignment and CNAM. Related entities are returned by id + name only — use the dedicated list tools for their full details.
| Name | Required | Description | Default |
|---|---|---|---|
| did_id | Yes | UUID of the DID (from list_dids). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only cover the safety profile (readOnly, idempotent, non-destructive). The description adds substantial content-level transparency: the returned field groups, that E911/CNAM are included, that all amounts are USD, and critically that related entities come back as id+name only. That last point is a genuine behavioral trait an agent could not infer.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One dense sentence, but it is front-loaded with the operation and then groups the return fields logically (number/location, status, routing, capacity, billing, regulation, E911/CNAM). Given the absence of an output schema, the length is justified, though the run-on structure could be broken into clauses.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description must carry the entire contract for return values, and it does so exhaustively — enumerating every field group plus the id+name abbreviation rule for related entities. Nothing an agent needs to invoke or interpret this read correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only one parameter and schema coverage is 100%; the schema already states it is the DID UUID from list_dids. The description's parenthetical repeats that verbatim, adding no syntax or format detail beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (return full details) and resource (one DID) plus the lookup key (id from list_dids). It is immediately distinguishable from list_dids (enumerate), get_did_history (history), and update_did (mutation).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Names the id source (the uuid returned by list_dids) and explicitly routes the agent elsewhere for nested entities ('use the dedicated list tools for their full details'), which prevents the common mistake of expecting full related objects. It does not, however, contrast this tool with get_did_history, so it falls short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_did_historyGet DID historyARead-onlyIdempotentInspect
Return the billing/lifecycle history of one DID (by the phone number returned by list_dids / get_did): purchase assignment, renewals, cancellations, restorations, stock removal and renewal-setting (billing_cycles_count) changes, newest first. Each entry carries the action, when it happened, the channel it came from (user_panel / api3 / mcp / staff / system) and — for billing_cycles_count changes — the from/to values. HARD LIMIT: history is only retained for the last 90 days (the platform archives older partitions), so this can never show the full lifetime of a long-held number — say so instead of implying completeness. Returns at most 200 entries.
| Name | Required | Description | Default |
|---|---|---|---|
| action | No | Optional filter to one action type. | |
| number | Yes | The full DID phone number (the `number` field from list_dids / get_did), digits only. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive), and the description goes well beyond them: a 90-day hard retention limit with the explicit instruction to 'say so instead of implying completeness', a 200-entry cap, newest-first ordering, and per-entry fields (action, timestamp, channel, from/to values). This is exactly the 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core purpose, then detail, with the critical 'HARD LIMIT' constraint emphasized mid-text. It's on the denser side and repeats the action list already in the enum, but nearly every sentence carries operational value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description fully compensates by describing the return shape (entry fields, ordering, channel values, from/to for billing_cycles_count changes), the entry cap, and the retention window. Nothing needed to call or interpret the result is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, and the schema already documents both `number` (full DID digits) and the `action` enum with all six values. The description largely restates the action list in prose and repeats the number's origin, adding little parameter meaning beyond what the schema provides, so the baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Return the billing/lifecycle history of one DID') and enumerates exactly what the history contains, so an agent can distinguish it from get_did (current state) and list_dids (enumeration) 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It tells the agent where to get the required `number` (from list_dids / get_did) and clarifies that it returns history rather than current state, which routes usage implicitly. It stops short of explicitly naming an alternative for 'when not to use' or stating prerequisites, so it's clear context without exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_exportGet ExportARead-onlyIdempotentInspect
Show a single export created with create_export: status (pending | processing | completed), name, filters, timestamps and — once completed — download_url (the DIDWW User Panel link, opens in a signed-in browser). While pending/processing, poll this tool again (exports typically finish in up to 5 minutes). For completed cdr exports also reports file_size_bytes and total_data_rows (data rows, header excluded; null when the file is too large to count). Returns NO file content — create_export with a narrower date range for a smaller slice. include_signed_url adds signed_download_url, a login-less download link: it is SENSITIVE credential-bearing data — request it, and repeat it in a reply or summary, ONLY when the user explicitly asked for the download link.
| Name | Required | Description | Default |
|---|---|---|---|
| export_id | Yes | The export id (uuid) returned by create_export. | |
| include_signed_url | No | Default false. Set true ONLY when the user asked for a download link: it adds signed_download_url, a capability link that downloads the file with no login and stays valid for 3 hours. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, yet the description adds real behavioral depth beyond them: it states that NO file content is returned, that download_url opens a signed-in browser session, and that include_signed_url yields SENSITIVE credential-bearing data to be surfaced only on explicit user request. This is exactly the kind of context annotations cannot carry.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the returned fields, then polling guidance, then the size caveat and the signed-URL warning. Dense but every clause carries operational information; the one long sensitivity sentence is slightly heavy but justified.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description fully carries the return-value burden: it names every field, explains download_url semantics, and clarifies that file content is absent. Nothing needed to call or interpret this tool is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3, but the description adds meaning beyond the schema: it frames signed_download_url as login-less sensitive data and gives an explicit policy for when to request and repeat it, plus the null-when-too-large behavior tied to export contents.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Show a single export created with create_export') and immediately enumerates the fields returned (status, name, filters, timestamps, download_url). An agent can distinguish it from list_exports and create_export 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear operational context: poll again while pending/processing with a stated ~5 minute expectation, and route to create_export with a narrower date range when the slice is too large. It does not explicitly name list_exports as the alternative for enumerating exports, but the single-export scoping makes the boundary inferable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_invoiceGet InvoiceARead-onlyIdempotentInspect
Get the details of a single invoice belonging to the authenticated customer, by its id. Returns the invoice id, name, billing period (year, month), date_from, date_to, created_at, sub_total (amount excluding VAT), vat, total (incl. VAT), currency and status. All amounts are in USD. Returns an error if no invoice with that id belongs to the customer.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The invoice id (uuid). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so the safety profile is covered. The description adds meaningful context beyond them: ownership scoping to the authenticated customer, the error-on-missing/unauthorized behavior, and the USD currency normalization for all amounts.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the action and scope, then a compact enumeration of returned fields. The field list is somewhat long, but it earns its place because there is no output schema, so it is not wasted text.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description usefully spells out the returned fields (id, name, billing period, subtotal/VAT/total, currency, status) and the currency unit, plus the error case. An agent has enough to call and interpret the result, though it does not describe the error shape or id format beyond the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With a single parameter and 100% schema description coverage ('The invoice id (uuid)'), the schema already carries the parameter semantics. The description reinforces the ownership scoping of the id but adds no format or lookup detail beyond what the schema states, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Get the details of a single invoice') plus the scoping dimension (belonging to the authenticated customer, by its id). This clearly distinguishes it from the sibling list_invoices.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear context for use: retrieve one invoice by id for the authenticated customer, with an explicit failure condition ('returns an error if no invoice with that id belongs to the customer'). It does not, however, explicitly name list_invoices as the alternative for browsing multiple invoices, so the routing guidance is implied rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_sms_trunkGet SMS trunkARead-onlyIdempotentInspect
Return the full details of one of the authenticated customer's SMS trunks by id (the uuid returned by list_sms_trunks). Includes name, type, inbound/outbound flags, blocked state, priority, number of assigned DIDs, creation time and the full type-specific configuration (e.g. webhook method/url/headers/body for http_in; recipient/subject/message for smtp; SMPP/HTTP settings for outbound trunks). Password values are never returned; a boolean <field>_set reports whether a password is configured.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The SMS trunk id (uuid), as returned by list_sms_trunks. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish the safe read-only, idempotent profile, and the description adds genuinely useful context beyond them: what fields come back, that passwords are never returned, and that a boolean '<field>_set' signals password presence. This security detail is not derivable from the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core purpose and the id source, then the return details. It is dense but each clause earns its place given there is no output schema; the long parenthetical field enumeration is borderline but justified.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description correctly compensates by summarizing the returned fields, including type-specific configuration and the password-redaction behavior. An agent has everything needed to call it and interpret the response.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% on a single required 'id' parameter, so the schema already carries the semantics; the description only restates that the id is the uuid from list_sms_trunks. Baseline 3 applies when the schema does the work.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Return full details) and resource (SMS trunk) scoped to a single id, and explicitly names list_sms_trunks as the source of that id, which cleanly separates it from the list sibling and from create/update/delete_sms_trunk.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The parenthetical '(the uuid returned by list_sms_trunks)' tells the agent how to obtain the argument, giving clear usage context. It stops short of explicit when-not guidance or naming the alternative getters (get_trunk, get_did_had) it should not be confused with.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_trunkGet Voice IN TrunkARead-onlyIdempotentInspect
Return the full details of one of the authenticated customer's Voice IN Trunks by id (the uuid returned by list_trunks). Includes name, trunk type, PSTN destination, capacity limit, priority, trunk group id, number of assigned DIDs, creation time and the full type-specific configuration (SIP host/port/username/codecs/registration + incoming auth, PSTN destination, PhoneSystems cnam). Password values are never returned; a boolean <field>_set reports whether one is configured.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The Voice IN Trunk id (uuid), as returned by list_trunks. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare read-only, idempotent, non-destructive, closed-world behavior. The description adds meaningful context beyond annotations by disclosing that password values are never returned and that boolean <field>_set fields indicate whether secrets are configured.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core action, then enumerates returned fields that matter because no output schema exists. It uses two sentences with no filler and places the password-disclosure note at the end where it is easy to find.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description carries the return-value burden and does so thoroughly: it lists the main fields plus type-specific configuration and clarifies password handling. Combined with annotations covering safety and idempotency, the definition is complete for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the single id parameter is fully documented in the schema. The description repeats that the id is the uuid returned by list_trunks, but adds no syntax, format, or validation detail beyond what the schema already provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb and resource: returning full details of a single Voice IN Trunk by id. It also distinguishes itself from the list operation by noting the id is the uuid returned by list_trunks.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It clearly implies when to use this tool: when an agent already has a trunk id and needs full details. It references list_trunks as the source of that id, but stops short of explicitly stating when not to use it or how it differs from other get_* siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_voice_in_number_listGet Voice IN Number ListARead-onlyIdempotentInspect
Show one of the authenticated customer's Voice IN Number Lists (caller-ID filters for inbound calls) INCLUDING its stored entries, paginated. Each entry is returned with its exact stored value (character-for-character, as needed by update_voice_in_number_list remove_numbers) and its allow/reject action. Also returns the list name, mode ("full_number"/"prefix"), default_action, items_count, attached_trunks_count with up to 10 named trunks, and items pagination meta. Use page/page_size to walk large lists — entries are never returned wholesale.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | UUID of the Voice IN Number List (from list_voice_in_number_lists). | |
| page | No | Page number (default 1). | |
| page_size | No | Results per page (default 100, max 500). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnly/idempotent/non-destructive, so the description is free to add return-shape context: the exact response fields (name, mode, default_action, items_count, attached_trunks_count with up to 10 named trunks, pagination meta) and the constraint that entries are never returned wholesale. That is meaningful added behavior beyond the safety hints, though it does not discuss permissions or failure modes.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action, then the return contents, then pagination guidance. Three dense sentences with no filler, though the enumeration of response fields is slightly long for a description that could lean on a schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description compensates by enumerating the returned fields, the exact-value guarantee, the allow/reject action, and the pagination model. An agent has everything needed to call this tool and interpret the response.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so all three parameters (id, page, page_size) are already documented with defaults and bounds. The description reinforces their purpose ('page/page_size to walk large lists') and notes where the id comes from, but adds no syntax or format detail beyond the schema, so the baseline 3 is correct.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Show) and resource (one Voice IN Number List including its stored entries) with scope ('one of the authenticated customer's'), plus a parenthetical that explains what a Voice IN Number List is. This cleanly distinguishes it from the sibling list_voice_in_number_lists, which enumerates lists rather than returning one list's contents.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It names a concrete downstream use case (entries are needed character-for-character by update_voice_in_number_list remove_numbers) and gives pagination guidance ('Use page/page_size to walk large lists — entries are never returned wholesale'). It does not explicitly contrast with the sibling list tool or state when not to use it, so it falls short of a full 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_accountsList available accountsARead-onlyInspect
List every DIDWW account (customer) the authenticated user can act as, with the roles held on each, the tools that account may NOT call (everything else is allowed) and which one is currently active. Use switch_account to change the active account.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, and openWorldHint=false, so the safety profile is covered. The description adds meaningful extra behavior: the payload is permission-scoped (it reports tools the account may NOT call, with an explicit 'everything else is allowed' rule) and flags the currently active account. It omits any auth/permission prerequisites for the caller.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences with zero filler. The resource and scope come first, and the alternative-tool routing is placed last as an actionable follow-up.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema and a trivial input schema, the description carries the full burden and discharges it by enumerating the returned data (accounts, roles, denied tools, active account). Nothing an agent needs to call or interpret this tool is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is nothing for the description to disambiguate; the baseline of 4 applies. The schema is an empty, fully-described object consistent with the description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List every DIDWW account (customer) the authenticated user can act as') and enumerates the returned facts: roles held, tools not callable, and which account is active. This clearly distinguishes it from siblings like current_account and switch_account without needing to open any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the mutation case to a named alternative: 'Use switch_account to change the active account.' It gives clear context for reading accounts, but does not directly contrast with current_account, which is the most confusable sibling.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_addressesList addressesARead-onlyIdempotentInspect
List the authenticated customer's regulation addresses with their uploaded proof documents. Returns each address id, the identity it belongs to (id, name, type), country ISO code, city name, postal code, street address, verified flag and a proof summary (proof type name, expired flag, files count). Pass country_iso (+ did_group_type) — straight from a DID's registration_required block, or with requirement_type "emergency" to pick the address for an E911 calling service — to have every address checked against that requirement: each one then carries eligible, plus the mismatches and how to fix them when it is not. Use an address id with create_address_verification or create_regulation_upload_link. If no suitable address exists, create one with create_address.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number (default 1). | |
| page_size | No | Results per page (default 50, max 1000). | |
| country_iso | No | Optional: check every returned record against the DID registration requirement of this country (ISO 3166-1 alpha-2, case-insensitive) — pass the `country_iso` from buy_did's registration_required block. Each record then carries `eligible`, plus `blocking_errors` and `remediation` when it cannot be used as is. | |
| did_group_type | No | Optional companion to country_iso: the DID Group type (a name like "National" or a DID Group Type UUID) — needed when the country has requirements for several group types. | |
| requirement_type | No | Which rule set country_iso refers to: "regulation" (default — DID registration) or "emergency" (E911 calling service, the requirement create_emergency_verification validates against). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and destructiveHint=false, so the safety profile is covered. The description adds genuinely non-obvious behavior: that passing country_iso causes every record to be checked against the requirement and each one then carries `eligible`, `blocking_errors` and `remediation` when it cannot be used. That conditional side-effect is real added value beyond the annotations, though pagination/ordering behavior is left implicit.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the resource and scope, then the conditional eligibility behavior, then routing to sibling tools. It is dense but every clause earns its place; the only minor cost is a long enumerated list of return fields packed into a single sentence.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so enumerating the returned fields (address id, identity, country ISO, city, postal code, street, verified flag, proof summary) is exactly what the description should supply, and it does. Combined with the eligibility behavior and sibling routing, an agent has 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.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so a 3 would be the baseline, but the description goes further by explaining where country_iso's value comes from ('straight from a DID's registration_required block') and clarifying the emergency/regulation semantics of requirement_type beyond the enum labels. It gives practical sourcing guidance the schema does not.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('List the authenticated customer's regulation addresses') and immediately delimits scope to the caller's own addresses with proof documents. It is clearly distinguishable from siblings like list_address_verifications and list_requirements by naming the resource precisely.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly tells the agent how to use the optional parameters ('Pass country_iso (+ did_group_type) — straight from a DID's registration_required block') and adds the alternate condition ('or with requirement_type "emergency" to pick the address for an E911 calling service'). It also routes downstream usage ('Use an address id with create_address_verification or create_regulation_upload_link') and the fallback ('If no suitable address exists, create one with create_address'), giving full when/when-not/alternative coverage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_address_verificationsList address verificationsARead-onlyIdempotentInspect
List the authenticated customer's address verifications (end-user / number registration reviews) with their status: Pending, Approved or Rejected. This is where a rejection becomes visible — a rejected verification carries the staff reject_comment and reject reasons, while the address itself only shows verified: false. Check here when a DID stays in awaiting_registration or an address stays unverified. Filter by status, address_id and/or DID number.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number (default 1). | |
| number | No | Filter to the verification covering this DID number (E.164, digits only). | |
| status | No | Filter by verification status. | |
| page_size | No | Results per page (default 50, max 1000). | |
| address_id | No | Filter by address UUID (from list_addresses). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive), and the description adds meaningful context beyond them: it discloses that rejected verifications carry the staff reject_comment and reject reasons while the address object itself only shows verified: false. It doesn't discuss pagination or result ordering, so it stops short of 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tightly packed sentences, front-loaded with the resource and statuses, then the diagnostic value, then the filters. No filler, though the parenthetical gloss of 'address verifications' is slightly redundant with the title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, so the description carries the return-shape burden and does so by naming the status values and the rejection fields (reject_comment, reject reasons) an agent will see. Combined with the full schema coverage, nothing needed to call or interpret this tool correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so every parameter (page, number, status, page_size, address_id) is already documented in the schema with defaults and bounds. The description restates the filterable fields and the 'and/or' combinability, which adds only marginal information beyond the structured data — baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List the authenticated customer's address verifications') and clarifies the domain with the parenthetical '(end-user / number registration reviews)' plus the enumerated statuses. An agent can distinguish this from list_addresses, create_address_verification, and validate_address without opening 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit symptom-driven triggers: 'Check here when a DID stays in awaiting_registration or an address stays unverified.' It also frames the tool as the diagnostic surface for rejections, which tells the agent when this is the right call versus simply reading the address record or the DID record.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_capacity_groupsList Shared Capacity GroupsARead-onlyIdempotentInspect
List the authenticated customer's Shared Capacity Groups (capacity groups) and the Capacity Pool each belongs to, optionally filtered by Capacity Pool. Results are paginated. Returns each group id, name, shared and metered channel counts, number of assigned DIDs and its Capacity Pool (id and name), plus pagination meta.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number (default 1). | |
| page_size | No | Results per page (default 50, max 1000). | |
| capacity_pool_id | No | Optional Capacity Pool UUID filter. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive, closed-world), so the bar is lower; the description adds useful behavior beyond them by disclosing that results are paginated and enumerating the returned fields (id, name, channel counts, assigned DIDs, pool id/name, pagination meta). It stops short of stating default page size or rate limits, which the schema covers for defaults.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Effectively two sentences, front-loaded with the resource and scope, then the return contents. Dense but every clause (filter, pagination, returned fields) carries information; minor density is the only cost.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description compensates by enumerating the return payload and noting pagination, and it acknowledges the optional filter for the one non-pagination parameter. Nothing an agent needs to call this list tool correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so page, page_size, and capacity_pool_id are already documented with defaults and bounds in the schema. The description only echoes the capacity_pool_id filter concept without adding syntax or format detail beyond it, which matches the baseline-3 case when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List the authenticated customer's Shared Capacity Groups') and disambiguates the resource from the similarly named list_capacity_pools by clarifying these are capacity groups, each tied to a Capacity Pool. An agent can distinguish this from the pool-listing sibling without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by 'optionally filtered by Capacity Pool,' which tells the agent the filter exists but not when to prefer this tool over list_capacity_pools or other list_* tools. No explicit when-to-use, prerequisites, or exclusions are given, leaving usage to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_capacity_poolsList Capacity PoolsARead-onlyIdempotentInspect
List the authenticated customer's Capacity Pools. A Capacity Pool holds a number of channels the customer can distribute across Shared Capacity Groups and dedicated-channel reservations. Results are paginated. Returns each pool id, name, total/assigned/free channel counts, monthly price, metered rate (the pay-per-minute usage price — it can differ by orders of magnitude between pools, e.g. 1.00 vs 0.005, so weigh it alongside monthly_price when choosing a pool), currency (all amounts are in USD), renew date, creation time and the covered countries (covered_country_isos — DIDs can only draw capacity from a pool that covers their country, so check it before creating a group for a specific country), plus pagination meta.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number (default 1). | |
| page_size | No | Results per page (default 50, max 1000). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive). The description adds real value beyond them: pagination behavior, scoping to the authenticated customer, and semantics of key fields like metered_rate variability and USD-only amounts. No rate limits or auth details, so not 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core purpose and then enumerates return fields in a single dense paragraph. The parenthetical asides (metered-rate orders of magnitude, DID country coverage) earn their place, but the run-on structure is heavy and would scan better split into shorter sentences.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the full burden of describing return values and does so comprehensively: id, name, channel counts, pricing, currency, dates, covered_country_isos, and pagination meta. Nothing an agent needs to call or interpret this tool is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so page and page_size are fully documented in the schema and the description adds no syntax beyond 'Results are paginated.' Baseline 3 is appropriate when the schema carries the parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (List) and resource (Capacity Pools), then defines the domain concept and what a pool contains, distinguishing it from the sibling list_capacity_groups. An agent knows exactly what this returns and how it differs from adjacent tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Embeds actionable usage context: check covered_country_isos before creating a group for a country, and weigh metered_rate alongside monthly_price when choosing a pool. This is clear guidance, though it never explicitly names an alternative sibling or an exclusion condition.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_credit_cardsList Credit CardsARead-onlyIdempotentInspect
List the authenticated customer's saved credit cards. Only masked, safe fields are returned (never the full card number or any secret): id, brand (e.g. VISA, MASTERCARD), last4 (last four digits), expires (YYYY-MM), auto_charge and origin_type. Results are ordered most recent first and paginated.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number (default 1). | |
| page_size | No | Results per page (default 12, max 100). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false. The description adds useful behavioral context beyond annotations: only masked fields are returned, no full card number or secret is exposed, results are ordered most recent first, and the response is paginated.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single tight paragraph, front-loads the resource and safety constraint, then gives returned fields and pagination behavior. Every sentence earns its place and there is no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description appropriately lists the returned fields, explains masking/security, states ordering, and notes pagination. Annotations cover the safety profile and the input schema fully documents parameters.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents page and page_size. The description only notes that results are paginated, adding no parameter-level meaning beyond what the schema provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: list the authenticated customer's saved credit cards. No sibling tool covers credit cards, so it is clearly distinguishable from the surrounding telecom/DID/trunk tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the tool name and description, but there is no explicit when-to-use, when-not-to-use, or alternative routing guidance. For this tool family, the intended context is reasonably inferable but not stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_didsList DIDsARead-onlyIdempotentInspect
List the authenticated customer's DIDs, optionally filtered by number (exact or number_contains), description_contains, country, DID Group, group features (voice, voice_out, t38, sms, sms_out, a2p, p2p, emergency, cnam_out — ALL listed must be supported), routing (trunk_id / sms_trunk_id, or has_trunk / has_sms_trunk false for the numbers routed NOWHERE), capacity (shared_capacity_group_id, capacity_pool_id, has_dedicated_channels) and status (terminated, blocked, awaiting_registration, is_configured — the get_did flag: routed AND with channels). Results are paginated. Returns each DID id, phone number, country ISO code, DID Group area, included channels, status flags, billing_cycles_count (renewal), description, creation time and expiration date (expires_at), plus pagination meta.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number (default 1). | |
| number | No | Exact full DID phone number match. | |
| blocked | No | Filter by routing-blocked status. | |
| features | No | Capabilities the DID Group must support — every listed feature must be present (AND), like the panel Features filter. | |
| trunk_id | No | Voice IN Trunk UUID (from list_trunks) — only the DIDs routed to that trunk. | |
| has_trunk | No | false = only voice DIDs with NO trunk (calls go nowhere); true = only routed ones. | |
| page_size | No | Results per page (default 50, max 1000). | |
| terminated | No | Filter by terminated status. | |
| country_iso | No | Optional country filter by ISO 3166-1 alpha-2 code (e.g. US, GB), case-insensitive. Same value returned as `country_iso` on each DID. | |
| did_group_id | No | Optional DID Group UUID filter. | |
| sms_trunk_id | No | SMS trunk UUID (from list_sms_trunks) — only the DIDs whose incoming SMS route there. | |
| has_sms_trunk | No | false = only SMS-capable DIDs with NO SMS trunk; true = only routed ones. | |
| is_configured | No | The get_did flag: true = ready to carry traffic, false = missing routing or capacity. | |
| number_contains | No | Partial phone number match (substring of the full number). | |
| capacity_pool_id | No | Capacity pool UUID (from list_capacity_pools) — only the DIDs drawing on that pool. | |
| description_contains | No | Partial match on the DID description (substring, case-insensitive). | |
| awaiting_registration | No | Filter by awaiting-registration status. | |
| has_dedicated_channels | No | true = only DIDs with dedicated channels of their own; false = only those without. | |
| shared_capacity_group_id | No | Shared capacity group UUID (from list_capacity_groups) — only its member DIDs. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, non-destructive, and closed-world, so the safety profile is covered. The description adds real value on top: it declares pagination, enumerates the returned fields, and clarifies the multi-condition semantics of the features filter ('ALL listed must be supported').
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Single front-loaded paragraph with the core action first and filters grouped by theme (routing, capacity, status). It is long but every clause maps to a real parameter; only the dense parenthetical listing hurts readability slightly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description compensates by enumerating returned fields (id, number, country_iso, channels, status flags, billing_cycles_count, description, expires_at) and pagination meta. Combined with 19 fully documented params, an agent has 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.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents all 19 parameters, setting a baseline of 3. The description adds meaning beyond it by spelling out AND-semantics for features and the routing/capacity interpretation of flags, though it mostly parallels the schema text.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource ('List the authenticated customer's DIDs') and immediately scopes it with the filter dimensions. It is trivially distinguishable from get_did, delete_did, and update_did 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains what each filter accomplishes (e.g. has_trunk/has_sms_trunk false surfaces numbers 'routed NOWHERE', is_configured means 'routed AND with channels'), which is effectively usage guidance. It stops short of naming alternatives like get_did for a singleton lookup or the assign_* tools for non-list operations.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_emergency_calling_servicesList Emergency Calling ServicesARead-onlyIdempotentInspect
List the authenticated customer's Emergency Calling Services. Returns each service id, name, reference, status (new, in process, changes required, pending update, active, canceled), country ISO code, DID group type, the emergency address one-liner, the count of covered phone numbers, the service setup_price and monthly_price with their currency (all amounts are in USD) and the last verification (id + status: pending, approved, rejected), plus pagination meta. Billing is per number: the recurring monthly cost of a service is monthly_price times the count of attached DID numbers (setup_price is one-time). Use create_emergency_verification to resubmit a service in changes required status.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number (default 1). | |
| page_size | No | Results per page (default 50, max 1000). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, but the description adds real value: the full set of status values, the per-number billing formula (monthly_price × DID count, setup_price one-time, USD), and the last-verification status enum. It doesn't mention rate limits or pagination defaults (those live in schema).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded in the first sentence, followed by a dense field enumeration and a useful billing sentence. The long return-field list is heavy but earns its place given there is no output schema. Minor verbosity, but no waste.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema present, the description compensates by enumerating the returned fields and statuses, and explains billing so the agent can interpret costs. Combined with annotations covering the safety profile, an agent has everything needed to call and interpret this tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% for both page and page_size, so the schema fully documents pagination. The description only notes 'plus pagination meta' without adding syntax or constraint detail beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('List the authenticated customer's Emergency Calling Services') with clear scope (authenticated customer). Easily distinguished from siblings like list_emergency_requirements or create_emergency_verification.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent to create_emergency_verification for services in 'changes required' status. It also clarifies billing semantics, giving useful context. However, it does not state when not to use this tool versus list_emergency_requirements, so it stops short of the 5 bar.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_emergency_requirementsList Emergency RequirementsARead-onlyIdempotentInspect
Check what an emergency verification needs BEFORE creating: identity type, mandatory identity/address fields (fill gaps with update_identity), area levels. The verification itself attaches no files, but the identity/address must carry their regulation proofs (staff reviews them) — upload missing ones via create_regulation_upload_link with purpose "emergency". Each requirement also carries the setup_price and monthly_price from YOUR account's emergency plan rate — emergency service is billed PER covered DID number: monthly_price times the attached numbers count every month, plus a one-time setup_price; both come with their currency (all amounts are in USD). Only requirements your plan prices are listed, so everything here can be ordered; an account without an emergency plan is told so instead. Optionally filter by country_iso and/or DID group type; without filters every requirement that your plan prices is returned (paginated). An empty list means emergency calling is not available to the account there — either not offered at all, or not covered by your plan, which sales@didww.com can extend.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number (default 1). | |
| page_size | No | Results per page (default 50, max 1000). | |
| country_iso | No | Optional country filter: ISO 3166-1 alpha-2 code (e.g. US, GB), case-insensitive. | |
| did_group_type | No | Optional DID group type name (e.g. Local, National, Mobile, case-insensitive) or UUID. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare a safe read (readOnlyHint=true, destructiveHint=false, idempotent), but the description adds substantial behavior beyond them: per-DID billing semantics (monthly_price times attached numbers plus one-time setup_price, in USD), empty-list meaning, and the fact that only plan-priced requirements are returned. It does not mention pagination page limits, but the billing and empty-result semantics are unusually rich disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The key point (check before creating) is front-loaded and every clause carries information, but the billing and empty-list discussion is dense and delivered in one long paragraph with heavy dashes and semicolons. It is informative rather than wasteful, though a little sprawling for a list tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the burden of return semantics and does so: it names the requirement fields, the pricing fields, and what an empty list means. Nothing an agent needs to call and interpret this tool correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds meaning the schema does not: filtering by country_iso and/or did_group_type is optional and omitting them returns every plan-priced requirement, paginated. That clarifies the default behavior of the two filter parameters beyond their field-level docs.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('Check what an emergency verification needs BEFORE creating') and enumerates the returned content: identity type, mandatory identity/address fields, and area levels. An agent can distinguish it from create_emergency_verification and list_requirements from the text alone.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly positions the tool before creation, names the follow-up tools for each gap (update_identity to fill identity/address fields, create_regulation_upload_link with purpose 'emergency' to upload proofs), and describes filter vs. no-filter behavior. This is genuinely actionable routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_exportsList ExportsARead-onlyIdempotentInspect
List the authenticated customer's recent exports, newest first, optionally filtered by export_type or status. Results are paginated. Returns each export's id, export_type, status (pending | processing | completed), name, filters, created_at and — when completed — completed_at, download_url (open in a browser while signed in to the DIDWW User Panel) and download_expires_at. Download links that need no login are never listed here — get them one at a time from get_export with include_signed_url, and only when the user asked for one.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number (default 1). | |
| status | No | Optional filter by status. | |
| page_size | No | Results per page (default 50, max 200). | |
| export_type | No | Optional filter by export type. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover the safety profile (read-only, idempotent), but the description adds substantial behavior the annotations cannot: newest-first ordering, pagination, the fact that download_url only works in a signed-in browser session, and the constraint that anonymous links must be fetched individually elsewhere. This is real operational context beyond 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose and filters, then return fields, then the signed-URL caveat — a logical order with no filler sentences. It is fairly dense, but every clause carries information an agent needs.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description enumerates the returned fields (id, export_type, status, name, filters, created_at, completed_at, download_url, download_expires_at) and their conditional availability, and covers pagination and the download-link caveat. Nothing needed to call or interpret it is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents page, page_size, status and export_type. The description restates the two filterable fields and inlines the status values, which adds marginal reinforcement but no syntax or format detail beyond the schema. Baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List the authenticated customer's recent exports'), plus ordering ('newest first') and scope ('the authenticated customer's'). It explicitly distinguishes itself from the sibling get_export for the signed-URL case.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Names the alternative (get_export with include_signed_url) and the precise condition that selects it ('only when the user asked for one'), and states that login-free links are never returned here. Both the when and the when-not are explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_identitiesList identitiesARead-onlyIdempotentInspect
List the authenticated customer's regulation identities with their uploaded proof documents. Returns each identity id, type (personal/business), display name, country ISO code, verified flag, creation time and a proof summary (proof id — usable with delete_proof, proof type name, expired flag, files count). Pass country_iso (+ did_group_type) — straight from a DID's registration_required block, or with requirement_type "emergency" for E911 — to have every identity checked against that requirement: each one then carries eligible, plus the mismatches and how to fix them when it is not. Use an identity id with create_address / update_identity / create_regulation_upload_link. If no suitable identity exists, create one with create_identity.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number (default 1). | |
| page_size | No | Results per page (default 50, max 1000). | |
| country_iso | No | Optional: check every returned record against the DID registration requirement of this country (ISO 3166-1 alpha-2, case-insensitive) — pass the `country_iso` from buy_did's registration_required block. Each record then carries `eligible`, plus `blocking_errors` and `remediation` when it cannot be used as is. | |
| did_group_type | No | Optional companion to country_iso: the DID Group type (a name like "National" or a DID Group Type UUID) — needed when the country has requirements for several group types. | |
| requirement_type | No | Which rule set country_iso refers to: "regulation" (default — DID registration) or "emergency" (E911 calling service, the requirement create_emergency_verification validates against). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark it read-only, idempotent, non-destructive, and closed-world, but the description adds crucial behavioral detail beyond them: passing country_iso triggers a per-record eligibility check that attaches `eligible`, `blocking_errors`, and `remediation`. It also enumerates the returned fields, which is valuable since there is no output schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose and return shape, then eligibility behavior, then sibling links. It is dense and slightly list-heavy in the return-field enumeration, but every clause carries actionable information with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description compensates fully by enumerating the returned fields and the conditional eligibility/remediation fields, plus the correct follow-up tools. An agent has everything needed to call and use the result correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds genuine meaning: country_iso is sourced 'straight from a DID's registration_required block' (via buy_did) and requirement_type switches the rule set between regulation and E911 emergency requirements.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List the authenticated customer's regulation identities with their uploaded proof documents') and immediately scopes it to the caller's account. It is clearly distinguishable from create_identity, update_identity, and delete_identity in the sibling set.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to pass country_iso/did_group_type and requirement_type 'emergency' for E911, and routes the agent to concrete next tools ('Use an identity id with create_address / update_identity / create_regulation_upload_link. If no suitable identity exists, create one with create_identity').
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_invite_requestsList Invite RequestsARead-onlyIdempotentInspect
List the authenticated customer's pending invitations — users who were invited to access this account (create_invite_request) but have not responded yet. Returns each invitation id, email, name, roles (role names the invitee will be granted), status (always Pending — like the panel, this list shows only pending invitations) and created_at, plus pagination meta, ordered most recent first. Invite lifecycle: create_invite_request emails the invitee -> while unanswered the invitation is listed here and can be revoked with cancel_invite_request -> once the invitee accepts, it leaves this list and their access appears in list_user_accesses; revoked or declined invitations also leave this list.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number (default 1). | |
| page_size | No | Results per page (default 12, max 100). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive, closed-world), so the bar is lower; the description still adds real behavioral context: ordering (most recent first), that status is always Pending, that revoke/decline removes rows, and that pagination meta is returned. It does not mention rate limits or result caps, but no contradiction exists.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded and the long return-field enumeration plus lifecycle chain earn their space given there is no output schema. Slightly dense, but no filler or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description compensates by enumerating returned fields (id, email, name, roles, status, created_at, pagination meta) and ordering, and the lifecycle chain makes the tool's place in the invite flow unambiguous. 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.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% — both page and page_size carry their own defaults and bounds in the schema — so this is the baseline 3. The description only references pagination meta generally and adds no format or syntax detail beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource with scope: 'List the authenticated customer's pending invitations — users who were invited... but have not responded yet.' It is distinguishable from sibling list_user_accesses (accepted access) and create_invite_request/cancel_invite_request by name and function.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The lifecycle sentence explicitly says where this list fits: create_invite_request sends the invite, unanswered invites appear here, cancel_invite_request revokes them, and accepted invites move to list_user_accesses. This gives clear routing context, though it never states an explicit 'use this when you need X' directive or any exclusion.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_invoicesList InvoicesARead-onlyIdempotentInspect
List the authenticated customer's invoices, optionally filtered by year and/or month. Results are ordered most recent first and paginated. Returns each invoice id, billing period (year, month), sub_total (amount excluding VAT), vat, total (incl. VAT), currency and status, plus pagination meta. All amounts are in USD.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number (default 1). | |
| year | No | Optional filter by billing year. | |
| month | No | Optional filter by billing month (1-12). | |
| page_size | No | Results per page (default 12, max 100). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive, closed-world), so the bar is lower. The description goes beyond them by disclosing ordering ('most recent first'), pagination, the exact returned fields, and that all amounts are USD — meaningful behavioral context an agent cannot get from the 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three compact sentences, front-loaded with purpose and filters before ordering and return shape. Every sentence carries information: filters, sort order, pagination, field list, currency — no padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema and four optional params, the description fully compensates by enumerating the returned fields (id, period, sub_total, vat, total, currency, status) and pagination meta, plus the USD currency caveat. An agent has everything needed to call and interpret it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%: page, year, month, and page_size all carry descriptions with defaults and ranges. The description's mention of year/month filtering restates the schema rather than adding syntax or edge-case detail (e.g. whether month requires year), so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (List) and resource (the authenticated customer's invoices) with the available filters named up front. It is immediately distinguishable from get_invoice in practice, but the description never explicitly contrasts itself with the single-invoice sibling or other list_* billing tools, so it stops short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description conveys when the filters apply ('optionally filtered by year and/or month') and how results come back, which implies the browse-the-billing-history use case. However, it never says when to reach for this instead of get_invoice, list_payments, or list_refunds, and gives no exclusions or prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_ordersList OrdersARead-onlyIdempotentInspect
List the authenticated customer's purchase order history, ordered most recent first and paginated. Returns each order id, reference, service (Did, Pstn, Generic, Capacity, A2p, Emergency, ...), amount (incl. VAT), amount_no_vat, vat, currency, status (Completed, Pending, Canceled), created_at and completed_at, plus pagination meta. All amounts are in USD.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number (default 1). | |
| page_size | No | Results per page (default 12, max 100). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the safety profile (readOnly, idempotent, non-destructive, closed-world), and the description usefully adds ordering (most recent first), pagination, the authenticated-customer scoping, and a USD currency note. It stops short of stating rate limits or exact pagination meta shape, but it goes well 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and scope, then a compact enumeration of return fields. The field list is long but earns its place because there is no output schema, so it is informative rather than padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description compensates by enumerating the returned fields, their meanings, and status/service vocabularies, plus currency and ordering. This is nearly complete for a read-only list tool whose annotations already carry the safety profile.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and both parameters (page, page_size) are fully documented in the schema. The description only alludes to pagination generically, adding no syntax beyond what the schema already provides, so baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (list the authenticated customer's purchase order history) with clear scope. It does not, however, differentiate itself from the many sibling list/get tools such as list_invoices, list_payments, or list_refunds, so an agent must infer the distinction.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No when-to-use guidance, no exclusions, and no alternative tools named. Given the crowded sibling set of financial list tools (list_invoices, list_payments, list_refunds), the absence of routing guidance is a real gap.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_paymentsList PaymentsARead-onlyIdempotentInspect
List the authenticated customer's payment history, ordered most recent first and paginated. Returns each payment id, payment_type (e.g. CreditCard, PayPal, Wiretransfer), amount, currency, status (Completed, Pending, Canceled), is_charged, reference, payer_name, payer_email, paid_at and created_at, plus pagination meta. All amounts are in USD.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number (default 1). | |
| page_size | No | Results per page (default 12, max 100). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and destructiveHint=false, so safety is covered. The description adds genuinely useful behavior beyond that: results are ordered most recent first, they are paginated, and all amounts are normalized to USD, which matters because a per-record currency field is returned.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single dense sentence set: purpose and ordering are front-loaded, then the returned fields, then the currency caveat. The long field enumeration earns its space because there is no output schema, though the run-on list slightly hurts scanability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description usefully enumerates the returned fields and status/type vocabularies and notes pagination meta, which is exactly the burden it must carry. Minor gaps remain around total-count/next-page semantics and whether canceled or pending items are included by default.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and both parameters (page, page_size with defaults and max) are fully documented in the schema. The description only alludes to pagination generically, adding no format or default detail beyond what the schema already provides, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a precise verb and resource ('List the authenticated customer's payment history') plus ordering and scope, which cleanly separates it from list_invoices, list_refunds and list_orders by resource alone. It never names or contrasts a sibling explicitly, so it stops short of the top tier.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: the phrase 'authenticated customer's payment history' tells the agent this is the account-scoped payment listing, but there is no when-to-use statement, no mention of prerequisites beyond implied auth, and no routing against list_invoices/list_refunds.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_refundsList RefundsARead-onlyIdempotentInspect
List the authenticated customer's COMPLETED refunds (money actually returned), ordered most recent first and paginated. A refund is money returned to the customer for a previous charge. Refunds are issued by DIDWW staff or payment-provider flows against a payment (money goes back to the original payment method), or against an order or invoice (the amount is credited back to the account balance — credited_to_balance is true). Only completed refunds are listed — a refund still being processed does not appear here yet (same as the panel); tell the user to check back later or contact support about a refund in progress. Refund history is strictly read-only: no MCP tool can create, change or cancel a refund — customers request one through support. Amounts are negative (money returned) and include VAT. Returns each refund id, refund_target (payment, order or invoice), destination — where the money was returned: "original payment method" (a payment refund goes back to the card/PayPal/etc. it was paid from) or "account balance" (an order or invoice refund is credited to the account balance), amount, currency, description, reference, refunded_entities (type, reference, amount and currency of each refunded payment/order/invoice item — cross-reference the reference with list_payments / list_orders), credited_to_balance, paid_at and created_at, plus pagination meta. All amounts are in USD. Optionally filter by creation time with created_after / created_before.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number (default 1). | |
| page_size | No | Results per page (default 50, max 100). | |
| created_after | No | Only refunds created at or after this ISO 8601 date-time (UTC), e.g. "2026-01-01T00:00:00Z". | |
| created_before | No | Only refunds created before this ISO 8601 date-time (UTC), exclusive. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only/idempotent/non-destructive, and the description adds substantial beyond-annotation context: refunds cannot be created, changed or canceled by any MCP tool, amounts are negative and VAT-inclusive in USD, ordering is most-recent-first with pagination, and the completed-only visibility rule. This is rich 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The key scoping constraint (completed only, read-only) is front-loaded and most sentences carry distinct information. It is a single dense block with some redundancy — the refund concept is defined twice ('money actually returned' then 'money returned to the customer') — which keeps it just short of a 5.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description compensates by enumerating the return fields (id, refund_target, destination, amount, currency, reference, refunded_entities, credited_to_balance, timestamps, pagination meta) and explaining destination/credited_to_balance semantics. Nothing an agent needs to call or interpret it is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents page, page_size, created_after and created_before with defaults and formats. The description only restates that creation-time filtering is optional, adding no syntax or semantics beyond the schema — baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (list the authenticated customer's COMPLETED refunds) and immediately scopes it to money actually returned. It defines what a refund is and the two issuance pathways, so an agent knows exactly what this tool returns versus a generic payment/order listing.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear context: only completed refunds appear (same as the panel), in-progress refunds should be handled by telling the user to check back or contact support, and refunded_entities references can be cross-referenced with list_payments / list_orders. It stops short of explicitly naming a sibling list tool to use instead for other refund states.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_requirementsList regulatory requirementsARead-onlyIdempotentInspect
List the regulatory requirements for DID registration, optionally filtered by country and/or DID Group type (name like "National" or UUID); without filters all requirements are returned (paginated). Use this FIRST when a DID needs registration (awaiting_registration / needs_registration): it tells you which identity type is accepted (any/personal/business), which proof documents and how many are needed for the identity and the address, which identity fields are mandatory, whether one-time/permanent supporting documents and a service description are required. Follow-up flow: create_identity -> create_regulation_upload_link (upload proofs) -> create_address -> create_address_verification.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number (default 1). | |
| page_size | No | Results per page (default 50, max 1000). | |
| country_iso | No | Optional country filter: ISO 3166-1 alpha-2 code, e.g. US, GB, UA (case-insensitive). | |
| did_group_type | No | Optional DID Group type filter: a name like "Local", "National", "Mobile", "Toll-free", "Shared Cost", "Global" or a DID Group Type UUID. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, so safety is covered; the description adds real behavioral context by stating that unfiltered calls return everything and are paginated, and by enumerating the kinds of data returned (accepted identity type, proof counts, mandatory fields, one-time/permanent docs). It stops short of describing page limits or result size, but goes well 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose, then usage trigger, then the detailed output inventory, then the follow-up flow. The long middle clause listing what the response reveals is dense but earns its place given there is no output schema; a minor trim would tighten it.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description compensates by spelling out exactly what the response reveals and how it feeds the registration workflow. Combined with annotations covering safety, an agent has everything needed to call this correctly in context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so both filter parameters are already fully documented with formats and examples; the description only restates that country and DID Group type are optional ('name like "National" or UUID'). Baseline 3 is appropriate when the schema carries parameter semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb+resource ('List the regulatory requirements for DID registration') and scopes it with the optional country and DID Group type filters. It implicitly separates itself from the sibling list_emergency_requirements by anchoring to DID registration, but never names or contrasts that sibling explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states exactly when to call it ('Use this FIRST when a DID needs registration (awaiting_registration / needs_registration)') and lays out the full follow-up sequence with named sibling tools (create_identity -> create_regulation_upload_link -> create_address -> create_address_verification). Nothing about sequencing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_sms_trunksList SMS trunksARead-onlyIdempotentInspect
List the authenticated customer's SMS trunks, optionally searched by name (case-insensitive, partial match) and/or filtered by type (HTTP_IN, SMTP, HTTP_OUT, SMSC, ESME, GROUP). Results are paginated. Returns each trunk id, name, type, inbound/outbound flags, blocked state, priority, number of assigned DIDs and creation time, plus pagination meta. Use get_sms_trunk for the full details (delivery target) of one trunk.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Search by trunk name (case-insensitive, partial match). | |
| page | No | Page number (default 1). | |
| type | No | Filter by SMS trunk type. | |
| page_size | No | Results per page (default 50, max 1000). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, so the safety profile is covered. The description adds genuinely useful behavior beyond that: pagination, case-insensitive partial-match semantics for name, and the exact set of enum values accepted by type.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, all front-loaded: scope first, filter semantics second, return shape third, alternative last. No filler or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description compensates by enumerating the returned fields (id, name, type, flags, blocked state, priority, DID count, creation time) plus pagination meta. Combined with the annotations and full schema coverage, nothing an agent needs to call this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all four parameters are already documented in the schema, including the enum values and match semantics. The description restates this rather than adding syntax or defaults beyond what the schema provides, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List the authenticated customer's SMS trunks') and immediately qualifies scope with search/filter options. It also names the sibling get_sms_trunk for detail retrieval, so an agent can distinguish list-vs-get without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent to get_sms_trunk when full details of a single trunk are needed, which is the key alternative. It doesn't address how this differs from the generic list_trunks sibling, so it stops just short of full when/when-not coverage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_trunk_groupsList Voice IN Trunk GroupsARead-onlyIdempotentInspect
List the authenticated customer's Voice IN Trunk Groups (failover / load-balancing groups of inbound voice trunks), optionally searched by name (case-insensitive, partial match). Results are paginated. Returns each group id, name, capacity limit, number of assigned DIDs, creation time and its member trunks (id, name, type, destination, priority, weight) in routing order — priority ascending, then weight descending — plus pagination meta.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Search by trunk group name (case-insensitive, partial match). | |
| page | No | Page number (default 1). | |
| page_size | No | Results per page (default 50, max 1000). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive, closed-world), so the bar is lower; the description still adds real behavioral detail — pagination, case-insensitive partial-match search, the returned member fields, and the routing order (priority ascending, then weight descending). It stops short of things like rate limits or auth scopes.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Dense and front-loaded: resource and scope lead, then search, pagination, and return shape. It is essentially one long run-on sentence, but each clause (routing order, member fields) carries useful information rather than padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the return-value burden and does so fully — it enumerates the group fields and member trunk fields and explains the ordering. Combined with annotations covering safety, an agent has everything needed to call and interpret this tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and all three parameters (name, page, page_size) are documented in the schema, so the baseline is 3. The description restates the name search semantics (case-insensitive, partial match) but adds no syntax or format detail beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (List) and resource (Voice IN Trunk Groups) and even defines the resource in a parenthetical ('failover / load-balancing groups of inbound voice trunks'), which cleanly separates it from siblings like list_trunks, list_sms_trunks, and list_capacity_groups.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description conveys that this lists the authenticated customer's trunk groups with optional name search, so the general usage context is implied, but it never states when to prefer this over list_trunks, get_trunk, or the create/update/delete trunk-group siblings. No explicit alternatives or exclusions are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_trunksList Voice IN TrunksARead-onlyIdempotentInspect
List the authenticated customer's Voice IN Trunks (inbound voice trunks), optionally searched by name (case-insensitive, partial match) and/or filtered by type (SIP, PSTN, PHONE-SYSTEMS-2, TRUNK-GROUP). Results are paginated. Returns each trunk id, name, trunk type, PSTN destination (if any), capacity limit, priority, trunk group id, number of assigned DIDs and creation time, plus pagination meta.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Search by trunk name (case-insensitive, partial match). | |
| page | No | Page number (default 1). | |
| type | No | Filter by trunk type. | |
| page_size | No | Results per page (default 50, max 1000). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false and closed-world, so the safety profile is covered. The description adds real behavioral context beyond that: results are paginated, and it enumerates what each record contains (ids, PSTN destination, capacity limit, priority, group id, assigned DID count, creation time).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One dense but front-loaded sentence that puts the resource and scope first and the filtering conditions second. No filler, though the trailing enumeration of return fields is long and could be trimmed.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, and the description compensates by listing the returned fields and noting pagination, so an agent knows what it will get back. Combined with the annotations covering the safety profile and the fully documented schema, nothing needed to call this tool is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both the name and type semantics ('case-insensitive, partial match' and the enum filter) are already documented. The description restates the same filtering semantics without adding format details, defaults, or interactions, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List the authenticated customer's Voice IN Trunks (inbound voice trunks)') and clarifies the domain term with a parenthetical. It does not name or differentiate from nearby siblings such as list_sms_trunks, list_trunk_groups, or get_trunk, so the agent must infer separation from the name alone.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied: list trunks, optionally narrowed by name or type. There is no explicit when-to-use statement and no routing to alternatives — notably nothing tells the agent to use get_trunk for a single trunk or list_sms_trunks for the SMS variant. Adequate but leaves selection to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_user_accessesList User AccessesARead-onlyIdempotentInspect
List every user who can currently access the authenticated customer account, with their panel roles. Returns each access id, email, name, roles (role names such as SuperAdmin, Billing, Technical), is_owner (the account owner cannot be removed), is_current_user (the access this MCP session authenticated as), has_two_factor_auth, last_login_at and created_at, plus pagination meta. Ordered oldest first, so the account owner is typically first. NOTE: users appear here only after they accepted an invitation — a newly invited user who has not yet accepted is visible in list_invite_requests instead (invite lifecycle: create_invite_request sends an email -> the invitee accepts -> their access appears here).
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number (default 1). | |
| page_size | No | Results per page (default 12, max 100). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, but the description goes well beyond them: it discloses ordering (oldest first, owner typically first), the invariant that is_owner cannot be removed, the meaning of is_current_user, and the visibility rule tied to invitation acceptance. This is genuine behavioral context an agent needs to 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose and the key routing note, and every clause earns its place. The field enumeration is long, but it substitutes for a missing output schema, so it is justified rather than padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description compensates by listing return fields, ordering, pagination, and the invitation-acceptance visibility rule. An agent has everything needed to call and interpret this tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and both parameters (page, page_size with defaults and max) are fully documented in the schema. The description adds only the existence of 'pagination meta', which is marginal; baseline 3 applies when the schema carries the load.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List every user who can currently access the authenticated customer account') plus the payload scope (panel roles). It explicitly distinguishes itself from the closely related sibling list_invite_requests, so an agent can route correctly without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit when-to-use-this vs when-to-use-alternative rule: accepted users appear here, unaccepted invitees appear in list_invite_requests. It even spells out the invite lifecycle (create_invite_request -> accept -> appears here), 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.
list_voice_in_number_listsList Voice IN Number ListsARead-onlyIdempotentInspect
List the authenticated customer's Voice IN Number Lists — caller-ID (source number) filters for inbound calls. Each list matches the CALLER's number either exactly (mode "full_number") or by prefix (mode "prefix"); every entry in the list carries its own allow/reject action, and the list's default_action ("allow" or "reject") applies when no entry matches. A list only takes effect once it is attached to a SIP or PSTN Voice IN Trunk as its source number filter (src_number_list_id on the create/update SIP or PSTN trunk tools); attached_trunks in the result shows where each list is in use. Optionally searched by name (case-insensitive, partial match); results are paginated. Returns each list id, name, mode, default_action, items_count, attached_trunks_count with up to 10 named trunks (id and name) and creation time, plus pagination meta. The list ENTRIES themselves are not returned — only items_count; page through them with get_voice_in_number_list.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Search by list name (case-insensitive, partial match). | |
| page | No | Page number (default 1). | |
| page_size | No | Results per page (default 50, max 1000). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, so the bar is lower; the description still adds meaningful domain context — that a list only takes effect once attached to a SIP/PSTN trunk, and that entries are omitted in favor of items_count. This is valuable behavioral insight 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core purpose and the definition of a Voice IN Number List before moving to return details. It is dense and runs long, but each sentence carries functional information and little is redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description must carry the return contract, and it does so thoroughly: id, name, mode, default_action, items_count, attached_trunks (up to 10), creation time, and pagination meta. Nothing needed to call or interpret the tool is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and all three parameters (name, page, page_size) are documented in the schema. The description restates the case-insensitive partial name match and pagination but adds no syntax or format detail beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List the authenticated customer's Voice IN Number Lists') and immediately defines what a list is: caller-ID (source number) filters for inbound calls. It clearly distinguishes itself from the sibling get_voice_in_number_list by noting that list entries are not returned here.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explains that results are optionally searched by name and paginated, and explicitly routes the agent to get_voice_in_number_list for the entries themselves. It lacks an explicit 'do not use this when...' exclusion, but the alternative-tool routing is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
restore_didRestore terminated DIDADestructiveInspect
Restore one of the authenticated customer's TERMINATED DIDs by id, bringing the number back into service (find terminated numbers with list_dids terminated: true). Only works while the number is still in the terminated state — roughly 35 days after termination it is released to public stock and can no longer be restored (it will not be found). Restoring a still-valid DID is free. But if the DID has already EXPIRED, restoring first RENEWS it and CHARGES the renewal price (USD, like every DIDWW amount) to the account balance — a PAID operation. This paid case is confirmation-gated — warn the user it is a paid renew before confirming. With insufficient balance the restore fails and nothing changes. On success the DID is unblocked and set to auto-renew (billing_cycles_count null); use update_did afterwards to change that. Returns the restored DID with its new expiration date.
| Name | Required | Description | Default |
|---|---|---|---|
| did_id | Yes | UUID of the terminated DID to restore (from list_dids with terminated: true). | |
| confirmation_token | No | Only needed when the DID has EXPIRED (restoring it is then a PAID renew). Leave empty on the first call — it returns a preview + confirmation_token and charges nothing; re-call with the token to renew and restore. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations (destructiveHint=true, readOnlyHint=false, idempotentHint=false): discloses pricing semantics (free for still-valid, charged renew for expired), the ~35-day window, insufficient-balance failure behavior, and success post-conditions (unblocked, set to auto-renew, billing_cycles_count null). This is rich operational context the agent cannot derive from 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Information is front-loaded (purpose, then window, then pricing, then gating, then post-conditions) and nearly every sentence carries distinct operational facts. Slightly dense with capitalized emphasis, but no wasted sentences.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description compensates by stating the return value ('restored DID with its new expiration date'), the cost implications, and failure modes. Nothing an agent needs to call this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds real value on confirmation_token: it explains the two-call preview-then-confirm flow and that the first call charges nothing. That explains the intent of the parameter beyond the schema's field description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource — restore a TERMINATED DID by id — and scopes it to the authenticated customer. An agent can distinguish it from siblings like list_dids, get_did, buy_did, and update_did 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit routing ('find terminated numbers with list_dids terminated: true'), an eligibility window (~35 days before release to public stock), and the confirmation-gated paid case ('warn the user it is a paid renew before confirming'). It names the alternative for discovery and the follow-up tool (update_did) to change auto-renew.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_coverageSearch DID coverageARead-onlyIdempotentInspect
List DID Groups the authenticated customer can purchase, optionally filtered by country, city and/or number type. country_iso is an ISO 3166-1 alpha-2 code (e.g. CA, US, GB); city is a city name in English (fuzzy-matched, so spacing/hyphens are ignored; only local groups have cities); did_group_type is the number type (Local, National, Mobile, Toll-free, Shared Cost, Global). Each DID Group has one or more Stock Keeping Units (SKUs) at different included-channel tiers and prices. For each group returns: sku_id (pass THIS to buy_did — NOT group_id), group_id, DID Group area name, group type, country ISO code, dialing prefix, supported features (voice, voice_out, t38, sms, sms_out, a2p, p2p, emergency, cnam_out), needs_registration (true = the group requires address registration), restrictions (the group's service-restrictions text, when any — buying a DID from the group means accepting them), available quantity, back_orderable (present and true when the group is API-connected: buy_did purchases it even at 0 available quantity — back-ordering is on by default, see its allow_back_ordering argument — and the numbers are provisioned after the order), and per SKU: setup/monthly price with its currency (all amounts are in USD), included channels with a human label ("2 channels included" / "no channels (metered)") and billing_type (bundled = channels included, metered = 0 channels, pay-per-minute until capacity is attached). Filter by features to keep only groups supporting ALL listed features (e.g. ["sms"] for SMS-capable numbers, ["emergency"] for emergency-calling support).
| Name | Required | Description | Default |
|---|---|---|---|
| npa | No | NANPA area code (3 digits). Narrows the selection to a specific area code — mainly for countries with structured numbering plans, such as the United States and Canada. Combine with nxx for an exact NPA-NXX prefix. | |
| nxx | No | NANPA exchange code (3 digits) — requires npa; narrows the selection to the exact NPA-NXX number prefix. | |
| city | No | City name in English (DIDWW stores city names in English). Fuzzy-matched — "Los Angeles", "Los-Angeles" and "los angeles" all match. Only local groups have cities — do NOT put a number type (e.g. "Mobile") here; use did_group_type. | |
| page | No | Page number (default 1). | |
| region | No | State / administrative region name in English (case-insensitive substring), e.g. "California". Narrows the selection within countries that have sub-national divisions, such as the United States, Canada and the United Kingdom. | |
| features | No | Keep only groups supporting ALL listed features: voice = inbound calls, voice_out = outbound calls, t38 = fax, sms = inbound SMS, sms_out = outbound SMS, a2p/p2p = outbound SMS kinds, emergency = emergency calling (e.g. 911/112), cnam_out = outbound caller-name delivery. | |
| area_name | No | Finds groups for a specific area or locality by name fragment (case-insensitive). The area name is the group's label: a city or locality for geographic groups, or a service area like "Toll-free", "Mobile", "National", "Shared Cost" or "Global" for non-geographic ones (use did_group_type to filter by number type instead). | |
| page_size | No | Results per page (default 50, max 200). | |
| country_iso | No | ISO 3166-1 alpha-2 country code, e.g. CA, US, GB (case-insensitive). | |
| is_available | No | Filter by immediate purchasability: true = only groups you can buy right now (free DIDs in stock OR API-connected back-orderable groups); false = only groups with neither. Omit to list both. | |
| did_group_type | No | Filter by number type. | |
| prefix_contains | No | Finds DID groups matching the entered number prefix — a digit fragment of the full international prefix (country code + area code), e.g. "1212" for US +1 212 groups. | |
| needs_registration | No | Filter by whether the DID Group requires address registration: false = no registration needed. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent, but the description adds substantial behavior: back_orderable semantics (API-connected groups purchasable at 0 quantity, back-ordering default on, provisioned after order), needs_registration meaning, restrictions implying acceptance on purchase, and cross-references buy_did's allow_back_ordering argument. This is rich context beyond 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose and filter semantics are front-loaded, and the long return-field enumeration earns its place since there is no output schema. It is dense and runs as one block sentence, which slightly hurts readability but wastes little.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 13 params, no output schema, and a complex pricing/stocking domain, the description compensates by enumerating every returned field and its meaning, plus back-order and registration behavior. Nothing essential for correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents every parameter. Description restates country_iso, city, did_group_type and features semantics largely as the schema already does, adding only the feature-filter example. Baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List DID Groups the authenticated customer can purchase') with scope and optional filters, and names the downstream sibling buy_did so the agent can place it in the purchase flow. It is clearly distinguishable from list_dids/get_did.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage context is clear (browse purchasable groups before buying, pass sku_id to buy_did). It even warns 'pass THIS to buy_did — NOT group_id.' It does not explicitly state when NOT to use it versus siblings like list_dids, so it falls short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
switch_accountSwitch the active accountAIdempotentInspect
Switch the active DIDWW account (customer) for this session. Pass a user_access_id from list_accounts. Subsequent tool calls run under the new account's roles, and the response lists the tools the new account may NOT call.
| Name | Required | Description | Default |
|---|---|---|---|
| user_access_id | Yes | The user_access_id (uuid) of the account to switch to, from list_accounts. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover the safety profile (idempotent, non-destructive, not read-only), so the bar is lower, and the description still adds real context: this is a session-scoped state change that alters the role context of all subsequent tool calls, and it returns a list of tools the new account cannot call. It does not say whether the switch persists across sessions or how to revert, but the disclosed behavior is genuinely useful.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, zero filler, and the core action is front-loaded before the prerequisite and the side effects. Every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter session-mutation tool with no output schema, the description covers the key concerns: where the ID comes from, the scope of the change, and what the response contains. It stops short of explaining persistence or reversal, which is the only notable gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the schema already states the uuid comes from list_accounts; the description repeats the same sourcing information without adding format, validation, or edge-case detail. Baseline 3 is appropriate when the schema carries the parameter documentation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Switch) plus the exact resource (the active DIDWW account/customer) and scopes it to 'this session'. It is clearly distinguishable from siblings like current_account (read) and list_accounts (enumerate), which is exactly the differentiation needed.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a prerequisite for the parameter ('Pass a user_access_id from list_accounts') and notes the effect on subsequent calls, but never states when an agent should switch versus simply reading with current_account, nor any when-not conditions. Usage is implied rather than prescribed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
unassign_did_from_capacity_groupUnassign DID from Shared Capacity GroupADestructiveIdempotentInspect
Remove one of the customer's DIDs from its Shared Capacity Group (capacity group), so it no longer draws channels from that group's Capacity Pool. Provide the did_id. Idempotent: a DID that is not assigned to any group is reported as already unassigned. This is not a refund: it returns channels to the pool they were allocated from, reversibly — only buy_capacity_channels spends money. Returns the DID and a confirmation message, or a readable error.
| Name | Required | Description | Default |
|---|---|---|---|
| did_id | Yes | UUID of the DID to unassign (must belong to the customer). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag idempotentHint and destructiveHint, but the description goes well beyond them: it explains the idempotent edge case (unassigned DIDs are reported as already unassigned), the reversibility semantics (channels return to the pool they were allocated from), the cost model, and the return/error shape. This is exactly the extra behavioral context annotations cannot express.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The action and its scope are front-loaded in the first clause, followed by tightly packed behavioral facts. It is somewhat dense (the 'not a refund' clarification is convoluted), but nearly every sentence carries information an agent needs.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter mutation with full annotation coverage and no output schema, the description closes the remaining gaps: it covers the idempotency case, the mutation's reversibility, the cost implication, and the return/error behavior. Nothing required 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.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the single parameter's UUID/ownership constraint is already documented in the schema. The description only restates 'Provide the did_id' without adding format, validation, or lookup guidance, so baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Remove') plus resource (a DID) and its exact scope (from its Shared Capacity Group/Capacity Pool), which cleanly distinguishes it from the sibling assign_did_to_capacity_group. An agent can identify the inverse operation 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Clearly states the required input ('Provide the did_id') and routes cost-related expectations to buy_capacity_channels ('only buy_capacity_channels spends money'). It does not explicitly name assign_did_to_capacity_group as the inverse operation or state preconditions/alternatives beyond that, so it falls 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.
update_addressUpdate addressADestructiveInspect
Update an existing regulation address of the authenticated customer — only the street address, postal code, area and description can change (same as the panel). The country, city and identity of an address can NEVER be changed: for a different location create a new address with create_address. Only the provided fields are changed. Note: once the address is in use (linked to DIDs or verifications) its filled fields become read-only — though a still-blank address_area can be filled even then. Pass an empty string to clear the description.
| Name | Required | Description | Default |
|---|---|---|---|
| address | No | Street address (street, building, apartment). Cannot be blanked. | |
| address_id | Yes | UUID of the address to update (must belong to the customer, see list_addresses). | |
| description | No | Free-form description of the address. Empty string clears it. | |
| postal_code | No | Postal / ZIP code. Cannot be blanked. | |
| address_area | No | Area/region name — needed for countries with area-level regulation (see the requirement address_area_level). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only flag destructiveHint/not-idempotent; the description goes well beyond them by disclosing partial-update semantics ('Only the provided fields are changed'), the in-use read-only lock with its one exception (blank address_area), and the empty-string clear behavior. These are non-obvious mutation side effects an agent cannot infer from 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Dense and front-loaded — the mutability scope and the create_address alternative come before the edge cases. Minor waste in the parenthetical '(same as the panel)', which carries little actionable meaning for an agent.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 5-param, no-output-schema mutation tool, the description supplies everything an agent needs: which params are editable, the irreversible/in-use constraint, the clearing convention, and the fallback tool. No return-value explanation is required since there is no output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds meaning the schema does not carry: the immutable-field rule (country/city/identity can never change) and the condition under which provided fields are rejected. Field-clearing is partly duplicated from the schema's own 'Empty string clears it' note.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Update an existing regulation address of the authenticated customer') and immediately scopes which fields are mutable versus immutable. An agent can distinguish it from create_address, delete_address and list_addresses 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Names the alternative explicitly — 'for a different location create a new address with create_address' — and gives the conditions under which fields can no longer be edited (address in use/linked to DIDs or verifications). It also tells the agent to check list_addresses for the address_id, giving a concrete prerequisite path.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_capacity_groupUpdate Shared Capacity GroupADestructiveIdempotentInspect
Reconfigure one of the customer's Shared Capacity Groups (capacity groups): rename it and/or change its shared_channels_count / metered_channels_count. Only the provided fields are changed. Shared channels are drawn from (or returned to) the Capacity Pool's free channels — raising shared_channels_count is not a purchase, it allocates channels already bought into the pool. Raising metered_channels_count DOES enable more pay-per-use channels, billed at the pool's metered rate (all amounts are in USD), which is why raising it is two-call confirmation-gated: the first call returns a preview + confirmation_token and changes nothing; re-call with the token to apply it. Every other change applies immediately. Returns the updated group, or a readable error.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | New friendly name of the Shared Capacity Group. | |
| capacity_group_id | Yes | UUID of the Shared Capacity Group to update (must belong to the customer). | |
| confirmation_token | No | Only needed when RAISING metered_channels_count. Leave empty on the first call — the tool returns a preview + confirmation_token and changes nothing. Re-call with that confirmation_token to apply the change. Retrying with the SAME token after a lost response is safe — a repeat returns the original result. | |
| shared_channels_count | No | New number of shared channels drawn from the Capacity Pool. A COUNT, not a boolean: pass N to allow up to N concurrent shared channels, 0 for none. | |
| metered_channels_count | No | New number of metered (overload) channels. A COUNT, not a boolean: pass N to allow up to N metered channels, 0 to disable metered usage. Raising it is confirmation-gated. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantial behavior beyond the annotations: partial-update semantics, the billing consequence of raising metered channels (pay-per-use at the pool's metered rate, in USD), the two-call preview/confirmation_token gate, immediate application for all other changes, and token-retry idempotency ('a repeat returns the original result'). This is exactly the kind of context annotations (destructive/idempotent hints) 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose and scope are front-loaded in the first two sentences, and the confirmation-gating rule follows logically. The prose is dense and mostly earns its length, though the billing explanation could be tightened slightly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description correctly states the return ('the updated group, or a readable error'), and it covers the confirmation flow, partial-update behavior, and billing implications. An agent has everything needed to invoke this correctly, including the non-obvious two-call path.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3; the description goes further by explaining why confirmation_token exists (billing-gated metered increase) and clarifying that raising shared_channels_count is an allocation, not a purchase. That rationale is not present in the schema, though the field-level mechanics largely are.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (reconfigure/update) and a specific resource (Shared Capacity Group), and enumerates exactly which fields can change (name, shared_channels_count, metered_channels_count). An agent can immediately distinguish it from create_capacity_group, delete_capacity_group, and list_capacity_groups 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear context on when the tool is appropriate, including partial-update semantics ('Only the provided fields are changed') and the precise condition that triggers the two-call confirmation flow (raising metered_channels_count). It does not explicitly name sibling alternatives (e.g., buy_capacity_channels for actually purchasing channels), so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_didUpdate DID renewal (billing cycles) / description / detach E911ADestructiveInspect
Manage a DID's renewal by setting billing_cycles_count. Three modes: null = the DID AUTO-RENEWS every billing cycle (monthly) indefinitely; N (a positive integer) = the DID renews for N MORE cycles (a countdown), then stops; 0 = STOP renewing: the DID keeps no renewal count and stays valid until the end of its current expiration date, then expires (this is the SOFT, reversible alternative to deleting a DID — set it back to null or N to resume renewing). Omit billing_cycles_count to leave it unchanged. Can also set or clear the DID description (to label several DIDs at once, use update_did_description). Can also DETACH the DID from its Emergency Calling Service (E911): pass emergency_calling_service_id: null (requires the emergency management permission, like the panel). Only unassignment is supported — assignment goes through the emergency domain verification flow. E911 is billed per number, so removing the number stops its charge from the next renewal; a service left with NO numbers is auto-canceled within a few hours (the customer is notified) — no extra cancellation step is needed. Returns the DID number, its resulting expiration date (expires_at), the new billing_cycles_count and the description.
| Name | Required | Description | Default |
|---|---|---|---|
| did_id | Yes | UUID of the DID to update (must belong to the customer). | |
| description | No | Free text, e.g. an internal ticket reference. null or "" clears it. Omit to leave unchanged. | |
| billing_cycles_count | No | Renewal control. null = auto-renew indefinitely; a positive integer N = renew for N more cycles then stop; 0 = stop renewing (DID stays valid until its expiration date, then expires — the soft alternative to deleting). Omit to leave unchanged. | |
| emergency_calling_service_id | No | ONLY null is accepted: detaches the DID from its Emergency Calling Service (E911). Errors if the DID is not assigned to one. Billing is per number — the detached number stops being charged; a service left with no numbers auto-cancels within a few hours. Omit to leave the E911 assignment unchanged. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare destructiveHint=true and readOnlyHint=false, but the description adds substantial context: unlike a hard delete, mode 0 is reversible and the DID remains valid until expiration; detaching E911 stops per-number billing from the next renewal; a service left with no numbers auto-cancels within hours with customer notification. It also names the required permission (emergency management).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the primary renewal mechanism before the secondary description and E911 behaviors. It is long and overlaps with the schema's own field descriptions, but every clause carries operational meaning (reversibility, billing, auto-cancel), so waste is minimal.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description supplies the return payload (DID number, expires_at, new billing_cycles_count, description), documents all four parameters' edge cases, and covers permissions and side effects — everything needed to invoke correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description still adds value by synthesizing billing_cycles_count into three behavioral modes (including the countdown interpretation) and by clarifying omit-to-leave-unchanged and only-null-accepted for E911, plus the null/"" clear semantics for description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (update) and resource (DID) and enumerates the three distinct operations it manages: renewal via billing_cycles_count, description, and E911 detach. It also explicitly names the sibling to use for bulk description updates (update_did_description), so an agent can tell it apart from adjacent tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit mode semantics (null = auto-renew indefinitely, N = N more cycles, 0 = stop renewing) and frames 0 as the soft reversible alternative to delete_did. It also states that E911 assignment is not supported here and must go through the emergency domain verification flow, routing the agent away from this tool for that case.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_did_descriptionSet / clear the description of DIDsADestructiveIdempotentInspect
Set the same description on one or more of the customer's DIDs (did_ids, max 100 per call), or clear it with description null or "". Use it to label several numbers at once (e.g. all numbers of an order or a ticket); update_did does the same for a single DID together with its renewal. The batch is all-or-nothing: every id must resolve to a DID in the account, otherwise NOTHING is changed and the error lists the offending ids. Returns the numbers with their resulting description and the count.
| Name | Required | Description | Default |
|---|---|---|---|
| did_ids | Yes | UUIDs of the DIDs to label (1..100, must all belong to the customer). | |
| description | Yes | Free text set on every listed DID, e.g. an internal ticket reference. null or "" clears it. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare destructiveHint=true and idempotentHint=true; the description adds the important batch semantics: all-or-nothing atomicity, the failure mode (NOTHING is changed and the error lists the offending ids), and the return payload. It could go further by stating explicitly that existing descriptions on those DIDs are overwritten, which is the destructive aspect, but the added context is substantial.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the action and scope, then the alternative, then the failure behavior, then the return value. Dense but every clause carries information; only minor tightening is possible.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 2-param mutation with no output schema, the description supplies the atomicity contract, the error behavior, and the return shape (numbers with resulting description and count). 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.
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 did_ids (UUIDs, 1..100, must belong to the customer) and description (free text, null/"" clears). The description restates the max-100 limit and the clearing semantics rather than adding new meaning, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Set/clear) and resource (the description of the customer's DIDs) with scope (one or more DIDs, max 100). It also explicitly contrasts itself with the sibling update_did, so an agent can route correctly without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a concrete when-to-use ('label several numbers at once, e.g. all numbers of an order or a ticket') and names the alternative ('update_did does the same for a single DID together with its renewal'), plus the clearing trigger (null or "").
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_identityUpdate identityADestructiveInspect
Update an existing regulation identity of the authenticated customer — use it to fill in mandatory fields a requirement demands (see list_requirements), e.g. birth_date, id_number or country of tax residence before an address/emergency verification. Only the provided fields are changed; fields have the same semantics as in create_identity, and the identity type cannot be changed. Note: some fields become read-only once the identity is used by active DIDs or verifications.
| Name | Required | Description | Default |
|---|---|---|---|
| vat_id | No | New VAT number / tax code. Business identities only. | |
| id_number | No | New personal/company ID number. | |
| last_name | No | New last name. | |
| birth_date | No | New birth date (YYYY-MM-DD). Personal identities only. | |
| first_name | No | New first name. | |
| country_iso | No | New country of tax residence as ISO 3166-1 alpha-2 code (e.g. UA, DE), case-insensitive. | |
| description | No | New free-form description of the identity. | |
| identity_id | Yes | UUID of the identity to update (must belong to the customer, see list_identities). | |
| company_name | No | New company name. Business identities only. | |
| phone_number | No | New contact phone number, digits only. | |
| contact_email | No | New contact email address. | |
| personal_tax_id | No | New personal tax ID. | |
| company_reg_number | No | New company registration number. Business identities only. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare the safety profile (destructiveHint=true, non-idempotent, not open-world), and the description adds genuinely useful behavior beyond that: partial-update semantics ('only the provided fields are changed'), the identity type being immutable, and fields becoming read-only once used by active DIDs or verifications. It stops short of describing response or rollback behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Dense but well-structured; the core purpose is front-loaded, then usage, then change/immutability constraints, then the read-only caveat. Every clause carries information, though the single em-dash cluster makes it slightly heavy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 13-parameter mutation tool with annotations and no output schema, the description covers partial-update semantics, immutability, and the read-only-after-use constraint well. It does not explain error/validation behavior or what the response returns, a minor gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents all 13 parameters (baseline 3). The description adds value by cross-referencing that field semantics match create_identity and by surfacing the fields commonly required (birth_date, id_number, country of tax residence).
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (update an existing regulation identity of the authenticated customer) and distinguishes it from siblings by naming create_identity, list_requirements and list_identities. An agent can tell it apart from create/delete identity 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear triggering context: use it to fill mandatory fields a requirement demands before an address/emergency verification, and points to list_requirements. It lacks an explicit when-not-to-use statement or a direct routing to create_identity, but the usage situation is well defined.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_phone_systems_trunkUpdate phone.systems™ Voice IN TrunkADestructiveInspect
Update one of the authenticated customer's phone.systems™ (PBX) Voice IN Trunks. Pass the trunk id and ONLY the fields to change — everything this tool can set is in the schema, and an omitted field keeps its current value. For SIP trunks use update_sip_trunk; for PSTN trunks use update_pstn_trunk. Returns the updated trunk attributes or a readable error.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | UUID of the phone.systems™ Voice IN Trunk to update. | |
| pop | No | DIDWW Point of Presence the trunk is served from. Null unpins the trunk and lets DIDWW pick. | |
| name | No | New friendly name of the Voice IN Trunk. | |
| weight | No | Load-balancing weight among trunk-group members of the same priority; higher is preferred (default 65535). | |
| priority | No | Priority of this trunk; DIDWW contacts the lowest-numbered priority first. Range 0-65535. | |
| cli_format | No | Format of the caller ID sent to the customer equipment (default e164). | |
| cli_prefix | No | Prefix prepended to the caller ID. Letters, digits, "+" and "#" only, up to 7 characters. Null removes the prefix. | |
| cnam_lookup | No | Enable (true) or disable (false) CNAM lookup on the trunk. | |
| description | No | Description of the Voice IN Trunk. Null clears it. | |
| capacity_limit | No | Maximum number of simultaneous calls for the Voice IN Trunk. Null lifts the limit. | |
| trunk_group_id | No | Voice IN Trunk Group UUID to assign the trunk to (or null to detach). | |
| ringing_timeout | No | Seconds to wait for a 200 OK after a 18x ringing response before ending the routing attempt with the "Ringing timeout" disconnect code. Null restores the platform default. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With annotations covering the safety profile (destructiveHint=true, idempotentHint=false), the description adds genuinely useful behavioral context: it is a partial/merge update where omitted fields keep their current value, and it returns updated trunk attributes or a readable error. It does not, however, flag which specific changes are destructive or require elevated permissions, so it stops short of 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tightly written sentences: identity/scope first, calling convention second, sibling routing third, return behavior last. Zero filler and each sentence carries distinct information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 12-parameter mutation tool with no output schema, it covers the essentials: what it mutates, partial-update semantics, sibling routing, and the return shape. Annotations carry the safety profile, so 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.
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, but the description earns extra credit by explaining the merge semantics that govern every parameter — only supplied fields change, omitted fields are preserved. That is real meaning beyond the per-field schema text, though it does not explain the null-vs-omit distinction in its own words.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Update), a precise resource (phone.systems Voice IN Trunks), and scopes it to the authenticated customer. It explicitly differentiates itself from update_sip_trunk and update_pstn_trunk, so an agent can distinguish it from the nearest siblings without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit routing rules: SIP trunks go to update_sip_trunk, PSTN trunks to update_pstn_trunk, and this tool is for phone.systems Voice IN trunks. It also states the calling convention (pass id, pass only fields to change), 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.
update_pstn_trunkUpdate PSTN Voice IN TrunkADestructiveInspect
Update one of the authenticated customer's PSTN / call-forwarding Voice IN Trunks. Pass the trunk id and ONLY the fields to change; fields have the same semantics as in create_pstn_trunk. Changing destination is confirmation-gated: the preview shows the new destination's per-minute rate (amounts are in USD) — show the price to the user before confirming. Updates without a destination change apply immediately. For SIP trunks use update_sip_trunk; for phone.systems™ trunks use update_phone_systems_trunk.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | UUID of the PSTN Voice IN Trunk to update. | |
| pop | No | DIDWW Point of Presence the trunk is served from. Null unpins the trunk and lets DIDWW pick. | |
| name | No | New friendly name of the Voice IN Trunk. | |
| weight | No | Load-balancing weight among trunk-group members of the same priority; higher is preferred (default 65535). | |
| priority | No | Priority of this trunk; DIDWW contacts the lowest-numbered priority first. Range 0-65535. | |
| cli_format | No | Format of the caller ID sent to the customer equipment (default e164). | |
| cli_prefix | No | Prefix prepended to the caller ID. Letters, digits, "+" and "#" only, up to 7 characters. Null removes the prefix. | |
| description | No | Description of the Voice IN Trunk. Null clears it. | |
| destination | No | New phone number to forward calls to, digits only (e.g. "48452006332"). Confirmation-gated. | |
| capacity_limit | No | Maximum number of simultaneous calls for the Voice IN Trunk. Null lifts the limit. | |
| trunk_group_id | No | Voice IN Trunk Group UUID to assign the trunk to (or null to detach). | |
| ringing_timeout | No | Seconds to wait for a 200 OK after a 18x ringing response before ending the routing attempt with the "Ringing timeout" disconnect code. Null restores the platform default. | |
| confirmation_token | No | Only needed when changing `destination`. Leave empty on the first call — it returns the per-minute rate preview + a confirmation_token and changes nothing; re-call with the token to apply the change. | |
| src_number_list_id | No | Voice IN Number List UUID (from list_voice_in_number_lists) to apply as the caller-ID (source number) filter on this trunk, or null to detach the current one. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=false, so the safety profile is covered; the description adds genuine behavioral detail beyond that — the two-phase destination change (preview + confirmation_token, USD pricing shown to the user) and that non-destination updates apply immediately. It does not, however, describe what a rejected/failed update looks like or any permission requirements.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and scope, then alternatives, then the gating caveat — a sensible priority order with no filler sentences. The mid-sentence em-dash clause about USD pricing is slightly dense but still earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 14-parameter mutation with no output schema, the description covers the critical non-obvious behaviors: partial updates, sibling routing, and the confirmation-gated destination path. It omits any statement of required permissions/account scope and error behavior, which is the remaining gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all 14 parameters are already documented, including the confirmation_token protocol and destination semantics. The description adds only a deferral ('fields have the same semantics as in create_pstn_trunk') and the USD note, so the baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Update ... PSTN / call-forwarding Voice IN Trunks') and explicitly disambiguates from the two nearest siblings: update_sip_trunk and update_phone_systems_trunk. An agent can pick the right tool 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit routing rules ('For SIP trunks use update_sip_trunk; for phone.systems™ trunks use update_phone_systems_trunk'), the partial-update convention ('pass the trunk id and ONLY the fields to change'), and the condition that triggers the confirmation flow versus immediate application.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_sip_trunkUpdate SIP Voice IN TrunkADestructiveInspect
Update one of the authenticated customer's SIP Voice IN Trunks (inbound voice trunks). Pass the trunk id and ONLY the fields to change — never invent values for fields the user did not ask about; untouched fields keep their current values. Fields have the same semantics as in create_sip_trunk. For PSTN trunks use update_pstn_trunk; for phone.systems™ trunks use update_phone_systems_trunk. Returns the updated trunk attributes (passwords masked) or a readable error.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | UUID of the SIP Voice IN Trunk to update. | |
| pop | No | DIDWW Point of Presence the trunk is served from. Null unpins the trunk and lets DIDWW pick. | |
| host | No | New host part of R-URI (SIP host/IP). | |
| name | No | New trunk name. | |
| port | No | New port part of R-URI. Null resolves the SRV/A record instead. | |
| codecs | No | New codec list, in order of preference. Replaces the whole list, so keep "telephone-event" in it unless the user asked otherwise — it carries RFC 2833 DTMF, and dropping it stops DTMF from reaching the customer equipment. | |
| weight | No | Load-balancing weight among trunk-group members of the same priority; higher is preferred (default 65535). | |
| priority | No | Priority of this trunk; DIDWW contacts the lowest-numbered priority first. Range 0-65535. | |
| rtp_ping | No | Enable/disable RTP keep-alive packets. | |
| username | No | New user part of R-URI ("{DID}" pattern supported). Null removes it. | |
| auth_user | No | New username for outgoing SIP authentication. | |
| cli_format | No | Format of the caller ID sent to the customer equipment (default e164). | |
| cli_prefix | No | Prefix prepended to the caller ID. Letters, digits, "+" and "#" only, up to 7 characters. Null removes the prefix. | |
| cnam_lookup | No | Enable/disable CNAM lookup on the trunk. | |
| description | No | Description of the Voice IN Trunk. Null clears it. | |
| rtp_timeout | No | New number of seconds without inbound RTP before the call is dropped. | |
| sip_timer_b | No | New INVITE transaction timeout in MILLISECONDS. | |
| sst_enabled | No | Enable/disable SIP Session Timers. Enabling requires sst_min_timer and sst_max_timer. | |
| auth_enabled | No | Enable/disable outgoing SIP digest authentication (enabling requires auth_user and auth_password). | |
| resolve_ruri | No | Resolve the R-URI host to an IP before sending the INVITE. | |
| auth_password | No | New password for outgoing SIP authentication. | |
| max_transfers | No | New maximum number of SIP transfers (REFER) to follow. | |
| sst_max_timer | No | New maximum session timer in seconds; must be >= sst_min_timer. | |
| sst_min_timer | No | New minimum session timer in seconds. | |
| auth_from_user | No | New From-header user part. Null removes it. | |
| capacity_limit | No | Maximum number of simultaneous calls for the Voice IN Trunk. Null lifts the limit. | |
| rx_dtmf_format | No | New format for DTMF received from the DIDWW network. | |
| sst_accept_501 | No | Treat a 501 answer to the session refresh as success. | |
| trunk_group_id | No | Voice IN Trunk Group UUID to assign the trunk to (or null to detach). | |
| tx_dtmf_format | No | New format for DTMF sent to the customer equipment. | |
| allowed_rtp_ips | No | New RTP source restriction (CIDR notation, e.g. "203.0.113.0/24"). Replaces the whole list; up to 10 entries, and 0.0.0.0/0 and ::/0 are rejected. Pass null to remove the restriction and accept RTP from any address. | |
| ringing_timeout | No | Seconds to wait for a 200 OK after a 18x ringing response before ending the routing attempt with the "Ringing timeout" disconnect code. Null restores the platform default. | |
| use_did_in_ruri | No | Only with enabled_sip_registration: put the called DID in the R-URI user part. | |
| auth_from_domain | No | New From-header domain part. Null removes it. | |
| stir_shaken_mode | No | New STIR/SHAKEN attestation passing mode. | |
| max_30x_redirects | No | New maximum number of 3xx redirects to follow. | |
| src_number_list_id | No | Voice IN Number List UUID to apply as the caller-ID filter (or null to detach). | |
| sst_refresh_method | No | New SIP method used to refresh the session. | |
| transport_protocol | No | New SIP transport protocol. | |
| force_symmetric_rtp | No | Send RTP back to the source address of the received stream instead of the SDP address. | |
| sst_session_expires | No | New Session-Expires value in seconds; must be between sst_min_timer and sst_max_timer. Null clears it. | |
| diversion_relay_mode | No | New Diversion header relay mode. | |
| diversion_inject_mode | No | New Diversion header inject mode. | |
| media_encryption_mode | No | New SRTP media encryption mode. | |
| dns_srv_failover_timer | No | New DNS SRV failover time in milliseconds; must not exceed sip_timer_b. | |
| enabled_sip_registration | No | Switch the trunk to/from SIP-registration mode. When enabling, host/port are cleared and registration credentials are generated server-side; when disabling, set a host. | |
| network_protocol_priority | No | New IP version preference when resolving the host. | |
| symmetric_rtp_ignore_rtcp | No | With force_symmetric_rtp, ignore RTCP when learning the source address. | |
| rerouting_disconnect_codes | No | New list of SIP response codes that trigger rerouting ("486" Busy Here, "503" Service Unavailable, ...), plus "Ringing timeout" — the no-answer disconnect reason, which has no SIP code and is not a timeout setting. Replaces the whole list; omit the argument to leave it untouched, or pass null to go back to the platform default set. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=false and readOnlyHint=false, so the mutation profile is covered. The description adds useful non-structural context: untouched fields retain current values, semantics mirror create_sip_trunk, and the response returns updated attributes with passwords masked or a readable error. This is above the annotation baseline, though it does not detail auth/permission requirements.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four tightly packed sentences, each earning its place: purpose, invocation contract, sibling routing, and return behavior. The most decision-relevant information (which sibling to use) is front-loaded and unambiguous.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 49-parameter mutation tool with no output schema, the description is unusually complete: it clarifies the partial-update contract, delegates field semantics to create_sip_trunk, and describes the return value including password masking. Remaining gap is minor – no mention of permissions or error conditions in detail.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% with rich per-field documentation, so the schema does the heavy lifting and the baseline of 3 applies. The description reinforces the partial-update semantics (only send changed fields) and points to create_sip_trunk for field meaning, but adds no syntax or format detail beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Update) and resource (SIP Voice IN Trunks) with the defining scope 'inbound voice trunks'. It explicitly distinguishes this tool from its two closest siblings, update_pstn_trunk and update_phone_systems_trunk, so an agent can unambiguously select it.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit routing rules: PSTN trunks go to update_pstn_trunk, phone.systems™ trunks to update_phone_systems_trunk. It also states the update contract ('pass ONLY the fields to change, never invent values'), which tells the agent how to invoke it rather than just when.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_sms_trunkUpdate SMS trunkADestructiveInspect
Update one of the authenticated customer's SMS trunks by id (the uuid returned by list_sms_trunks). Partial update: only the passed fields change; fields have the same semantics as in create_sms_trunk — webhook fields apply to HTTP IN trunks only, email fields to SMTP trunks only, and the trunk type itself cannot be changed. Available placeholders (substituted per incoming SMS): {SMS_TIME} received time, {SMS_SRC_ADDR} sender, {SMS_DST_ADDR} receiver, {SMS_TEXT} message text, {SMS_TEXT_BASE64_ENCODED} message text base64-encoded. Placeholders work in the SMTP subject/message and in HTTP IN query_parameters/headers/body. Returns the updated trunk with its full configuration (passwords are never returned) or a readable error.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The SMS trunk id (uuid), as returned by list_sms_trunks. | |
| url | No | HTTP IN trunks only: new webhook URL DIDWW pushes each incoming SMS to. | |
| body | No | HTTP IN trunks only: new request body, required for POST/PUT. | |
| name | No | New trunk name (must be unique for the customer). | |
| blocked | No | Whether the trunk is blocked. | |
| headers | No | HTTP IN trunks only: new HTTP headers (string => string). | |
| message | No | SMTP trunks only: new email body text, may use {SMS_*} placeholders. | |
| send_to | No | SMTP trunks only: new recipient email, e.g. "test@example.com" or "Name <test@example.com>". | |
| subject | No | SMTP trunks only: new email subject, may use {SMS_*} placeholders. | |
| priority | No | New routing priority. | |
| body_type | No | HTTP IN trunks only: new body encoding, required for POST/PUT. | |
| http_method | No | HTTP IN trunks only: new HTTP method used for the webhook. | |
| use_smtp_relay | No | SMTP trunks only: use the DIDWW SMTP relay. | |
| query_parameters | No | HTTP IN trunks only: new query string parameters (string => string). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructive=true and idempotent=false, so the safety profile is covered; the description adds real value beyond that by stating the update is partial, that trunk type is immutable, and that passwords are never returned. It still doesn't discuss reversibility or permission requirements, keeping it at a 4.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Dense but front-loaded: the update operation and its partial semantics come first, followed by type-specific behavior and placeholders. Every sentence carries information, though the single long paragraph is slightly heavy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 14-parameter mutation tool, the description covers the distinguishing constraints (partial update, immutable type, password non-disclosure, placeholder semantics) and even states the return shape, so nothing essential is missing despite the absence of an output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds meaning the schema lacks: the full list of {SMS_*} placeholders and where they can be substituted (SMTP subject/message, HTTP IN query_parameters/headers/body), plus the HTTP-IN vs SMTP field split.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (update an SMS trunk by id) and names the sibling that produces the id (list_sms_trunks), so an agent can distinguish it from create_sms_trunk and update_sms_trunk_group immediately.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Clearly frames this as a partial update with the same field semantics as create_sms_trunk, and warns that the trunk type cannot be changed. It does not explicitly state when to prefer this over sibling update tools or prerequisite permissions, so it falls just short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_sms_trunk_groupUpdate SMS trunk groupADestructiveInspect
Update one of the authenticated customer's SMS trunk groups by id (a GROUP-type uuid from list_sms_trunks). Partial update: pass any of name (rename), add_sms_trunk_ids (link more member trunks) and remove_sms_trunk_ids (unlink members — the trunks themselves are NOT deleted). Only inbound-capable HTTP IN, SMTP, SMSC or ESME trunks can be added; a trunk already inside another group must be removed there first. To delete the whole group use delete_sms_trunk (WARNING: that also deletes its member trunks). Returns the updated group with its member trunks, or a readable error.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The SMS trunk group id (uuid), as returned by list_sms_trunks (type GROUP). | |
| name | No | New group name (must be unique for the customer). | |
| add_sms_trunk_ids | No | SMS trunk ids (uuids) to ADD as members. | |
| remove_sms_trunk_ids | No | SMS trunk ids (uuids) to REMOVE from the group. The trunks are only unlinked, never deleted. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=true, and idempotentHint=false. The description adds rich context beyond those: it clarifies that remove_sms_trunk_ids only unlinks (does not delete trunks), that deleting the group requires a different tool which does delete trunks, that only specific trunk types can be added, and that the response is the updated group with members or a readable error.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core purpose, then proceeds through partial-update semantics, eligibility constraints, deletion alternative, and return value. Every sentence carries actionable information; no filler or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with no output schema and four fully described parameters, the description covers purpose, when to use/avoid, prerequisites, side effects, and return format. Annotations already cover the safety profile, so nothing essential is missing for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description adds a meaningful constraint not present in the schema: only inbound-capable HTTP IN, SMTP, SMSC or ESME trunks can be added, and a trunk already in another group must be removed there first. It otherwise largely paraphrases the schema's field descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (update) and resource (SMS trunk group) scoped to the authenticated customer's groups. It distinguishes itself from siblings by naming list_sms_trunks as the id source and delete_sms_trunk as the deletion alternative, so an agent can tell it apart 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly frames this as a partial update and enumerates the three optional fields. It gives when-not-to-use (deletion via delete_sms_trunk) with a warning, and states prerequisites for adding trunks (only inbound-capable types; trunk must first be removed from any other group). Alternatives and conditions are spelled out rather than inferred.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_trunk_groupUpdate Voice IN Trunk GroupADestructiveInspect
Update one of the authenticated customer's Voice IN Trunk Groups. Pass the group id and any fields to change: name, capacity_limit and/or members. IMPORTANT: members REPLACES the whole member list — trunks not listed are detached from the group (they survive as standalone trunks, nothing is deleted); pass an empty array to detach all members. Omit members to leave the membership untouched. Each member entry: trunk_id (required) plus optional priority (lowest tried first) / weight (higher preferred among equal priorities). Returns the updated group with its members in routing order, or a readable error (nothing is changed).
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | UUID of the Voice IN Trunk Group to update (from list_trunk_groups). | |
| name | No | New friendly name of the Voice IN Trunk Group. | |
| members | No | Full REPLACEMENT member list (max 10); trunks not listed are detached (not deleted). Pass [] to detach all members. Omit to keep the current members. Member semantics as in create_trunk_group. | |
| capacity_limit | No | New maximum number of simultaneous calls for the whole group. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructiveHint=true, but the description earns extra credit by explaining exactly what is destroyed: `members` replaces the entire list, unlisted trunks are detached yet survive as standalone trunks, nothing is deleted, and a failed call changes nothing. That is behavioral detail no annotation or schema conveys.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads purpose and then the critical replacement warning, with the destructive caveat emphasized in caps. Slightly over-explains member fields that the schema already documents, but every sentence still carries useful information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description supplies the return contract ('updated group with its members in routing order, or a readable error'), covers all four parameters, and discloses the atomic failure behavior. Nothing an agent needs to call this safely is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds relational meaning the schema cannot express: replacement semantics for `members`, omit-vs-empty-array behavior, and the routing interpretation of priority (lowest first) and weight (higher preferred among equal priorities).
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Update one of the authenticated customer's Voice IN Trunk Groups') and names the updatable fields, clearly separating it from siblings like update_sms_trunk_group or update_trunk_group. It even points at list_trunk_groups as the source of the id.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives precise conditional guidance: pass fields to change, omit `members` to leave membership untouched, pass an empty array to detach all. It does not explicitly compare against a sibling alternative (e.g., when to use this vs. update_trunk_group), so it falls just short of the top band.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_voice_in_number_listUpdate Voice IN Number ListADestructiveInspect
Update one of the authenticated customer's Voice IN Number Lists (caller-ID filters for inbound calls). Pass the list id and only the fields to change; mode, default_action and entry semantics are as in create_voice_in_number_list. remove_numbers entries are matched EXACTLY by their stored value — do NOT guess formats ("+4930..." and "4930..." are different entries): look up the exact stored values with get_voice_in_number_list first, or use values you added earlier in this conversation. Changes apply immediately to every trunk the list is attached to, and atomically — on any error nothing is changed. Returns the updated list or a readable error (e.g. naming the remove_numbers entries that do not exist in the list).
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | UUID of the Voice IN Number List to update (from list_voice_in_number_lists). | |
| mode | No | New matching mode. Applies to ALL existing entries at once. | |
| name | No | New name of the list. | |
| add_numbers | No | Entries to add — same format rules as `numbers` in create_voice_in_number_list (up to 500 per call). Values already in the list are rejected. | |
| default_action | No | New action for calls whose caller number matches no entry. | |
| remove_numbers | No | Existing entries to remove, matched EXACTLY by their stored value (character-for-character: "+4930..." and "4930..." are different entries; entries are unique within a list). Look up exact values via get_voice_in_number_list — any unknown value makes the WHOLE update fail and roll back (the unmatched values are named in the error). | |
| add_numbers_action | No | Action the added entries carry: "allow" or "reject". Default: the opposite of the list default_action. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructiveHint=true, idempotentHint=false and readOnlyHint=false, and the description adds substantial context beyond them: changes apply immediately to every attached trunk, updates are atomic (nothing changes on error), and errors name the offending remove_numbers values. This is exactly the extra behavioral detail an agent needs for a destructive mutation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads purpose, then the field-selection guidance, then the exact-match warning and atomicity guarantee in a logical order. It is dense but nearly every clause is actionable; the exact-match caveat appears in both description and schema, a minor redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description still states the return ('the updated list or a readable error') and covers the destructive/atomic semantics an agent needs. For a 7-parameter mutation tool, nothing essential to correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3; the description adds meaning by warning that remove_numbers entries match character-for-character with a concrete '+4930...' vs '4930...' example and by pointing to create_voice_in_number_list for mode/default_action semantics. Some of the remove_numbers detail duplicates the schema, so it does not fully exceed the schema's contribution.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Update ... Voice IN Number Lists') and immediately glosses the domain ('caller-ID filters for inbound calls'), so the agent knows exactly what entity is being modified. It is distinguishable from the create/get/list/delete siblings of the same resource.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says to pass the list id and only the fields to change, defers mode/default_action/entry semantics to create_voice_in_number_list, and prescribes a prerequisite workflow: look up exact stored values with get_voice_in_number_list first, or reuse values added earlier in the conversation. The when-and-how is fully specified.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
validate_addressValidate address against a requirementARead-onlyIdempotentInspect
Check whether an existing address (and its identity) satisfies a regulation or emergency requirement BEFORE creating a verification — a read-only pre-flight that changes nothing. Pass the address_id and either a requirement_id or country_iso (+ did_group_type) to resolve the requirement; requirement_type picks the rule set: "regulation" (DID registration, mirrors the panel address validation) or "emergency" (E911, mirrors the emergency address validation). Returns a valid flag plus what is missing: identity/address proof documents, supporting documents, mandatory identity fields, structural mismatches the upload flow cannot fix (identity type, country/area levels), and whether the requirement demands a one-time supporting document at verification time. The next_step field says how to proceed: create_address_verification directly when everything is in place, create_regulation_upload_link when documents (incl. the one-time document) still must be collected, update_identity for missing fields. Note: for City/Area-level requirements the city match against the actual DIDs is checked only at verification time (no DIDs are passed here).
| Name | Required | Description | Default |
|---|---|---|---|
| address_id | Yes | UUID of the address to validate (must belong to the customer, see list_addresses). Its identity is validated with it. | |
| country_iso | No | Alternative to requirement_id: resolve the requirement by DID country (ISO 3166-1 alpha-2, case-insensitive) — combine with did_group_type when several requirements exist for the country. | |
| did_group_type | No | DID group type name (e.g. Local, National, Mobile, case-insensitive) or UUID — narrows the country_iso requirement lookup. | |
| requirement_id | No | UUID of the requirement (from list_requirements for regulation, list_emergency_requirements for emergency). Either this or country_iso must be passed. | |
| requirement_type | Yes | Which rule set to validate against: "regulation" (DID number registration) or "emergency" (E911 calling). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint/idempotentHint/destructiveHint=false, and the description reinforces this ('changes nothing') while adding genuinely new behavioral context: what the response contains (valid flag, missing documents/fields, structural mismatches), the next_step semantics, and the caveat that City/Area-level city matching is only checked at verification time. That caveat is non-obvious and cannot be derived from the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose and the read-only framing, then progressively adds resolution mechanics and return semantics. It is dense and long for one paragraph, but nearly every clause carries information; a small amount of restructuring into sentences would improve scannability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, so the description carries the return-value burden — and it does, describing the valid flag, what is missing, and the next_step field. Combined with the resolution rules and the City/Area caveat, an agent has everything needed to invoke and interpret this tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema documents all parameters and the baseline is 3. The description adds resolution logic beyond the schema: that requirement_id or country_iso (+ did_group_type) resolve the requirement, and that requirement_type selects the rule set ('regulation' mirrors panel validation, 'emergency' mirrors E911). Useful added meaning over the field descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource — 'Check whether an existing address (and its identity) satisfies a regulation or emergency requirement' — and immediately distinguishes it from the create_* siblings by framing it as a pre-flight. An agent can tell exactly what this does 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says to use it BEFORE creating a verification, and routes to alternatives by outcome: create_address_verification when everything is in place, create_regulation_upload_link when documents must be collected, update_identity for missing fields. This is clear when-to-use and what-to-do-next guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Publisher details
- Operator
- DIDWW
- Operator website
- https://www.didww.com/
- Vendor relationship
- Not applicable
- Documentation
- https://doc.didww.com/mcp/index.html
- Trust center
- Not available
- Restrictions
- Requires an active DIDWW account and a compatible remote MCP client supporting Streamable HTTP and OAuth. Users must authorize access through DIDWW’s browser-based login and complete two-factor authentication if enabled. Access is limited to the user’s existing DIDWW roles, permissions and enabled services. No API key or manually configured OAuth client ID or client secret is required; the client registers automatically. Connector availability may depend on the AI client’s plan, platform and organization settings. Managed workspaces may require owner or administrator enablement. Normal DIDWW service charges, prepaid balance requirements, account quotas and request limits apply. Significant, chargeable or destructive actions require explicit confirmation. · Publisher source
Related MCP Connectors
Authenticated, user-scoped MCP connectors for 30+ business systems.
Sherweb Platform MCP server to manage subscriptions and orders. Use OpenID Connect to authenticate.
Give AI agents a phone number. Voice calls, SMS, and phone number management for MCP clients.
Connect your AI assistant to Revnu, your autonomous growth agent for outbound sales, SEO, content, social media and ads. Use this MCP connector to read leads and campaign results, review and approve queued work, hand jobs to your Revnu agent, and schedule recurring workflows from your AI chat. Supports Streamable HTTP and OAuth with permissions you choose at sign-in. Tools act on your connected Revnu account; write actions require explicit permissions. Learn more and connect at https://revnu.com/mcp.
Related MCP Servers
AlicenseNot gradedqualityBmaintenanceEnables AI agents to provision phone numbers, send SMS, place AI voice calls, and react to inbound events via the Dial communication stack, all through MCP tools.1,677 npmMIT- AlicenseBqualityCmaintenanceEnables MCP clients to manage AI voice assistants, place calls, run campaigns, handle contacts and knowledge bases, and read call transcripts. It also provides account, phone number, dialer, and analytics tools through a hosted or local MCP connection.25MIT
- AlicenseAqualityCmaintenanceEnables interaction with RingCentral phone system data, including account info, extensions, presence, call queues, contacts, and call logs/recordings, through MCP tools.13Apache 2.0
- AlicenseNot gradedqualityDmaintenanceEnables sending messages, managing templates, uploading media, and configuring webhooks for WhatsApp Business via the MCP protocol.23 npm5MIT
Glama MCP Gateway
Add one secure layer between your agents and this server.