Scribe Mail
Server Details
Email signature management finally simple and measurable. Built for teams & AI agents. Install consistent signatures company-wide in under a day. IT sets up once. Marketing takes over. AI agents assist. No employee installation. 12% average CTR on signature banners. Conversion tracking from click to revenue.
- Status
- Healthy
- Uptime
- 100.0% over the last 24 hours
- OAuth
- Works in Glama
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
- Repository
- scribemail/claude-plugin
- GitHub Stars
- 0
- ChatGPT
- –
- Claude
- Scribe Mail
TDQS
Scored across 69 tools
Despite 69 tools, descriptions actively disambiguate near-neighbours: add_signature_recipients vs add_signature_recipient_entities vs set_signature_recipient_rules, preview_signature vs get_signature_html vs send_test_email, and install_signature vs install_signature_for_email each state explicitly when to use which. The weakest zone is analytics, where get_analytics_views, get_analytics_clicks, get_analytics_events_summary, list_analytics_events and get_visitor_breakdown return similar breakdown shapes and an agent must reason about intent rather than resource. Residual confusion is possible but mostly resolved by the descriptions themselves.
Uniform snake_case verb_noun throughout: list_/get_/create_/update_/delete_/preview_/publish_/install_ + resource. Families are predictable (list_signatures/list_folders/list_teammates/list_assets; create_/update_/delete_ mirrored across signatures, folders, smart_fields, marketing_campaigns). Minor outliers like get_more_tools or create_first_signature still follow the pattern rather than breaking it.
69 tools is far past the point where an agent can hold the surface in view, and the rubric's 25+ threshold applies. The domain is genuinely broad (signatures, variants, folders, smart fields, teammates, emails, assets, campaigns, analytics, visitors, integrations, docs, billing, feedback), which explains but does not excuse the size; several tools (get_more_tools, create_first_signature, duplicate_signature, send_feedback, list_financial_documents) are peripheral to the core signature-deployment job.
Lifecycle coverage is strong: signatures have create/update/duplicate/publish/preview/install/delete plus recipient and variant management, and folders, smart fields, teammates, emails, assets and campaigns all have near-full CRUD with activation/state transitions. Gaps are minor and explicitly acknowledged (no single-signature or single-campaign get, no address search, no workspace-wide recipient listing), all workable via list calls, so no true dead ends.
Available Tools
69 toolsadd_signature_recipient_entitiesTarget signature at org unitsAIdempotentInspect
Target a signature at whole directory org units or groups (by uuid) so every teammate in them becomes a recipient. Use it to assign by team or department; use add_signature_recipients to assign individual emails, set_signature_recipient_rules for smart-field conditions, and remove_signature_recipient_entities to undo. Additive and idempotent: the uuids are merged into the existing org-unit targeting, and manual and condition-based recipients are kept. Membership is re-resolved after each directory sync, so people who later join a targeted unit get the signature too. Returns the full updated selection; unknown entity uuids fail with 422.
| Name | Required | Description | Default |
|---|---|---|---|
| context | Yes | Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as "a user", "the customer", or "an account". Example: "Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution." | |
| signature_id | Yes | The signature template's UUID (the `id` from list_signatures). | |
| integration_entity_ids | Yes | Org-unit/group uuids to add to the targeting: the `id` of each entity from list_integration_entities. At least one is required (an empty list returns 422); duplicates and already-targeted uuids are ignored. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations: discloses additivity, idempotent merge semantics, that manual and condition-based recipients are preserved, that membership is re-resolved after directory sync (future joiners inherit), and that unknown entity uuids fail with 422. The idempotent/read-only hints are merely confirmed rather than relied upon.
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 effect, then alternatives, then behavior, then failure mode. Every sentence carries distinct information with 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 an output schema present, return values need no explanation, and the description still covers mutation semantics, preservation of other recipient types, sync re-resolution, and the 422 failure path. Nothing material to a correct call 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 lifts this by explaining that uuids are merged into existing targeting, duplicates/already-targeted entries are effectively no-ops, and unknown uuids produce a 422. It does not restate param syntax, but it adds merge and failure semantics the schema only partially 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?
States a specific verb (target a signature) and resource (whole directory org units/groups by uuid), and immediately explains the effect: every teammate in them becomes a recipient. It explicitly distinguishes itself from add_signature_recipients and remove_signature_recipient_entities, 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 explicit when-to-use ('assign by team or department') and names the three alternative tools with the conditions that select each: individual emails, smart-field rules, and undo. This is a complete routing map for the recipient-targeting family.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
add_signature_recipientsAdd manual signature recipientsAIdempotentInspect
Manually assign a signature to specific email addresses (by email uuid). Use it to add named people one by one; use add_signature_recipient_entities to target whole org units or groups, set_signature_recipient_rules for smart-field conditions or all future emails, and remove_signature_recipients to undo. Additive and idempotent: the emails join the manual list, and org-unit and condition-based recipients are kept. When the signature's installation is on and a signature integration can push it, Scribe queues installation on its recipients' mailboxes right away. Returns the full updated selection; check who it reaches with list_signature_recipients. Needs the signatures:write scope; an unknown signature returns 404.
| Name | Required | Description | Default |
|---|---|---|---|
| context | Yes | Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as "a user", "the customer", or "an account". Example: "Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution." | |
| email_ids | Yes | Email uuids to assign as manual recipients: the `id` from list_emails (or a teammate's `emails[].id` from list_teammates), not teammate ids. At least one is required (an empty list returns 422); if any uuid is unknown the whole batch fails with 422 and nothing is added. Duplicates and already-assigned emails are ignored. | |
| signature_id | Yes | The signature template's UUID (the `id` from list_signatures). |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (idempotentHint, destructiveHint, readOnlyHint), the description discloses the additive semantics (org-unit and condition-based recipients preserved), the side effect that Scribe queues installation on recipients' mailboxes immediately, the 404 for unknown signatures, and the required signatures:write scope.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Dense but front-loaded: the manual-assignment purpose leads, sibling routing and behavioral notes follow. Every clause carries information, though the routing and behavior sentences are somewhat packed together.
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 an output schema present, the description covers the essentials an agent needs: additive/idempotent behavior, install side effect, error code, scope, and confirmation path via list_signature_recipients. Return format needn't be described since the output schema exists.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the schema already explains uuid sources, batch-failure (422), and duplicate handling in depth. The description only restates "by email uuid", adding little 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 ("Manually assign a signature to specific email addresses (by email uuid)") and immediately contrasts with add_signature_recipient_entities for org units, so an agent can distinguish it from siblings 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?
Explicitly routes: "use add_signature_recipient_entities to target whole org units or groups, set_signature_recipient_rules for smart-field conditions or all future emails, and remove_signature_recipients to undo." The when/when-not and alternatives are all named.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_assetCreate an assetAInspect
Upload an image to the workspace's asset library. Provide EITHER file_base64 (+ filename) OR source_url — exactly one. For a file the user uploaded in chat (no public URL), send its bytes as file_base64; if you cannot read the raw bytes on this platform, ask the user for a hosted URL or reuse an existing asset from list_assets instead of guessing. Non-images, bad base64, oversized files (>15MB), or a disallowed URL return 422.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Display name (defaults to the filename). | |
| role | No | Optional role: company_logo, profile_picture, or banner. | |
| context | Yes | Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as "a user", "the customer", or "an account". Example: "Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution." | |
| filename | No | Original filename (required when `file_base64` is given). | |
| source_url | No | Public http(s) URL the server downloads the image from (alternative to file_base64). Redirects ARE followed (each hop re-checked); hosts resolving to private/loopback addresses are blocked. If a fetch fails (some hosts block server-side downloads), pass the bytes as `file_base64` instead. | |
| file_base64 | No | Base64-encoded image bytes. Provide WITH `filename`, or use `source_url` instead. A `data:` URI, line-wrapped base64, or base64url is accepted as-is — the server unwraps it, so pass whatever your file-reading helper returned without re-encoding. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare it as a non-read-only, non-destructive, non-idempotent, open-world write, so the safety profile is covered. The description adds real behavioral context annotations cannot: the 15MB size ceiling, the 422 failure class (non-image, bad base64, disallowed URL), and the practical advice to fall back to a different input mode when fetching fails. Not a 5 only because retry/duplicate-upload semantics (relevant given idempotentHint=false) are not addressed.
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 action, then the input rule, then the fallback, then the failure modes. Every sentence carries information; the fallback clause ("ask the user for a hosted URL or reuse an existing asset from list_assets instead of guessing") 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?
With an output schema present the description needn't explain returns, and annotations cover safety. What remains — what to upload, how to supply it, which fallback to take, and what causes a 422 — is all covered, so an agent could call this correctly on the first try.
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 the cross-parameter exclusivity rule and the filename-with-base64 coupling in one readable statement, plus the reassurance that data: URIs, base64url, and line-wrapped base64 are accepted without re-encoding. That last point is a genuine usability detail 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 ("Upload an image to the workspace's asset library") and scopes it to images only, which separates it from list_assets, update_asset, and delete_asset. An agent knows exactly what operation this performs before 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 states the mutual-exclusion rule ("Provide EITHER `file_base64` (+ `filename`) OR `source_url` — exactly one") and gives a decision path for the common case: use bytes for chat-uploaded files, and fall back to asking the user for a hosted URL or reusing an existing asset via list_assets rather than guessing. This names both the condition and the alternative tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_emailCreate an emailAInspect
Add an alias email address to a teammate. Only available when the workspace manages its own team list — if a directory integration (Google, Microsoft or Zoho Mail) drives teammates, this returns a 409 conflict. The address is validated (format, uniqueness, disposable/deny-list) → 422 on failure.
| Name | Required | Description | Default |
|---|---|---|---|
| address | Yes | Email address to add. Added as an alias — the teammate's primary is unchanged. | |
| context | Yes | Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as "a user", "the customer", or "an account". Example: "Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution." | |
| teammate_id | Yes | UUID of the teammate to add the email to (the teammate `id`). |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare non-read-only, open-world, non-destructive behavior; the description adds real value beyond them with the 409 conflict condition, the validation pipeline (format, uniqueness, disposable/deny-list), and the 422 failure mode. It stops short of stating what happens to existing aliases or any rate limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three compact sentences with no filler: purpose first, availability constraint and its failure code second, validation outcome third. Every clause is an actionable 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?
An output schema exists, so return values need no prose. For a 3-parameter creation tool with a non-trivial eligibility gate, the description covers purpose, precondition, and error semantics; nothing an agent needs before calling 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 3 (entity, format, and context-string) parameters are baseline-documented. The description goes beyond the schema by characterizing address validation (format, uniqueness, disposable/deny-list) and reinforcing that the alias leaves the primary address unchanged. The mandatory `context` parameter is left entirely 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 and resource: 'Add an alias email address to a teammate.' The alias framing distinguishes it from create_teammate (which adds a teammate) and update_email (which mutates an existing address), so the agent can route 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?
Explicitly states the when-not condition: only usable when the workspace manages its own team list, and that a directory integration (Google, Microsoft, Zoho Mail) yields a 409. It does not name the alternative path (e.g. sync_teammates or list_integrations) for directory-driven workspaces, which is the only gap.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_first_signatureStart the first signature from the company's brandAInspect
Start a workspace's first email signature the way Scribe's web onboarding does: it looks up the company behind the user's email domain (name, logo, brand color and style, button labels, social links, phone, address, the person's name and job title) and builds the onboarding's template that suits the brand, saved as a DRAFT and returned rendered so you can show it. Use it right after create_scribe_account, or for a workspace that has no signature yet. Never publishes: publish_signature only after the person approves.
| Name | Required | Description | Default |
|---|---|---|---|
| context | Yes | Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as "a user", "the customer", or "an account". Example: "Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution." | |
| create_another | No | Create it even though the workspace already has a signature (default false: report it instead). Only when the person asked for a new starting point. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | |
| signature | Yes | The draft signature created; null when nothing was created. |
| next_steps | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the write and open-world annotations, it discloses the company lookup from the user's email domain, the data collected, template generation, DRAFT persistence, and the rendered result for review. "Never publishes" and the approval condition clarify that invocation does not make the signature live.
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 purpose is front-loaded, and the following sentences efficiently cover timing and publication safety. The long parenthetical inventory makes the opening sentence dense, but its details are relevant and there is no repetitive 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 creation tool with complete input and output schemas, the description supplies the essential operational context: brand-data provenance, draft creation, rendered preview, workflow position, and approval boundary. The existing-signature exception is covered by create_another, and no additional return-value explanation is necessary.
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 context and create_another are thoroughly documented there, making 3 the appropriate baseline. The description explains the implicit brand-data source but adds no direct guidance about either explicit parameter, including create_another's override-versus-report behavior.
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 opening identifies a specific operation and resource: starting a workspace's first email signature using brand-derived web-onboarding behavior. References to create_scribe_account and publish_signature also place it clearly within the signature workflow rather than leaving it interchangeable with other signature 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?
It gives explicit invocation points: immediately after create_scribe_account or when a workspace has no signature yet. It also establishes an approval gate and directs publishing to publish_signature, while the schema documents the exceptional create_another case.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_folderCreate a folderAInspect
Create a new, empty signature folder to organize signature templates. Folders created here are top-level (not nested). Use it only when no suitable folder exists: call list_folders first to reuse one, and use update_folder to rename an existing folder instead of creating another, since duplicate names are allowed. Creating a folder files nothing: to put a signature in it, pass the returned id as folder_id to create_signature or update_signature. Writes one folder and returns it with signature_count 0. Needs the folders:write scope; a blank name returns 422.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Name for the new signature folder (required). Must not be blank (422); it does not have to be unique, so check list_folders first if a folder with this name may already exist. | |
| context | Yes | Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as "a user", "the customer", or "an account". Example: "Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution." |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare write, non-idempotent, non-destructive, open-world, and the description corroborates and enriches this: it discloses the required folders:write scope, the 422 on a blank name, that duplicate names are permitted (explaining non-idempotency), that nothing is filed by the call itself, and the returned signature_count of 0. This is well beyond what 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?
The core purpose leads, followed by the routing rule, the alternative, the follow-up action, the side effects, and the failure mode. Every sentence carries distinct operational 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?
For a two-parameter write tool with annotations and an output schema, the description covers prerequisites, side effects, error behavior, and cross-tool usage. 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 coverage is 100%, so the baseline is 3, but the description adds real semantics: that the name need not be unique (so list_folders should be checked first), that blank returns 422, and how the returned id flows into other tools. It does not add format or length constraints 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 ('Create a new, empty signature folder') plus a scope qualifier ('top-level, not nested') that separates it from anything else in the sibling list. It explicitly names list_folders and update_folder as the alternatives, so an agent can route 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?
Gives an explicit precondition ('use it only when no suitable folder exists: call list_folders first to reuse one') and an explicit alternative with rationale ('use update_folder to rename ... since duplicate names are allowed'). It also notes the follow-up action (pass the returned id as folder_id to create_signature or update_signature), which is when-next guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_marketing_campaignCreate a marketing campaignAInspect
Create a marketing campaign. name, start_time, end_time, and time_zone are required; a missing one returns 422. The campaign is created as a draft — use schedule_marketing_campaign to activate it. content is a block tree (a stack root whose children are blocks) strict-validated server-side, the same format as signature draft_content; smart_fields_conditions and signature_template_ids set the targeting.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Campaign name (required). | |
| content | No | Campaign block tree (ILayoutBlock): a `stack` root whose `children` are blocks. Strict-validated server-side. Omit to leave unchanged; null to clear. Every node (block AND token) needs an `id` that is a fresh LOWERCASE uuid — any other string, including an uppercase uuid, is rejected 422. Every numeric size is in PIXELS, never a CSS multiplier: `lineHeight` is a px line box (~1.3x fontSize, e.g. fontSize 14 -> 18), so 1.3 is rejected. Call get_content_schema for the full schema, every enum value, and a worked example. | |
| context | Yes | Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as "a user", "the customer", or "an account". Example: "Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution." | |
| end_time | Yes | ISO-8601 end of the campaign window (required). | |
| behaviour | No | How the campaign content combines with the signature (replace or append). | |
| time_zone | Yes | IANA time zone, e.g. 'Europe/Paris' (required). | |
| send_email | No | ||
| start_time | Yes | ISO-8601 start of the campaign window (required). | |
| filter_kind | No | Which targeting dimension applies: by signature_templates or by smart_fields conditions. | |
| signature_template_ids | No | UUIDs of the signature templates to apply the campaign to (replaces the set; [] clears). | |
| smart_fields_conditions | No | Smart-field targeting: an array of OR-groups, each an array of AND-conditions { smart_field_id (uuid), operator, values }. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false and destructiveHint=false, so the description's added value is what it contributes beyond that: the resulting resource state (draft, not live), the 422 error on missing required fields, and server-side strict validation of the content tree. It does not cover permissions, rate limits, or whether create is safe to retry, so it is strong but not exhaustive.
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 required-field contract and lifecycle note before the content-format detail. Dense and nearly waste-free, though the clause about content block-tree shape partially duplicates the schema's own long description.
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 an output schema present, annotations covering safety, and 91% schema coverage, the description needs only to add lifecycle and validation context, which it does (draft state, 422 behavior, strict server-side validation, get_content_schema pointer via the schema). Minor gaps remain around whether send_email or behaviour change the creation semantics, but 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 91% and the schema already explains content, smart_fields_conditions, signature_template_ids, and required fields in detail, so the baseline is 3. The description's only genuinely new parameter information is the cross-reference that content uses the same format as signature draft_content; the rest restates required fields and targeting parameters already documented.
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 ("Create a marketing campaign") and immediately disambiguates from the sibling that activates campaigns by naming schedule_marketing_campaign. An agent can tell this apart from update_marketing_campaign, preview_marketing_campaign, and schedule_marketing_campaign without inspecting schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states the lifecycle position: the campaign is created as a draft and schedule_marketing_campaign must be used to activate it, which is the key routing decision for this tool family. It does not mention preview_marketing_campaign or when to prefer update_marketing_campaign instead, 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_scribe_accountCreate a Scribe accountAInspect
Create the Scribe account of the person signed in to this connector, when they have none yet (other Scribe tools say so). Creates their workspace with a free 14-day trial, from the email they signed in with, which must be a company address. ONLY call it after: (1) the person said they do NOT already have a Scribe account (someone who has one must reconnect with their Scribe email instead, or they get a second, empty workspace); (2) you showed them the Terms and Conditions (https://www.scribe-mail.com/terms-and-conditions) and the Privacy Policy (https://www.scribe-mail.com/privacy-policy); and (3) they explicitly agreed to create the account. Pass accept_terms: true only then.
| Name | Required | Description | Default |
|---|---|---|---|
| context | Yes | Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as "a user", "the customer", or "an account". Example: "Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution." | |
| time_zone | No | The person's IANA time zone (e.g. America/Chicago), when you know it. | |
| accept_terms | Yes | Must be true, and only once the person explicitly agreed in the chat to the Terms and Conditions and the Privacy Policy. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | |
| next_steps | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare the generic safety profile (readOnlyHint=false, openWorldHint=true, destructiveHint=false), so the description carries the real burden and does: it discloses the 14-day free trial workspace creation, the company-address constraint on the sign-in email, and the concrete failure consequence of getting it wrong — 'a second, empty workspace'. That is exactly the risk context an agent needs before a non-idempotent write.
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 presents the preconditions as a numbered list, so the length is justified by genuine consent requirements. The parenthetical '(other Scribe tools say so)' is slightly oblique and the block could be lightly trimmed, keeping it off 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 non-idempotent, open-world account-creation write with an output schema already covering return values, the description covers purpose, consent prerequisites, side-effect risk, and eligibility constraints. Nothing an agent needs before invoking 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 coverage is 100%, so the baseline is 3; the description goes further by tying accept_terms to the consent evidence ('Pass accept_terms: true only then'), which tells the agent the gating semantics rather than just the type. It says nothing extra about time_zone or context beyond the schema, so it stops 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 ('Create the Scribe account of the person signed in to this connector') plus the scope condition ('when they have none yet'), which distinguishes it from every other create_* sibling. An agent knows exactly what this tool produces 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 three-part precondition list (user denies having an account, terms and privacy policy were shown, explicit agreement) and names the alternative path for users who already have an account ('reconnect with their Scribe email instead'). Both when-to-use and when-not-to-use are covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_signatureCreate a signatureAInspect
Create a signature template. Sets draft_content (the working copy) — content stays empty until you publish_signature. name is required; draft_content is a block tree (a stack root whose children are blocks) strict-validated server-side; folder_id is a folder UUID. Call get_content_schema FIRST for the block-tree schema, every enum value (incl. the non-obvious icon names like linkedin-in/facebook-f), and a complete worked example to adapt — that's how you build a full signature, social-icon row included, in one shot. An invalid tree returns 422 naming each offending field and (for enums) its allowed values. Returns the created template.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Signature template name (required). | |
| context | Yes | Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as "a user", "the customer", or "an account". Example: "Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution." | |
| priority | No | Ordering priority (lower = higher). | |
| folder_id | No | UUID of the folder to file the signature under; null detaches it. | |
| draft_content | No | Draft block tree (ILayoutBlock): a `stack` root whose `children` are blocks. Strict-validated server-side. Omit to leave unchanged; null to clear. Every node (block AND token) needs an `id` that is a fresh LOWERCASE uuid — any other string, including an uppercase uuid, is rejected 422. Every numeric size is in PIXELS, never a CSS multiplier: `lineHeight` is a px line box (~1.3x fontSize, e.g. fontSize 14 -> 18), so 1.3 is rejected. Call get_content_schema for the full schema, every enum value, and a worked example. | |
| signature_installation_activated | No | Whether installation is activated for this template. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, idempotentHint=false, and destructiveHint=false, so the write/non-idempotent profile is structured. The description nevertheless adds real value beyond that: strict server-side validation returning 422 with offending fields and allowed enum values, and the lowercase-UUID/pixel-units constraints. These are useful but framed as parameter rules rather than additional behavioral traits like permissions or side effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the create action and the draft-vs-published distinction, then builds prerequisites. It is dense and slightly run-on with em-dash nesting, but nearly every clause carries actionable information (state effect, schema-first pointer, 422 behavior, id/unit rules).
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 6 parameters, nested block-tree complexity, and annotations plus an output schema, the description supplies the workflow ordering, validation behavior, unit/id constraints, and return note. 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%, so baseline is 3, and the description still adds meaning: `name` required, `draft_content` is a strict-validated block tree, `folder_id` is a folder UUID. It goes further with unit semantics (pixels not multipliers, lineHeight example) and lowercase-UUID id stability, exceeding what the schema alone conveys.
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 ('Create a signature template') and immediately clarifies the state effect: sets `draft_content` while `content` stays empty until publish_signature. This cleanly distinguishes it from create_first_signature, update_signature, and publish_signature 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 instructs to 'Call `get_content_schema` FIRST' and explains why (full schema, enum values, worked example), plus names publish_signature as the follow-on action. The when-to-use and prerequisite ordering is fully spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_smart_fieldCreate a smart fieldAInspect
Define a new custom smart field, a merge field signature templates and campaign conditions can use. Check list_smart_fields first: labels are unique, and to rename, retype or rebind an existing field use update_smart_field instead. A manual field starts empty; set each teammate's value with update_teammate. Bound to an integration (integration_id + integration_attribute), its values come from that integration and update_teammate can no longer set them; integrations do not fill url fields, so keep a url field manual. Creating the field changes no signature until a template references it. Writes one field and returns it. Needs the smart_fields:write scope; a taken label, an invalid kind or an unknown or unsuitable integration returns 422.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | Field type (default text). url/email values are validated; image values are read-only via the API. | |
| label | Yes | Display name for the field (required). Must be unique in the workspace: a label already in use returns 422 `taken`. | |
| context | Yes | Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as "a user", "the customer", or "an account". Example: "Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution." | |
| required | No | Whether teammates must fill this field (default true when omitted). | |
| integration_id | No | UUID of a workspace integration to sync this field's values from, from list_integrations. It must be a directory or HR/enrichment integration that supplies teammate data; any other returns 422. Omit for a manual field. | |
| integration_attribute | No | The integration's attribute key to map (required when integration_id is set; 422 without it). |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare it is a non-destructive, non-idempotent write, but the description adds substantially more: required smart_fields:write scope, the exact 422 failure modes (taken label, invalid kind, unknown or unsuitable integration), the fact that creation has no effect on any signature until a template references it, and that it writes exactly one field and returns it.
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 the list_smart_fields/update_smart_field routing are front-loaded, followed by the manual-vs-bound behavior split and then side effects and errors. Every sentence carries distinct operational information; there is no filler or repetition of 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 6-parameter mutation tool with an output schema, this covers purpose, prerequisites, alternatives, behavioral branching (manual vs. integration-bound), authorization scope, and error conditions. Return values are handled by the output schema, so 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 coverage is 100%, so the baseline is 3, but the description adds design-level semantics the schema only hints at: manual vs. integration-bound fields, the coupling of integration_id with integration_attribute, and the caveat that integrations do not fill url fields so they must stay manual. It does not cover the required/default behavior of kind or required, though the schema does.
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 ("Define a new custom smart field") and immediately explains what the resource is — a merge field usable by signature templates and campaign conditions. An agent can distinguish it from update_smart_field, delete_smart_field, and list_smart_fields 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 when-to-use (check list_smart_fields first because labels are unique), explicit when-not ("to rename, retype or rebind an existing field use update_smart_field instead"), and names the concrete alternative. It also routes follow-up work to update_teammate for setting values.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_teammateCreate a teammateAInspect
Create a new teammate from a primary email plus optional smart-field values. Only available when the workspace manages its own team list — if a directory integration (Google, Microsoft or Zoho Mail) drives teammates, this returns a 409 conflict. Email aliases are managed separately.
| Name | Required | Description | Default |
|---|---|---|---|
| Yes | Primary email address for the new teammate. Required, must be valid and not already used. | ||
| context | Yes | Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as "a user", "the customer", or "an account". Example: "Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution." | |
| smart_fields | No | Optional initial smart-field values, by smart_field_id (UUID). Integration-synced and image fields are ignored; an unknown id or a value invalid for its field type fails the whole create. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the write/non-destructive/non-idempotent profile, and the description adds real behavioral detail beyond that: the 409 conflict for directory-driven workspaces, that integration-synced and image fields are silently ignored, and that an unknown smart_field_id or type-invalid value fails the entire create atomically. These are exactly the failure-mode facts an agent cannot get 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?
Three tight sentences, front-loaded with the create action and inputs, then the precondition, then the alias caveat. No restatement of the tool name or 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 an output schema present and 100% schema coverage, the description's remaining job is preconditions and failure behavior, and it covers both (409 on directory-driven workspaces, atomic failure on bad smart-field input). Nothing material an agent needs before calling 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 still adds meaning by clarifying that 'email' is the primary address (aliases handled elsewhere) and that smart_fields is an optional initial-value set whose bad entries abort the whole call. It does not add syntax detail beyond the schema, so 4 rather than 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 ('Create a new teammate') plus the input shape ('from a primary email plus optional smart-field values'), which cleanly separates it from list_teammates, update_teammate, delete_teammate and sync_teammates in the sibling set. The availability precondition is stated in the same breath, so the agent knows this is the manual-creation path rather than the directory-sync path.
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-not condition: if a directory integration (Google, Microsoft, Zoho Mail) drives teammates, this returns 409, so the agent should not call it in that workspace. It also flags that email aliases are managed separately, steering the agent away from expecting alias behavior here. It stops short of naming the alternative tool (e.g. sync_teammates) by name, which keeps it at 4 rather than 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_assetDelete an assetADestructiveIdempotentInspect
Delete an asset by UUID. If it's still in use (referenced by a signature or set as the workspace picture) it is soft-deleted so those keep rendering; otherwise it is permanently removed. Either way it disappears from list_assets.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The asset's UUID (the `id` returned by list_assets). | |
| context | Yes | Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as "a user", "the customer", or "an account". Example: "Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution." |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| deleted | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare the safety profile (destructiveHint=true, idempotentHint=true), but the description adds genuinely new context: it explains the conditional soft-delete vs permanent-removal logic, why references preserve the asset ('so those keep rendering'), and that the asset vanishes from list_assets either way. This is exactly the kind of consequence detail an agent needs before calling a destructive 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?
Two sentences, zero filler, and the payload (what happens on delete) is front-loaded right after the verb. 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?
With an output schema present, return values need not be described, and the annotations already cover idempotency and destructiveness. The description closes the remaining gap by explaining the soft/hard delete outcome, making the definition complete for a destructive 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% and the schema already documents the `id` parameter as the UUID returned by list_assets, plus the full `context` contract. The description's 'by UUID' repeats what the schema provides without adding syntax or format detail, 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 ('Delete an asset by UUID'), immediately distinguishing it from the many other delete_* siblings. The behavior it describes is uniquely scoped to assets, so an agent can select it without ambiguity.
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's nature (delete a specific asset) and it points to list_assets as the source of the UUID, but there is no explicit when-to-use/when-not guidance or mention of alternatives such as update_asset when the goal is modification rather than removal.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_emailDelete an emailADestructiveIdempotentInspect
Delete an alias email by UUID (soft delete). A teammate's primary email cannot be deleted (returns 422). Only available when the workspace manages its own team list — a directory integration returns a 409 conflict.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The email's UUID (the `id` returned by list_emails). | |
| context | Yes | Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as "a user", "the customer", or "an account". Example: "Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution." |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| deleted | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructive/idempotent/openWorld, but the description adds substantive behavior the annotations cannot express: the delete is soft rather than permanent, teammate primary emails are rejected with 422, and managed-directory workspaces conflict with 409. These are exactly the side effects and auth/ownership constraints an agent needs before invoking a destructive 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?
Three short sentences, front-loaded with the action and its soft-delete nature, followed by two error-condition clauses. No filler, no restatement of the title, and each sentence carries distinct operational 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 destructive two-parameter tool with an output schema and rich annotations, this covers action, semantics, and the two most likely failure modes. It omits whether the soft-deleted alias can be restored or what happens to signature installations referencing it, which is the only meaningful 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% — the `id` parameter is already documented as "the UUID returned by list_emails" and `context` is fully specified. The description's "by UUID" 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 precise verb+resource ("Delete an alias email by UUID") and immediately narrows scope with "(soft delete)", which separates it from sibling delete_* tools operating on assets, folders, signatures, smart fields, and teammates. The qualifier "alias email" also distinguishes it from delete_teammate and update_email.
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 concrete preconditions and failure conditions: primary emails return 422, and workspaces using a directory integration return 409. That tells the agent when the call is invalid, but it never names the alternative action for those cases (e.g., remove/update the address instead of deleting), so it stops just short of explicit when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_folderDelete a folderADestructiveIdempotentInspect
Delete a signature folder by UUID. A folder that still contains signatures cannot be deleted (returns 409) — move or delete its signatures first.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The folder's UUID (the `id` returned by list_folders). | |
| context | Yes | Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as "a user", "the customer", or "an account". Example: "Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution." |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| deleted | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=true, and readOnlyHint=false, so the safety profile is covered. The description adds genuinely new behavior beyond the annotations: the 409 error condition and the empty-folder requirement, which the agent cannot infer 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?
Two sentences, no filler, with the core action and the blocking precondition front-loaded. Every clause 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?
For a destructive tool with full annotation coverage, a 100% documented schema, and an output schema handling return values, the description supplies the one missing piece an agent needs: the precondition that would cause the call to fail.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters are already documented, including the requirement that id is 'the id returned by list_folders'. The description only restates 'by UUID' and says nothing extra about the analytics-only context parameter, 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 ('Delete a signature folder by UUID'), which cleanly separates it from update_folder, list_folders, and the other delete_* siblings that target different resources. An agent can identify the 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?
Gives a clear precondition and failure mode: a folder containing signatures cannot be deleted (409), and the agent is told to move or delete the signatures first. It stops short of naming the sibling tools to perform that remediation, so it is clear context rather than 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_marketing_campaignDelete a marketing campaignADestructiveIdempotentInspect
Delete a marketing campaign by UUID. An active campaign is stopped first (it stops applying to signatures), then removed.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The campaign's UUID (the `id` from list_marketing_campaigns). | |
| context | Yes | Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as "a user", "the customer", or "an account". Example: "Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution." |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| deleted | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=true, so the safety profile is covered structurally. The description adds real value beyond that by disclosing the cascade: an active campaign is stopped first, ceases applying to signatures, and is then removed. It stops short of stating irreversibility or any required permissions/scope.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences with zero filler, and the identifying detail (UUID) plus the lifecycle behavior are front-loaded. Nothing could be cut without losing 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 destructive two-parameter tool with an output schema, the safety hints, the parameter documentation, and the cascade behavior are all covered. The only meaningful omission is an explicit statement about irreversibility or recovery, which matters for a delete.
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 `context` are already fully documented, including the pointer to list_marketing_campaigns for obtaining the UUID. The description's "by UUID" restates the schema rather than extending it, 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 ("Delete a marketing campaign") and pins the identifier form ("by UUID"), which separates it cleanly from sibling mutations like update_marketing_campaign, pause_marketing_campaign, and resume_marketing_campaign. An agent can select 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?
The description implies the destructive use case but never states when to choose this over pause_marketing_campaign or update_marketing_campaign, nor does it warn that the operation is permanent. Usage is inferable from the verb alone, which is the minimum-viable bar.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_signatureDelete a signatureADestructiveIdempotentInspect
Permanently delete a signature template by UUID; there is no undo or trash. The template is removed with its recipient assignment (manual, org-unit and smart-field rules), its marketing-campaign targeting and its installation records, but Scribe does not push an uninstall to mailboxes it was already installed in. Use it only when the template itself should go: to stop it reaching some people, use remove_signature_recipients or remove_signature_recipient_entities; to reset only a reply or internal variant, use delete_signature_variant. Needs the signatures:delete scope; an unknown id returns 404.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The signature's UUID (the `id` from list_signatures). Only primary templates can be deleted: a reply or internal variant's id returns 404. | |
| context | Yes | Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as "a user", "the customer", or "an account". Example: "Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution." |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| deleted | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=true, but the description goes well beyond them: it enumerates the cascade (recipient assignment, marketing-campaign targeting, installation records), clarifies what does NOT happen ('Scribe does not push an uninstall to mailboxes it was already installed in'), states the required scope, and predicts the 404 on an unknown id.
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 most consequential fact (permanent, no undo or trash) is front-loaded in the first clause, followed by cascade details and then routing alternatives. Every sentence carries distinct information with no filler, appropriate length for a destructive cascade 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?
With an output schema present, return values need not be explained; the description still covers the operation's permanence, side effects, scope requirement, failure mode, and tool-selection boundaries. Nothing an agent needs to invoke 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 description coverage is 100% and both parameters are fully documented in the schema, including the 'only primary templates can be deleted' caveat and the context-writing rules. The description's 'by UUID' and 404 note largely restate the schema, so it adds marginal value here — baseline 3.
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 ('Permanently delete a signature template by UUID') and immediately distinguishes itself from sibling deletion tools like delete_signature_variant. An agent can identify exactly what this deletes and how it differs from remove_signature_recipients 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 conditions use: 'Use it only when the template itself should go', then routes to the correct alternatives with their own conditions — remove_signature_recipients/remove_signature_recipient_entities for narrowing reach, delete_signature_variant for resetting a single variant. When-not guidance and named alternatives are both present.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_signature_variantReset a signature variantADestructiveIdempotentInspect
Reset a signature's reply/internal variant back to the primary: deactivate it and restore the primary's content (the variant record is kept). This is the 'reset to primary' action, not a hard delete. Returns 409 if the workspace lacks a Microsoft 365 signatures integration (variants_unavailable).
| Name | Required | Description | Default |
|---|---|---|---|
| kind | Yes | Which variant to reset. | |
| context | Yes | Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as "a user", "the customer", or "an account". Example: "Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution." | |
| signature_id | Yes | The primary signature's UUID (the `id` from list_signatures). |
Output Schema
| Name | Required | Description |
|---|---|---|
| kind | Yes | |
| reset | Yes | |
| signature_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (destructiveHint=true, idempotentHint=true), the description discloses the actual side effects an agent cannot infer: the variant is deactivated rather than removed, the primary's content is restored, the variant record is retained, and a 409 variants_unavailable error is returned when the workspace lacks the M365 integration. This is exactly the extra behavioral 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?
Two sentences, front-loaded with the core action and its most important semantic distinction ('reset to primary, not a hard delete'), followed by the failure condition. No filler 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?
An output schema exists, so return values need no explanation, and the description still covers the mutation's semantics, the retention of the variant record, and the error case. For a 3-parameter mutation tool this is complete enough 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 description coverage is 100% and all three required parameters are documented there. The description restates the variant kinds ('reply/internal') but adds no syntax, format, or edge-case detail beyond the schema; the baseline 3 applies when structured fields do 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 precise verb and resource (reset a signature's reply/internal variant to the primary) and immediately clarifies the operation's nature versus what the name implies — explicitly 'not a hard delete'. This lets an agent distinguish it from delete_signature, update_signature_variant, and publish_signature_variant 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 for when to call it (the 'reset to primary' action) and names the error condition that blocks it (409 / variants_unavailable without a Microsoft 365 signatures integration). It does not, however, explicitly name the alternative tools (update_signature_variant, delete_signature) or state when-not to use it, so the routing guidance is contextual rather than exhaustive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_smart_fieldDelete a smart fieldADestructiveIdempotentInspect
Delete a custom smart field by UUID (this also removes its value on every teammate). Default fields are read-only (422), the computed Email field is not addressable (404), and a field used in a signature template or campaign can't be deleted (409).
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The smart field's UUID (the `id` returned by list_smart_fields). | |
| context | Yes | Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as "a user", "the customer", or "an account". Example: "Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution." |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| deleted | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=true, but the description adds materially more: deletion cascades to remove the field's value on every teammate, plus three concrete failure modes with HTTP codes. That is exactly the 'what gets destroyed and when it won't work' context the annotation 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?
A single dense sentence with the verb and destruction scope front-loaded, followed by the failure cases. No filler, no restatement of the title, and every clause carries operational 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 destructive mutation with an output schema present and full annotation coverage, the description supplies the cascade semantics, addressing requirements, and complete error preamble. Nothing an agent needs before invoking 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 baseline is 3; the description goes beyond the schema's 'id returned by list_smart_fields' by constraining which IDs are valid targets (custom fields only, not default or computed fields). It does not add anything further about the analytics-only context parameter, which is already fully documented.
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 custom smart field') with the addressing key (UUID) and immediately distinguishes it from sibling operations by noting it is a custom field. It also names what makes a field non-custom, so an agent knows update_smart_field/list_smart_fields are not substitutes.
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 enumerates the when-not conditions with status codes: default fields (422), computed Email field (404), fields in use by a signature template or campaign (409). These effectively tell an agent when the call will fail, though no alternative tool (e.g., update_smart_field) is named as a fallback.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_teammateDelete a teammateADestructiveIdempotentInspect
Delete a teammate by UUID (a soft delete; their emails are removed from signature deployment). Only available when the workspace manages its own team list — if a directory integration (Google, Microsoft or Zoho Mail) drives teammates, this returns a 409 conflict.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The teammate's UUID (the `id` returned by list_teammates). | |
| context | Yes | Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as "a user", "the customer", or "an account". Example: "Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution." |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| deleted | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantial context beyond annotations: it discloses the soft-delete semantics (not a hard delete), the cascade effect on signature deployment, and the 409 conflict condition tied to directory integrations. Annotations only give generic destructive/idempotent hints; the description supplies the domain-specific 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?
Two sentences, front-loaded with the core action and then the critical precondition. No filler; every clause carries operational weight.
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?
Covers action, scope constraint, side effects, and failure mode. With an output schema present, return values need not be explained, and the description is fully sufficient 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. The description adds meaning by tying 'UUID' to the id returned by list_teammates, reinforcing correct sourcing of the 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+resource ('Delete a teammate by UUID') and immediately clarifies it is a soft delete with a specific side effect (emails removed from signature deployment), distinguishing it from update_teammate and delete_* 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 states the precondition for use ('Only available when the workspace manages its own team list') and the failure mode with an alternative-driving integration (directory integration → 409 conflict). This tells the agent both when to use it and when it will fail.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
duplicate_signatureDuplicate a signatureAInspect
Copy a signature into a new one, as the dashboard's Duplicate: a safe copy to try a change on (a new banner, a layout) without touching the original or anyone's signature. The copy gets the source's design (its draft, published as the copy's content) and its reply/internal variants; it is assigned to no one, its installation is off, it has no smart-field rules. Use it instead of reading the design and create_signature. Then edit the copy with update_signature and check it with preview_signature; to bring a tried change back, update_signature the original with the copy's draft_content. Unknown signature → 404; unknown folder → 422. Returns the copy.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | UUID of the signature to copy (from list_signatures). | |
| name | No | The copy's name. Omit for "<name> (Copy)", in the user's language. | |
| context | Yes | Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as "a user", "the customer", or "an account". Example: "Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution." | |
| folder_id | No | UUID of the folder to file the copy under; null for no folder. Omit for the source's folder. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With annotations only flagging it as a non-read-only, non-destructive, non-idempotent open-world write, the description goes well beyond: it discloses what the copy inherits (design drafted into content, reply/internal variants) and what it explicitly does not (no assignee, installation off, no smart-field rules). It also documents failure modes (404 unknown signature, 422 unknown folder) and that it returns the copy.
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, then behavior, then workflow guidance — each sentence carries distinct information with no repetition. Dense but 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 copy/mutation tool with an output schema present and annotations covering safety, the description supplies everything else an agent needs: inheritance semantics, rollback path, and error codes. Nothing material 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 id, name, folder_id, and context are already documented in the schema. The description's mention of 'assigned to no one' and inherited content is behavioral rather than parameter-level, and it adds no enum, format, or default detail beyond the schema's own '<name> (Copy)' and folder-inheritance defaults. Baseline 3 fits 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?
States a specific verb and resource ('Copy a signature into a new one') and immediately anchors the mental model to the dashboard's Duplicate, distinguishing it from create_signature. An agent can tell exactly what operation this is without further reading.
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 this 'instead of reading the design and create_signature', then lays out the follow-on workflow (edit with update_signature, verify with preview_signature, and roll back by updating the original with the copy's draft_content). This gives when-to-use and named alternatives, not just implied context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_analytics_clicksAnalytics — signature clicksARead-onlyIdempotentInspect
Signature-click counts over a date range. By DEFAULT a timeseries bucketed by granularity (hour/day/week/month, UTC): { data:[{period, count}], totals:{count} }. Set group_by (signature_template | marketing_campaign | teammate | country) for a ranked breakdown instead: { data:[{id, label, view_count, click_count, clickthrough_rate}], pagination } — each breakdown row already carries views, clicks, AND the clickthrough rate, so one call answers "which signature/teammate drives the most engagement". Filter by start_date/end_date and any of signature_template_id, marketing_campaign_id, teammate_id.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | 1-based page (breakdown only; ignored for the timeseries). | |
| limit | No | Page size 1–100 (breakdown only; default 20). | |
| order | No | Sort direction. Default desc. | |
| context | Yes | Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as "a user", "the customer", or "an account". Example: "Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution." | |
| end_date | No | Range end (inclusive), ISO-8601 date YYYY-MM-DD. Default: today. | |
| group_by | No | If set, return a ranked breakdown by this dimension instead of a timeseries: signature_template | marketing_campaign | teammate | anchor (link) | country. | |
| start_date | No | Range start (inclusive), ISO-8601 date YYYY-MM-DD. Default: 2 months ago. | |
| granularity | No | Timeseries bucket size: hour | day | week | month (default day). Ignored when `group_by` is set. `hour` is capped at a 31-day range. | |
| teammate_id | No | Restrict to one teammate (their UUID). | |
| marketing_campaign_id | No | Restrict to one marketing campaign (its UUID). | |
| signature_template_id | No | Restrict to one signature template (its UUID). |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
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 adds real context on defaults (2 months ago → today, UTC), the mutually exclusive timeseries vs. breakdown behavior, and that breakdown rows carry views, clicks, and CTR together. That last point (one call answers the engagement question) is genuine behavioral insight not implied by annotations, though some response-shape detail duplicates the 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?
Well front-loaded: default behavior first, alternative mode second, filters last. It is dense with inline JSON response sketches that make sentences long, but every sentence carries routing or format 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 an 11-parameter analytics tool with an output schema, the description covers both modes, defaults, the UTC basis, and the filter set, which is enough for correct invocation. Minor gaps remain: no mention of pagination behavior in the timeseries mode or the anchor breakdown dimension, both of which are discoverable only from 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?
Schema coverage is 100%, so the baseline is 3. The description explains the semantic interplay of `granularity` vs. `group_by` and the available filters, but it largely restates schema content — and its group_by list ('signature_template | marketing_campaign | teammate | country') silently omits 'anchor', which is in the enum.
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 ('signature-click counts over a date range') and immediately clarifies the two shapes the result can take, so an agent knows exactly what data comes back. It does not name or differentiate itself from the nearest analytics siblings (get_analytics_views, get_analytics_events_summary), relying on the word 'clicks' to do that work implicitly.
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 in-tool routing: default timeseries vs. `group_by` ranked breakdown, and even frames the breakdown as answering 'which signature/teammate drives the most engagement'. It stops short of saying when to reach for this tool over get_analytics_views or list_analytics_events, so the cross-tool selection guidance is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_analytics_events_summaryAnalytics — conversions & revenue (aggregated events)ARead-onlyIdempotentInspect
Aggregated conversion/revenue numbers from recorded events. By DEFAULT a timeseries of event count + sum of value bucketed by granularity: { data:[{period, count, value}], totals:{count, value} }. Set group_by (name | signature_template | marketing_campaign | teammate | anchor | country | currency | user) for a ranked breakdown: { data:[{id, label, count, value}], pagination } — rank by order_by (count | value). value is summed across currencies, so pass currency or group_by=currency for a clean total. Answers total revenue, revenue by campaign/template/teammate/country, conversions per day, top customers (group_by=user).
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Restrict to one event name (e.g. `purchase`). | |
| page | No | 1-based page (breakdown only). | |
| limit | No | Page size 1–100 (breakdown only). | |
| order | No | Sort direction. Default desc. | |
| context | Yes | Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as "a user", "the customer", or "an account". Example: "Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution." | |
| country | No | Restrict to one country (ISO 3166-1 alpha-2). | |
| currency | No | Restrict to one currency (e.g. `USD`) for a clean sum. | |
| end_date | No | Range end (inclusive), ISO-8601 date YYYY-MM-DD. Default: today. | |
| group_by | No | Ranked breakdown by dimension instead of a timeseries: name | signature_template | marketing_campaign | teammate | anchor | country | currency | user. | |
| order_by | No | Breakdown ranking metric: count | value (default count). | |
| start_date | No | Range start (inclusive), ISO-8601 date YYYY-MM-DD. Default: 2 months ago. | |
| distinct_id | No | Restrict to one identified visitor (their user id). | |
| granularity | No | Timeseries bucket size (default day). Ignored when `group_by` is set. | |
| teammate_id | No | Restrict to one teammate (their UUID). | |
| marketing_campaign_id | No | Restrict to one marketing campaign (its UUID). | |
| signature_template_id | No | Restrict to one signature template (its UUID). |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, so safety needs no restating. The description adds real behavioral context: the DEFAULT is a timeseries, the shape changes when group_by is set, and value is summed across currencies unless currency is supplied, which is a genuine correctness trap an agent would otherwise miss.
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 definition, then response shapes, then the mode switch, then use cases — a sensible ordering with little waste. It is dense and sentence-long, but nearly every clause carries information an agent needs to pick the right mode.
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 16 parameters this could easily be under-specified, but the description covers the two operating modes, defaults, ranking, and the currency pitfall, and an output schema plus full schema descriptions cover return details and the required context parameter. 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% with 16 well-described parameters including four enums, so the schema does the heavy lifting; baseline is 3. The description restates group_by/order_by/granularity behavior and the currency summing rule, but mostly mirrors what the schema already says rather than adding new syntax or edge-case 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?
"Aggregated conversion/revenue numbers from recorded events" states a specific verb-equivalent and resource, and the mention of timeseries vs ranked breakdown makes the output contract clear. It does not explicitly name the sibling tools it is not (get_analytics_clicks, get_analytics_views, list_analytics_events), so an agent must infer the boundary from the word "events" 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?
The closing sentence enumerates concrete use cases — total revenue, revenue by campaign/template/teammate/country, conversions per day, top customers — which gives a strong positive signal for when to call it. There is no explicit exclusion or named alternative for the cases where this is the wrong tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_analytics_viewsAnalytics — signature viewsARead-onlyIdempotentInspect
Signature-view counts over a date range. By DEFAULT a timeseries bucketed by granularity (hour/day/week/month, UTC): { data:[{period, count}], totals:{count} }. Set group_by (signature_template | marketing_campaign | teammate | country) for a ranked breakdown instead: { data:[{id, label, view_count, click_count, clickthrough_rate}], pagination } — each breakdown row already carries views, clicks, AND the clickthrough rate, so one call answers "which signature/teammate drives the most engagement". Filter by start_date/end_date and any of signature_template_id, marketing_campaign_id, teammate_id.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | 1-based page (breakdown only; ignored for the timeseries). | |
| limit | No | Page size 1–100 (breakdown only; default 20). | |
| order | No | Sort direction. Default desc. | |
| context | Yes | Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as "a user", "the customer", or "an account". Example: "Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution." | |
| end_date | No | Range end (inclusive), ISO-8601 date YYYY-MM-DD. Default: today. | |
| group_by | No | If set, return a ranked breakdown by this dimension instead of a timeseries: signature_template | marketing_campaign | teammate | anchor (link) | country. | |
| start_date | No | Range start (inclusive), ISO-8601 date YYYY-MM-DD. Default: 2 months ago. | |
| granularity | No | Timeseries bucket size: hour | day | week | month (default day). Ignored when `group_by` is set. `hour` is capped at a 31-day range. | |
| teammate_id | No | Restrict to one teammate (their UUID). | |
| marketing_campaign_id | No | Restrict to one marketing campaign (its UUID). | |
| signature_template_id | No | Restrict to one signature template (its UUID). |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
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 real operational context: default bucketing, hour granularity capped at 31 days, and the shape of both response modes including pagination on breakdowns. One gap: it lists group_by as 'signature_template | marketing_campaign | teammate | country' while the schema also allows 'anchor', an omission that could mislead an agent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core purpose, then the default behavior, then the alternative. Every clause carries information — response shape, mode switch, filters — with no filler, despite being longer than typical.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 11-parameter analytics tool with full schema coverage and an output schema, this description supplies the mode-selection logic, defaults, and the payoff of each mode. The single shortfall, the missing 'anchor' enum value in the group_by list, is corrected by the schema itself.
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 goes further by explaining the causal relationship between group_by and the output shape and by enumerating the three ID filters together. It synthesizes how parameters interact ('granularity ignored when group_by is set') rather than merely restating field 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?
States a specific verb+resource+scope: 'Signature-view counts over a date range', with the two operating modes (timeseries vs. group_by breakdown) made explicit. It never names the adjacent analytics siblings (get_analytics_clicks, get_analytics_events_summary, list_analytics_events), so the boundary with those tools is left to inference.
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 routing between the default timeseries and the group_by breakdown, plus the concrete question the breakdown answers ('which signature/teammate drives the most engagement') and the available filters. It gives context for when each mode applies but offers no exclusions against competing analytics tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_content_schemaGet the content schemaARead-onlyIdempotentInspect
Call this FIRST before authoring or editing a signature draft_content (create_signature / update_signature) or a marketing-campaign content. Returns, in ONE call, everything needed to build a valid block tree: the strict JSON Schema; a flat enums lookup of every allowed value (including the 100+ valid icon names and the iconStyle.shape values); the social_icons map from common platform to its exact (non-obvious) icon enum, e.g. linkedin -> linkedin-in, facebook -> facebook-f, youtube -> youtube, instagram -> instagram, whatsapp -> whatsapp; a complete worked example signature containing every block type AND a populated 5-platform socialList; and short guidance. Adapt example to author a full signature — social-icon row included — without guessing the format or brute-forcing enum spellings.
| Name | Required | Description | Default |
|---|---|---|---|
| context | Yes | Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as "a user", "the customer", or "an account". Example: "Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution." |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint, and destructiveHint=false, so the safety profile is covered. The description adds non-annotation behavior: the prerequisite ordering, that everything arrives in ONE call, and that it removes the need to brute-force enum spellings. It does not mention auth or rate limits, but for a schema-fetch tool that is minor.
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 imperative 'Call this FIRST', which is exactly what an agent needs to see first. It is dense but the parenthetical icon enumerations (linkedin -> linkedin-in, etc.) are repetitive; a couple of examples would have carried the same signal with less bulk.
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?
An output schema exists, so return-value structure need not be re-explained, and the description still gives the shape of what comes back (schema + enums + example + guidance). Together with annotations this is fully sufficient for an agent to call the tool correctly and know why.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is a single parameter (context) with 100% schema description coverage, so the schema already explains its purpose and constraints. The description adds no parameter-level detail beyond that, which is the expected baseline when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb+resource (returns the content schema needed to build a valid block tree) and enumerates exactly what is returned: strict JSON Schema, enums lookup, social_icons map, worked example, and guidance. It is unmistakably distinct from siblings like get_signature_html or preview_signature.
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 an explicit call-order rule ('Call this FIRST before authoring or editing') and names the exact downstream tools it enables: create_signature / update_signature drafts and marketing-campaign content. When-to-use is 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.
get_more_toolsARead-onlyIdempotentInspect
Check for additional tools whenever your task might benefit from specialized capabilities - even if existing tools could work as a fallback.
| Name | Required | Description | Default |
|---|---|---|---|
| context | Yes | A description of your goal and what kind of tool would help accomplish it. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds no additional behavioral context such as what 'check' entails, whether it makes a network call, or what side effects (if any) occur 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?
The description is a single, front-loaded sentence with no wasted words. It quickly communicates the action and the conditions for use, making it efficient and easy to parse, though it could be slightly more structured with a separate usage note.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description gives clear usage guidance but does not explain what the tool returns or what happens after 'checking' for tools. With no output schema present, the description carries the burden of explaining the result, which it fails to do. For a simple one-parameter tool, this is a notable gap, though not severe.
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 parameter 'context' is already documented with a clear description in the schema. The tool description adds no additional semantic meaning beyond what the schema provides, which aligns with the baseline of 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function: checking for additional tools when a task could benefit from specialized capabilities. It distinguishes itself from the sibling clipform_* tools by being a meta-tool for tool discovery rather than a domain-specific operation, though it does not explicitly name this 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?
The description provides explicit usage guidance: use this tool whenever specialized capabilities might help, even if existing tools could work as a fallback. This gives the agent a clear decision rule, though it does not mention when not to use it or list alternative tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_signature_htmlGet a signature's real HTML for a recipientARead-onlyIdempotentInspect
Get the REAL final installed HTML of a signature for a SPECIFIC recipient — the live published content rendered with that teammate's real values and tracking links on, i.e. exactly what their mail client receives. This is NOT a preview: it reflects the published signature (publish_signature first), and returns empty HTML if the signature has not been published. The email must be a recipient of this signature (see list_signature_recipients), otherwise the API returns a 404 (no such email) or 422 (not a recipient). For a tracking-free placeholder layout check of a draft before publishing, use preview_signature instead.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The signature's UUID (the `id` from list_signatures). | |
| context | Yes | Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as "a user", "the customer", or "an account". Example: "Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution." | |
| email_id | Yes | UUID of a recipient email of this signature (an `email_id` from list_signature_recipients). |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive), yet the description adds substantial behavior beyond them: it returns empty HTML for unpublished signatures, and returns 404 (no such email) versus 422 (not a recipient) for ineligible recipients. These failure modes and lifecycle constraints are exactly the kind of 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?
Front-loaded with the core action before the caveats, and every sentence carries distinct information (non-preview, publish prerequisite, empty-HTML case, error codes, alternative tool). The heavy ALL-CAPS emphasis and stacked parenthetical references make it denser than it needs to be, but 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?
An output schema exists, so return-value documentation is not the description's job, and the description still covers prerequisites, eligibility, error behavior and the alternative tool. For a 3-parameter read tool with full schema coverage and annotations, 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, and the schema already documents id, email_id and context. The description adds meaning by tying email_id to a recipient-membership requirement and its error consequences, which goes beyond the schema's 'UUID of a recipient email'. It does not add format or syntax detail beyond that, so a 4 rather than 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 ('get the REAL final installed HTML of a signature for a SPECIFIC recipient') and immediately scopes it as live published content rendered with the teammate's real values. It explicitly distinguishes itself from the nearest sibling by declaring 'This is NOT a preview' and naming preview_signature. An agent can differentiate it from preview_signature and list_signature_installations 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 an explicit prerequisite (publish_signature must run first), an eligibility constraint (the email must be a recipient — see list_signature_recipients), and a named alternative with the condition that selects it ('For a tracking-free placeholder layout check of a draft before publishing, use preview_signature instead'). When-to-use, when-not-to-use and the alternative are all covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_visitorGet a visitorARead-onlyIdempotentInspect
Fetch one identified visitor (the customer's identify subject — NOT a Scribe member) by its Scribe id — the uuid from list_visitors, not the distinct_id (to look up by distinct_id, filter list_visitors instead). Returns the visitor's distinct_id, traits (PII lives here), first/last_seen_at, first_touch attribution (the signature click that drove their first visit), and stats — the visitor's lifetime engagement (event count + total value).
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The visitor's Scribe `id` (a uuid, as returned by list_visitors) — NOT the distinct_id. | |
| context | Yes | Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as "a user", "the customer", or "an account". Example: "Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution." |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | |
| stats | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint, and destructiveHint=false, so the safety profile is covered. The description adds useful context beyond annotations by noting that traits contain PII and by explaining first_touch attribution and lifetime engagement stats. It does not discuss auth needs or rate limits, but for a read-only lookup the added disclosure is meaningful.
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 purpose is front-loaded, and the description is compact overall. It is a single dense sentence with nested parentheticals, and some return-field detail overlaps with the output schema, but every clause still provides useful orientation 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 read-only lookup with full schema coverage, annotations, and an output schema, the description covers the necessary conceptual context: what is fetched, what identifier to use, what identifier not to use, and the main returned data categories. 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%, and the schema already documents both `id` and `context` in detail. The description reinforces the critical `id` versus `distinct_id` distinction, but largely repeats what the schema says and does not add further meaning for `context`. With full schema coverage, the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: fetch one identified visitor by its Scribe `id`. It immediately distinguishes this from a Scribe member and from a distinct_id lookup, and it names `list_visitors` as the source of the id. An agent can tell exactly what this tool returns and how it differs from related list/breakdown 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?
It explicitly says to use this tool for a single identified visitor by Scribe `id`, and explicitly redirects distinct_id lookups to `list_visitors` instead. The `id` source is also stated as coming from `list_visitors`, leaving little inference required.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_visitor_breakdownVisitor acquisition breakdown (first-touch)ARead-onlyIdempotentInspect
Rank which signature template or teammate acquired the most identified visitors (the first signature click that drove their first visit): { data:[{id, label, count}], pagination }.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | 1-based page (default 1). | |
| limit | No | Page size 1–100 (default 20). | |
| context | Yes | Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as "a user", "the customer", or "an account". Example: "Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution." | |
| group_by | Yes | Rank acquisition by the first-touch dimension: signature_template | teammate. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | |
| pagination | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive/openWorld, so the safety profile is covered. The description adds the attribution semantics and sketches the return payload, but says nothing about the aggregation time window, which is the main behavioral unknown an agent would have for an analytics call.
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 leads with the ranking verb and the acquisition metric. The trailing {data:[...], pagination} sketch is mildly redundant given an output schema exists, but it is compact and not a distraction.
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 a full output schema and fully described parameters, the description only needs to supply the metric definition, which it does. The one meaningful omission is the time period the breakdown covers – an agent cannot tell whether it is all-time or a default window.
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 page/limit/context/group_by are all documented in the schema, so parameter semantics are largely handled there. The description only restates the group_by dimension ('signature template or teammate') without adding format or default 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?
Names a specific verb (rank) and resource (identified visitors acquired by signature template or teammate) and defines the attribution rule behind it. An agent can distinguish it from list_visitors or get_analytics_views, though it never explicitly points at those siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The definition of first-touch ('first signature click that drove their first visit') implies the intended question – which template or teammate drives acquisition – but there is no explicit when-to-use, exclusion, or named alternative among get_analytics_clicks, get_analytics_views, or list_visitors.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_workspaceWorkspace plan, seats & tracking setupARead-onlyIdempotentInspect
A snapshot of the current workspace's commercial state: plan (tier, kind, status, billing_interval, cancel_at_period_end + start/end dates), seat_count (invoiced seats — what Stripe is billed for), and event_tracking (conversion-tracking setup: the Event Tracking ID to paste into the website snippet / @scribemail/js init, plus whether events would be ingested). When helping a user set up conversion tracking, read the ID here and search_docs for 'conversion tracking' to walk them through the snippet, identify() and track() calls. There is no id — it is always the API key's own workspace. Read-only: plan and seats are managed in the dashboard / by the billing system, never via the API.
| Name | Required | Description | Default |
|---|---|---|---|
| context | Yes | Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as "a user", "the customer", or "an account". Example: "Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution." |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover readOnly/idempotent/non-destructive, and the description reinforces with 'Read-only' plus the valuable constraint that plan and seats cannot be mutated through the API at all. It also notes events-tracking tells whether events 'would be ingested,' a behavioral nuance not in annotations, though it does not discuss cost, rate limits, or staleness of the snapshot.
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 its components, then the workflow hint, then the scope/read-only caveats. The parenthetical enumeration of plan fields partially duplicates the output schema, which is mild redundancy but keeps the description skimmable.
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 an output schema already defines return values, the description adds the missing pieces an agent needs: scope (API key's own workspace), mutation limits, and the conversion-tracking follow-up path via search_docs. Nothing required to call it correctly is absent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the single 'context' parameter is already documented and the description needn't repeat it. It does add meaning by clarifying that no identifier parameter exists — the workspace is implied by the API key — which prevents an agent from searching the schema for an id 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?
States a specific verb+resource ('snapshot of the current workspace's commercial state') and enumerates the three returned components (plan, seat_count, event_tracking). It also disambiguates scope explicitly: 'There is no id — it is always the API key's own workspace,' which no sibling tool claims.
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 trigger ('When helping a user set up conversion tracking, read the ID here and search_docs for conversion tracking') and names the follow-on sibling tool. It also states a when-not: plan and seats are managed in the dashboard / billing system, never via the API.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
install_signatureInstall a signatureADestructiveInspect
Trigger installation of a signature template's current content to connected mail clients (without publishing), on every email it is assigned to; for one email alone, use install_signature_for_email. Returns 403 if the plan lacks signature installation, or 409 if no API signature integration is connected — in both cases the error includes a dashboard link to connect an integration or upgrade the plan; relay it to the user (the API can't run OAuth).
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The signature's UUID (the `id` from list_signatures). | |
| context | Yes | Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as "a user", "the customer", or "an account". Example: "Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution." |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, the description discloses that installation targets connected mail clients, does not publish the signature, applies to every assigned email, and can fail with 403 or 409 when plan or integration requirements are missing. It also explains that error responses include a dashboard link and must be relayed to the user because the API cannot run OAuth.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The main action and its scope are front-loaded, followed by the alternative tool and then necessary error-handling guidance. The description is dense and every sentence contributes operationally 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?
The tool mutates external mail-client state, so the description appropriately covers scope, non-publishing behavior, and common failure modes. An output schema exists, annotations cover safety traits, and the description adds the contextual details an agent needs to invoke and handle errors 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%, and both parameters are fully documented in the input schema. The description does not add parameter-specific semantics beyond the schema, so the baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: triggering installation of a signature template's current content to connected mail clients. It clearly scopes the operation to every assigned email and distinguishes it from install_signature_for_email for single-email installation.
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 names the alternative for installing on one email alone and describes the conditions under which this all-email installation applies. The 403/409 error guidance further clarifies operational prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
install_signature_for_emailInstall the signatures of one emailADestructiveInspect
Install one email's signatures now, in its mailbox alone, without reinstalling the signature for everyone else (install_signature): a send-as alias that needs its signature, one person whose details changed (a new title). Installs the installed (activated) and published signatures assigned to the email, or only signature_id, through the workspace's signature integrations (Google Workspace, Zoho Mail, Front, …). Runs in the background: the result lists what was queued, and list_signature_installations with the email_id shows each one as it ends. 409 installed_by_client when the Outlook add-in or the desktop app installs the workspace's signatures: the client picks up the latest published signature by itself, there is nothing to push, say so. 409 no_signature_to_install when no installed signature is assigned to the email; 422 not_a_recipient when signature_id is not assigned to it. Returns 403 if the plan lacks signature installation, or 409 installation_unavailable if no signature integration is connected; relay the dashboard link.
| Name | Required | Description | Default |
|---|---|---|---|
| context | Yes | Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as "a user", "the customer", or "an account". Example: "Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution." | |
| email_id | Yes | The email's UUID: the `id` from list_emails, or the `email_id` from list_signature_recipients or list_signature_installations. | |
| signature_id | No | Install only this signature (its UUID from list_signatures), one assigned to the email. Without it, every installed signature assigned to the email. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations (destructiveHint=true, openWorldHint=true) by disclosing asynchronous execution ('runs in the background', result lists what was queued), the polling path via list_signature_installations, and the full error contract: 403 plan limitation, 409 installed_by_client, 409 no_signature_to_install, 409 installation_unavailable, 422 not_a_recipient. It also tells the agent what to say to the user in the installed_by_client case, which is behavior no structured field 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?
Dense and front-loaded, with the scope constraint and the sibling contrast in the first clause. The parenthetical example list and the long error-code enumeration make it a single run-on sentence that is heavier than it needs to be, though almost every clause carries actionable content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with an output schema, an agent has everything it needs: scope, async model, follow-up polling tool, tier/setup prerequisites, and every documented failure mode with the required user-facing response. Nothing material is left unspecified.
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 email_id and signature_id are already fully documented in the schema, including the 'without it, every installed signature' default. The description restates 'or only signature_id' without adding format, validation, or sourcing detail 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 ('install one email's signatures') plus the crucial scope constraint: 'in its mailbox alone, without reinstalling the signature for everyone else'. It explicitly names the sibling install_signature as the contrasting tool, 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?
Gives concrete triggering scenarios ('a send-as alias that needs its signature, one person whose details changed') and explicitly distinguishes this from install_signature (workspace-wide). The alternative and the condition that selects it are both stated, not inferred.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_analytics_eventsList analytics eventsARead-onlyIdempotentInspect
List the raw conversion events recorded for the workspace (from the website SDK and server-to-server calls), most recent first, one row per event with its attribution uuids and its properties returned as recorded. Use it to verify that conversion tracking works, to read one visitor's event history (distinct_id) or to export rows. For counts, revenue or rankings use get_analytics_events_summary instead, which aggregates; for signature views and clicks use get_analytics_views / get_analytics_clicks; for visitor profiles use list_visitors. Events are ingested asynchronously, so one tracked seconds ago may not show yet. Read-only; needs the analytics:read scope and a plan with event tracking (403 otherwise). Returns one page (default 50, max 100); set auto_paginate to fetch up to max_pages, and truncated: true means more remain.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Filter to one event name (exact match). | |
| page | No | 1-based page (default 1). | |
| limit | No | Page size, 1–100 (default 50). | |
| context | Yes | Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as "a user", "the customer", or "an account". Example: "Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution." | |
| country | No | Filter to one country (ISO 3166-1 alpha-2, case-insensitive, e.g. FR). | |
| end_date | No | Range end (inclusive), ISO-8601 date YYYY-MM-DD. | |
| max_pages | No | Page cap when auto_paginate is true (default 5). | |
| start_date | No | Range start (inclusive), ISO-8601 date YYYY-MM-DD. Omit both dates for all time. | |
| distinct_id | No | Filter to one identified visitor's event history: their user id, the `distinct_id` from list_visitors (exact match). | |
| teammate_id | No | Filter to one teammate (UUID from list_teammates); unknown returns 404. | |
| auto_paginate | No | Fetch multiple pages up to `max_pages` (default false). | |
| marketing_campaign_id | No | Filter to one marketing campaign (UUID from list_marketing_campaigns); unknown returns 404. | |
| signature_template_id | No | Filter to one signature template (UUID from list_signatures); unknown returns 404. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | |
| truncated | Yes | True when auto_paginate stopped at max_pages with more results remaining. |
| pagination | Yes | |
| pages_fetched | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/destructive/idempotent, but the description adds material context beyond them: async ingestion means recent events may be missing, it requires the analytics:read scope and an event-tracking plan (403 otherwise), and it documents pagination behavior including auto_paginate/max_pages and the `truncated: true` overflow signal.
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: purpose and return shape first, then use cases, then sibling routing, then caveats (async, auth/plan, pagination). Every sentence carries distinct information; nothing is redundant padding despite the length.
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?
Covers everything an agent needs: what is returned, ordering, ingestion lag, permission/plan failure mode, and pagination semantics including the truncation signal. With an output schema present, return-value details need not be repeated, and the description still tells the agent enough to call and interpret results 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 every parameter and baseline is 3. The description adds value by explaining the interaction of the pagination params (one page default 50/max 100; auto_paginate fetches up to max_pages) and by framing distinct_id in terms of the list_visitors workflow, which is more than the schema states.
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?
Starts with a specific verb and resource ('List the raw conversion events recorded for the workspace') and immediately states scope and ordering ('most recent first, one row per event'). It also names the data sources (website SDK, server-to-server) which disambiguates it from the summary/view/click 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?
Gives three concrete use cases (verify tracking, read one visitor's history via distinct_id, export rows) and then explicitly routes alternative needs: get_analytics_events_summary for counts/revenue/rankings, get_analytics_views/clicks for signature views and clicks, list_visitors for profiles. Explicit when-to-use and when-to-use-something-else.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_assetsList assetsARead-onlyIdempotentInspect
List the workspace's asset library (logos, banners, profile pictures), newest first. Each has its id, a downloadable file URL, its role, in_use (a signature or the workspace picture references it) and signature_template_count. Use it to reuse an image: put an asset's id in an image block's assetUuid (see get_content_schema) rather than uploading a duplicate with create_asset. Also use it to find the id for update_asset or delete_asset, and check in_use first, since delete_asset only soft-deletes an asset in use. Deleted assets are excluded and there is no filter by role, so page through and match role or name. Read-only; needs the assets:read scope. Returns one page (default 50, max 100); set auto_paginate to fetch up to max_pages, and truncated: true means more remain.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | 1-based page (default 1). | |
| limit | No | Page size, 1–100 (default 50). | |
| context | Yes | Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as "a user", "the customer", or "an account". Example: "Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution." | |
| max_pages | No | Page cap when auto_paginate is true (default 5). | |
| auto_paginate | No | Fetch multiple pages up to `max_pages` (default false). |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | |
| truncated | Yes | True when auto_paginate stopped at max_pages with more results remaining. |
| pagination | Yes | |
| pages_fetched | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint/idempotentHint annotations it discloses deleted assets are excluded, there is no role filter so you must page and match manually, a required `assets:read` scope, paging defaults and caps, and that `truncated: true` means more remain. It also explains why `in_use` matters: delete_asset only soft-deletes an asset in use.
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 ordering, then usage, then pagination mechanics; no filler sentences. It is dense and slightly long, but each clause carries operational 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?
Covers what an agent needs to call and interpret it: return fields (id, file, role, in_use, signature_template_count), exclusions, auth scope, and pagination behavior, even though an output schema exists. Nothing material about invoking 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 baseline is 3, but the description adds meaning the schema does not: the practical consequence of paginating without a role filter, the default 50/max 100 page size, auto_paginate driving max_pages, and the `truncated` signal. It does not explain `context`, but that parameter is fully self-documenting 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 ('List the workspace's asset library') plus scope (logos, banners, profile pictures, newest first), which lets an agent separate it from create_asset/update_asset/delete_asset 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 clauses: reuse an image by putting `id` in an image block's `assetUuid` instead of 'uploading a duplicate with create_asset', and find the `id` for update_asset or delete_asset. It also names a concrete alternative path (get_content_schema) and a pre-check ('check `in_use` first'), leaving little to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_emailsList emailsARead-onlyIdempotentInspect
List the workspace's teammate email addresses, primary and aliases, newest first, each with its id, address, primary flag and owning teammate_id. Use it to get the email id that add_signature_recipients, remove_signature_recipients, update_email, delete_email, install_signature_for_email and send_test_email take. Use list_teammates instead when you also need smart-field values: it embeds each teammate's emails too. There is no address search: filter by teammate_id, or page through and match address. Deleted emails and teammates are excluded. Read-only; needs the emails:read scope. Returns one page (default 50, max 100); set auto_paginate to fetch up to max_pages, and truncated: true means more remain.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | 1-based page (default 1). | |
| limit | No | Page size, 1–100 (default 50). | |
| context | Yes | Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as "a user", "the customer", or "an account". Example: "Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution." | |
| max_pages | No | Page cap when auto_paginate is true (default 5). | |
| teammate_id | No | Filter to a single teammate's emails by their UUID (the `id` from list_teammates). An unknown id returns an empty list, not an error. | |
| auto_paginate | No | Fetch multiple pages up to `max_pages` (default false). |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | |
| truncated | Yes | True when auto_paginate stopped at max_pages with more results remaining. |
| pagination | Yes | |
| pages_fetched | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, and the description adds beyond them: the required emails:read scope, exclusion of deleted emails and teammates, page-size defaults (50/100), the auto_paginate+max_pages behavior, and the meaning of `truncated: true`.
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 every sentence earns its place: scope/return shape first, then consumer tools, then the alternative, then the no-search constraint, then pagination. 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?
Covers the identity of the resource, filtering limits, pagination semantics, scope/auth, and sibling routing; with an output schema present it correctly avoids re-explaining the raw return payload. Nothing needed 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 baseline is 3; the description adds meaning by explaining that filtering is by `teammate_id` only, that paging plus matching `address` is the search substitute, and what `truncated` signals. It stops short of documenting every parameter, so a 4 rather than 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+resource ('List the workspace's teammate email addresses, primary and aliases') and enumerates the returned fields (`id`, `address`, `primary`, `teammate_id`). It explicitly distinguishes itself from the sibling list_teammates and names the downstream tools that consume the returned `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?
Provides explicit when-to-use (get the email `id` for add/remove_signature_recipients, update_email, delete_email, etc.), a named alternative with its selection condition (list_teammates when smart-field values are also needed), and a negative constraint ('There is no address search') with a workaround.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_financial_documentsList financial documentsARead-onlyIdempotentInspect
List the workspace's financial documents (invoices and credit notes), newest first. Only documents with a downloadable PDF are returned: each carries a file ({ url, filename, content_type, byte_size }) whose url downloads the document, plus a receipt (same shape) when a separate receipt PDF exists. Use the file.url to fetch/download the document. Read-only — documents are issued by the billing system, not via the API. Paginated (page/limit).
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | 1-based page (default 1). | |
| limit | No | Page size, 1–100 (default 50). | |
| context | Yes | Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as "a user", "the customer", or "an account". Example: "Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution." | |
| max_pages | No | Page cap when auto_paginate is true (default 5). | |
| auto_paginate | No | Fetch multiple pages up to `max_pages` (default false). |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | |
| truncated | Yes | True when auto_paginate stopped at max_pages with more results remaining. |
| pagination | Yes | |
| pages_fetched | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnly/idempotent annotations, it discloses a non-obvious filtering rule (only documents with a downloadable PDF are returned), the exact response shape for `file` and optional `receipt`, and that pagination applies. These details materially change how an agent interprets an empty or partial result set.
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 scope and ordering, then result shape, then the download instruction. Minor redundancy: 'whose `url` downloads the document' and 'Use the `file.url` to fetch/download the document' say overlapping things.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only paginated list tool with full schema coverage and an output schema, this covers everything an agent needs: scope, filter behavior, ordering, result shape, and pagination. Nothing material 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 page/limit/auto_paginate/max_pages/context are already documented inline. The description's '(page/limit)' adds nothing beyond the schema and is silent on the auto_paginate/max_pages interaction and the mandatory `context` parameter, 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 workspace's financial documents'), narrows the domain to invoices and credit notes, and specifies ordering ('newest first'). No sibling tool covers financial documents, so an agent can route here without ambiguity.
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 tells the agent how to consume results ('Use the `file.url` to fetch/download the document') and closes off a wrong assumption by noting documents are issued by the billing system, not created via the API. It stops short of naming an alternative sibling for related needs, but no such alternative exists in the sibling list.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_foldersList foldersARead-onlyIdempotentInspect
List the workspace's signature folders, newest first, each with its id, name and signature_count (the signature templates it directly contains). Use it to find a folder id for update_folder, delete_folder or the folder_id of create_signature / update_signature, and to check for an existing folder before create_folder, since names need not be unique. It does not list the signatures inside a folder: use list_signatures and match each one's folder_id. A folder whose signature_count is above 0 cannot be deleted (delete_folder returns 409). Asset folders are not included. Read-only; needs the folders:read scope. Returns one page (default 50, max 100); set auto_paginate to fetch up to max_pages, and truncated: true means more remain.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | 1-based page (default 1). | |
| limit | No | Page size, 1–100 (default 50). | |
| context | Yes | Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as "a user", "the customer", or "an account". Example: "Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution." | |
| max_pages | No | Page cap when auto_paginate is true (default 5). | |
| auto_paginate | No | Fetch multiple pages up to `max_pages` (default false). |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | |
| truncated | Yes | True when auto_paginate stopped at max_pages with more results remaining. |
| pagination | Yes | |
| pages_fetched | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnly/idempotent annotations, it discloses the required folders:read scope, the 409 behavior when deleting a folder whose signature_count is above 0, and pagination semantics (default 50, max 100, truncated: true means more remain). These are substantive operational facts the annotations do not cover.
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: purpose and returned fields come first, then usage routing, then exclusions and pagination. Every clause carries actionable 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?
An output schema exists, so return-value documentation is not required, and the description still covers scope, exclusions, pagination, failure mode (409), and sibling routing. Nothing needed to call 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 description coverage is 100%, so the baseline is 3, but the description adds real meaning about the pagination parameters' interplay (auto_paginate up to max_pages, truncated signalling remaining pages) and clarifies what signature_count counts (directly contained templates only). It does not explain the required context parameter, but that is a platform-level 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?
States a specific verb+resource (list the workspace's signature folders), the ordering (newest first), and the exact fields returned (id, name, signature_count). It explicitly distinguishes itself from list_signatures and notes that asset folders are excluded, so an agent can separate it from both neighbors 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 when-to-use routing: find a folder id for update_folder/delete_folder, obtain the folder_id for create_signature/update_signature, and check existence before create_folder. It also states the when-not condition (it does not list signatures inside a folder) and names list_signatures as the alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_integration_entitiesList integration entitiesARead-onlyIdempotentInspect
List the workspace's directory org units / groups (from a teammates integration). Their uuids are what you pass to add_signature_recipient_entities to target a signature at a whole org unit. Paginated (page/limit).
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | 1-based page (default 1). | |
| limit | No | Page size, 1–100 (default 50). | |
| context | Yes | Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as "a user", "the customer", or "an account". Example: "Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution." | |
| max_pages | No | Page cap when auto_paginate is true (default 5). | |
| auto_paginate | No | Fetch multiple pages up to `max_pages` (default false). |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | |
| truncated | Yes | True when auto_paginate stopped at max_pages with more results remaining. |
| pagination | Yes | |
| pages_fetched | Yes |
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 that results are paginated and originate from a teammates integration, but says nothing about auto_paginate behavior or result volume beyond what the schema already 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?
Three short sentences, zero filler, with the core purpose and the downstream handoff front-loaded. Every sentence carries a distinct piece of 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 an output schema and rich annotations present, the description only needs to cover purpose and routing, which it does. The one gap is auto-pagination behavior, which the schema covers but the description never acknowledges.
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, limit, max_pages, auto_paginate, and context are fully documented in the schema. The description only repeats '(page/limit)' and adds no semantics for the auto-pagination parameters, 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 workspace's directory org units / groups') and identifies the data source ('from a teammates integration'). It also distinguishes itself from siblings that read signatures or integrations by explaining what the returned uuids are for.
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 directs the agent to use the returned uuids with add_signature_recipient_entities to target a whole org unit, which is a clear when-to-use signal. It does not contrast with nearby list tools such as list_teammates or list_integrations, so the routing guidance stops short of full exclusion.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_integrationsList active integrationsARead-onlyIdempotentInspect
List the workspace's active (set-up) integrations, including any currently failing. Each carries a status ("active" or "error") and, when erroring, an error_message + error_since so you can see which integrations are connected and debug what went wrong. Each also has a dashboard_url to manage or reconnect it — relay that link when an integration is in error (the API can't run OAuth). Integrations are connected and configured in the dashboard, not via the API — and connecting one (Google Workspace, Microsoft 365, Zoho Mail, …) must be done by a SUPER ADMIN of that third-party app (an Admin is enough in Zoho Mail), so guide the user rather than trying to act: use search_docs (e.g. 'connect Microsoft 365', 'Google Workspace setup') to fetch the step-by-step setup guide and walk them through it alongside the dashboard link. This is WORKSPACE-level health only — for per-email install state/errors (e.g. a recipient not found on Front) use list_signature_installations. Paginated (page/limit).
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | 1-based page (default 1). | |
| limit | No | Page size, 1–100 (default 50). | |
| context | Yes | Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as "a user", "the customer", or "an account". Example: "Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution." | |
| max_pages | No | Page cap when auto_paginate is true (default 5). | |
| auto_paginate | No | Fetch multiple pages up to `max_pages` (default false). |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | |
| truncated | Yes | True when auto_paginate stopped at max_pages with more results remaining. |
| pagination | Yes | |
| pages_fetched | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnly/idempotent annotations, the description discloses the critical constraint that the API cannot run OAuth, that connection requires a SUPER ADMIN of the third-party app (Admin suffices in Zoho Mail), that only set-up integrations are returned, and that pagination applies. This is material context 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?
Front-loaded with purpose and returned fields, then action guidance and routing. It is dense and runs long across several clauses, but each sentence (status/error fields, dashboard_url relay, admin requirement, sibling routing) carries real operational value with little 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?
Although an output schema exists, the description explains the useful return fields (status, error_message, error_since, dashboard_url) and what to do with them, covers the auth/setup constraint, and routes to the correct sibling. Nothing an agent needs to call or act on 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% and already documents page, limit, max_pages, auto_paginate, and the context field. The description's mention of 'paginated (page/limit)' only restates the schema, adding no new semantics — 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?
The first sentence states a specific verb and resource with scope: list the workspace's active integrations, including failing ones. It explicitly contrasts with list_signature_installations (per-email install state) and is clearly distinct from list_integration_entities and the many signature/folder 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?
It gives explicit when-to-use guidance plus exclusions: use list_signature_installations for per-email install errors. It also pre-empts the wrong behavior — don't try to connect integrations via the API, guide the user with search_docs and the dashboard_url instead.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_marketing_campaignsList marketing campaignsARead-onlyIdempotentInspect
List the workspace's marketing campaigns (signature banners), each with its status, schedule, targeting and content block tree. Use it to find a campaign's id before update_, schedule_, pause_, resume_, delete_ or preview_marketing_campaign; there is no single-campaign get and no server-side filter, so pick the campaign from this list. To see the rendered banner rather than its block tree, use preview_marketing_campaign. Read-only. Returns one page by default; set auto_paginate to fetch up to max_pages pages in one call, and truncated: true means more remain, so call again with a later page.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | 1-based page (default 1). | |
| limit | No | Page size, 1–100 (default 50). | |
| context | Yes | Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as "a user", "the customer", or "an account". Example: "Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution." | |
| max_pages | No | Page cap when auto_paginate is true (default 5). | |
| auto_paginate | No | Fetch multiple pages up to `max_pages` (default false). |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | |
| truncated | Yes | True when auto_paginate stopped at max_pages with more results remaining. |
| pagination | Yes | |
| pages_fetched | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive), yet the description still adds non-obvious behavior: no server-side filtering means the agent must page and scan client-side, one page is returned by default, auto_paginate respects max_pages, and `truncated: true` signals more pages remain. Those are exactly the facts needed to drive a correct loop.
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 what is returned, then when to use it, then how pagination behaves. No filler; every clause carries decision-relevant 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 5-parameter read tool with a full output schema, the description supplies the missing pieces — the absence of filters, the pagination contract, and the sibling routing. Nothing an agent needs to invoke it correctly is left 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%, so the baseline is 3; the description earns above that by explaining the interaction between `auto_paginate`, `max_pages` and the `truncated` response flag, which the schema does not connect. It stops short of documenting `limit` or `context`, but those are adequately covered by 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 ("List the workspace's marketing campaigns") and immediately disambiguates the term by equating campaigns with signature banners, then enumerates what each record contains (status, schedule, targeting, content block tree). An agent can distinguish it from list_signatures or preview_marketing_campaign 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 names the downstream calls that require an id (update_, schedule_, pause_, resume_, delete_, preview_) and states the constraint that forces this tool: "there is no single-campaign get and no server-side filter." It also routes the agent to the alternative when the goal is a rendered banner rather than a block tree.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_signature_installationsList per-email signature installation stateARead-onlyIdempotentInspect
Where each signature actually IS (or failed to be) installed, per email: one row per email × signature × integration/email client with status (installed | failed | uninstalled) and, on failure, the error_code (e.g. user_not_found = the recipient has no account on that integration). Use this to answer 'is X's signature installed on ?' or 'which installs failed and why?' — list_integrations only reports workspace-level connection health. Filter by email_id or email_address, signature_template_id, integration_id, status.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | 1-based page (default 1). | |
| limit | No | Page size, 1–100 (default 50). | |
| status | No | Restrict to one state: installed | failed | uninstalled. | |
| context | Yes | Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as "a user", "the customer", or "an account". Example: "Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution." | |
| email_id | No | Restrict to one email (its UUID). | |
| max_pages | No | Page cap when auto_paginate is true (default 5). | |
| auto_paginate | No | Fetch multiple pages up to `max_pages` (default false). | |
| email_address | No | Restrict to one email address (exact match) — no need to resolve the UUID first. | |
| integration_id | No | Restrict to one integration (its UUID from list_integrations). | |
| signature_template_id | No | Restrict to one signature template (its UUID). |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | |
| truncated | Yes | True when auto_paginate stopped at max_pages with more results remaining. |
| pagination | Yes | |
| pages_fetched | Yes |
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, but the description adds real value: it discloses the row shape, the status enum semantics, and the meaning of `error_code` (user_not_found = recipient has no account). It omits pagination behavior, but the schema covers that.
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 what the tool returns before the usage guidance, which is the right order. The trailing filter enumeration is somewhat redundant with the schema and could be trimmed, but the rest of the text is dense and waste-free.
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?
Output schema exists and annotations cover safety, so the description needn't explain return values — yet it still describes the row shape and error semantics, which is exactly the extra needed to use the tool correctly. Nothing material 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 all ten parameters are already documented; the description only restates the filterable fields at the end and adds no syntax or behavioral detail beyond what the schema provides. 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 ('where each signature actually IS... installed') and nails the result granularity: one row per email × signature × integration, with `status` and `error_code`. This is clearly distinguished from list_integrations by the sibling-scoping sentence.
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 concrete example questions it answers ('is X's signature installed on <integration>?', 'which installs failed and why?') and explicitly contrasts with the alternative: list_integrations only reports workspace-level connection health. The filter list further clarifies the intended query patterns.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_signature_recipientsList a signature's recipientsARead-onlyIdempotentInspect
REQUIRES signature_id (a signature template UUID) — there is no workspace-wide form of this tool. Without one in hand, call list_signatures first and pass an id from it. List the emails a signature is assigned to — each with the sources explaining why (manual, smart_field, or an org unit) — plus the selection config (manual ids, targeted org units, smart-field conditions, and the assign-to-all-future flag). data is paginated; selection is the full rule config.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | 1-based page (default 1). | |
| limit | No | Page size, 1–100 (default 50). | |
| context | Yes | Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as "a user", "the customer", or "an account". Example: "Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution." | |
| max_pages | No | Page cap when auto_paginate is true (default 5). | |
| signature_id | Yes | The signature template's UUID (the `id` from list_signatures). | |
| auto_paginate | No | Fetch multiple pages up to `max_pages` (default false). |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | |
| selection | Yes | |
| truncated | Yes | True when auto_paginate stopped at max_pages with more results remaining. |
| pagination | Yes | |
| pages_fetched | Yes |
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, yet the description still adds useful behavior: `data` is paginated while `selection` returns the complete rule config unpaginated, and it enumerates the `sources` values (manual, smart_field, org unit). It stops short of explaining default page size or the auto_paginate interaction, which the schema covers.
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 blocking requirement in the first clause, then describes the return shape, with no filler sentences. Dense em-dash construction makes it slightly harder to scan but every clause carries 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?
An output schema exists, so the description need not explain return values, yet it usefully summarizes them. With annotations covering the safety profile and the schema covering pagination knobs, the only minor omission is edge behavior (e.g. a signature with zero recipients).
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 earns a bump by clarifying the pagination scoping: page/limit apply to `data` only, not to the `selection` object. It also restates the origin of `signature_id`, which duplicates the schema rather than extending 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 and resource ('list the emails a signature is assigned to') and names exactly what the response contains (emails with `sources`, plus `selection` rule config). It also forecloses confusion with a sibling by declaring there is no workspace-wide variant, so an agent can tell it apart from list_signatures and list_signature_installations.
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 prerequisite (`signature_id`) and gives a concrete fallback: call list_signatures first and pass an `id` from it. That is real routing guidance, but it does not address closely related write operations (add/remove_signature_recipients, set_signature_recipient_rules) that an agent might confuse this read with.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_signaturesList signaturesARead-onlyIdempotentInspect
List the workspace's email-signature templates. A Scribe 'signature' is a reusable template (the layout that gets deployed to teammates' mail clients); v1 returns the workspace's primary templates. Paginated (page/limit). The large content/draft_content block trees are omitted by default — pass include_content:true to fetch them.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | 1-based page (default 1). | |
| limit | No | Page size, 1–100 (default 50). | |
| context | Yes | Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as "a user", "the customer", or "an account". Example: "Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution." | |
| max_pages | No | Page cap when auto_paginate is true (default 5). | |
| auto_paginate | No | Fetch multiple pages up to `max_pages` (default false). | |
| include_content | No | Include the full `content`/`draft_content` block trees. Default false: they are omitted to save tokens, but `has_content`/`has_draft_content` still tell you whether each exists. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | |
| truncated | Yes | True when auto_paginate stopped at max_pages with more results remaining. |
| pagination | Yes | |
| pages_fetched | Yes |
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 free. The description adds genuinely useful non-annotation behavior: large content trees are stripped by default to save tokens and has_content/has_draft_content still report existence. It also flags the v1 scope limit, but says nothing about the openWorld/workspace-scoping implication of 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 sentences, each doing distinct work: definition, domain disambiguation, pagination scope, and the token-saving default. The most decision-relevant constraint (content omitted by default) is stated before the call and nothing is repeated from the schema verbatim.
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 an output schema present, return values need no prose, and the description covers scope, pagination, and the content-omission default. The remaining gap is routing among the many neighbor list_* tools (variants, recipients, installations) and the required context parameter, both of which an agent must reason about unaided.
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, and the description earns an extra point by explaining the tradeoff behind include_content (token cost vs. full block trees) and by surfacing page/limit pagination semantics. auto_paginate and max_pages are left entirely to the schema, and the required context parameter is unmentioned.
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 workspace's email-signature templates") and disambiguates the overloaded term "signature" as a reusable deployment template, which distinguishes it from email/asset concepts. It does not explicitly name the near siblings (list_signature_variants, get_signature_html), so an agent still has to infer which signature-* list to pick.
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 conditional: content blocks are omitted by default, and you should pass include_content:true to fetch them, with has_content flags left as a cheap alternative. Pagination behavior is also stated. It stops short of naming alternatives for scenario-based routing (e.g. variants vs primary templates), so it is clear context rather than 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.
list_signature_variantsList signature variantsARead-onlyIdempotentInspect
List a signature's reply and internal variants (always both entries). A variant is an alternate signature shown on reply emails (reply) or internal/same-domain emails (internal). Each entry reports its state (exists / activated / hidden / show_marketing_campaigns) and content. Also returns supported: variants require an active Microsoft 365 signatures integration, and writes return 409 variants_unavailable when it's false.
| Name | Required | Description | Default |
|---|---|---|---|
| context | Yes | Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as "a user", "the customer", or "an account". Example: "Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution." | |
| signature_id | Yes | The primary signature's UUID (the `id` from list_signatures). |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | |
| supported | Yes | Whether this workspace can use variants (it has an active Microsoft 365 signatures integration). Writes return 409 variants_unavailable when false. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so safety is covered. The description adds real value beyond that: the guaranteed presence of both variant entries, the per-entry state fields (exists / activated / hidden / show_marketing_campaigns), and the `supported` flag with the 409 variants_unavailable error that downstream writes will hit.
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, each carrying distinct information: what is listed, what a variant is, and what each entry plus the `supported` gate reports. Scope constraint is front-loaded and there is no restatement of the tool name.
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 an output schema present and full annotation coverage, the description only needs to cover behavior the structured fields can't express — and it does, via the guaranteed dual entries and the `supported`/409 gating. Minor gap: it doesn't relate itself explicitly to update_signature_variant or publish_signature_variant, which are the obvious next calls when `supported` is true.
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 signature_id documented as the primary signature's UUID from list_signatures and context documented as an analytics-only field. The description adds no additional parameter meaning 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 and resource (list a signature's reply and internal variants) and immediately defines what a 'variant' is in this product's terms. It also clarifies scope ('always both entries'), which distinguishes it from list_signatures and from the get/preview siblings without requiring the schema to be opened.
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 final sentence gives actionable gating guidance: variants require an active Microsoft 365 signatures integration and the returned `supported` flag determines whether write operations are viable. It does not explicitly name the alternative read tools (list_signatures, preview_signature) or state when not to call it, so it falls 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.
list_smart_fieldsList smart fieldsARead-onlyIdempotentInspect
List the workspace's smart-field definitions — the merge fields available to signature templates (e.g. first name, job position, custom fields). Each carries its kind, whether it's a default field, and an integration_id when its values are synced. The computed Email field is not exposed. Paginated (page/limit).
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | 1-based page (default 1). | |
| limit | No | Page size, 1–100 (default 50). | |
| context | Yes | Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as "a user", "the customer", or "an account". Example: "Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution." | |
| max_pages | No | Page cap when auto_paginate is true (default 5). | |
| auto_paginate | No | Fetch multiple pages up to `max_pages` (default false). |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | |
| truncated | Yes | True when auto_paginate stopped at max_pages with more results remaining. |
| pagination | Yes | |
| pages_fetched | Yes |
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 substantive context beyond that: each item carries `kind`, a `default` flag, and an `integration_id` when synced, plus the notable exclusion that the computed Email field is not exposed — exactly the kind of scope caveat an agent cannot infer from 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?
Two tight sentences, front-loaded with the identity of the resource, followed by the useful exclusions. The trailing "Paginated (page/limit)" is redundant with a 100%-covered schema, a minor wasted clause.
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 an output schema present and full schema coverage, the description only needs to frame scope and semantics, which it does well (what a smart field is, what fields come back, what is excluded). It stops short of noting auto_paginate's role or any ordering of results, but nothing critical to a correct call 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, limit, auto_paginate and max_pages are already fully documented, and the description's "Paginated (page/limit)" merely repeats that. No added meaning about parameter behavior is provided, 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 workspace's smart-field definitions") and immediately glosses the concept as "the merge fields available to signature templates," which an agent can act on without opening the schema. It is clearly distinguishable from the create/update/delete_smart_field 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?
Usage is implied — an agent would call this to discover available merge fields before creating or previewing a signature — but the description never states when to use this versus alternatives such as create_smart_field or the integration listing tools. No exclusions or prerequisites are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_teammatesList teammatesBRead-onlyIdempotentInspect
List the workspace's teammates. A 'teammate' is a managed person whose email signature Scribe deploys; each carries their email addresses and smart-field values (the data merged into signature templates). Paginated (page/limit).
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | 1-based page (default 1). | |
| limit | No | Page size, 1–100 (default 50). | |
| context | Yes | Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as "a user", "the customer", or "an account". Example: "Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution." | |
| max_pages | No | Page cap when auto_paginate is true (default 5). | |
| auto_paginate | No | Fetch multiple pages up to `max_pages` (default false). |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | |
| truncated | Yes | True when auto_paginate stopped at max_pages with more results remaining. |
| pagination | Yes | |
| pages_fetched | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent and non-destructive, so safety is covered. The description adds useful domain context about what a teammate carries (email addresses, smart-field values) and notes pagination, but says nothing about auto_paginate behavior or result ordering beyond what the schema states.
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 short sentences, front-loaded with the action, and the teammate definition earns its place by disambiguating the domain object. The trailing 'Paginated (page/limit)' slightly duplicates the schema but is brief.
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?
Safe for a read-only list tool: the output schema covers return shape, annotations cover safety, the schema documents all parameters, and the description supplies the one thing neither does – the meaning of 'teammate'. 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 page, limit, auto_paginate, max_pages and context are fully documented in the schema. The description only echoes 'Paginated (page/limit)' without adding format or behavior detail, 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 workspace's teammates') and then defines what a teammate is, distinguishing it from signature recipients or smart fields that appear among the siblings. It does not explicitly name a sibling it differs from, so it falls just 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?
There is no guidance on when to use this instead of sibling list tools (list_signature_recipients, list_smart_fields) or sync_teammates for refreshing the roster. Usage is only implied by the tool name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_visitorsList identified visitorsARead-onlyIdempotentInspect
The workspace's identified visitors — the customer's own end-users, described by their identify calls (NOT Scribe members/teammates). Each row: distinct_id, traits (PII lives here), first/last_seen_at, and first_touch (the signature click that drove their first visit). Filter by distinct_id (exact), a trait (trait_key + trait_value, e.g. plan=enterprise), identified_via, and first-seen date range. Newest first, paginated.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | 1-based page (default 1). | |
| limit | No | Page size, 1–100 (default 50). | |
| context | Yes | Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as "a user", "the customer", or "an account". Example: "Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution." | |
| end_date | No | Only visitors first seen on/before this ISO date. | |
| max_pages | No | Page cap when auto_paginate is true (default 5). | |
| trait_key | No | Segment by a trait: the trait name (e.g. `plan`). Use with `trait_value`. | |
| start_date | No | Only visitors first seen on/after this ISO date. | |
| distinct_id | No | Find a visitor by their exact user id (distinct_id). | |
| trait_value | No | The trait value to match (e.g. `enterprise`). | |
| auto_paginate | No | Fetch multiple pages up to `max_pages` (default false). | |
| identified_via | No | Filter by acquisition channel: `browser` or `api`. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | |
| truncated | Yes | True when auto_paginate stopped at max_pages with more results remaining. |
| pagination | Yes | |
| pages_fetched | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, idempotent, non-destructive, so the description rightly doesn't restate safety. It adds real context instead: PII lives in traits, results are newest-first, and results are paginated — behaviorally useful for planning queries, though it doesn't mention cost or rate limits on auto_paginate sweeps.
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 tight sentences, front-loaded with the definition and disambiguation before returning to row shape and filters. Dense but no sentence is filler; the parentheticals earn their place by preventing the teammate/end-user confusion.
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?
An output schema exists, so return values needn't be explained, yet the description gives a useful preview of the row shape (distinct_id, traits, first/last_seen_at, first_touch). Adequate for an 11-param listing tool; only the auto_paginate/max_pages interaction is left entirely to 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?
Schema coverage is 100%, so all 11 parameters are already documented, and the description's filter summary (distinct_id exact, trait_key+trait_value with `plan=enterprise`, identified_via, date range) largely mirrors what the schema says, including the same example values. Baseline 3 applies since the schema carries the parameter burden.
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 workspace's identified visitors) and immediately disambiguates the concept: end-users from `identify` calls, explicitly NOT Scribe members/teammates. This distinguishes it from list_teammates and from the singular get_visitor without the agent 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?
Clear implied context (browse/segment the visitor population) and it enumerates the available filter dimensions, which tells the agent when this tool fits. It does not explicitly route to alternatives such as get_visitor for a single visitor or get_visitor_breakdown for aggregates, so the when-not guidance is missing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pause_marketing_campaignPause a marketing campaignAInspect
Pause an active campaign — it stops applying to signatures. Only an active campaign can be paused (otherwise 409). Resume later with resume_marketing_campaign.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The campaign's UUID (the `id` from list_marketing_campaigns). | |
| context | Yes | Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as "a user", "the customer", or "an account". Example: "Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution." |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare non-readOnly, non-destructive, non-idempotent, open-world, so the bar is lower; the description adds valuable context beyond them by disclosing the state precondition and the 409 failure mode. It does not discuss whether pausing affects already-issued signatures or reversibility beyond the resume pointer, leaving a small 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?
Two compact sentences with zero filler: effect first, then precondition, then the alternative. Front-loaded and every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present and full schema coverage, the description supplies the key missing behavioral facts (state requirement, error code, resume path). Only minor gaps remain, such as the exact effect on already-published signatures.
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 id parameter is fully documented in-schema (UUID from list_marketing_campaigns); the description adds no parameter detail. Baseline 3 is appropriate since the schema carries this dimension.
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 ('Pause an active campaign') and describes the concrete effect ('stops applying to signatures'), which an agent cannot infer from the name alone. It is clearly distinguished from resume_marketing_campaign and delete_marketing_campaign in the sibling list.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states the precondition (only an active campaign can be paused, otherwise 409) and names the natural follow-up tool (resume_marketing_campaign). The when-to-use condition is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
preview_marketing_campaignPreview a campaign (placeholder values)ARead-onlyIdempotentInspect
Render a marketing campaign's content block tree to HTML with PLACEHOLDER values — the same recipient-less, tracking-free render preview_signature does. Use it to VERIFY a banner's layout after create/update_marketing_campaign and BEFORE schedule_marketing_campaign: read the returned html, confirm it looks right, fix the content if not. An empty html means the campaign has no content yet.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The campaign's UUID (the `id` from list_marketing_campaigns). | |
| context | Yes | Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as "a user", "the customer", or "an account". Example: "Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution." |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes |
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 non-obvious behavior: values are placeholders, the render is recipient-less and tracking-free, and an empty `html` means the campaign has no content yet. The empty-result signal is exactly the kind of 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?
Three dense sentences, front-loaded with the core action, then the workflow, then the edge case. No filler, and the most decision-relevant information (what it renders, when to call it) comes first.
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?
An output schema exists so return shape need not be explained, yet the description still flags the one field that matters for interpretation (`html`) and what an empty value means. Nothing needed 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 `id` and `context` are already documented in the schema; the description adds no syntax or sourcing detail beyond what the schema states. Baseline 3 is appropriate when the schema carries the parameter burden.
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?
Specific verb and resource: 'Render a marketing campaign's `content` block tree to HTML with PLACEHOLDER values'. It also explicitly anchors itself against a sibling ('the same recipient-less, tracking-free render preview_signature does'), so an agent can distinguish it from preview_signature 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?
Gives an explicit workflow position: use it to VERIFY layout after create/update_marketing_campaign and BEFORE schedule_marketing_campaign. It also states the follow-up action (read `html`, fix content if wrong), leaving no ambiguity about when this tool is the right call.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
preview_signaturePreview a signature (placeholder values)ARead-onlyIdempotentInspect
Render a signature to HTML with PLACEHOLDER values (each smart field shows its label, like the editor canvas for an empty field) — no recipient needed. Use this to VERIFY layout and spacing after create_signature / update_signature and BEFORE publish_signature: read the returned html to confirm the result looks right (no overlapping lines, correct spacing), and fix the draft if not. Renders the draft by default; pass content:"published" for the live copy.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The signature's UUID (the `id` from list_signatures). | |
| content | No | Which tree to render: the working `draft` (default) or the live `published` content. | |
| context | Yes | Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as "a user", "the customer", or "an account". Example: "Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution." |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes |
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 still adds genuine context beyond that: smart fields render as placeholder labels (not resolved data), it works without a recipient, and it renders the draft tree unless content="published" is passed. That is meaningful disclosure for a preview tool, though it says nothing about rendering cost or limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads what the tool produces (placeholder HTML, no recipient) before the workflow guidance, and the parenthetical examples make the abstract claim concrete. It is dense and packed with em-dash clauses, slightly more than strictly needed, 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?
An output schema exists, so return values need not be enumerated, yet the description usefully points the agent at the `html` field and tells it what to look for (overlapping lines, spacing). Combined with the placeholder semantics, the draft/published switch, and the confirmed absence of a recipient requirement, 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 id, content, and context, including the draft default. The description only restates the default and glosses 'published' as 'the live copy', which adds little beyond the enum descriptions. 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 (render a signature to HTML) and immediately qualifies it with the distinguishing trait: PLACEHOLDER values, each smart field showing its label, and no recipient required. This lets an agent tell it apart from get_signature_html (real rendered output) 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 explicit workflow positioning: use it to verify layout/spacing after create_signature or update_signature and before publish_signature, and fix the draft if the result is wrong. The 'no recipient needed' clause implicitly scopes it against recipient-based rendering, but no alternative tool is named and no explicit when-not condition is stated, 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.
publish_signaturePublish a signatureADestructiveInspect
Publish a signature template: copy draft_content into the live content and, when the workspace can, trigger installation to connected mail clients. SIDE EFFECT: a successful publish also activates installation for the template (signature_installation_activated becomes true) — the signature goes live to its recipients' mail clients, not just in the API. Confirm with the user before publishing a signature that has recipients. Returns the updated template (with last_published_at set).
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The signature's UUID (the `id` from list_signatures). | |
| context | Yes | Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as "a user", "the customer", or "an account". Example: "Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution." |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Going beyond the destructive/non-idempotent annotations, it discloses the concrete side effect: a successful publish flips `signature_installation_activated` to true and pushes the signature live to recipients' mail clients, not just the API. It also states the return value (`last_published_at` set) and warns to confirm first, which is exactly the context an agent needs for a destructive, open-world write.
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 destructive side effect is front-loaded in a clearly marked 'SIDE EFFECT' sentence, and every sentence contributes: mechanism, side effect, confirmation gate, return value. It could tighten slightly with the parenthetical restatement, but 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?
With an output schema present, the description need not explain return payload structure in detail — and it still notes the updated template and `last_published_at`. Annotations cover the safety profile, and the description supplies the domain-specific consequence (live installation to recipients), leaving no material 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%, and both parameters (`id` and `context`) are thoroughly documented in the schema, including the awkward third-person `context` constraint. The description adds no parameter-specific detail; the fields it mentions (`draft_content`, `content`, `last_published_at`) are template data, not inputs. 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 (publish a signature template) and explains the mechanism: copying `draft_content` into live `content` and triggering installation. It is clearly distinct from CRUD siblings like update_signature, though it does not explicitly contrast with install_signature or publish_signature_variant.
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 clear caution — confirm with the user before publishing a signature that has recipients — which is genuinely useful gating guidance. However, it never states when to choose this over the closely named siblings install_signature, install_signature_for_email, or publish_signature_variant, leaving the agent to infer the boundary.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
publish_signature_variantPublish a signature variantADestructiveInspect
Publish a signature's reply/internal variant: copy its draft_content into the live content and redeploy through the primary signature. Returns the updated variant (with last_published_at set). Returns 409 if the variant hasn't been created yet (variant_not_created) or if the workspace lacks a Microsoft 365 signatures integration (variants_unavailable).
| Name | Required | Description | Default |
|---|---|---|---|
| kind | Yes | Which variant to publish. | |
| context | Yes | Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as "a user", "the customer", or "an account". Example: "Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution." | |
| signature_id | Yes | The primary signature's UUID (the `id` from list_signatures). |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations flag destructiveHint=true and idempotentHint=false, and the description earns credit by explaining exactly what that means: draft_content overwrites the live content. It also enumerates the 409 failure states (variant_not_created, variants_unavailable), which is context annotations cannot carry. It omits the permission/integration prerequisites and that repeated calls overwrite prior published state.
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 tight sentences: action and mechanism first, then return value, then failure modes. No filler, and the most decision-relevant information (what gets overwritten) is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present and 100% parameter coverage, the remaining burden is behavioral, and the description covers the mutation's effect and its error codes. It could still note that the primary signature must be installed/deployed for the publish to succeed, but nothing essential 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 both meaningful parameters are already documented in the schema, and the description adds only the clarification that signature_id refers to the primary signature. The free-text analytics context param is fully self-documented. 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?
Specific verb 'Publish' tied to a precise resource ('a signature's reply/internal variant'), plus the mechanism ('copy its draft_content into the live content and redeploy through the primary signature'). This clearly separates it from publish_signature (primary) and update_signature_variant (editing).
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?
Implies the precondition that a variant must already have been created and gives an explicit failure mode when it hasn't, which tells the agent when the call is valid. It stops short of naming the alternative tools (update_signature_variant, list_signature_variants) or stating when the agent should edit instead of publish.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
read_docs_pageRead a help-center pageARead-onlyIdempotentInspect
Fetch the FULL content of one Scribe help-center page by its path (from a search_docs result). Use it when the search excerpt isn't enough — e.g. to walk a user step-by-step through an integration setup, DNS configuration, or the conversion-tracking install. Public documentation; needs no scope and touches no workspace data.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Docs page path from a search_docs result (its `Page:` line), e.g. 'en/conversion-tracking'. A leading '/' and the '.mdx' extension are added automatically when missing. | |
| context | Yes | Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as "a user", "the customer", or "an account". Example: "Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution." |
Output Schema
| Name | Required | Description |
|---|---|---|
| path | Yes | Normalized page path that was read, e.g. '/en/conversion-tracking.mdx'. |
| content | Yes | Full MDX content of the page. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, and openWorld, so the safety profile is covered. The description still adds real context the annotations cannot: it is public documentation that 'needs no scope and touches no workspace data', which matters for an agent weighing auth and data-exposure concerns. Return shape is left to the 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?
Three short sentences, front-loaded with purpose before usage and then the auth/data note. Nothing is redundant and every sentence 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 an output schema covering return values and annotations covering the safety profile, the description supplies exactly the missing pieces: when to escalate from search_docs and that no scope or workspace data is involved. Nothing an agent needs to call this correctly is absent.
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 parameters — including the path format rules and the strict 'context' analytics constraint — are already fully documented in the schema. The description only restates that the path comes from a search_docs result, adding no syntax or format detail beyond it, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence states a specific verb and resource ('Fetch the FULL content of one Scribe help-center page') plus the locating key ('by its path'). It explicitly ties itself to a sibling's output ('from a search_docs result'), so an agent can distinguish it from search_docs 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?
It states the selecting condition plainly — 'Use it when the search excerpt isn't enough' — and names the sibling that produces that excerpt. Concrete escalation examples (integration setup, DNS configuration, conversion-tracking install) make the trigger unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
remove_signature_recipient_entitiesUntarget signature from org unitsADestructiveIdempotentInspect
Stop targeting a signature at a batch of directory org units / groups (by uuid). Manual and condition-based recipients are untouched. Returns the updated selection.
| Name | Required | Description | Default |
|---|---|---|---|
| context | Yes | Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as "a user", "the customer", or "an account". Example: "Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution." | |
| signature_id | Yes | The signature template's UUID (the `id` from list_signatures). | |
| integration_entity_ids | Yes | Org-unit/group uuids to untarget (from list_integration_entities). |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=true, and openWorldHint=true, so the safety profile is covered. The description adds useful behavioral context beyond the annotations: the operation is scoped to directory entity targets and explicitly leaves manual/condition-based recipients untouched, which is exactly the kind of side-effect boundary an agent needs before a destructive call.
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 tight sentences, front-loaded with the action and resource. Every sentence earns its place: action, scope exclusion, and return statement, with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive entity-removal tool with a full output schema and complete annotations, the description covers the operation, the untouched scope, and the return. Nothing an agent needs to call it correctly is missing, and the return value need not be spelled out given the 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 description coverage is 100% and every parameter is documented there, so the schema carries the semantics. The description only adds '(by uuid)' and '(batch)', which the schema already conveys via the array of integration_entity_ids and its '(from list_integration_entities)' hint — 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 ('Stop targeting a signature at a batch of directory org units / groups') and scopes it by uuid. It implicitly distinguishes itself from the sibling remove_signature_recipients by specifying org units/groups, so an agent can route between entity-level and recipient-level removal.
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 clause 'Manual and condition-based recipients are untouched' clarifies the scope, telling the agent this tool only applies to directory entity targets. However, it never explicitly names an alternative tool or the condition that would select it, so the routing guidance is inferred rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
remove_signature_recipientsRemove manual signature recipientsADestructiveIdempotentInspect
Remove a batch of manual recipients (by email uuid) from a signature. Only manual assignment is affected — emails matched by a condition or org unit stay. Returns the updated selection.
| Name | Required | Description | Default |
|---|---|---|---|
| context | Yes | Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as "a user", "the customer", or "an account". Example: "Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution." | |
| email_ids | Yes | Email uuids to unassign as manual recipients (removing a non-recipient is a no-op). | |
| signature_id | Yes | The signature template's UUID (the `id` from list_signatures). |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=true, and openWorldHint=true, so the safety profile is covered. The description adds precise blast-radius information (manual recipients only; conditioned/org-unit recipients survive) and mentions that the updated selection is returned, which goes beyond the annotation set. It does not mention permission requirements or any draft/published-state constraints.
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 short sentences, front-loaded with the action, followed by the scoping caveat and the return note. No filler or redundant restatement of the tool name.
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 an output schema present, the return value need not be explained further, and full annotation coverage handles the safety profile. The remaining minor gap is preconditions — nothing states whether the signature must be unpublished or which permissions are required for a destructive batch removal.
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 three parameters (signature_id, email_ids, context) are already documented, including the no-op behavior for non-recipients. The description restates the uuid/batch nature of email_ids but adds 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 (remove), resource (manual signature recipients), and scope (batch, by email uuid). The clause 'Only manual assignment is affected — emails matched by a condition or org unit stay' distinguishes it from the similarly named remove_signature_recipient_entities sibling without the agent needing to open 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?
Clearly signals the condition under which this tool applies — recipients that were manually assigned — and implicitly routes condition/org-unit recipients elsewhere. It stops short of naming the alternative tool explicitly, so the agent must infer that remove_signature_recipient_entities covers the other case.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
resume_marketing_campaignResume a marketing campaignAInspect
Resume a paused campaign — it becomes active again. Only a paused campaign with a future end time can be resumed (otherwise 409). Returns 403 if the workspace's plan does not include marketing campaigns.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The campaign's UUID (the `id` from list_marketing_campaigns). | |
| context | Yes | Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as "a user", "the customer", or "an account". Example: "Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution." |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond annotations by disclosing both preconditions and the two failure modes: 409 for ineligible state, 403 when the workspace plan lacks marketing campaigns. That plan-gating detail is exactly the kind of 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?
Two short sentences, front-loaded with the state transition, followed immediately by constraints and error codes. No filler or repetition of 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?
With an output schema present and annotations covering the safe-but-mutating profile, the description supplies everything needed to attempt the call correctly. A minor gap is that it doesn't say what the returned campaign object reflects (new status, schedule), though the output schema likely covers that.
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 explains that 'id' is the UUID from list_marketing_campaigns and fully specifies the 'context' analytics field. The description adds no parameter-level detail, 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?
Specific verb ('Resume') plus resource ('a paused campaign') plus the resulting state ('it becomes active again'). This cleanly separates it from pause_marketing_campaign and update_marketing_campaign without the agent needing to open 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 an explicit eligibility gate — the campaign must be paused and have a future end time — and names the failure code (409) when that gate is not met. It does not cross-reference the sibling pause/update tools, so it stops short of a full when/when-not/alternatives statement.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
schedule_marketing_campaignSchedule a marketing campaignAInspect
Launch a draft or paused marketing campaign on its own dates. If the campaign's start_time (set with create_ or update_marketing_campaign) has passed, it goes live at once and the targeted signatures Scribe pushes are reinstalled with the banner; otherwise its status becomes scheduled and it starts at start_time. Use it to launch a draft from create_marketing_campaign, after checking the banner with preview_marketing_campaign. To restart a paused campaign now, use resume_marketing_campaign, which ignores start_time; to stop one, pause_marketing_campaign; to change dates, update_marketing_campaign first. Not idempotent: a campaign that is not draft or paused, or whose end_time has passed, returns 409. Needs the marketing_campaigns:write scope; 403 if the plan lacks marketing campaigns.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The campaign's UUID (the `id` from list_marketing_campaigns). | |
| context | Yes | Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as "a user", "the customer", or "an account". Example: "Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution." |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare the generic non-read-only, non-idempotent, non-destructive profile, while the description discloses the actual state transition semantics (goes live immediately if start_time passed, otherwise status becomes scheduled), the side effect of reinstalling Scribe pushes with the banner, the 409 failure conditions, and the marketing_campaigns:write scope with a 403 for plans lacking marketing campaigns.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core behavior is front-loaded in the first two sentences, and every following sentence adds distinct routing, failure, or permission information. Despite its length, 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 an output schema present and annotations covering the safety profile, the description still supplies everything an agent needs: state preconditions, timing behavior, side effects, sibling routing, error codes, and auth requirements.
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 id and context parameters are already documented. The description ties start_time/end_time semantics to behavior but adds no syntax or meaning for the parameters themselves, 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 ('Launch a draft or paused marketing campaign') with the crucial scoping detail 'on its own dates', which is what separates it from resume_marketing_campaign. An agent can identify the 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?
Explicitly names when to use it (launch a draft from create_marketing_campaign, after checking the banner with preview_marketing_campaign) and names the alternatives with the condition that selects each: resume_marketing_campaign for restarting paused now, pause_marketing_campaign to stop, update_marketing_campaign to change dates.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_docsSearch the Scribe help centerARead-onlyIdempotentInspect
Search the official Scribe help-center documentation (help.scribe-mail.com) and return matching excerpts with titles and links. ALWAYS use this before answering product/how-to questions from memory — how smart fields work, how the editor works, DNS configuration, connecting an integration (Google Workspace, Microsoft 365, Zoho Mail, Front, …), conversion-tracking setup, plans and billing — and before telling a user something isn't possible. Results are excerpts: to read a full guide, pass the page path from a result to read_docs_page. Public documentation; needs no scope and touches no workspace data.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | What to look up, e.g. 'how do smart fields work', 'connect Microsoft 365', 'DNS'. | |
| context | Yes | Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as "a user", "the customer", or "an account". Example: "Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution." | |
| language | No | Docs language code (e.g. 'fr'). Defaults to 'en'. |
Output Schema
| Name | Required | Description |
|---|---|---|
| results | Yes | Matching excerpts with titles, links, and a `Page:` path per result (pass that path to read_docs_page for the full guide), or a no-match notice. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/openWorld/non-destructive, but the description adds that it is 'Public documentation; needs no scope and touches no workspace data', which clarifies auth requirements not in annotations, and explains the excerpt nature of results. It stops short of describing result count or rate limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and the routing instruction, then gives the trigger list and the excerpt caveat. The parenthetical example list (Google Workspace, Microsoft 365, Zoho Mail, Front, …) is slightly heavy but genuinely narrows the trigger scope.
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?
An output schema exists so return values needn't be spelled out, yet the description still notes results carry 'titles and links'. Combined with the scope statement and the handoff to read_docs_page, an agent has everything needed to call this 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 query, context, and language are already fully documented in the schema. The description only marginally links results to the sibling's input ('pass the page path from a result to read_docs_page'), which is not a parameter of this tool, 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 ('Search the official Scribe help-center documentation') plus the exact domain, and clearly distinguishes itself from the sibling read_docs_page by characterizing output as excerpts versus a full guide.
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 'ALWAYS use this before answering product/how-to questions from memory' and 'before telling a user something isn't possible', enumerating trigger topics and naming the alternative (read_docs_page) with the condition that selects it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
send_feedbackSend feedback to the Scribe teamAInspect
Send a bug report, missing-capability request, or question straight to the Scribe team. When a tool fails unexpectedly, a capability the user needs is missing, or the docs can't answer their question, OFFER the user to report it — and only send after they agree (the report includes their workspace identity). Works with any valid API key, no extra scope. Returns { received: true } once accepted; the team reads every report.
| Name | Required | Description | Default |
|---|---|---|---|
| context | Yes | Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as "a user", "the customer", or "an account". Example: "Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution." | |
| message | Yes | The feedback itself (max 5000 chars). Include what was attempted, what happened, and what was expected — enough for the team to act without this conversation. | |
| category | Yes | bug: a tool errored or behaved wrong. missing_capability: the user needed something the API/MCP can't do. question: unanswered product question. other: anything else. | |
| reporter | No | Who is reporting (e.g. the user's email), ONLY if the user agreed to share it. | |
| tool_name | No | The MCP tool or API endpoint the feedback is about, when applicable. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare a non-read-only, non-idempotent, open-world write, and the description adds substantial context beyond them: the report carries the workspace identity, consent is mandatory before sending, no extra auth scope is needed, and it returns {received: true}. That 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?
Three tight sentences, front-loaded with purpose, then usage/consent, then operational facts. 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 single write tool with a full output schema, it covers purpose, triggers, consent workflow, identity disclosure, and auth scope. The return value explanation is bonus rather than a gap, since an output schema exists.
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 five parameters (including the sensitive context field and the enum) are already fully documented in the schema. The description adds no parameter-level syntax or format detail beyond what structured data 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 (send) and resource (feedback) with the exact content types accepted: bug report, missing-capability request, or question. No sibling tool in the list covers this function, so an agent can identify it immediately 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 enumerates the triggering conditions (tool fails unexpectedly, capability missing, docs can't answer) and pairs them with the required consent step ('OFFER the user... only send after they agree'). This is precisely when-to-use plus a precondition, 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.
send_test_emailSend yourself a test of a signatureAInspect
Mail the user a test of a signature's DRAFT, to their own inbox and no one else's: what publish would install (the published design when the signature has no draft), with one email's real values and no tracking. To see a design in a real mail client (dark mode, Outlook, a phone) before anyone gets it: use it instead of copying, assigning, publishing or installing a signature to check it. There is no recipient to set: it goes to the signed-in user's own address (sent_to in the result), never a teammate's or anyone else's. email_id chooses whose values show; the user's own by default. Sent in the background, usually within a minute. 10 an hour per user: 429 rate_limited past that, say so and stop. 422 on email_id when the user has no address in the workspace (ask whose values to show), or on draft_content when the signature has no design yet. Unknown signature or email → 404.
| Name | Required | Description | Default |
|---|---|---|---|
| context | Yes | Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as "a user", "the customer", or "an account". Example: "Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution." | |
| email_id | No | UUID of the email whose values (name, title, phone…) the test shows: the `id` from list_emails, e.g. a teammate's, to see their signature. Omit for the user's own address in the workspace. It only chooses the values: the mail still goes to the user alone. | |
| signature_id | Yes | UUID of the signature to test (from list_signatures). |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With annotations present, it still adds substantial context: the send goes only to the signed-in user's address (surfaced as `sent_to`), runs in the background within a minute, and is capped at 10/hour with a 429 `rate_limited` response. It also enumerates 422 and 404 failure conditions, which 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-loads purpose, recipient constraint, and usage in the first two clauses, then attaches timing, rate limit, and error semantics. Dense but every sentence carries information; only the error enumeration borders on over-packed.
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?
An output schema exists so return values need not be explained, and annotations cover the safety profile. The description still supplies recipient behavior, async timing, rate limits, and error codes, leaving nothing an agent needs 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 baseline is 3, but the description adds real meaning: it clarifies `email_id` only selects whose values display (the user's own by default) while the mail still goes to the user alone, and ties a 422 to `email_id` when the user has no workspace address. This goes beyond the schema's field-level 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 ('Mail the user a test of a signature's DRAFT') plus precise scope ('their own inbox and no one else's'). It explicitly frames what would be installed, cleanly separating it from preview_signature, publish_signature, and install_signature.
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 see a design in a real mail client before anyone gets it') and names the alternatives it replaces ('instead of copying, assigning, publishing or installing a signature to check it'). Nothing 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.
set_signature_recipient_rulesSet signature recipient rulesADestructiveIdempotentInspect
Set a signature's rule-based targeting: the smart-field conditions tree and/or the assign_to_all_future_emails flag (provide at least one). Replaces conditions wholesale; manual and org-unit targeting are untouched. An unknown field or bad operator fails with 422.
| Name | Required | Description | Default |
|---|---|---|---|
| context | Yes | Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as "a user", "the customer", or "an account". Example: "Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution." | |
| conditions | No | Replace the smart-field rule tree: an array of OR-groups, each an array of ANDed conditions. Pass [] to clear all conditions. | |
| signature_id | Yes | The signature template's UUID (the `id` from list_signatures). | |
| assign_to_all_future_emails | No | Whether the signature auto-assigns to newly-created emails. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=true, so the safety profile is covered. The description adds real specifics beyond that: conditions are replaced wholesale rather than merged, and invalid input fails with 422. Those details materially change how an agent should prepare the call. It does not cover rate limits or auth scoping, keeping it off 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 tight sentences with zero filler. The core capability and the at-least-one precondition are front-loaded, followed by the replacement semantics and the error behavior, in order of decision-relevance.
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?
An output schema exists, so return values need no explanation, and annotations cover the safety profile. The description supplies the destructive-replacement nuance and the 422 failure mode, which are the main things an agent needs before calling. Only the absence of guidance on sourcing smart_field_id constraints (beyond the schema reference) keeps this from a 5.
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 every parameter (including the nested condition shape and the context field) is already documented in the schema. The description names the two meaningful inputs but adds no format or syntax detail beyond what the schema provides. Baseline 3 is correct 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 (Set) plus the resource (a signature's rule-based targeting) and enumerates exactly what is set: the `conditions` tree and/or the `assign_to_all_future_emails` flag. It also carves out what it does not touch (manual and org-unit targeting), which cleanly separates it from sibling tools like add_signature_recipients.
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 caller a precondition: provide at least one of conditions or assign_to_all_future_emails. The note that manual and org-unit targeting are untouched implies other tools handle those cases, but no sibling is named outright, so it falls short of a full when/when-not routing statement.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sync_teammatesSync teammates nowADestructiveInspect
Resync the workspace's team now, as the dashboard's Refresh does, instead of waiting for the daily sync: every activated teammates integration (a directory such as Google Workspace, Microsoft Entra ID or Zoho Mail) and smart fields integration (BambooHR, Okta, …) syncs, so new people, aliases and changed details (a job title) reach Scribe and their signatures. A teammates sync can add and remove teammates, a smart fields sync changes and clears their values; both install their signatures, and neither mails anyone. Takes no argument. The syncs run in the background: the result lists those started. An integration whose sync already runs, or that lost its access, is left out. 409 sync_already_running when every sync already runs, integration_access_lost when every integration must be reconnected first, no_integration_to_sync when none is connected (relay the dashboard link).
| Name | Required | Description | Default |
|---|---|---|---|
| context | Yes | Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as "a user", "the customer", or "an account". Example: "Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution." |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (readOnlyHint=false, destructiveHint=true, openWorldHint=true), the description discloses the real consequences: teammates syncs can add and remove people, smart fields syncs change and clear values, signatures get installed, no email is sent, execution is backgrounded, skipped integrations are left out, and it documents three distinct 409 error codes with remediation hints. This is exactly the kind of mutation-side-effect disclosure the 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?
The definition is front-loaded with the core action and then layers consequences and error codes, with no filler sentences. It is dense and longer than typical, but the length is defensible for a destructive, background-executing bulk operation with three failure modes.
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 an output schema present and annotations covering the safety profile, the description supplies the remaining context an agent needs: scope of what syncs, side effects, background execution, skip behavior, and every documented error code. Nothing material about 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% and there is only one parameter (an analytics-only 'context' rationale), so the schema already carries the semantics; baseline 3 applies. 'Takes no argument' adds mild reassurance that no business input is needed, but it arguably sits in slight tension with a required 'context' field, so no bump is warranted.
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 (resync) and resource (the workspace's team) and anchors it to a known mental model ('as the dashboard's Refresh does'), which separates it cleanly from list_teammates, create_teammate and update_teammate. It also enumerates exactly what gets synced (teammates integrations, smart fields integrations), so an agent knows this is a bulk refresh trigger, not a per-entity CRUD call.
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 clear use condition: call this to sync immediately 'instead of waiting for the daily sync'. That is actionable context. It does not, however, state a when-not case or point to a sibling alternative (e.g. list_integrations to check connectivity first), so it falls short of explicit routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_assetUpdate an assetADestructiveIdempotentInspect
Update an asset's metadata (name and/or role) by UUID. The image bytes can't be changed — create a new asset to replace them. An unknown role returns 422.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The asset's UUID (the `id` returned by list_assets). | |
| name | No | New display name. | |
| role | No | New role (company_logo / profile_picture / banner), or null to clear it. | |
| context | Yes | Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as "a user", "the customer", or "an account". Example: "Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution." |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (destructive, idempotent, open-world), and the description adds two things they don't: partial-update semantics (name and/or role, not the image bytes) and a concrete failure mode ('an unknown role returns 422'). It does not explain that omitted fields are left untouched or what the response contains, but with an output schema that gap is minor.
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 short sentences, front-loaded with the scope, then the constraint, then the error case. No filler and nothing buried.
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 4-param mutation with full schema and annotation coverage plus an output schema, the description covers scope, the immutability constraint, the sibling alternative, and one error code. It could note that at least one of name/role must be supplied, but 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 coverage is 100%, so the schema already carries the role enum, the null-to-clear behavior, and the UUID linkage to list_assets. The description only restates the two mutable fields, adding no syntax or format detail beyond the schema – baseline 3.
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?
"Update an asset's metadata (name and/or role) by UUID" gives a specific verb, resource, and the exact mutable fields, which separates it immediately from create_asset, delete_asset, and list_assets. An agent does not need the schema to know what this does.
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 excludes a use case ('the image bytes can't be changed') and names the alternative ('create a new asset to replace them'), which is a genuine when-not plus a redirect to a sibling. That is exactly the routing information an agent needs between update_asset and create_asset.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_emailUpdate an email's addressADestructiveIdempotentInspect
Change an email's address (works for primary and alias addresses). Only available when the workspace manages its own team list — a directory integration returns a 409 conflict. The new address is validated → 422 on failure.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The email's UUID (the `id` returned by list_emails). | |
| address | Yes | The new email address. | |
| context | Yes | Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as "a user", "the customer", or "an account". Example: "Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution." |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the mutation profile (destructiveHint=true, idempotentHint=true, openWorldHint=true), so the description's job is to add context beyond them, which it does via the 409 conflict path and 422 validation failure on the new address. It stops short of saying what happens to the previous address or existing signature installations tied to it.
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 that front-load the operation, then the availability constraint, then the failure modes. No filler and no repetition of the title or 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?
An output schema exists, so return values need not be described, and the description covers the key operational constraints and error codes. It is nearly complete for a mutation tool, with the only gap being the side effects of replacing an address (e.g., downstream signature or teammate references).
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 genuine meaning by noting the address is validated and that this applies to both primary and alias addresses, clarifying intent beyond the schema's plain "The new email address." The required `context` analytics parameter is only explained in the schema, not 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 precise verb and resource ("Change an email's address") and adds scope coverage for both primary and alias addresses. It is unambiguous against siblings like create_email or delete_email, though it never names a sibling explicitly to route the agent.
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 and an explicit exclusion condition: usable only when the workspace manages its own team list, and a directory integration produces a 409 conflict. An agent can decide up front whether this call is even legal in the current workspace.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_folderRename a folderADestructiveIdempotentInspect
Rename an existing signature folder by UUID; the name is the only folder property you can change. The folder keeps its id and its signatures, so prefer this over create_folder plus delete_folder when only the name is wrong. To move a signature into or out of a folder, use update_signature with folder_id instead; to remove the folder, use delete_folder. Overwrites the previous name and returns the folder with its signature_count. Needs the folders:write scope; an unknown id returns 404 and a blank name 422.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The folder's UUID (the `id` returned by list_folders). | |
| name | Yes | The new folder name; replaces the current one. Must not be blank (422). Other folders may already use the same name. | |
| context | Yes | Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as "a user", "the customer", or "an account". Example: "Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution." |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond annotations by disclosing that the previous name is overwritten, that the id and signatures are preserved, that the folders:write scope is required, and that unknown ids return 404 while blank names return 422. All of this is consistent with destructiveHint=true and idempotentHint=true (overwrite is idempotent) – no contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core action and scope, then packs routing guidance and error/auth behavior into two dense but waste-free sentences. Nothing is repeated from the schema for its own sake.
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 this is thorough: it covers what changes, what is preserved, required scope, error conditions, and alternatives. Since an output schema exists, the brief mention of signature_count in the return is a bonus rather than a required 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 coverage is 100%, so all three parameters are already documented in the schema, which sets the baseline at 3. The description reinforces the UUID identifier ('by UUID', matching list_folders output) and the overwrite semantics of name, 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 (rename) and resource (signature folder), and clarifies scope by declaring the name is the only mutable property. It also distinguishes itself from create_folder/delete_folder, so 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?
Explicit routing: 'prefer this over create_folder plus delete_folder when only the name is wrong', 'to move a signature ... use update_signature with folder_id', 'to remove the folder, use delete_folder'. Both when-to-use and when-not-to-use with named alternatives are present.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_marketing_campaignUpdate a marketing campaignADestructiveIdempotentInspect
Update a marketing campaign by UUID. Only the fields you pass change (omit = leave as-is; content: null clears it). status is read-only — use schedule/pause/resume to change it. Invalid enums, unknown smart fields, or unknown signature templates return 422.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The campaign's UUID (the `id` from list_marketing_campaigns). | |
| name | No | ||
| content | No | Campaign block tree (ILayoutBlock): a `stack` root whose `children` are blocks. Strict-validated server-side. Omit to leave unchanged; null to clear. Every node (block AND token) needs an `id` that is a fresh LOWERCASE uuid — any other string, including an uppercase uuid, is rejected 422. Every numeric size is in PIXELS, never a CSS multiplier: `lineHeight` is a px line box (~1.3x fontSize, e.g. fontSize 14 -> 18), so 1.3 is rejected. Call get_content_schema for the full schema, every enum value, and a worked example. | |
| context | Yes | Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as "a user", "the customer", or "an account". Example: "Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution." | |
| end_time | No | ISO-8601 end of the campaign window. | |
| behaviour | No | How the campaign content combines with the signature (replace or append). | |
| time_zone | No | IANA time zone, e.g. 'Europe/Paris'. | |
| send_email | No | ||
| start_time | No | ISO-8601 start of the campaign window. | |
| filter_kind | No | Which targeting dimension applies: by signature_templates or by smart_fields conditions. | |
| signature_template_ids | No | UUIDs of the signature templates to apply the campaign to (replaces the set; [] clears). | |
| smart_fields_conditions | No | Smart-field targeting: an array of OR-groups, each an array of AND-conditions { smart_field_id (uuid), operator, values }. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructive/idempotent/openWorld, and the description correctly adds non-obvious behavior on top: omit-equals-unchanged, `content: null` as the explicit clear, and 422 as the failure mode for bad enums, smart fields, or signature templates. It does not explain what makes the call destructive in the annotations' sense beyond content clearing, nor any permission or rate-limit 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?
Three short sentences, front-loaded with the identity (UUID) and the patch semantics, then error behavior last. Every clause carries information an agent would otherwise have to infer or discover on a 422.
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, deeply nested mutation with an output schema, this covers the essentials: lookup key, partial-update semantics, content clearing, blocked field, and validation failures, with content-schema detail delegated to a sibling. The remaining gap is that no guidance is given on ordering against preview_marketing_campaign or on how filter_kind governs the targeting 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 coverage is already 83%, but the description still adds real meaning: the null-vs-omit distinction for `content`, the prohibition on changing `status`, and the pointer to get_content_schema for the block tree's enums and worked example. It does not address the interaction between `filter_kind` and its two targeting payloads, which is the one semantic gap 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 and resource ("Update a marketing campaign by UUID") and immediately scopes it against the lifecycle siblings by declaring `status` read-only and routing status changes to schedule/pause/resume. An agent can distinguish this from pause_marketing_campaign, resume_marketing_campaign, schedule_marketing_campaign, and create_marketing_campaign 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 an explicit alternative plus the condition that selects it ("status is read-only — use schedule/pause/resume to change it") and defers content structure to get_content_schema. It also states the partial-update contract ("only the fields you pass change"), which tells the agent this is a patch, not a replace-all.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_signatureUpdate a signatureADestructiveIdempotentInspect
Update a signature template by UUID. Stages draft_content (the working copy) — the live content only changes when you publish_signature. Only the fields you pass change (omit = leave as-is; draft_content: null / folder_id: null clear them). When editing draft_content, call get_content_schema first for the block-tree schema, enum values (incl. the non-obvious icon names), and a worked example; an invalid tree returns 422 naming each offending field and its allowed values. Blocks are CLOSED: every key you add must exist in the schema, so build each block by adapting the schema's example rather than attaching extra keys to carry styling or smart-field values — an invented key fails the whole update with unknown_property.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The signature's UUID (the `id` from list_signatures). | |
| name | No | ||
| context | Yes | Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as "a user", "the customer", or "an account". Example: "Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution." | |
| priority | No | Ordering priority (lower = higher). | |
| folder_id | No | UUID of the folder to file the signature under; null detaches it. | |
| draft_content | No | Draft block tree (ILayoutBlock): a `stack` root whose `children` are blocks. Strict-validated server-side. Omit to leave unchanged; null to clear. Every node (block AND token) needs an `id` that is a fresh LOWERCASE uuid — any other string, including an uppercase uuid, is rejected 422. Every numeric size is in PIXELS, never a CSS multiplier: `lineHeight` is a px line box (~1.3x fontSize, e.g. fontSize 14 -> 18), so 1.3 is rejected. Call get_content_schema for the full schema, every enum value, and a worked example. | |
| signature_installation_activated | No | Whether installation is activated for this template. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare destructiveHint=true and idempotentHint=true, but the description supplies the context that makes those meaningful: only the draft is mutated, fields not passed are preserved, nulls clear fields, and invalid trees fail with a 422 naming each offending field. It further discloses the closed-block `unknown_property` failure mode, which is non-obvious and materially affects how the tool is called.
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 draft-vs-live rule, then validation guidance; nearly every sentence carries operational weight. It does restate some schema-level detail (lowercase UUIDs, pixel sizing, call get_content_schema) that also appears in the parameter descriptions, so it is slightly redundant rather than maximally tight.
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?
Covers the draft/publish lifecycle, partial-update semantics, the prerequisite schema-fetch step, and the failure modes an agent will hit (422 field errors, unknown_property). With an output schema present, nothing further about return values is required.
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 already 86%, so the baseline is 3; the description still adds real semantics for the trickiest parameters — partial-update/clearing behavior for `draft_content` and `folder_id`, and the lowercase-UUID and pixel-vs-multiplier constraints. Minor overlap with the schema's own parameter notes keeps it 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?
States a specific verb and resource plus the identifier ('Update a signature template by UUID'), and implicitly scopes the write to the draft copy, which separates it from publish_signature and update_signature_variant. An agent can identify the target object and action 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 this stages `draft_content` and that live `content` only changes via `publish_signature`, so the when-to-use vs. the publish sibling is unambiguous. It also routes to `get_content_schema` before editing and explains partial-update semantics (omit = leave as-is, null = clear).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_signature_variantUpdate a signature variantADestructiveIdempotentInspect
Create or update a signature's reply/internal variant (upsert). Passing draft_content or activated: true creates the variant if it doesn't exist yet. draft_content stages the variant's working copy — publish_signature_variant copies it live. Also toggles activated (use a distinct variant vs. the primary), hidden (show no signature on this kind of email), and show_marketing_campaigns. Only the fields you pass change (omit = leave as-is; draft_content: null clears it). When editing draft_content, call get_content_schema first. Variants require an active Microsoft 365 signatures integration — otherwise 409 variants_unavailable.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | Yes | Which variant: reply (reply emails) or internal (same-domain emails). | |
| hidden | No | Hide any signature on this kind of email. | |
| context | Yes | Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as "a user", "the customer", or "an account". Example: "Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution." | |
| activated | No | Use a distinct variant on this kind of email (creates it if needed). | |
| signature_id | Yes | The primary signature's UUID (the `id` from list_signatures). | |
| draft_content | No | Variant draft block tree (ILayoutBlock): a `stack` root whose `children` are blocks. Strict-validated server-side. Setting it creates the variant if needed. Omit to leave unchanged; null to clear. Every node (block AND token) needs an `id` that is a fresh LOWERCASE uuid — any other string, including an uppercase uuid, is rejected 422. Every numeric size is in PIXELS, never a CSS multiplier: `lineHeight` is a px line box (~1.3x fontSize, e.g. fontSize 14 -> 18), so 1.3 is rejected. Call get_content_schema for the full schema, every enum value, and a worked example. | |
| show_marketing_campaigns | No | Append marketing campaigns on this kind of email. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, the description discloses partial-update semantics, that omitted fields remain unchanged, that `draft_content: null` clears content, and that variants require an active Microsoft 365 signatures integration or return 409. These details are consistent with the destructive and idempotent hints.
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 upsert purpose, then covers staging, toggles, partial updates, preconditions, and the integration requirement in dense but useful sentences. There is little wasted text for a complex mutation 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?
Given the mutation risk, complex content schema, annotations, and the presence of an output schema, the description provides the essential behavioral and precondition context an agent needs. It explains creation, update, clearing, staging, publishing, and integration availability.
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 already 100%, so the schema documents each parameter. The description still adds useful meaning by explaining the working-copy versus live-publish relationship for `draft_content` and the creation trigger for `activated`, though much of the per-field meaning is already present 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?
The description opens with a specific verb and resource: create or update a signature's reply/internal variant as an upsert. It clearly scopes the tool to variants and distinguishes it from sibling operations such as publish_signature_variant.
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 explicit creation conditions (`draft_content` or `activated: true`), explains that `draft_content` stages the working copy while publish_signature_variant makes it live, and says to call get_content_schema before editing content. It also states the Microsoft 365 integration prerequisite and the 409 failure condition.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_smart_fieldUpdate a smart fieldADestructiveIdempotentInspect
Change an existing custom smart field's definition: its label, kind, required flag or integration binding. Only the fields you pass change, and the field keeps its id, so templates and campaign conditions that reference it still point to it. Use create_smart_field for a new field, delete_smart_field to remove one, and update_teammate to set a teammate's value (this tool never writes values directly). Binding a new integration or attribute queues a re-sync of the teammates' values from it (integrations never fill url fields); unlinking stops the sync. Overwrites the previous definition and returns the field. Needs the smart_fields:write scope; default fields are read-only (422), the computed Email field is not addressable (404), and a taken label, an invalid kind or an unknown integration returns 422.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The smart field's UUID (the `id` returned by list_smart_fields). | |
| kind | No | New field type. | |
| label | No | New display name. Must be unique in the workspace (422 `taken` otherwise). | |
| context | Yes | Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as "a user", "the customer", or "an account". Example: "Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution." | |
| required | No | Whether teammates must fill this field. | |
| integration_id | No | UUID of a workspace integration to sync values from (a directory or HR/enrichment integration from list_integrations). Pass null to unlink, which also clears integration_attribute. Omit to leave unchanged. | |
| integration_attribute | No | The integration's attribute key (required when the field is bound to an integration; 422 without it). Changing it re-syncs the field's values. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well past annotations (destructive/idempotent/openWorld) by disclosing concrete consequences: templates and campaign conditions keep pointing at the field because id is preserved, binding an integration queues a re-sync, unlinking stops it, integrations never fill url fields, and the previous definition is overwritten. Also lists required scope and the 422/404 failure modes (read-only defaults, non-addressable Email field, taken label, invalid kind, unknown integration).
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 side effects, then errors – a sensible order with no filler sentences. It is dense and long for a single paragraph, so findability of the error codes suffers 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?
For a destructive, integration-touching mutation with an output schema present, the description covers what is overwritten, what is preserved, who is affected by syncs, permissions, and error semantics. An agent has everything needed to call it correctly and to anticipate failure responses.
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 adds genuine semantic value beyond it with the partial-update contract ('Only the fields you pass change') and the re-sync side effect of changing a binding. It does not restate enum values or per-parameter formats, which the schema already handles well.
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?
Specific verb+resource ('Change an existing custom smart field's definition') plus an enumeration of what is mutable (label, kind, required flag, integration binding). It also distinguishes itself from create_smart_field, delete_smart_field and update_teammate by name.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent: create_smart_field for new fields, delete_smart_field to remove, update_teammate to set a teammate's value, and states the negative boundary 'this tool never writes values directly'. No inference required.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_teammateUpdate a teammate's smart fieldsADestructiveIdempotentInspect
Set a teammate's smart-field values. Pass the teammate's UUID and an array of { smart_field_id, value }. Only manually-editable fields change — integration-synced and image fields in the payload are ignored. Email addresses are managed separately, not here.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The teammate's UUID (the `id` returned by list_teammates). | |
| context | Yes | Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as "a user", "the customer", or "an account". Example: "Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution." | |
| smart_fields | Yes | Smart-field values to set, by smart_field_id (UUID). Fields synced from an integration (non-null integration_id) and image fields are skipped silently; an unknown id or a value invalid for its field type fails the whole update. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag this as destructive, idempotent, and open-world, so the bar is lower. The description adds genuinely non-obvious behavior: integration-synced and image fields are silently skipped, and an unknown id or type-invalid value aborts the entire update. It stops short of saying overwritten values are unrecoverable despite destructiveHint=true.
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 tight sentences, front-loaded with the action, then the payload shape, then the scope exclusion. Slight overlap with schema wording in the middle sentence, but nothing is wasted.
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 an output schema present, return values needn't be described, and annotations cover the safety profile. The description supplies the field-filtering and atomicity constraints, leaving only reversibility of the write unaddressed.
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 the id, the smart_fields item shape, the skip rules, and the all-or-nothing failure mode. The description restates this payload contract rather than adding syntax, defaults, or ordering semantics 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?
Specific verb ('Set') plus resource ('a teammate's smart-field values'), which cleanly separates it from update_smart_field (field definitions), create_teammate, and delete_teammate. An agent can route here 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 carves out email addresses as out of scope ('managed separately, not here') and implicitly scopes to manual fields only. It does not name update_smart_field or sync_teammates as alternatives, so routing guidance is clear but not exhaustive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
6 tool updates
- Changed
create_marketing_campaign2 fields changed- added
Output schema / properties / data / properties / name / descriptionAdded value: +"Campaign name. Null for a legacy draft that was saved without one. Report it as an unnamed draft and refer to it by its id rather than inventing a name." - changed
Output schema / properties / data / properties / name / typePrevious value: -"string"New value: +[ + "string", + "null" +]
- Changed
list_marketing_campaigns2 fields changed- added
Output schema / properties / data / items / properties / name / descriptionAdded value: +"Campaign name. Null for a legacy draft that was saved without one. Report it as an unnamed draft and refer to it by its id rather than inventing a name." - changed
Output schema / properties / data / items / properties / name / typePrevious value: -"string"New value: +[ + "string", + "null" +]
- Changed
pause_marketing_campaign2 fields changed- added
Output schema / properties / data / properties / name / descriptionAdded value: +"Campaign name. Null for a legacy draft that was saved without one. Report it as an unnamed draft and refer to it by its id rather than inventing a name." - changed
Output schema / properties / data / properties / name / typePrevious value: -"string"New value: +[ + "string", + "null" +]
- Changed
resume_marketing_campaign2 fields changed- added
Output schema / properties / data / properties / name / descriptionAdded value: +"Campaign name. Null for a legacy draft that was saved without one. Report it as an unnamed draft and refer to it by its id rather than inventing a name." - changed
Output schema / properties / data / properties / name / typePrevious value: -"string"New value: +[ + "string", + "null" +]
- Changed
schedule_marketing_campaign2 fields changed- added
Output schema / properties / data / properties / name / descriptionAdded value: +"Campaign name. Null for a legacy draft that was saved without one. Report it as an unnamed draft and refer to it by its id rather than inventing a name." - changed
Output schema / properties / data / properties / name / typePrevious value: -"string"New value: +[ + "string", + "null" +]
- Changed
update_marketing_campaign2 fields changed- added
Output schema / properties / data / properties / name / descriptionAdded value: +"Campaign name. Null for a legacy draft that was saved without one. Report it as an unnamed draft and refer to it by its id rather than inventing a name." - changed
Output schema / properties / data / properties / name / typePrevious value: -"string"New value: +[ + "string", + "null" +]
36 tool updates
- Changed
create_asset2 fields changed- removed
Output schema / properties / data / properties / name / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / data / properties / name / typeAdded value: +[ + "string", + "null" +]
- Changed
create_marketing_campaign7 fields changed- changed
Input schema / properties / content / anyOfPrevious value: -[ - { - "additionalProperties": {}, - "properties": { - "blockStyle": { - "additionalProperties": {}, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "children": { - "items": { - "additionalProperties": {}, - "properties": { - "id": { - "description": "Lowercase uuid (8-4-4-4-12 hex), e.g. 6f1e8a2c-4b0d-4c8e-9f3a-2d7b5e9c1a4f. Generate a fresh one per element and keep it stable across updates so a link keeps its click-tracking identity.", - "pattern": "^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$", - "type": "string" - }, - "role": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "type": { - "enum": [ - "stack", - "text", - "image", - "icon", - "list", - "listItem", - "listItemLabel", - "socialList", - "socialListItem", - "button", - "divider", - "marketing" - ], - "type": "string" - }, - "visible": { - "type": "boolean" - } - }, - "required": [ - "id", - "type", - "role", - "visible" - ], - "type": "object" - }, - "type": "array" - }, - "id": { - "description": "Lowercase uuid (8-4-4-4-12 hex), e.g. 6f1e8a2c-4b0d-4c8e-9f3a-2d7b5e9c1a4f. Generate a fresh one per element and keep it stable across updates so a link keeps its click-tracking identity.", - "pattern": "^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$", - "type": "string" - }, - "role": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "type": { - "const": "stack", - "type": "string" - }, - "visible": { - "type": "boolean" - } - }, - "required": [ - "id", - "type", - "role", - "visible", - "blockStyle", - "children" - ], - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": {}, + "properties": { + "blockStyle": { + "additionalProperties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "children": { + "items": { + "additionalProperties": {}, + "properties": { + "id": { + "description": "Lowercase uuid (8-4-4-4-12 hex), e.g. 6f1e8a2c-4b0d-4c8e-9f3a-2d7b5e9c1a4f. Generate a fresh one per element and keep it stable across updates so a link keeps its click-tracking identity.", + "pattern": "^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$", + "type": "string" + }, + "role": { + "type": [ + "string", + "null" + ] + }, + "type": { + "enum": [ + "stack", + "text", + "image", + "icon", + "list", + "listItem", + "listItemLabel", + "socialList", + "socialListItem", + "button", + "divider", + "marketing" + ], + "type": "string" + }, + "visible": { + "type": "boolean" + } + }, + "required": [ + "id", + "type", + "role", + "visible" + ], + "type": "object" + }, + "type": "array" + }, + "id": { + "description": "Lowercase uuid (8-4-4-4-12 hex), e.g. 6f1e8a2c-4b0d-4c8e-9f3a-2d7b5e9c1a4f. Generate a fresh one per element and keep it stable across updates so a link keeps its click-tracking identity.", + "pattern": "^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$", + "type": "string" + }, + "role": { + "type": [ + "string", + "null" + ] + }, + "type": { + "const": "stack", + "type": "string" + }, + "visible": { + "type": "boolean" + } + }, + "required": [ + "id", + "type", + "role", + "visible", + "blockStyle", + "children" + ], + "type": "object" + }, + { + "type": "null" + } +] - removed
Output schema / properties / data / properties / end_time / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / data / properties / end_time / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / data / properties / start_time / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / data / properties / start_time / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / data / properties / time_zone / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / data / properties / time_zone / typeAdded value: +[ + "string", + "null" +]
- Changed
create_scribe_account8 fields changed- removed
Output schema / properties / data / properties / trial_ends_at / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / data / properties / trial_ends_at / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / data / properties / user / properties / first_name / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / data / properties / user / properties / first_name / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / data / properties / user / properties / last_name / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / data / properties / user / properties / last_name / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / data / properties / workspace / properties / name / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / data / properties / workspace / properties / name / typeAdded value: +[ + "string", + "null" +]
- Changed
create_signature15 fields changed- changed
Input schema / properties / draft_content / anyOfPrevious value: -[ - { - "additionalProperties": {}, - "properties": { - "blockStyle": { - "additionalProperties": {}, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "children": { - "items": { - "additionalProperties": {}, - "properties": { - "id": { - "description": "Lowercase uuid (8-4-4-4-12 hex), e.g. 6f1e8a2c-4b0d-4c8e-9f3a-2d7b5e9c1a4f. Generate a fresh one per element and keep it stable across updates so a link keeps its click-tracking identity.", - "pattern": "^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$", - "type": "string" - }, - "role": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "type": { - "enum": [ - "stack", - "text", - "image", - "icon", - "list", - "listItem", - "listItemLabel", - "socialList", - "socialListItem", - "button", - "divider", - "marketing" - ], - "type": "string" - }, - "visible": { - "type": "boolean" - } - }, - "required": [ - "id", - "type", - "role", - "visible" - ], - "type": "object" - }, - "type": "array" - }, - "id": { - "description": "Lowercase uuid (8-4-4-4-12 hex), e.g. 6f1e8a2c-4b0d-4c8e-9f3a-2d7b5e9c1a4f. Generate a fresh one per element and keep it stable across updates so a link keeps its click-tracking identity.", - "pattern": "^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$", - "type": "string" - }, - "role": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "type": { - "const": "stack", - "type": "string" - }, - "visible": { - "type": "boolean" - } - }, - "required": [ - "id", - "type", - "role", - "visible", - "blockStyle", - "children" - ], - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": {}, + "properties": { + "blockStyle": { + "additionalProperties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "children": { + "items": { + "additionalProperties": {}, + "properties": { + "id": { + "description": "Lowercase uuid (8-4-4-4-12 hex), e.g. 6f1e8a2c-4b0d-4c8e-9f3a-2d7b5e9c1a4f. Generate a fresh one per element and keep it stable across updates so a link keeps its click-tracking identity.", + "pattern": "^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$", + "type": "string" + }, + "role": { + "type": [ + "string", + "null" + ] + }, + "type": { + "enum": [ + "stack", + "text", + "image", + "icon", + "list", + "listItem", + "listItemLabel", + "socialList", + "socialListItem", + "button", + "divider", + "marketing" + ], + "type": "string" + }, + "visible": { + "type": "boolean" + } + }, + "required": [ + "id", + "type", + "role", + "visible" + ], + "type": "object" + }, + "type": "array" + }, + "id": { + "description": "Lowercase uuid (8-4-4-4-12 hex), e.g. 6f1e8a2c-4b0d-4c8e-9f3a-2d7b5e9c1a4f. Generate a fresh one per element and keep it stable across updates so a link keeps its click-tracking identity.", + "pattern": "^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$", + "type": "string" + }, + "role": { + "type": [ + "string", + "null" + ] + }, + "type": { + "const": "stack", + "type": "string" + }, + "visible": { + "type": "boolean" + } + }, + "required": [ + "id", + "type", + "role", + "visible", + "blockStyle", + "children" + ], + "type": "object" + }, + { + "type": "null" + } +] - removed
Input schema / properties / folder_id / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Input schema / properties / folder_id / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / data / properties / folder_id / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / data / properties / folder_id / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / data / properties / internal_variant_uuid / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / data / properties / internal_variant_uuid / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / data / properties / last_published_at / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / data / properties / last_published_at / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / data / properties / name / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / data / properties / name / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / data / properties / priority / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "null" - } -] - added
Output schema / properties / data / properties / priority / typeAdded value: +[ + "number", + "null" +] - removed
Output schema / properties / data / properties / reply_variant_uuid / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / data / properties / reply_variant_uuid / typeAdded value: +[ + "string", + "null" +]
- Changed
create_smart_field10 fields changed- removed
Input schema / properties / integration_attribute / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Input schema / properties / integration_attribute / typeAdded value: +[ + "string", + "null" +] - removed
Input schema / properties / integration_id / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Input schema / properties / integration_id / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / data / properties / integration_attribute / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / data / properties / integration_attribute / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / data / properties / integration_id / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / data / properties / integration_id / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / data / properties / slug / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / data / properties / slug / typeAdded value: +[ + "string", + "null" +]
- Changed
create_teammate8 fields changed- removed
Input schema / properties / smart_fields / items / properties / value / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Input schema / properties / smart_fields / items / properties / value / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / data / properties / smart_field_values / items / properties / image_url / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / data / properties / smart_field_values / items / properties / image_url / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / data / properties / smart_field_values / items / properties / integration_id / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / data / properties / smart_field_values / items / properties / integration_id / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / data / properties / smart_field_values / items / properties / value / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / data / properties / smart_field_values / items / properties / value / typeAdded value: +[ + "string", + "null" +]
- Changed
duplicate_signature14 fields changed- removed
Input schema / properties / folder_id / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Input schema / properties / folder_id / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / data / properties / folder_id / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / data / properties / folder_id / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / data / properties / internal_variant_uuid / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / data / properties / internal_variant_uuid / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / data / properties / last_published_at / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / data / properties / last_published_at / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / data / properties / name / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / data / properties / name / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / data / properties / priority / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "null" - } -] - added
Output schema / properties / data / properties / priority / typeAdded value: +[ + "number", + "null" +] - removed
Output schema / properties / data / properties / reply_variant_uuid / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / data / properties / reply_variant_uuid / typeAdded value: +[ + "string", + "null" +]
- Changed
get_visitor8 fields changed- removed
Output schema / properties / data / properties / first_touch / properties / click_id / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / data / properties / first_touch / properties / click_id / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / data / properties / first_touch / properties / email_id / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / data / properties / first_touch / properties / email_id / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / data / properties / first_touch / properties / signature_template_id / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / data / properties / first_touch / properties / signature_template_id / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / data / properties / first_touch / properties / teammate_id / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / data / properties / first_touch / properties / teammate_id / typeAdded value: +[ + "string", + "null" +]
- Changed
get_visitor_breakdown2 fields changed- removed
Output schema / properties / data / items / properties / label / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / data / items / properties / label / typeAdded value: +[ + "string", + "null" +]
- Changed
get_workspace8 fields changed- removed
Output schema / properties / data / properties / name / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / data / properties / name / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / data / properties / plan / properties / ends_at / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / data / properties / plan / properties / ends_at / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / data / properties / plan / properties / started_at / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / data / properties / plan / properties / started_at / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / data / properties / plan / properties / status / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / data / properties / plan / properties / status / typeAdded value: +[ + "string", + "null" +]
- Changed
install_signature12 fields changed- removed
Output schema / properties / data / properties / folder_id / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / data / properties / folder_id / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / data / properties / internal_variant_uuid / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / data / properties / internal_variant_uuid / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / data / properties / last_published_at / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / data / properties / last_published_at / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / data / properties / name / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / data / properties / name / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / data / properties / priority / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "null" - } -] - added
Output schema / properties / data / properties / priority / typeAdded value: +[ + "number", + "null" +] - removed
Output schema / properties / data / properties / reply_variant_uuid / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / data / properties / reply_variant_uuid / typeAdded value: +[ + "string", + "null" +]
- Changed
install_signature_for_email2 fields changed- removed
Output schema / properties / data / properties / signatures / items / properties / name / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / data / properties / signatures / items / properties / name / typeAdded value: +[ + "string", + "null" +]
- Changed
list_analytics_events24 fields changed- removed
Output schema / properties / data / items / properties / anchor_uuid / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / data / items / properties / anchor_uuid / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / data / items / properties / anonymous_id / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / data / items / properties / anonymous_id / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / data / items / properties / click_id / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / data / items / properties / click_id / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / data / items / properties / country_code / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / data / items / properties / country_code / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / data / items / properties / currency / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / data / items / properties / currency / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / data / items / properties / distinct_id / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / data / items / properties / distinct_id / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / data / items / properties / email_uuid / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / data / items / properties / email_uuid / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / data / items / properties / marketing_campaign_uuid / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / data / items / properties / marketing_campaign_uuid / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / data / items / properties / recorded_at / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / data / items / properties / recorded_at / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / data / items / properties / signature_template_uuid / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / data / items / properties / signature_template_uuid / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / data / items / properties / source / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / data / items / properties / source / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / data / items / properties / teammate_uuid / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / data / items / properties / teammate_uuid / typeAdded value: +[ + "string", + "null" +]
- Changed
list_assets2 fields changed- removed
Output schema / properties / data / items / properties / name / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / data / items / properties / name / typeAdded value: +[ + "string", + "null" +]
- Changed
list_financial_documents10 fields changed- removed
Output schema / properties / data / items / properties / due_date / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / data / items / properties / due_date / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / data / items / properties / number / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / data / items / properties / number / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / data / items / properties / period_end / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / data / items / properties / period_end / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / data / items / properties / period_start / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / data / items / properties / period_start / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / data / items / properties / stripe_receipt_url / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / data / items / properties / stripe_receipt_url / typeAdded value: +[ + "string", + "null" +]
- Changed
list_integration_entities6 fields changed- removed
Output schema / properties / data / items / properties / integration_id / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / data / items / properties / integration_id / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / data / items / properties / name / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / data / items / properties / name / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / data / items / properties / sub_kind / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / data / items / properties / sub_kind / typeAdded value: +[ + "string", + "null" +]
- Changed
list_integrations4 fields changed- removed
Output schema / properties / data / items / properties / error_message / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / data / items / properties / error_message / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / data / items / properties / error_since / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / data / items / properties / error_since / typeAdded value: +[ + "string", + "null" +]
- Changed
list_marketing_campaigns6 fields changed- removed
Output schema / properties / data / items / properties / end_time / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / data / items / properties / end_time / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / data / items / properties / start_time / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / data / items / properties / start_time / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / data / items / properties / time_zone / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / data / items / properties / time_zone / typeAdded value: +[ + "string", + "null" +]
- Changed
list_signature_installations26 fields changed- removed
Output schema / properties / data / items / properties / device_kind / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / data / items / properties / device_kind / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / data / items / properties / device_name / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / data / items / properties / device_name / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / data / items / properties / email_client / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / data / items / properties / email_client / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / data / items / properties / error_code / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / data / items / properties / error_code / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / data / items / properties / first_installed_at / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / data / items / properties / first_installed_at / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / data / items / properties / integration_id / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / data / items / properties / integration_id / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / data / items / properties / integration_kind / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / data / items / properties / integration_kind / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / data / items / properties / integration_name / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / data / items / properties / integration_name / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / data / items / properties / last_failed_at / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / data / items / properties / last_failed_at / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / data / items / properties / last_installed_at / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / data / items / properties / last_installed_at / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / data / items / properties / signature_template_id / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / data / items / properties / signature_template_id / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / data / items / properties / signature_template_name / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / data / items / properties / signature_template_name / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / data / items / properties / uninstalled_at / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / data / items / properties / uninstalled_at / typeAdded value: +[ + "string", + "null" +]
- Changed
list_signature_recipients2 fields changed- removed
Output schema / properties / data / items / properties / sources / items / properties / integration_entity_id / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / data / items / properties / sources / items / properties / integration_entity_id / typeAdded value: +[ + "string", + "null" +]
- Changed
list_signature_variants8 fields changed- removed
Output schema / properties / data / items / properties / created_at / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / data / items / properties / created_at / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / data / items / properties / id / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / data / items / properties / id / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / data / items / properties / last_published_at / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / data / items / properties / last_published_at / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / data / items / properties / updated_at / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / data / items / properties / updated_at / typeAdded value: +[ + "string", + "null" +]
- Changed
list_signatures8 fields changed- removed
Output schema / properties / data / items / properties / folder_id / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / data / items / properties / folder_id / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / data / items / properties / last_published_at / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / data / items / properties / last_published_at / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / data / items / properties / name / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / data / items / properties / name / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / data / items / properties / priority / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "null" - } -] - added
Output schema / properties / data / items / properties / priority / typeAdded value: +[ + "number", + "null" +]
- Changed
list_smart_fields6 fields changed- removed
Output schema / properties / data / items / properties / integration_attribute / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / data / items / properties / integration_attribute / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / data / items / properties / integration_id / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / data / items / properties / integration_id / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / data / items / properties / slug / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / data / items / properties / slug / typeAdded value: +[ + "string", + "null" +]
- Changed
list_teammates6 fields changed- removed
Output schema / properties / data / items / properties / smart_field_values / items / properties / image_url / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / data / items / properties / smart_field_values / items / properties / image_url / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / data / items / properties / smart_field_values / items / properties / integration_id / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / data / items / properties / smart_field_values / items / properties / integration_id / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / data / items / properties / smart_field_values / items / properties / value / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / data / items / properties / smart_field_values / items / properties / value / typeAdded value: +[ + "string", + "null" +]
- Changed
list_visitors8 fields changed- removed
Output schema / properties / data / items / properties / first_touch / properties / click_id / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / data / items / properties / first_touch / properties / click_id / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / data / items / properties / first_touch / properties / email_id / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / data / items / properties / first_touch / properties / email_id / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / data / items / properties / first_touch / properties / signature_template_id / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / data / items / properties / first_touch / properties / signature_template_id / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / data / items / properties / first_touch / properties / teammate_id / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / data / items / properties / first_touch / properties / teammate_id / typeAdded value: +[ + "string", + "null" +]
- Changed
pause_marketing_campaign6 fields changed- removed
Output schema / properties / data / properties / end_time / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / data / properties / end_time / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / data / properties / start_time / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / data / properties / start_time / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / data / properties / time_zone / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / data / properties / time_zone / typeAdded value: +[ + "string", + "null" +]
- Changed
publish_signature12 fields changed- removed
Output schema / properties / data / properties / folder_id / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / data / properties / folder_id / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / data / properties / internal_variant_uuid / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / data / properties / internal_variant_uuid / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / data / properties / last_published_at / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / data / properties / last_published_at / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / data / properties / name / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / data / properties / name / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / data / properties / priority / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "null" - } -] - added
Output schema / properties / data / properties / priority / typeAdded value: +[ + "number", + "null" +] - removed
Output schema / properties / data / properties / reply_variant_uuid / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / data / properties / reply_variant_uuid / typeAdded value: +[ + "string", + "null" +]
- Changed
publish_signature_variant8 fields changed- removed
Output schema / properties / data / properties / created_at / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / data / properties / created_at / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / data / properties / id / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / data / properties / id / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / data / properties / last_published_at / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / data / properties / last_published_at / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / data / properties / updated_at / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / data / properties / updated_at / typeAdded value: +[ + "string", + "null" +]
- Changed
resume_marketing_campaign6 fields changed- removed
Output schema / properties / data / properties / end_time / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / data / properties / end_time / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / data / properties / start_time / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / data / properties / start_time / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / data / properties / time_zone / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / data / properties / time_zone / typeAdded value: +[ + "string", + "null" +]
- Changed
schedule_marketing_campaign6 fields changed- removed
Output schema / properties / data / properties / end_time / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / data / properties / end_time / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / data / properties / start_time / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / data / properties / start_time / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / data / properties / time_zone / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / data / properties / time_zone / typeAdded value: +[ + "string", + "null" +]
- Changed
update_asset2 fields changed- removed
Output schema / properties / data / properties / name / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / data / properties / name / typeAdded value: +[ + "string", + "null" +]
- Changed
update_marketing_campaign7 fields changed- changed
Input schema / properties / content / anyOfPrevious value: -[ - { - "additionalProperties": {}, - "properties": { - "blockStyle": { - "additionalProperties": {}, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "children": { - "items": { - "additionalProperties": {}, - "properties": { - "id": { - "description": "Lowercase uuid (8-4-4-4-12 hex), e.g. 6f1e8a2c-4b0d-4c8e-9f3a-2d7b5e9c1a4f. Generate a fresh one per element and keep it stable across updates so a link keeps its click-tracking identity.", - "pattern": "^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$", - "type": "string" - }, - "role": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "type": { - "enum": [ - "stack", - "text", - "image", - "icon", - "list", - "listItem", - "listItemLabel", - "socialList", - "socialListItem", - "button", - "divider", - "marketing" - ], - "type": "string" - }, - "visible": { - "type": "boolean" - } - }, - "required": [ - "id", - "type", - "role", - "visible" - ], - "type": "object" - }, - "type": "array" - }, - "id": { - "description": "Lowercase uuid (8-4-4-4-12 hex), e.g. 6f1e8a2c-4b0d-4c8e-9f3a-2d7b5e9c1a4f. Generate a fresh one per element and keep it stable across updates so a link keeps its click-tracking identity.", - "pattern": "^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$", - "type": "string" - }, - "role": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "type": { - "const": "stack", - "type": "string" - }, - "visible": { - "type": "boolean" - } - }, - "required": [ - "id", - "type", - "role", - "visible", - "blockStyle", - "children" - ], - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": {}, + "properties": { + "blockStyle": { + "additionalProperties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "children": { + "items": { + "additionalProperties": {}, + "properties": { + "id": { + "description": "Lowercase uuid (8-4-4-4-12 hex), e.g. 6f1e8a2c-4b0d-4c8e-9f3a-2d7b5e9c1a4f. Generate a fresh one per element and keep it stable across updates so a link keeps its click-tracking identity.", + "pattern": "^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$", + "type": "string" + }, + "role": { + "type": [ + "string", + "null" + ] + }, + "type": { + "enum": [ + "stack", + "text", + "image", + "icon", + "list", + "listItem", + "listItemLabel", + "socialList", + "socialListItem", + "button", + "divider", + "marketing" + ], + "type": "string" + }, + "visible": { + "type": "boolean" + } + }, + "required": [ + "id", + "type", + "role", + "visible" + ], + "type": "object" + }, + "type": "array" + }, + "id": { + "description": "Lowercase uuid (8-4-4-4-12 hex), e.g. 6f1e8a2c-4b0d-4c8e-9f3a-2d7b5e9c1a4f. Generate a fresh one per element and keep it stable across updates so a link keeps its click-tracking identity.", + "pattern": "^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$", + "type": "string" + }, + "role": { + "type": [ + "string", + "null" + ] + }, + "type": { + "const": "stack", + "type": "string" + }, + "visible": { + "type": "boolean" + } + }, + "required": [ + "id", + "type", + "role", + "visible", + "blockStyle", + "children" + ], + "type": "object" + }, + { + "type": "null" + } +] - removed
Output schema / properties / data / properties / end_time / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / data / properties / end_time / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / data / properties / start_time / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / data / properties / start_time / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / data / properties / time_zone / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / data / properties / time_zone / typeAdded value: +[ + "string", + "null" +]
- Changed
update_signature15 fields changed- changed
Input schema / properties / draft_content / anyOfPrevious value: -[ - { - "additionalProperties": {}, - "properties": { - "blockStyle": { - "additionalProperties": {}, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "children": { - "items": { - "additionalProperties": {}, - "properties": { - "id": { - "description": "Lowercase uuid (8-4-4-4-12 hex), e.g. 6f1e8a2c-4b0d-4c8e-9f3a-2d7b5e9c1a4f. Generate a fresh one per element and keep it stable across updates so a link keeps its click-tracking identity.", - "pattern": "^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$", - "type": "string" - }, - "role": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "type": { - "enum": [ - "stack", - "text", - "image", - "icon", - "list", - "listItem", - "listItemLabel", - "socialList", - "socialListItem", - "button", - "divider", - "marketing" - ], - "type": "string" - }, - "visible": { - "type": "boolean" - } - }, - "required": [ - "id", - "type", - "role", - "visible" - ], - "type": "object" - }, - "type": "array" - }, - "id": { - "description": "Lowercase uuid (8-4-4-4-12 hex), e.g. 6f1e8a2c-4b0d-4c8e-9f3a-2d7b5e9c1a4f. Generate a fresh one per element and keep it stable across updates so a link keeps its click-tracking identity.", - "pattern": "^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$", - "type": "string" - }, - "role": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "type": { - "const": "stack", - "type": "string" - }, - "visible": { - "type": "boolean" - } - }, - "required": [ - "id", - "type", - "role", - "visible", - "blockStyle", - "children" - ], - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": {}, + "properties": { + "blockStyle": { + "additionalProperties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "children": { + "items": { + "additionalProperties": {}, + "properties": { + "id": { + "description": "Lowercase uuid (8-4-4-4-12 hex), e.g. 6f1e8a2c-4b0d-4c8e-9f3a-2d7b5e9c1a4f. Generate a fresh one per element and keep it stable across updates so a link keeps its click-tracking identity.", + "pattern": "^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$", + "type": "string" + }, + "role": { + "type": [ + "string", + "null" + ] + }, + "type": { + "enum": [ + "stack", + "text", + "image", + "icon", + "list", + "listItem", + "listItemLabel", + "socialList", + "socialListItem", + "button", + "divider", + "marketing" + ], + "type": "string" + }, + "visible": { + "type": "boolean" + } + }, + "required": [ + "id", + "type", + "role", + "visible" + ], + "type": "object" + }, + "type": "array" + }, + "id": { + "description": "Lowercase uuid (8-4-4-4-12 hex), e.g. 6f1e8a2c-4b0d-4c8e-9f3a-2d7b5e9c1a4f. Generate a fresh one per element and keep it stable across updates so a link keeps its click-tracking identity.", + "pattern": "^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$", + "type": "string" + }, + "role": { + "type": [ + "string", + "null" + ] + }, + "type": { + "const": "stack", + "type": "string" + }, + "visible": { + "type": "boolean" + } + }, + "required": [ + "id", + "type", + "role", + "visible", + "blockStyle", + "children" + ], + "type": "object" + }, + { + "type": "null" + } +] - removed
Input schema / properties / folder_id / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Input schema / properties / folder_id / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / data / properties / folder_id / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / data / properties / folder_id / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / data / properties / internal_variant_uuid / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / data / properties / internal_variant_uuid / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / data / properties / last_published_at / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / data / properties / last_published_at / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / data / properties / name / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / data / properties / name / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / data / properties / priority / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "null" - } -] - added
Output schema / properties / data / properties / priority / typeAdded value: +[ + "number", + "null" +] - removed
Output schema / properties / data / properties / reply_variant_uuid / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / data / properties / reply_variant_uuid / typeAdded value: +[ + "string", + "null" +]
- Changed
update_signature_variant9 fields changed- changed
Input schema / properties / draft_content / anyOfPrevious value: -[ - { - "additionalProperties": {}, - "properties": { - "blockStyle": { - "additionalProperties": {}, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "children": { - "items": { - "additionalProperties": {}, - "properties": { - "id": { - "description": "Lowercase uuid (8-4-4-4-12 hex), e.g. 6f1e8a2c-4b0d-4c8e-9f3a-2d7b5e9c1a4f. Generate a fresh one per element and keep it stable across updates so a link keeps its click-tracking identity.", - "pattern": "^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$", - "type": "string" - }, - "role": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "type": { - "enum": [ - "stack", - "text", - "image", - "icon", - "list", - "listItem", - "listItemLabel", - "socialList", - "socialListItem", - "button", - "divider", - "marketing" - ], - "type": "string" - }, - "visible": { - "type": "boolean" - } - }, - "required": [ - "id", - "type", - "role", - "visible" - ], - "type": "object" - }, - "type": "array" - }, - "id": { - "description": "Lowercase uuid (8-4-4-4-12 hex), e.g. 6f1e8a2c-4b0d-4c8e-9f3a-2d7b5e9c1a4f. Generate a fresh one per element and keep it stable across updates so a link keeps its click-tracking identity.", - "pattern": "^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$", - "type": "string" - }, - "role": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "type": { - "const": "stack", - "type": "string" - }, - "visible": { - "type": "boolean" - } - }, - "required": [ - "id", - "type", - "role", - "visible", - "blockStyle", - "children" - ], - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": {}, + "properties": { + "blockStyle": { + "additionalProperties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "children": { + "items": { + "additionalProperties": {}, + "properties": { + "id": { + "description": "Lowercase uuid (8-4-4-4-12 hex), e.g. 6f1e8a2c-4b0d-4c8e-9f3a-2d7b5e9c1a4f. Generate a fresh one per element and keep it stable across updates so a link keeps its click-tracking identity.", + "pattern": "^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$", + "type": "string" + }, + "role": { + "type": [ + "string", + "null" + ] + }, + "type": { + "enum": [ + "stack", + "text", + "image", + "icon", + "list", + "listItem", + "listItemLabel", + "socialList", + "socialListItem", + "button", + "divider", + "marketing" + ], + "type": "string" + }, + "visible": { + "type": "boolean" + } + }, + "required": [ + "id", + "type", + "role", + "visible" + ], + "type": "object" + }, + "type": "array" + }, + "id": { + "description": "Lowercase uuid (8-4-4-4-12 hex), e.g. 6f1e8a2c-4b0d-4c8e-9f3a-2d7b5e9c1a4f. Generate a fresh one per element and keep it stable across updates so a link keeps its click-tracking identity.", + "pattern": "^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$", + "type": "string" + }, + "role": { + "type": [ + "string", + "null" + ] + }, + "type": { + "const": "stack", + "type": "string" + }, + "visible": { + "type": "boolean" + } + }, + "required": [ + "id", + "type", + "role", + "visible", + "blockStyle", + "children" + ], + "type": "object" + }, + { + "type": "null" + } +] - removed
Output schema / properties / data / properties / created_at / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / data / properties / created_at / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / data / properties / id / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / data / properties / id / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / data / properties / last_published_at / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / data / properties / last_published_at / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / data / properties / updated_at / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / data / properties / updated_at / typeAdded value: +[ + "string", + "null" +]
- Changed
update_smart_field10 fields changed- removed
Input schema / properties / integration_attribute / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Input schema / properties / integration_attribute / typeAdded value: +[ + "string", + "null" +] - removed
Input schema / properties / integration_id / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Input schema / properties / integration_id / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / data / properties / integration_attribute / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / data / properties / integration_attribute / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / data / properties / integration_id / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / data / properties / integration_id / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / data / properties / slug / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / data / properties / slug / typeAdded value: +[ + "string", + "null" +]
- Changed
update_teammate8 fields changed- removed
Input schema / properties / smart_fields / items / properties / value / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Input schema / properties / smart_fields / items / properties / value / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / data / properties / smart_field_values / items / properties / image_url / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / data / properties / smart_field_values / items / properties / image_url / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / data / properties / smart_field_values / items / properties / integration_id / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / data / properties / smart_field_values / items / properties / integration_id / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / data / properties / smart_field_values / items / properties / value / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / data / properties / smart_field_values / items / properties / value / typeAdded value: +[ + "string", + "null" +]
2 tool updates
- Added
create_first_signature - Added
create_scribe_account
3 tool updates
- Changed
get_analytics_clicks1 field changed- changed
Output schema / properties / result / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "data": { - "items": { - "additionalProperties": false, - "properties": { - "count": { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - "period": { - "description": "Bucket start as an ISO-8601 UTC instant.", - "type": "string" - } - }, - "required": [ - "period", - "count" - ], - "type": "object" - }, - "type": "array" - }, - "granularity": { - "enum": [ - "hour", - "day", - "week", - "month" - ], - "type": "string" - }, - "time_zone": { - "type": "string" - }, - "totals": { - "additionalProperties": false, - "properties": { - "count": { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - } - }, - "required": [ - "count" - ], - "type": "object" - } - }, - "required": [ - "data", - "totals", - "granularity", - "time_zone" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "data": { - "items": { - "additionalProperties": false, - "properties": { - "click_count": { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - "clickthrough_rate": { - "description": "click_count / view_count as a percentage.", - "type": "number" - }, - "id": { - "description": "Subject id for the group_by (UUID; ISO 3166-1 alpha-2 for country).", - "type": "string" - }, - "label": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "view_count": { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - } - }, - "required": [ - "id", - "label", - "view_count", - "click_count", - "clickthrough_rate" - ], - "type": "object" - }, - "type": "array" - }, - "pagination": { - "additionalProperties": false, - "properties": { - "has_more": { - "type": "boolean" - }, - "limit": { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - "page": { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - "total_count": { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - "total_pages": { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - } - }, - "required": [ - "page", - "limit", - "total_count", - "total_pages", - "has_more" - ], - "type": "object" - } - }, - "required": [ - "data", - "pagination" - ], - "type": "object" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "data": { + "items": { + "additionalProperties": false, + "properties": { + "count": { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "period": { + "description": "Bucket start as an ISO-8601 UTC instant.", + "type": "string" + } + }, + "required": [ + "period", + "count" + ], + "type": "object" + }, + "type": "array" + }, + "granularity": { + "enum": [ + "hour", + "day", + "week", + "month" + ], + "type": "string" + }, + "time_zone": { + "type": "string" + }, + "totals": { + "additionalProperties": false, + "properties": { + "count": { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + } + }, + "required": [ + "count" + ], + "type": "object" + } + }, + "required": [ + "data", + "totals", + "granularity", + "time_zone" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "data": { + "items": { + "additionalProperties": false, + "properties": { + "click_count": { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "clickthrough_rate": { + "description": "click_count / view_count as a percentage.", + "type": "number" + }, + "id": { + "description": "Subject id for the group_by (UUID; ISO 3166-1 alpha-2 for country).", + "type": "string" + }, + "label": { + "anyOf": [ + { + "anyOf": [ + { + "type": "string" + }, + { + "additionalProperties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + } + ] + }, + { + "type": "null" + } + ], + "description": "Human label: the signature/campaign name, teammate email or country name (the id itself for the events summary's name/country/currency/user). For `anchor`, the link's content node as stored in the signature: an object with `type` (button, socialListItem, textToken…), `href.text` (the URL) or `href.smartFieldUuid` (a smart-field URL), and its visible `text`, `label` or `value` depending on the type. Null when none is available." + }, + "view_count": { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + } + }, + "required": [ + "id", + "label", + "view_count", + "click_count", + "clickthrough_rate" + ], + "type": "object" + }, + "type": "array" + }, + "pagination": { + "additionalProperties": false, + "properties": { + "has_more": { + "type": "boolean" + }, + "limit": { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "page": { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "total_count": { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "total_pages": { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + } + }, + "required": [ + "page", + "limit", + "total_count", + "total_pages", + "has_more" + ], + "type": "object" + } + }, + "required": [ + "data", + "pagination" + ], + "type": "object" + } +]
- Changed
get_analytics_events_summary1 field changed- changed
Output schema / properties / result / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "data": { - "items": { - "additionalProperties": false, - "properties": { - "count": { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - "period": { - "description": "Bucket start as an ISO-8601 UTC instant.", - "type": "string" - }, - "value": { - "description": "Sum of event value in the bucket (mixed currencies unless filtered).", - "type": "number" - } - }, - "required": [ - "period", - "count", - "value" - ], - "type": "object" - }, - "type": "array" - }, - "granularity": { - "enum": [ - "hour", - "day", - "week", - "month" - ], - "type": "string" - }, - "time_zone": { - "type": "string" - }, - "totals": { - "additionalProperties": false, - "properties": { - "count": { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - "value": { - "type": "number" - } - }, - "required": [ - "count", - "value" - ], - "type": "object" - } - }, - "required": [ - "data", - "totals", - "granularity", - "time_zone" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "data": { - "items": { - "additionalProperties": false, - "properties": { - "count": { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - "id": { - "type": "string" - }, - "label": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "value": { - "type": "number" - } - }, - "required": [ - "id", - "label", - "count", - "value" - ], - "type": "object" - }, - "type": "array" - }, - "pagination": { - "additionalProperties": false, - "properties": { - "has_more": { - "type": "boolean" - }, - "limit": { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - "page": { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - "total_count": { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - "total_pages": { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - } - }, - "required": [ - "page", - "limit", - "total_count", - "total_pages", - "has_more" - ], - "type": "object" - } - }, - "required": [ - "data", - "pagination" - ], - "type": "object" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "data": { + "items": { + "additionalProperties": false, + "properties": { + "count": { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "period": { + "description": "Bucket start as an ISO-8601 UTC instant.", + "type": "string" + }, + "value": { + "description": "Sum of event value in the bucket (mixed currencies unless filtered).", + "type": "number" + } + }, + "required": [ + "period", + "count", + "value" + ], + "type": "object" + }, + "type": "array" + }, + "granularity": { + "enum": [ + "hour", + "day", + "week", + "month" + ], + "type": "string" + }, + "time_zone": { + "type": "string" + }, + "totals": { + "additionalProperties": false, + "properties": { + "count": { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "value": { + "type": "number" + } + }, + "required": [ + "count", + "value" + ], + "type": "object" + } + }, + "required": [ + "data", + "totals", + "granularity", + "time_zone" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "data": { + "items": { + "additionalProperties": false, + "properties": { + "count": { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "id": { + "type": "string" + }, + "label": { + "anyOf": [ + { + "anyOf": [ + { + "type": "string" + }, + { + "additionalProperties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + } + ] + }, + { + "type": "null" + } + ], + "description": "Human label: the signature/campaign name, teammate email or country name (the id itself for the events summary's name/country/currency/user). For `anchor`, the link's content node as stored in the signature: an object with `type` (button, socialListItem, textToken…), `href.text` (the URL) or `href.smartFieldUuid` (a smart-field URL), and its visible `text`, `label` or `value` depending on the type. Null when none is available." + }, + "value": { + "type": "number" + } + }, + "required": [ + "id", + "label", + "count", + "value" + ], + "type": "object" + }, + "type": "array" + }, + "pagination": { + "additionalProperties": false, + "properties": { + "has_more": { + "type": "boolean" + }, + "limit": { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "page": { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "total_count": { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "total_pages": { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + } + }, + "required": [ + "page", + "limit", + "total_count", + "total_pages", + "has_more" + ], + "type": "object" + } + }, + "required": [ + "data", + "pagination" + ], + "type": "object" + } +]
- Changed
get_analytics_views1 field changed- changed
Output schema / properties / result / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "data": { - "items": { - "additionalProperties": false, - "properties": { - "count": { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - "period": { - "description": "Bucket start as an ISO-8601 UTC instant.", - "type": "string" - } - }, - "required": [ - "period", - "count" - ], - "type": "object" - }, - "type": "array" - }, - "granularity": { - "enum": [ - "hour", - "day", - "week", - "month" - ], - "type": "string" - }, - "time_zone": { - "type": "string" - }, - "totals": { - "additionalProperties": false, - "properties": { - "count": { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - } - }, - "required": [ - "count" - ], - "type": "object" - } - }, - "required": [ - "data", - "totals", - "granularity", - "time_zone" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "data": { - "items": { - "additionalProperties": false, - "properties": { - "click_count": { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - "clickthrough_rate": { - "description": "click_count / view_count as a percentage.", - "type": "number" - }, - "id": { - "description": "Subject id for the group_by (UUID; ISO 3166-1 alpha-2 for country).", - "type": "string" - }, - "label": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "view_count": { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - } - }, - "required": [ - "id", - "label", - "view_count", - "click_count", - "clickthrough_rate" - ], - "type": "object" - }, - "type": "array" - }, - "pagination": { - "additionalProperties": false, - "properties": { - "has_more": { - "type": "boolean" - }, - "limit": { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - "page": { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - "total_count": { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - "total_pages": { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - } - }, - "required": [ - "page", - "limit", - "total_count", - "total_pages", - "has_more" - ], - "type": "object" - } - }, - "required": [ - "data", - "pagination" - ], - "type": "object" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "data": { + "items": { + "additionalProperties": false, + "properties": { + "count": { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "period": { + "description": "Bucket start as an ISO-8601 UTC instant.", + "type": "string" + } + }, + "required": [ + "period", + "count" + ], + "type": "object" + }, + "type": "array" + }, + "granularity": { + "enum": [ + "hour", + "day", + "week", + "month" + ], + "type": "string" + }, + "time_zone": { + "type": "string" + }, + "totals": { + "additionalProperties": false, + "properties": { + "count": { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + } + }, + "required": [ + "count" + ], + "type": "object" + } + }, + "required": [ + "data", + "totals", + "granularity", + "time_zone" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "data": { + "items": { + "additionalProperties": false, + "properties": { + "click_count": { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "clickthrough_rate": { + "description": "click_count / view_count as a percentage.", + "type": "number" + }, + "id": { + "description": "Subject id for the group_by (UUID; ISO 3166-1 alpha-2 for country).", + "type": "string" + }, + "label": { + "anyOf": [ + { + "anyOf": [ + { + "type": "string" + }, + { + "additionalProperties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + } + ] + }, + { + "type": "null" + } + ], + "description": "Human label: the signature/campaign name, teammate email or country name (the id itself for the events summary's name/country/currency/user). For `anchor`, the link's content node as stored in the signature: an object with `type` (button, socialListItem, textToken…), `href.text` (the URL) or `href.smartFieldUuid` (a smart-field URL), and its visible `text`, `label` or `value` depending on the type. Null when none is available." + }, + "view_count": { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + } + }, + "required": [ + "id", + "label", + "view_count", + "click_count", + "clickthrough_rate" + ], + "type": "object" + }, + "type": "array" + }, + "pagination": { + "additionalProperties": false, + "properties": { + "has_more": { + "type": "boolean" + }, + "limit": { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "page": { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "total_count": { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "total_pages": { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + } + }, + "required": [ + "page", + "limit", + "total_count", + "total_pages", + "has_more" + ], + "type": "object" + } + }, + "required": [ + "data", + "pagination" + ], + "type": "object" + } +]
3 tool updates
- Changed
add_signature_recipient_entities1 field changed- changed
Input schema / properties / integration_entity_ids / descriptionPrevious value: -"Org-unit/group uuids to target (from list_integration_entities)."New value: +"Org-unit/group uuids to add to the targeting: the `id` of each entity from list_integration_entities. At least one is required (an empty list returns 422); duplicates and already-targeted uuids are ignored."
- Changed
create_folder1 field changed- changed
Input schema / properties / name / descriptionPrevious value: -"Name for the new signature folder (required)."New value: +"Name for the new signature folder (required). Must not be blank (422); it does not have to be unique, so check list_folders first if a folder with this name may already exist."
- Changed
update_folder1 field changed- changed
Input schema / properties / name / descriptionPrevious value: -"The new folder name."New value: +"The new folder name; replaces the current one. Must not be blank (422). Other folders may already use the same name."
6 tool updates
- Changed
add_signature_recipients1 field changed- changed
Input schema / properties / email_ids / descriptionPrevious value: -"Email uuids to assign as manual recipients (re-adding an existing one is a no-op)."New value: +"Email uuids to assign as manual recipients: the `id` from list_emails (or a teammate's `emails[].id` from list_teammates), not teammate ids. At least one is required (an empty list returns 422); if any uuid is unknown the whole batch fails with 422 and nothing is added. Duplicates and already-assigned emails are ignored."
- Changed
create_smart_field4 fields changed- changed
Input schema / properties / integration_attribute / descriptionPrevious value: -"The integration's attribute key to map (required when integration_id is set)."New value: +"The integration's attribute key to map (required when integration_id is set; 422 without it)." - changed
Input schema / properties / integration_id / descriptionPrevious value: -"UUID of a workspace integration to sync this field's values from (omit for a manual field)."New value: +"UUID of a workspace integration to sync this field's values from, from list_integrations. It must be a directory or HR/enrichment integration that supplies teammate data; any other returns 422. Omit for a manual field." - changed
Input schema / properties / label / descriptionPrevious value: -"Display name for the field (required)."New value: +"Display name for the field (required). Must be unique in the workspace: a label already in use returns 422 `taken`." - changed
Input schema / properties / required / descriptionPrevious value: -"Whether teammates must fill this field."New value: +"Whether teammates must fill this field (default true when omitted)."
- Changed
delete_signature1 field changed- changed
Input schema / properties / id / descriptionPrevious value: -"The signature's UUID (the `id` from list_signatures)."New value: +"The signature's UUID (the `id` from list_signatures). Only primary templates can be deleted: a reply or internal variant's id returns 404."
- Changed
list_analytics_events6 fields changed- changed
Input schema / properties / country / descriptionPrevious value: -"Filter to one country (ISO 3166-1 alpha-2)."New value: +"Filter to one country (ISO 3166-1 alpha-2, case-insensitive, e.g. FR)." - changed
Input schema / properties / distinct_id / descriptionPrevious value: -"Filter to one identified visitor (their user id) — their event history."New value: +"Filter to one identified visitor's event history: their user id, the `distinct_id` from list_visitors (exact match)." - changed
Input schema / properties / marketing_campaign_id / descriptionPrevious value: -"Filter to one marketing campaign (UUID)."New value: +"Filter to one marketing campaign (UUID from list_marketing_campaigns); unknown returns 404." - changed
Input schema / properties / signature_template_id / descriptionPrevious value: -"Filter to one signature template (UUID)."New value: +"Filter to one signature template (UUID from list_signatures); unknown returns 404." - changed
Input schema / properties / start_date / descriptionPrevious value: -"Range start (inclusive), ISO-8601 date YYYY-MM-DD."New value: +"Range start (inclusive), ISO-8601 date YYYY-MM-DD. Omit both dates for all time." - changed
Input schema / properties / teammate_id / descriptionPrevious value: -"Filter to one teammate (UUID)."New value: +"Filter to one teammate (UUID from list_teammates); unknown returns 404."
- Changed
list_emails1 field changed- changed
Input schema / properties / teammate_id / descriptionPrevious value: -"Filter to a single teammate's emails by their UUID (the teammate `id`)."New value: +"Filter to a single teammate's emails by their UUID (the `id` from list_teammates). An unknown id returns an empty list, not an error."
- Changed
update_smart_field3 fields changed- changed
Input schema / properties / integration_attribute / descriptionPrevious value: -"The integration's attribute key (required when integration_id is set)."New value: +"The integration's attribute key (required when the field is bound to an integration; 422 without it). Changing it re-syncs the field's values." - changed
Input schema / properties / integration_id / descriptionPrevious value: -"UUID of a workspace integration to sync values from; pass null to unlink. Omit to leave unchanged."New value: +"UUID of a workspace integration to sync values from (a directory or HR/enrichment integration from list_integrations). Pass null to unlink, which also clears integration_attribute. Omit to leave unchanged." - changed
Input schema / properties / label / descriptionPrevious value: -"New display name."New value: +"New display name. Must be unique in the workspace (422 `taken` otherwise)."
67 tool updates
- First observed
add_signature_recipient_entities - First observed
add_signature_recipients - First observed
create_asset - First observed
create_email - First observed
create_folder - First observed
create_marketing_campaign - First observed
create_signature - First observed
create_smart_field - First observed
create_teammate - First observed
delete_asset - First observed
delete_email - First observed
delete_folder - First observed
delete_marketing_campaign - First observed
delete_signature - First observed
delete_signature_variant - First observed
delete_smart_field - First observed
delete_teammate - First observed
duplicate_signature - First observed
get_analytics_clicks - First observed
get_analytics_events_summary - First observed
get_analytics_views - First observed
get_content_schema - First observed
get_more_tools - First observed
get_signature_html - First observed
get_visitor - First observed
get_visitor_breakdown - First observed
get_workspace - First observed
install_signature - First observed
install_signature_for_email - First observed
list_analytics_events - First observed
list_assets - First observed
list_emails - First observed
list_financial_documents - First observed
list_folders - First observed
list_integration_entities - First observed
list_integrations - First observed
list_marketing_campaigns - First observed
list_signature_installations - First observed
list_signature_recipients - First observed
list_signature_variants - First observed
list_signatures - First observed
list_smart_fields - First observed
list_teammates - First observed
list_visitors - First observed
pause_marketing_campaign - First observed
preview_marketing_campaign - First observed
preview_signature - First observed
publish_signature - First observed
publish_signature_variant - First observed
read_docs_page - First observed
remove_signature_recipient_entities - First observed
remove_signature_recipients - First observed
resume_marketing_campaign - First observed
schedule_marketing_campaign - First observed
search_docs - First observed
send_feedback - First observed
send_test_email - First observed
set_signature_recipient_rules - First observed
sync_teammates - First observed
update_asset - First observed
update_email - First observed
update_folder - First observed
update_marketing_campaign - First observed
update_signature - First observed
update_signature_variant - First observed
update_smart_field - First observed
update_teammate
Publisher details
- Operator
- Scribe SAS · Publisher source
- Operator website
- https://www.scribe-mail.com · Publisher source
- Vendor relationship
- First-party · Publisher source
- Documentation
- https://help.scribe-mail.com/en/ai-agents · Publisher source
- Trust center
- https://security.scribe-mail.com · Publisher source
- Restrictions
- Requires a Scribe workspace on a Business or Enterprise plan, or an active 14-day trial; the Free plan has no API access. The signed-in user must be a workspace owner or admin. · Publisher source
Related MCP Connectors
The agentic email signature platform: one saved signature for your people and your AI agents.
Manage team email signatures: teammates, groups, templates, banner campaigns, click analytics.
Email signatures for French businesses: HTML generator, legal mentions per job, SPF/DKIM/DMARC
E-signatures for contracts and NDAs. Draft with AI, review, and send for signature.
Related MCP Servers
- AlicenseAqualityNot gradedmaintenanceSend documents for e-signature from Claude Desktop, Claude Code, Cursor, and other AI agents. Free DocuSign alternative.1550 npmMIT
- AlicenseNot gradedqualityDmaintenanceE-signature for AI agents. One unauthenticated call returns a sandbox API key (no account, no browser), then the agent can send documents for signature, check status, and download the sealed PDF plus Certificate of Completion.4 npmMIT
- AlicenseAqualityBmaintenanceLets AI agents send PDFs for e-signature (recognized under ESIGN and UETA), place fields, track signers, and pull an evidence package. Every signing event goes into a public hash chain, sealed daily, so anyone can verify a document without trusting the sender or the service. 100 documents a month free, no card.11MIT
- AlicenseAqualityCmaintenanceDocument signing for AI agents. Send markdown or PDF for two-party e-signing with a single tool call — handles PDF generation, email verification, and SHA-256 certified delivery.28 npmMIT
Glama MCP Gateway
Add one secure layer between your agents and this server.