Skip to main content
Glama

Server Details

Connect your AI to your Well financial data - invoices, companies, contacts.

Status
Healthy
Last Tested
Transport
Streamable HTTP
URL

Glama MCP Gateway

Connect through Glama MCP Gateway for full control over tool access and complete visibility into every call.

MCP client
Glama
MCP server

Full call logging

Every tool call is logged with complete inputs and outputs, so you can debug issues and audit what your agents are doing.

Tool access control

Enable or disable individual tools per connector, so you decide what your agents can and cannot do.

Managed credentials

Glama handles OAuth flows, token storage, and automatic rotation, so credentials never expire on your clients.

Usage analytics

See which tools your agents call, how often, and when, so you can understand usage patterns and catch anomalies.

100% free. Your data is private.
Tool DescriptionsA

Average 4.6/5 across 25 of 25 tools scored.

Server CoherenceA
Disambiguation5/5

Every tool targets a distinct resource or action, with explicit cross-references to prevent confusion (e.g., get_cash_position vs get_runway vs get_cost_structure). The reconciliation tools (run_register_diff, resolve_reconciliation_task, resolve_register_diff_gap) have clear, non-overlapping roles, and the connector workflow (list_connectors, list_connector_tools, invoke_connector_tool) is clearly delineated. No two tools appear to do the same thing.

Naming Consistency5/5

All tools share the well_ prefix and follow a consistent verb_noun pattern (create_*, get_*, list_*, update_*, delete_*, etc.). Even longer names like create_invoice_from_data and resolve_register_diff_gap maintain the pattern, and there is no mixing of camelCase or inconsistent verb styles.

Tool Count4/5

At 25 tools, the server is on the heavier side, but the count is justified by the broad scope covering CRM, invoicing, financial analytics, connectors, and reconciliation. Each tool has a distinct purpose and there is no obvious duplication, though it sits at the upper boundary of what feels reasonable for a single server.

Completeness5/5

The server provides full lifecycle coverage for core entities (companies, persons, invoices) with create/read/update/delete operations, plus supporting tools for contact channels, financial KPIs, connector management, and the reconciliation workflow. Reads are handled via well_query_records and well_get_entity, and all documented workflows have the required tools with no dead ends.

Available Tools

26 tools
well_add_contact_channelAdd Contact ChannelAInspect

Add a contact channel to a company or person.

Wraps the resource-scoped REST endpoints (POST /v1/{companies,people}/:id/{emails,phones,web-links,locations}).

channel + the matching value field:

  • email → value.email

  • phone → value.e164_number (E.164; a leading "+" is added if missing)

  • web_link → value.url (+ optional value.platform, default "website")

  • location → value.city, value.country (+ optional address_line1/2, region, postal_code) value.label is optional (defaults to "work").

NOTE: adding a phone is supported on a PERSON but NOT on a company (no endpoint) — that combination returns a clear error. To READ existing channels, use well_query_records on the parent (companies/people) or the channel root.

ParametersJSON Schema
NameRequiredDescriptionDefault
valueYesChannel value — fill the field(s) for the chosen channel
parentYesParent record type: company or person
channelYesChannel to add: email | phone | web_link | location
parent_idYesUUID of the parent company or person
workspace_idNoTarget workspace. Omit to use the only authorized workspace, or (for read tools) to query all authorized workspaces grouped by workspace. Required for write tools when the token authorizes more than one workspace.
idempotency_keyNoOptional client-supplied key. A retried write with the same key returns the original result instead of re-applying the operation.

Output Schema

ParametersJSON Schema
NameRequiredDescription
errorNo
parentNo
channelNo
successYes
Behavior5/5

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

Beyond the annotations (readOnlyHint false, destructiveHint false), the description discloses concrete behavioral details: E.164 normalization with a leading '+' added, default label 'work', default platform 'website', and a clear error for unsupported phone/company combinations. It also mentions wrapping REST endpoints and shows the channel-to-value mapping.

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

Conciseness5/5

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

The description is well-structured with a one-line summary, endpoint reference, channel mapping table, and a note section. Every sentence carries useful information; there is no repetition of schema content or fluff, despite the tool's complexity.

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

Completeness5/5

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

Given the complexity (nested value objects, multiple channel types, unsupported combinations), the description covers all necessary context: endpoint wrapping, field mappings, defaults, and exceptions. The presence of an output schema means return-value documentation is unnecessary, and the description sufficiently covers the remaining behavioral context.

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

Parameters5/5

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

Although the input schema covers 100% of parameters with descriptions, the description adds essential cross-parameter logic: how 'channel' selects which 'value' sub-fields to populate (email → value.email, phone → value.e164_number, etc.). This mapping is not evident from the flat schema and is critical for correct invocation.

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

Purpose5/5

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

The description opens with a specific verb and resource: 'Add a contact channel to a company or person.' This clearly states both the action and the target, and it naturally distinguishes from sibling tools like well_remove_contact_channel and well_query_records.

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

Usage Guidelines5/5

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

The description explicitly tells the agent when to use an alternative: 'To READ existing channels, use well_query_records on the parent (companies/people) or the channel root.' It also warns against unsupported combinations (phone on company), preventing misuse.

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

well_create_companyCreate CompanyAInspect

Create a new company in the current workspace.

Use this tool when the user asks to create, add, or register a new company.

REQUIRED: name OPTIONAL: description

After creation, enrichment (logo, domain, industry, tax ID, description fill-in) runs asynchronously in the background. The new company is available immediately for follow-up actions, but enriched fields may take a few seconds to populate — re-query after a brief delay to see them.

Returns { success: true, company_id, name } on success, or { success: false, error } on failure.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesCompany name (required)
descriptionNoBrief company description
workspace_idNoTarget workspace. Omit to use the only authorized workspace, or (for read tools) to query all authorized workspaces grouped by workspace. Required for write tools when the token authorizes more than one workspace.
idempotency_keyNoOptional client-supplied key. A retried write with the same key returns the original result instead of re-applying the operation.

Output Schema

ParametersJSON Schema
NameRequiredDescription
nameNo
errorNo
successYes
company_idNo
Behavior5/5

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

Beyond the annotations (which only indicate non-read-only), the description discloses concrete behavioral details: enrichment runs asynchronously, the company is available immediately, enriched fields may take a few seconds, and the user should re-query after a delay. It also specifies the exact success/failure return format. This is rich, honest transparency.

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

Conciseness5/5

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

The description is efficiently organized: a one-sentence purpose, an explicit usage trigger, required/optional fields, a note on async enrichment, and the return format. Every sentence delivers value—no filler or redundancy.

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

Completeness5/5

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

For a create tool with an output schema, the description covers all essential context: purpose, when to use, parameter expectations, async side effects, and return structure. The workspace_id and idempotency_key are already fully documented in the schema, so the description does not need to repeat them. It is complete for the tool's complexity.

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

Parameters3/5

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

The input schema already provides descriptions for all four parameters (100% coverage). The description adds little beyond restating that 'name' is required and 'description' is optional—information already present in the schema. It does not explain workspace_id or idempotency_key behavior, which the schema already covers. Baseline 3 applies.

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

Purpose5/5

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

The description clearly states 'Create a new company in the current workspace'—a specific verb and resource. It distinguishes itself from sibling tools like well_update_company and well_delete_company by focusing solely on creation, and the trigger phrasing 'create, add, or register a new company' reinforces its unique role.

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

Usage Guidelines4/5

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

The description explicitly instructs when to use the tool: 'Use this tool when the user asks to create, add, or register a new company.' This provides clear context, though it does not explicitly mention alternatives (e.g., well_update_company for updates), which would earn a 5.

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

well_create_invoice_documentCreate Invoice DocumentAInspect

Render an existing invoice as a print-ready PDF and attach it as the invoice's source document.

The letterhead carries the issuing company's own mark when Well has one on file, and otherwise sets the issuer's name as text. Never promise a logo.

Use this tool when the user asks to generate, render, or attach a PDF for an invoice that already exists in the workspace. This does NOT email or send the invoice anywhere — it only creates and attaches the file.

REQUIRED: invoice_id (the invoice must already exist)

Refused if the invoice is already linked to a REAL ingested document (an upload, a connector import, or a provider-issued PDF) — that source of truth is never overwritten.

Returns { success: true, invoice_id, document_id, reference_number, file } on success, or { success: false, error } on failure.

file carries the rendered PDF's name and size plus the links to fetch it: download_url (saves the file), signed_url (opens it), and app_url (the document in Well). Hand the user download_url when they ask for the PDF itself. Both signed links stop working at expires_at; app_url does not.

ParametersJSON Schema
NameRequiredDescriptionDefault
invoice_idYes
workspace_idNoTarget workspace. Omit to use the only authorized workspace, or (for read tools) to query all authorized workspaces grouped by workspace. Required for write tools when the token authorizes more than one workspace.
idempotency_keyNoOptional client-supplied key. A retried write with the same key returns the original result instead of re-applying the operation.

Output Schema

ParametersJSON Schema
NameRequiredDescription
fileNo
errorNo
successYes
invoice_idNo
document_idNo
reference_numberNo
Behavior5/5

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

Annotations only indicate non-read-only and non-destructive. The description discloses crucial behaviors: it never overwrites a real ingested document, creates and attaches a PDF, returns signed URLs with expiration, and does not email. This goes well beyond annotations, covering edge cases and side effects.

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

Conciseness5/5

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

The description is long but every sentence adds value: core action, logo edge case, usage timing, non-goals, prerequisite, refusal, return structure, URL semantics. It is well-sectioned and front-loaded, making it easy to scan. No filler or redundancy.

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

Completeness5/5

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

The description fully covers the tool's purpose, prerequisites, constraints, return values, and link behaviors. Even with an output schema present, it explains what the file object contains and which URL to give the user. It is complete for both selection and invocation.

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

Parameters4/5

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

Schema descriptions cover workspace_id and idempotency_key, and the description adds critical semantics for invoice_id ('the invoice must already exist') which is not in the schema. However, the description does not elaborate further on workspace_id or idempotency_key, relying on schema text. Since schema coverage is 67% (not >80% but not low), the additional invoice_id context pushes it to a 4.

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

Purpose5/5

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

The description opens with a specific verb+resource: 'Render an existing invoice as a print-ready PDF and attach it as the invoice's source document.' This clearly distinguishes it from siblings like well_create_invoice_from_data (which creates a new invoice) and well_update_invoice (which updates fields). It also explicitly states what it does NOT do (email/send), preventing misuse.

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

Usage Guidelines5/5

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

The description provides explicit guidance: 'Use this tool when the user asks to generate, render, or attach a PDF for an invoice that already exists in the workspace.' It also gives a required prerequisite (invoice_id must exist), a refusal condition (already linked to a real ingested document), and what the tool does not do. This is exemplary usage guidance.

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

well_create_invoice_from_dataCreate Invoice From DataAInspect

Create an invoice in Well from data you extracted by reading an invoice (your own OCR) — you send the structured fields, not the file.

Well persists the invoice + its line items + payment means using the same pipeline as uploaded documents. Fill every field you can read from the document:

  • issuer / receiver: { name (required), company_id?, domain?, tax_id? }

  • reference_number, issue_date (YYYY-MM-DD), due_date? (YYYY-MM-DD), currency (ISO 4217)

  • totals?: { items_total?, tax_total?, grand_total }

  • line_items[]: { name, quantity?, unit_price, currency?, tax_rate? }

  • payment_means?[]: { type, iban?, bic?, scheme? }

  • status?: draft | issued | paid | canceled

ONE CALL IS THE WHOLE WRITE. This tool takes the invoice's status and both parties' company ids, so a create never needs a well_update_invoice after it:

  • The user asked to DRAFT an invoice → pass status: "draft" here.

  • You already found the company (well_query_records, well_get_entity) → pass its company_id on that party. Naming the party without its id re-resolves it, which can attach the invoice to the wrong company or create a duplicate one.

Creating and then patching the same invoice writes twice and shows the user two confirmations for one action. Put the intent in this call.

ParametersJSON Schema
NameRequiredDescriptionDefault
issuerYes
statusNoThe invoice's lifecycle status. Set it here when the user asked for one ("draft an invoice") — do NOT create and then call well_update_invoice to change it. Omitted, the status is derived from the document type.
totalsNo
currencyYesISO 4217 (3 letters).
due_dateNoISO 8601 YYYY-MM-DD.
receiverYes
issue_dateYesISO 8601 YYYY-MM-DD.
line_itemsYes
workspace_idNoTarget workspace. Omit to use the only authorized workspace, or (for read tools) to query all authorized workspaces grouped by workspace. Required for write tools when the token authorizes more than one workspace.
payment_meansNo
idempotency_keyNoOptional client-supplied key. A retried write with the same key returns the original result instead of re-applying the operation.
reference_numberYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
errorNo
successYes
invoice_idNo
document_idNo
payment_meansNo
reference_numberNo
invoice_item_countNo
Behavior5/5

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

With only minimal annotations (readOnlyHint=false, destructiveHint=false), the description carries the full burden and does so thoroughly. It discloses persistence behavior, the risk of company re-resolution causing wrong attachments or duplicates, and the double-write confirmation problem when combined with update calls. These are behavioral traits 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.

Conciseness5/5

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

The description is long but every sentence is purposeful. It opens with the core purpose, moves to a clear field list, and closes with a decisive 'ONE CALL IS THE WHOLE WRITE' callout. The structure uses paragraphs, bullets, and bolded hints to guide the reader, with no filler or redundancy.

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

Completeness5/5

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

For a complex tool with 12 parameters, nested objects, and significant operational pitfalls, the description covers the entire workflow: when to use, what fields to fill, how to avoid duplicates, and how to set status. The output schema exists, so not detailing return values is acceptable. It also references sibling tools for company lookup, making it contextually complete.

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

Parameters4/5

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

Schema coverage is 50%, so the description compensates by providing a structured field map for issuer/receiver, totals, line_items, and payment_means. It adds crucial semantics like 'company_id ALWAYS send this when you already know the company' and explains status derivation. While some details are already in the schema, the description enriches meaning, especially for nested objects lacking individual descriptions.

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

Purpose5/5

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

The description clearly states the tool creates an invoice from structured data extracted via OCR, explicitly distinguishing it from file upload ('you send the structured fields, not the file'). The verb 'create', the resource 'invoice', and the source 'data you extracted' are all specific and differentiate it from sibling tools like well_create_invoice_document and well_update_invoice.

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

Usage Guidelines5/5

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

The description gives explicit when-to-use guidance: use when you have structured data from OCR, and explicitly warns against pairing with well_update_invoice ('Creating and then patching the same invoice writes twice'). It also explains when to pass status and company_id, referencing well_query_records and well_get_entity for finding companies, and names the alternative of simply uploading a document.

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

well_create_personCreate PersonAInspect

Create a new person (contact) in the current workspace.

Use this tool when the user asks to add, create, or register a new contact, employee, or person.

REQUIRED: first_name OPTIONAL: last_name, job_title

After creation, enrichment runs asynchronously in the background.

Returns { success: true, person_id, full_name } on success, or { success: false, error } on failure.

ParametersJSON Schema
NameRequiredDescriptionDefault
emailNo
phoneNo
job_titleNoJob title
last_nameNoLast name (optional)
first_nameYesFirst name (required)
workspace_idNoTarget workspace. Omit to use the only authorized workspace, or (for read tools) to query all authorized workspaces grouped by workspace. Required for write tools when the token authorizes more than one workspace.
idempotency_keyNoOptional client-supplied key. A retried write with the same key returns the original result instead of re-applying the operation.

Output Schema

ParametersJSON Schema
NameRequiredDescription
errorNo
successYes
full_nameNo
person_idNo
Behavior4/5

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

With annotations already indicating this is a write operation (readOnlyHint=false) and not destructive, the description adds valuable context: 'After creation, enrichment runs asynchronously in the background' and the exact success/failure return shape. This goes beyond the annotations and helps the agent anticipate side effects and response format. It does not, however, detail what 'enrichment' entails or potential failure modes, so it is not a full behavioral disclosure.

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

Conciseness5/5

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

The description is tightly written with a clear structure: purpose, usage guidance, required/optional summary, async behavior, and return format. Every sentence earns its place, and the most important information is front-loaded. It is neither verbose nor ambiguous.

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

Completeness5/5

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

For a 7-parameter create tool with good schema coverage and an output schema, the description covers all essential aspects: what it does, when to use it, required/optional fields, background enrichment, and return values. The workspace_id and idempotency_key nuances are handled by the schema descriptions, so the description itself is complete for the agent to select and invoke the tool correctly.

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

Parameters3/5

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

The schema already provides descriptions for 5 of 7 parameters (71% coverage). The description adds a concise summary of REQUIRED first_name and OPTIONAL last_name/job_title, but it omits email and phone which are also optional and lack schema descriptions. Since the description does not fully compensate for the missing email/phone semantics, it adds moderate value but falls short of fully clarifying all parameters.

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

Purpose5/5

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

The description opens with 'Create a new person (contact) in the current workspace,' which uses a specific verb and resource while clarifying the scope. It further distinguishes from sibling tools like well_create_company by explicitly covering 'add, create, or register a new contact, employee, or person.' This makes the tool's purpose unambiguous.

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

Usage Guidelines4/5

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

The description explicitly states when to use the tool: 'Use this tool when the user asks to add, create, or register a new contact, employee, or person.' It also mentions the current workspace context and that enrichment runs asynchronously. However, it does not explicitly state when not to use it or mention alternatives (e.g., well_update_person for updates), so it stops short of a full when/when-not/alternatives explanation.

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

well_delete_companyDelete CompanyA
Destructive
Inspect

Delete a company from the current workspace (soft delete).

Use this tool when the user asks to delete, remove, or archive a company.

REQUIRED: company_id

This soft-deletes the company and its company_person relationships. Linked people records themselves are NOT deleted. Invoices and documents referencing the company are preserved.

Returns { success: true, company_id } on success, or { success: false, error } on failure.

ParametersJSON Schema
NameRequiredDescriptionDefault
company_idYesThe UUID of the company to delete (required)
workspace_idNoTarget workspace. Omit to use the only authorized workspace, or (for read tools) to query all authorized workspaces grouped by workspace. Required for write tools when the token authorizes more than one workspace.
idempotency_keyNoOptional client-supplied key. A retried write with the same key returns the original result instead of re-applying the operation.

Output Schema

ParametersJSON Schema
NameRequiredDescription
errorNo
successYes
company_idNo
Behavior5/5

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

The description goes beyond the destructiveHint annotation by explaining that the delete is a soft delete, that company_person relationships are removed, that linked people records are NOT deleted, and that invoices/documents referencing the company are preserved. It also discloses the return format, providing rich behavioral context beyond the annotations.

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

Conciseness5/5

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

The description is compact and well-structured: it starts with the core purpose, then usage guidance, then side effects, and finally the return contract. Every sentence contributes useful information without redundancy, and the formatting makes it easy to scan.

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

Completeness5/5

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

Given the tool's simplicity, the description is complete: it explains what is deleted, what is preserved, and what the return value looks like. Even with an output schema present, it provides a concise summary of success/failure behavior, and the schema covers parameter details.

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

Parameters3/5

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

The input schema already provides 100% coverage of all parameters (company_id, workspace_id, idempotency_key) with clear descriptions. The main description only reiterates that company_id is required without adding additional semantics, so it adds minimal value beyond the schema.

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

Purpose5/5

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

The description clearly states 'Delete a company from the current workspace (soft delete)' with a specific verb and resource. It distinguishes from sibling deletion tools by specifying that only the company is soft-deleted while linked people records and invoices/documents are preserved, making the tool's scope unambiguous.

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

Usage Guidelines4/5

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

The description explicitly says 'Use this tool when the user asks to delete, remove, or archive a company,' providing clear when-to-use guidance. However, it does not explicitly name alternative tools for deleting other entities (e.g., well_delete_person, well_delete_invoice), so it falls short of the full when-not/alternatives clarity seen in top-tier examples.

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

well_delete_invoiceDelete InvoiceA
Destructive
Inspect

Delete an invoice from Well (soft delete).

REQUIRED: invoice_id

Soft-deletes the invoice. Linked line items and payment_means rows are NOT cascade-deleted — they remain in the database, orphaned. The delete is reversible only at the database level.

ParametersJSON Schema
NameRequiredDescriptionDefault
invoice_idYesThe UUID of the invoice to delete
workspace_idNoTarget workspace. Omit to use the only authorized workspace, or (for read tools) to query all authorized workspaces grouped by workspace. Required for write tools when the token authorizes more than one workspace.
idempotency_keyNoOptional client-supplied key. A retried write with the same key returns the original result instead of re-applying the operation.

Output Schema

ParametersJSON Schema
NameRequiredDescription
errorNo
successYes
invoice_idNo
Behavior5/5

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

Beyond the annotation destructiveHint=true, the description adds significant behavioral detail: it is a soft delete, linked line items and payment_means rows remain orphaned, and reversal is only possible at the database level. This is critical context for an agent deciding whether to use the tool.

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

Conciseness5/5

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

The description is concise and well-structured: a one-line summary, a clear 'REQUIRED' note, and bullet-like consequences of the delete. It is easily scannable and every sentence contributes meaningful information.

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

Completeness5/5

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

For a destructive operation, the description explains the full impact: what will be deleted (invoice), what will NOT be deleted (line items, payment_means), and the reversibility limitation. Combined with the rich schema annotations, this is complete enough for an agent to safely invoke the tool.

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

Parameters3/5

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

The input schema provides 100% coverage with descriptions for all three parameters. The description only restates that invoice_id is required, adding no new information about workspace_id or idempotency_key. Thus the added value over the schema is minimal, matching the baseline for full schema coverage.

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

Purpose5/5

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

The description explicitly states the action: 'Delete an invoice from Well (soft delete).' It uses a clear verb+resource structure and distinguishes itself from sibling delete tools (e.g., well_delete_company, well_delete_person) by targeting invoices specifically.

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

Usage Guidelines4/5

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

The description provides clear context by explaining this is a soft delete and warns about the non-cascade behavior for linked rows. However, it does not explicitly mention when to use this tool over alternatives or state exclusions, so it falls short of fully explicit usage guidance.

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

well_delete_personDelete PersonA
Destructive
Inspect

Delete a person (contact) from the current workspace (soft delete).

Use this tool when the user asks to delete, remove, or archive a contact.

REQUIRED: person_id

This soft-deletes the person and its company_person relationships. Linked companies themselves are NOT deleted. The authenticated user cannot delete their own person record.

Returns { success: true, person_id } on success, or { success: false, error } on failure.

ParametersJSON Schema
NameRequiredDescriptionDefault
person_idYesThe UUID of the person to delete (required)
workspace_idNoTarget workspace. Omit to use the only authorized workspace, or (for read tools) to query all authorized workspaces grouped by workspace. Required for write tools when the token authorizes more than one workspace.
idempotency_keyNoOptional client-supplied key. A retried write with the same key returns the original result instead of re-applying the operation.

Output Schema

ParametersJSON Schema
NameRequiredDescription
errorNo
successYes
person_idNo
Behavior5/5

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

Annotations already mark destructiveHint=true, but the description adds significant behavior: soft delete, cascading company_person relationships, linked companies NOT deleted, and the restriction that a user cannot delete their own record. It also documents the exact return shape, going far beyond annotation hints.

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

Conciseness5/5

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

Description is well-structured and dense: a one-line summary, a clear usage trigger, a required parameter note, key behavioral caveats, and return format. Each sentence contributes unique value without redundancy.

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

Completeness5/5

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

The tool has a straightforward action with one required parameter, and the description covers all key aspects: what happens (soft delete), scope (current workspace), side effects (relationship removal), exclusions (companies, own record), and the success/error response. The output schema exists, so further return detail is unnecessary.

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

Parameters3/5

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

Input schema descriptions cover 100% of parameters, so the baseline is 3. The description only repeats that person_id is required and does not add extra semantic detail beyond the schema's built-in explanations. No additional parameter context is provided.

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

Purpose5/5

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

Description clearly identifies the tool as deleting a person/contact with 'soft delete' semantics, distinguishing it from sibling delete tools like well_delete_company and well_delete_invoice. The verb 'delete' and resource 'person' are specific and unambiguous.

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

Usage Guidelines4/5

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

Explicitly states when to use: 'when the user asks to delete, remove, or archive a contact.' Provides clear context but does not offer exclusions or name alternative tools for related scenarios, so it lacks the full when-not guidance for a 5.

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

well_get_cash_positionGet Cash PositionA
Read-only
Inspect

Get the workspace's current cash position: total cash on hand right now, converted to the workspace base currency, plus a per-account breakdown — the exact same computation and numbers the Well app's canvas KPI card shows. Use this instead of summing account balances yourself.

Returns amount/currency (the converted total), accounts (per-account contributions: native amount/currency, converted amount, the FX rate applied), and as_of (the FX-rate anchor date this snapshot is valid for).

unavailable: true means amount is a placeholder, not a real measurement (e.g. no accounts connected yet) — say so plainly rather than presenting it as a real €0 balance. partial: true means one or more accounts were excluded from an otherwise real total (e.g. missing FX rate) — mention the exclusion count and any hints rather than presenting the number as unconditionally complete.

This is a snapshot only — no burn rate or runway is implied. Call well_get_runway instead for a forward-looking figure.

Call this directly — no other tool call is needed first (workspace is resolved from the caller's authorized token, same as every other well_* tool).

ParametersJSON Schema
NameRequiredDescriptionDefault
workspace_idNoTarget workspace. Omit to use the only authorized workspace, or (for read tools) to query all authorized workspaces grouped by workspace. Required for write tools when the token authorizes more than one workspace.

Output Schema

ParametersJSON Schema
NameRequiredDescription
as_ofNo
errorNo
hintsNo
amountYes
partialNo
successYes
accountsYes
currencyNo
excludedNo
unavailableYes
Behavior5/5

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

The description adds significant behavioral context beyond the readOnlyHint=true annotation: it explains the `unavailable` and `partial` flags with concrete examples, clarifies this is a snapshot only, and defines the FX as_of anchor date. This is exactly the kind of nuance that prevents misinterpreting placeholder values as real balances.

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

Conciseness5/5

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

The description is structured in five focused paragraphs, each serving a distinct purpose: definition, return values, edge-case flags, forward-looking disclaimer, and entry prerequisite. Despite being lengthy, there is no filler; every sentence adds necessary information for correct invocation.

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

Completeness5/5

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

The description fully covers the tool's unique edge cases (`unavailable`, `partial`, FX rate anchor), distinguishes from runway, and states the token-based workspace resolution. With a rich output schema and annotations, this description leaves no critical gap for an agent trying to use the tool correctly.

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

Parameters3/5

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

The sole parameter workspace_id has 100% schema description coverage, including the omit behavior. The description reinforces that workspace resolution comes from the caller's authorized token and that no other call is needed, but it doesn't add syntax or format details beyond the schema, so the baseline of 3 is appropriate.

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

Purpose5/5

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

The description opens with a specific verb and resource: 'Get the workspace's current cash position: total cash on hand right now, converted to the workspace base currency, plus a per-account breakdown.' It also explicitly differentiates from manual summing and later from well_get_runway, making the tool's purpose unmistakable.

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

Usage Guidelines5/5

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

The description gives explicit when-to-use guidance: 'Use this instead of summing account balances yourself' and contrasts with the alternative 'Call well_get_runway instead for a forward-looking figure.' It also states a prerequisite: 'Call this directly — no other tool call is needed first,' covering both usage and exclusions.

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

well_get_cost_structureGet Cost StructureA
Read-only
Inspect

Get the workspace's cost structure: outflow for the latest closed month, broken down by category — the exact same computation and numbers the Well app's canvas cost-structure donut chart shows. Use this instead of summing/grouping transactions yourself.

Returns entries (an array of { category, amount, pct }, sorted by amount descending) and currency (the workspace base currency). amount is a magnitude (outflow), not signed.

rung names which grouping actually produced these categories — "ledger_account" (the workspace's own chart of accounts), "category_normalized" (Well's auto-categorization), "transaction_type" (a technical fallback bucket), or "uncategorised" (no rung qualified — either nothing covered the month, or a rung had the coverage but too few labelled rows). State it when you present the breakdown so the user knows whether they're looking at their own ledger's categories or Well's.

If hints are present (e.g. a coverage caveat about uncategorized spend), disclose them rather than presenting the breakdown as unconditionally complete.

Call this directly — no other tool call is needed first (workspace is resolved from the caller's authorized token, same as every other well_* tool).

ParametersJSON Schema
NameRequiredDescriptionDefault
workspace_idNoTarget workspace. Omit to use the only authorized workspace, or (for read tools) to query all authorized workspaces grouped by workspace. Required for write tools when the token authorizes more than one workspace.

Output Schema

ParametersJSON Schema
NameRequiredDescription
rungNoWhich ladder rung produced these categories: the workspace's own ledger accounts, Well's auto-categorization, a technical fallback bucket, or none qualified.
errorNo
hintsNo
entriesYes
successYes
currencyNo
records_urlNoLogin-gated deep link to the web-app transactions table, so the user can categorize the underlying spend. Null when no workspace is in context.
Behavior5/5

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

Beyond the readOnlyHint annotation, the description discloses detailed behavior: return shape (entries, currency, rung, hints), the meaning of each rung, that amount is a magnitude not signed, and the requirement to disclose hints. It also explains that workspace is resolved from the authorized token, which adds useful context.

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

Conciseness4/5

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

The description is longer than the calibration ideal but well-structured with clear sections: purpose, return details, rung explanation, hints, and call convention. Every sentence carries relevant information, though some redundancy exists with the schema description for workspace resolution.

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

Completeness5/5

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

Given an output schema exists, the description need not explain return values, yet it does so thoroughly. It covers purpose, usage, behavioral edge cases (rung fallback), and hints disclosure, providing a complete picture for correct invocation and result interpretation.

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

Parameters3/5

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

Schema coverage is 100% with a detailed workspace_id description already in the input schema. The tool description adds minimal new parameter meaning; it only reaffirms that workspace is resolved automatically, which is already implied by the schema's 'Omit to use the only authorized workspace' language.

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

Purpose5/5

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

The description clearly states a specific verb+resource+scope: 'Get the workspace's cost structure: outflow for the latest closed month, broken down by category.' It explicitly differentiates from manual transaction summing/grouping and references the exact same computation as the Well app's donut chart, making it unique among sibling tools.

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

Usage Guidelines4/5

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

The description tells the agent when to use this tool ('Use this instead of summing/grouping transactions yourself') and that no prerequisite call is needed ('Call this directly — no other tool call is needed first'). It does not explicitly name sibling alternatives or exclusion cases, but the context is clear enough for selection.

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

well_get_entityGet Entity (with sub-resources)A
Read-only
Inspect

Read ONE entity with its sub-resources nested in a single call.

Convenience over well_get_schema + well_query_records: resolves the field paths for you and returns the single record with its related data expanded.

depth (relation-nesting BOUNDARY, 1-3, default 1): 1 = the entity + its direct sub-resources (emails, phones, locations, …) 2 = + the sub-resources' related scalars 3 = the full level-3 graph (LARGER payload — use when you need the whole picture) Stops at depth 3. Aggregates are excluded. Each child collection is capped at 50 rows; for a full list or to page a large child collection, use well_query_records on that child root instead.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesThe entity's public UUID (the value of its *_id field, e.g. company_id)
rootYesEntity type, e.g. companies | people | invoices | transactions
depthNoRelation-nesting boundary 1-3 (default 1).
workspace_idNoTarget workspace. Omit to use the only authorized workspace, or (for read tools) to query all authorized workspaces grouped by workspace. Required for write tools when the token authorizes more than one workspace.

Output Schema

ParametersJSON Schema
NameRequiredDescription
depthNo
errorNo
foundYes
entityYes
successYes
columnMetaNoPer-column field meaning ({context, enrichment}) for documented columns — read this to interpret the entity's values.
fields_selectedNo
Behavior5/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, but the description adds critical behaviors beyond that: 'Stops at depth 3. Aggregates are excluded. Each child collection is capped at 50 rows.' This gives the agent concrete expectations about limits and exclusions.

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

Conciseness5/5

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

The description is well-structured: a one-sentence summary, followed by a comparison to alternatives, then depth-level details, and finally limitations with a pointer to the alternative tool. Every sentence adds necessary information with no redundancy.

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

Completeness5/5

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

With an output schema present, return values are already specified. The description fills in operational context: depth semantics, sub-resource examples, row caps, aggregate exclusion, and when to use an alternative. This makes the tool fully self-explanatory for an agent.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, but the description significantly enhances understanding of the 'depth' parameter by explaining what each level (1, 2, 3) returns and noting the payload size impact. Other parameters are already well-documented in the schema, so the extra depth semantics justify a score above baseline but not a 5 since not all parameters receive additional context.

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

Purpose5/5

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

The description opens with 'Read ONE entity with its sub-resources nested in a single call,' using a specific verb and resource while clearly defining the tool's scope. It also distinguishes itself from sibling tools by naming well_get_schema and well_query_records as alternatives.

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

Usage Guidelines5/5

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

Explicitly states when to use this tool: 'Convenience over well_get_schema + well_query_records' and provides an alternative for other cases: 'use well_query_records on that child root instead.' Depth-level guidance further clarifies usage boundaries.

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

well_get_investment_holdingsGet Investment HoldingsA
Read-only
Inspect

Get the live holdings/positions (what's currently held and its value) for a connected Plaid investment account — brokerage, IRA, 401k, etc.

WORKFLOW:

  1. well_list_connectors() → pick the ENABLED Plaid connector (connection_status: "enabled") and read its workspace_connector_id directly off the row.

  2. well_get_investment_holdings({ workspace_connector_id }) → the current holdings, fetched fresh from Plaid on every call (never stored/stale data).

Only works on Plaid connectors that support the investments product — not the MCP-transport connector-tool-passthrough tools (well_list_connector_tools / well_invoke_connector_tool), and not for investment transactions (buy/sell/dividend/fee), which are queryable as ordinary rows via well_query_records on the transactions root instead.

ParametersJSON Schema
NameRequiredDescriptionDefault
workspace_idNoTarget workspace. Omit to use the only authorized workspace, or (for read tools) to query all authorized workspaces grouped by workspace. Required for write tools when the token authorizes more than one workspace.
workspace_connector_idYesThe connected Plaid provider's workspace_connector_id (from well_list_connectors).

Output Schema

ParametersJSON Schema
NameRequiredDescription
errorNo
successYes
holdingsNo
Behavior5/5

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

Annotations declare readOnlyHint=true and destructiveHint=false, and the description adds valuable context beyond that: data is fetched fresh from Plaid on every call, never stale, and only works for Plaid connectors supporting the investments product. No contradiction with annotations.

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

Conciseness5/5

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

Well-structured with a clear opening summary, numbered workflow, and explicit exclusions. Each section earns its place; no fluff or redundancy.

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

Completeness5/5

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

Despite having an output schema, the description provides necessary context about prerequisites, connector eligibility, and alternative paths for transactions. It is complete for a tool with this complexity and connector ecosystem.

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

Parameters4/5

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

Schema coverage is 100% with descriptions for both params. The description adds extra meaning for workspace_connector_id by showing exactly where to obtain it (from well_list_connectors row), which is beyond the schema's basic description.

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

Purpose5/5

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

The description clearly states the tool retrieves live holdings/positions for connected Plaid investment accounts, with specific account types (brokerage, IRA, 401k). It distinguishes itself from sibling tools by explicitly excluding transactions and passthrough tool usage.

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

Usage Guidelines5/5

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

Provides a step-by-step workflow: first call well_list_connectors, pick the enabled Plaid connector, then call this tool with the workspace_connector_id. It also explicitly states when not to use it (not for MCP-transport passthrough tools, not for transactions) and points to well_query_records as the alternative.

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

well_get_runwayGet RunwayA
Read-only
Inspect

Get the workspace's current cash runway — cash on hand, trailing-3-month average burn, and months of cash left — the exact same computation and numbers the Well app's canvas KPI cards show. Use this instead of computing runway yourself from raw account/transaction reads.

Returns cash (amount + currency), avg_burn (amount + currency + trailing_months), months, and a status discriminator:

  • "ok" — a finite months figure.

  • "capped" — runway exceeds 36 months; report as ">36 months", not the raw number.

  • "infinite" — cash is positive and the workspace isn't burning (net inflow); there is no meaningful "months" figure.

  • "insufficient_data" — not enough connected cash/transaction data to compute; tell the user to connect a bank/accounting connector (well_list_connectors) instead of guessing.

partial: true means some accounts or transactions were excluded from the computation (e.g. missing FX rate) — mention the exclusion counts and any hints if present rather than presenting the number as unconditionally complete.

Call this directly — no other tool call is needed first (workspace is resolved from the caller's authorized token, same as every other well_* tool).

ParametersJSON Schema
NameRequiredDescriptionDefault
workspace_idNoTarget workspace. Omit to use the only authorized workspace, or (for read tools) to query all authorized workspaces grouped by workspace. Required for write tools when the token authorizes more than one workspace.

Output Schema

ParametersJSON Schema
NameRequiredDescription
cashNo
as_ofNo
errorNo
hintsNo
monthsYes
statusYes
partialNo
successYes
avg_burnNo
excludedNo
Behavior5/5

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

The description goes well beyond the readOnlyHint annotation by explaining status discriminator semantics (ok, capped, infinite, insufficient_data), partial=true behavior, and the exclusion-count/hints handling. It gives a complete behavioral picture without contradicting annotations.

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

Conciseness5/5

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

The description is detailed but every sentence is purposeful, with a clear first-sentence summary, bulleted status patterns, and a final usage note. It is front-loaded and structured for quick comprehension without fluff.

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

Completeness5/5

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

Even though an output schema is present, the description adds essential context: status meanings, capped/infinite handling, partial-data caveats, and the no-prerequisite instruction. It fully equips the agent to interpret results and act on edge cases.

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

Parameters3/5

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

The schema already provides 100% coverage for workspace_id, including omission behavior. The description's note that workspace is resolved from the caller's token adds minimal value beyond what the schema states, so baseline 3 is appropriate.

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

Purpose5/5

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

The description clearly states the tool returns the workspace's cash runway with specific metrics (cash on hand, trailing-3-month burn, months left) and explicitly ties it to Well app KPI cards, differentiating it from raw data reads and sibling tools like well_get_cash_position.

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

Usage Guidelines5/5

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

It explicitly instructs to use this instead of computing runway from raw account/transaction reads, states no other tool call is needed first, and points to well_list_connectors as an alternative when data is insufficient. This is strong 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.

well_get_schemaGet SchemaA
Read-only
Inspect

Discover available data types and fields.

USAGE:

  • well_get_schema() → List ALL available roots, including the accounting graph (ledger_accounts, journals, journal_entries) plus account_balances, tax_rates, exchange_rates — query these for real financial statements (compte de résultat / balance sheet) instead of reconstructing them from raw invoices

  • well_get_schema({ root: "invoices" }) → List all available fields for invoices

WORKFLOW:

  1. Call well_get_schema(root) to see available fields

  2. Pick the fields you need for your task (typically 5-15)

  3. Call well_query_records with those specific fields

Returns fields with path, type, and (when documented) semantic context:

  • { path: "invoices.grand_total", type: "numeric", context: "Total invoice amount incl. tax in the document currency...", enrichment: "AI extraction" } → use _eq, _gt, _lt, etc.

  • { path: "invoices.local_currency", type: "enum" } → use ONLY _eq, _neq, _in, _nin, _is_null

  • { path: "invoices.issuer.name", type: "text" } → use _eq, _like, _ilike, etc.

  • "context" (when present) explains what the field MEANS in the domain and how it's used — read it to pick the right field and write correct filters.

  • "enrichment" (when present) is the value's provenance (e.g. "Bank sync", "AI extraction", "System generated", "Derived", "Manual"). Use the type to choose the right whereClause operators in well_query_records. To use in well_query_records, convert path to array: "invoices.issuer.name" → ["invoices", "issuer", "name"]

ParametersJSON Schema
NameRequiredDescriptionDefault
rootNoEntity root to inspect. Omit to list every available root (call well_get_schema() with no argument first). Includes the accounting graph (ledger_accounts, journals, journal_entries) alongside companies, invoices, transactions, accounts, and more.
depthNoRelationship depth: 0=scalars only, 1=direct relations (default), 2=nested, 3=level-3 graph
workspace_idNoTarget workspace. Omit to use the only authorized workspace, or (for read tools) to query all authorized workspaces grouped by workspace. Required for write tools when the token authorizes more than one workspace.

Output Schema

ParametersJSON Schema
NameRequiredDescription
rootNo
errorNo
rootsNo
totalNo
fieldsNo
successYes
Behavior5/5

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

Beyond the readOnlyHint and destructiveHint annotations, the description discloses the return format (path, type, context, enrichment), provides examples of operator compatibility by type, and explains the meaning of 'context' and 'enrichment'. It also includes the path-to-array conversion detail for downstream use. This is rich behavioral context that goes far beyond the annotations.

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

Conciseness5/5

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

The description is structured with clear sections (USAGE, WORKFLOW, return format explanation). Every sentence provides necessary information for the agent to use the tool effectively. While it is longer than typical descriptions, the length is justified by the tool's role as a schema discovery gateway, and the organization makes it easy to scan.

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

Completeness5/5

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

The description fully covers what the tool does, how to invoke it, what it returns, how to interpret the results, and how to integrate with well_query_records. Given the tool's purpose and the presence of an output schema, the description explains the semantic meaning of returned fields and operator selection, making the context complete for an agent.

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

Parameters4/5

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

Schema description coverage is 100%, so the schema already documents all parameters. The description adds value by showing example calls, clarifying the meaning of omitting root, and explaining how the returned field metadata (type, context) relates to filter operators in well_query_records. It does not elaborate on depth or workspace_id, but those are well-described in the schema, so the extra context still justifies a score above baseline.

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

Purpose5/5

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

The description clearly states the tool discovers available data types and fields. It provides specific usage examples (e.g., 'well_get_schema()' to list all roots, 'well_get_schema({ root: "invoices" })' to list fields) and distinguishes itself from sibling tools like well_query_records by explaining it is the discovery step before querying.

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

Usage Guidelines5/5

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

The description gives explicit workflow steps: call well_get_schema first, pick 5-15 fields, then call well_query_records. It also specifies when to omit the root argument (list all roots) and how to use the returned type information to construct whereClause operators. This is clear, actionable guidance with no ambiguity about when to use the tool.

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

well_invoke_connector_toolInvoke Connector ToolA
Destructive
Inspect

Run one tool on a connected provider's own MCP server (e.g. create a record in Attio), on behalf of this workspace's connection.

Use this ONLY for an action the user explicitly asked to take on that provider. It is NOT a way to read financial data: Well already syncs invoices, transactions, accounts and the accounting graph from every connected provider — read those with well_query_records instead of calling a provider's own list/read tools.

WORKFLOW:

  1. well_list_connectors() → pick the ENABLED provider (connection_status: "enabled") and read its workspace_connector_id directly off the row.

  2. well_list_connector_tools({ workspace_connector_id }) → the live tool names + input schemas that connection actually exposes right now.

  3. well_invoke_connector_tool({ workspace_connector_id, tool: "<one of the names from step 2>", args: { ... } }).

Only works on connectors that expose an MCP server (e.g. Attio, Notion, Linear) and whose connection is enabled. Returns the provider's tool result, or { success: false, error } if the tool failed / is not granted.

ParametersJSON Schema
NameRequiredDescriptionDefault
argsNoArguments object passed straight to the provider tool. Omit if the tool takes none.
toolYesThe provider tool name to run (one of the connector's available_tools).
workspace_idNoTarget workspace. Omit to use the only authorized workspace, or (for read tools) to query all authorized workspaces grouped by workspace. Required for write tools when the token authorizes more than one workspace.
idempotency_keyNoOptional client-supplied key. A retried write with the same key returns the original result instead of re-applying the operation.
workspace_connector_idYesThe connected provider's workspace_connector_id (from well_list_connectors).

Output Schema

ParametersJSON Schema
NameRequiredDescription
toolNo
errorNo
resultNo
successYes
error_codeNo
Behavior4/5

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

The description adds valuable context beyond the annotations, such as eligibility ('Only works on connectors that expose an MCP server... and whose connection is enabled'), return format ('Returns the provider's tool result, or { success: false, error }'), and authorization context ('on behalf of this workspace's connection'). No contradiction with annotations.

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

Conciseness4/5

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

The description is somewhat long but well-structured: a clear opening statement, an exclusion note, and a numbered workflow. Each part serves a purpose, and the list format aids comprehension. No wasted words, though it could be tightened slightly.

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

Completeness5/5

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

Given the tool's complexity (5 params, nested args, output schema, annotations), the description covers all necessary context: prerequisites, discovery process (workflow), usage restrictions, and error behavior. It is comprehensive without needing to explain return values since an output schema exists.

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

Parameters4/5

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

Schema coverage is 100%, so baseline is 3. The description adds workflow-level meaning: workspace_connector_id comes from well_list_connectors, tool must be 'one of the names from step 2', and args are 'passed straight to the provider tool'. This enriches parameter understanding beyond the schema descriptions.

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

Purpose5/5

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

The description clearly states the tool's function: 'Run one tool on a connected provider's own MCP server' with a concrete example ('create a record in Attio'). It distinguishes itself from siblings by explicitly contrasting with well_query_records for reading financial data and by outlining a workflow that separate steps.

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

Usage Guidelines5/5

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

The description provides explicit when-to-use and when-not-to-use guidance: 'Use this ONLY for an action the user explicitly asked to take on that provider' and 'It is NOT a way to read financial data... read those with well_query_records instead.' It also names the alternative tools in the workflow.

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

well_list_connectorsList ConnectorsA
Read-only
Inspect

List the connectors a workspace can install, each with a one-click install deep link.

Use this to answer "what can I connect to Well?" or "how do I connect ?". Each entry has:

  • service_id: the connector's stable catalog id (e.g. "stripe"), used in the install link.

  • name, category_id, direction: what the connector is.

  • status: "available" connectors are connectable now; "coming_soon"/"unavailable"/"maintenance" are not.

  • is_matched / is_selected: whether this workspace's detected tools matched this connector / already picked it.

  • match_score: 0..1 confidence of that match; null when unmatched. A high score is a tool Well is confident the workspace already uses.

  • is_connected: this workspace already holds a live connection for the connector — offer a reconnect, not a first install.

  • connection_status: that live connection's state, or null when not connected. "enabled" is connected and syncing; "processing" means the grant is in and the FIRST sync is still running (connected — do not ask the user to connect it again); "error" is authenticated but its last real sync failed, which warrants a reconnect.

  • workspace_connector_id: the connected instance's id, or null when not connected. This is the id well_invoke_connector_tool and well_list_connector_tools need — resolve it HERE, never via well_query_records on workspace_connectors.

  • is_preselected: Well recommends connecting this one now (a high-confidence match that is not yet connected). The interactive picker pre-checks exactly these.

  • install_url: a one-click link that STARTS the connection in Well. It works from any state — it signs the user in if needed, creates their workspace if they have none, then runs the connector's own auth flow — and it covers banks too (a bank opens its bank-login flow pre-selected). Null only when the connector is not "available". Hand this to the user to get started in one click.

The default view returns the curated, matched-first connectors; pass q to name-search the full catalog (e.g. a specific bank). This is ALSO the tool that answers "what have I connected?" — read is_connected / connection_status / workspace_connector_id here rather than querying workspace_connectors records. Use well_list_connector_tools for a live connection's actions.

ParametersJSON Schema
NameRequiredDescriptionDefault
qNoName search across the full catalog (e.g. a specific bank). Omit for the curated, matched-first view.
limitNoMax connectors to return (1-100, default 50).
offsetNoNumber of connectors to skip, for paging (default 0).
workspace_idNoTarget workspace. Omit to use the only authorized workspace, or (for read tools) to query all authorized workspaces grouped by workspace. Required for write tools when the token authorizes more than one workspace.

Output Schema

ParametersJSON Schema
NameRequiredDescription
errorNo
limitNo
totalNo
offsetNo
successYes
connectorsNo
Behavior5/5

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

Annotations only declare readOnlyHint=true and destructiveHint=false, but the description adds extensive behavioral context: install_url behavior ('works from any state — it signs the user in if needed...'), connection_status state meanings, the instruction to resolve workspace_connector_id here rather than via well_query_records, and the default vs q-search behavior. This goes 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.

Conciseness4/5

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

The description is lengthy but structured: starting with purpose, then field-by-field bullets, then usage distinctions. Every sentence adds value, though a few statements are repeated (e.g., the 'This is ALSO' point appears twice). It is front-loaded and organized, earning a 4 rather than a 5.

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

Completeness5/5

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

Given the tool's complexity (many response fields, connection states, and install links), the description is remarkably complete. It explains each response field, how to interpret status/connection_status, when to pass q, and how to use install_url. The existing output schema would further support return values, but the description already covers the crucial context.

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

Parameters3/5

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

The input schema already covers all 4 parameters with descriptions (100% coverage). The description reinforces the q parameter's role ('pass q to name-search the full catalog') and default/limit behavior, but does not add meaning beyond the schema. Baseline 3 is appropriate since the schema does the heavy lifting.

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

Purpose5/5

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

The description opens with a specific verb and resource: 'List the connectors a workspace can install, each with a one-click install deep link.' It clearly distinguishes this from sibling tools by stating it answers 'what can I connect to Well?' and explicitly directing users to well_list_connector_tools for live connection actions.

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

Usage Guidelines5/5

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

The description gives explicit when-to-use guidance: 'Use this to answer...' and 'This is ALSO the tool that answers...' It names alternatives (well_list_connector_tools, well_query_records) and states 'Use well_list_connector_tools for a live connection's actions.' This satisfies exclusions and alternatives.

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

well_list_connector_toolsList Connector ToolsA
Read-only
Inspect

Discover the actions a connected provider exposes (e.g. "what can I do with Attio?").

WORKFLOW:

  1. well_list_connectors() → pick the ENABLED provider (connection_status: "enabled") and read its workspace_connector_id directly off the row.

  2. well_list_connector_tools({ workspace_connector_id }) → the actions that provider offers (name + description + input schema).

  3. well_invoke_connector_tool({ workspace_connector_id, tool, args }) → run one, shaping args from the input schema returned here.

Use this whenever you don't already know a connector's tool names — never guess them.

Every response also carries reconnect_url: a deep link to the connector's setup page in the web app. When success is false or status is "need_reconnect" (the provider's token is stale/revoked, so no tools come back), give the user reconnect_url so they can re-authenticate the connector. Surface it as a clickable link; never invent connector URLs.

ParametersJSON Schema
NameRequiredDescriptionDefault
workspace_idNoTarget workspace. Omit to use the only authorized workspace, or (for read tools) to query all authorized workspaces grouped by workspace. Required for write tools when the token authorizes more than one workspace.
workspace_connector_idYesThe connected provider's workspace_connector_id (from well_list_connectors).

Output Schema

ParametersJSON Schema
NameRequiredDescription
errorNo
toolsNo
totalNo
statusNo
successYes
reconnect_urlNo
connector_slugNo
Behavior4/5

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

Annotations already declare readOnlyHint true and destructiveHint false, and the description does not contradict them. It adds valuable behavioral detail about the reconnect_url field and the 'need_reconnect' status, explaining that a stale/revoked token results in no tools being returned and directing the user to re-authenticate, which is beyond the annotation hints.

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

Conciseness4/5

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

The description is long but well-structured with a numbered workflow and a clear purpose front-loaded. The reconnect_url instructions are necessary for error handling and earn their place, though the example parenthetical adds a bit of extra length. Overall, the structure is effective and every section serves a purpose, so not quite a 5.

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

Completeness5/5

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

With an output schema present and the description covering the full discovery workflow, input sourcing from a prior tool, and the reconnection failure mode, the tool is thoroughly contextualized. An agent has all necessary information to select and invoke this tool correctly, including how to handle error responses via reconnect_url.

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

Parameters3/5

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

The input schema already covers both parameters (workspace_id and workspace_connector_id) with descriptions, achieving 100% coverage. The description reinforces that workspace_connector_id comes from well_list_connectors, but this is also in the schema, so no new semantic meaning is added 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.

Purpose5/5

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

The description clearly states the tool lists actions a connected provider exposes, using the verb 'Discover' and an example ('what can I do with Attio?'). It distinguishes itself from sibling tools by outlining the broader workflow (list_connectors → list_connector_tools → invoke_connector_tool), making its specific role as the discovery step unambiguous.

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

Usage Guidelines5/5

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

The description provides an explicit numbered workflow and instructs to use this tool 'whenever you don't already know a connector's tool names — never guess them.' It also names the alternatives (well_list_connectors for the ID, well_invoke_connector_tool for invocation) and specifies the reconnect_url handling for failure cases, giving comprehensive when-to-use and when-not-to-use context.

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

well_list_workspacesList WorkspacesA
Read-only
Inspect

List the workspaces this connection is authorized to access.

Use this FIRST when a single token may cover more than one workspace. Each entry has:

  • workspace_id: pass this as the workspace_id argument on other tools to target one workspace.

  • workspace_name: human-readable name (null if it can't be resolved).

  • is_primary: true for the token's default workspace (used when you omit workspace_id on a write).

  • identity: the company behind the workspace (registered name, trade name, registry number, country, website, currency, fiscal year start), so two similarly-named workspaces can be told apart. Every field is null when the workspace has no accounting settings yet. Tax identifiers are deliberately not included.

When the token authorizes a single workspace you can omit workspace_id everywhere; when it authorizes several, read tools fan out across all of them unless you pass a workspace_id, and write tools require one.

ParametersJSON Schema
NameRequiredDescriptionDefault
workspace_idNoTarget workspace. Omit to use the only authorized workspace, or (for read tools) to query all authorized workspaces grouped by workspace. Required for write tools when the token authorizes more than one workspace.

Output Schema

ParametersJSON Schema
NameRequiredDescription
errorNo
successYes
workspacesYes
Behavior5/5

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

Annotations already mark the tool as read-only and non-destructive, and the description adds detailed behavioral context: it explains each output field, null handling when accounting settings are absent, exclusion of tax identifiers, and the semantics of is_primary. This exceeds what annotations alone offer.

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

Conciseness5/5

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

The description is well-organized with a clear opening statement, a bulleted list of output fields, and a concise behavioral note. Every sentence contributes necessary information without redundancy, making it appropriately sized for the content.

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

Completeness5/5

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

Despite having only one optional parameter, the tool's output structure and cross-tool behavior are fully explained. The description covers return fields, edge cases, and integration with other tools, making it complete for an agent to invoke correctly.

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

Parameters4/5

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

The input schema already describes workspace_id thoroughly (100% coverage), so the description doesn't need to repeat it. However, it enhances understanding by explaining how the returned workspace_id is used in other tools and clarifies omission semantics (single vs. multiple workspaces), adding value beyond the schema.

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

Purpose5/5

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

The description clearly states the tool 'List the workspaces this connection is authorized to access', using a specific verb and resource. It distinguishes itself from sibling tools by focusing on workspace enumeration, and the title matches the purpose.

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

Usage Guidelines5/5

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

Explicitly instructs 'Use this FIRST when a single token may cover more than one workspace.' Provides detailed guidance on when to omit or supply workspace_id across read and write tools, and explains fan-out behavior for multiple workspaces. This goes beyond vague alternatives to give concrete usage rules.

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

well_query_recordsQuery RecordsA
Read-only
Inspect

Query records from Well's database.

⚠️ WORKFLOW:

  1. To SHOW the user a table of a record type, just omit fields. You never choose columns for presentation: the table the user sees is ALWAYS the root's display view in the Well web app's column order, trimmed on the widest roots to what fits a chat-width table.

  2. To answer a targeted question, call well_get_schema(root) FIRST to discover available fields, then name in fields ONLY the extra values you need (5-15 typically). They are ADDED to the display view in the payload you read — they do not replace, reorder, or trim the columns the user sees.

ROOTS (read-only — all 33): companies, people, connectors, invoices, documents, transactions, accounts, payment_means, workspace_connectors, memberships, cards, checks, ledger_accounts, journals, journal_entries, tax_rates, exchange_rates, invoice_transactions, categories, account_balances, tasks, workspaces, invoice_payment_means, chat_conversations, blueprint_runs, workspace_connector_sync_logs, media, emails, phones, web_links, locations, invoice_items, billing_events (The accounting graph — ledger_accounts, journals, journal_entries — and balances/rates are read-only projections owned by the sync/posting pipelines; query them for financial context, you cannot create/update them here. Sub-resources like emails/phones/locations are usually richer when read via their parent company/person.)

CONNECTED TOOLS: do NOT use this tool to show the user what they have connected — call well_list_connectors instead. It owns that job: connection status, and an install link for anything not connected yet. Query root "workspace_connectors" here only for genuine RECORD-level needs — reading sync timestamps, filtering connections, joining them with other roots. ("connectors" is the installable catalog; "workspace_connector_sync_logs" is per-sync history.)

Well already syncs the providers' data into the roots above — invoices, transactions, accounts, the accounting graph. ALWAYS read it from here. well_invoke_connector_tool and a provider's own tools are for an ACTION the user explicitly asked to take on that provider (e.g. "create this record in Attio"), never a way to fetch data Well already holds.

EXAMPLE - show the user their invoices (no fields, ever): well_query_records({ root: "invoices", limit: 50 })

EXAMPLE - answer "how much is still owed on the unpaid invoices?": well_query_records({ root: "invoices", fields: [["invoices", "balance_due"]], whereClause: { "payment_status": { "_in": ["unpaid", "partial"] } } }) // balance_due arrives in the rows for you to total up; the user still sees the // standard invoices table, with its identity, counterparty and status columns.

⚠️ RULES:

  • fields is ADDITIVE — it widens the data you receive, never the table the user sees

  • Omitting fields (default view) or naming a few extras both beat allFields

  • Field paths from schema: "invoices.issuer.name" → ["invoices", "issuer", "name"]

  • Default 50 records per request, max 500.

ONE CALL IS THE ANSWER — do not walk the root: Every response already carries totalCount (ALL matches, not just this page) and records_url (the full web-app table, with your filter and sort already applied). So a request to see a record type is ONE call: the user gets a table of the first page, the count tells them how many there are, and the link takes them to the rest. "Show me all my invoices" is answered by one call + the link — NOT by fetching 483 rows into this conversation.

  • A non-null nextCursor is NOT a to-do. It means more rows exist, which totalCount already told you and the link already covers.

  • Never paginate to compute a total, count, average or breakdown: aggregate over the filtered set instead. Summing a paginated sample produces a wrong number.

  • Never paginate to "be thorough". Large roots will exhaust the output limit mid-walk, and the user ends up with nothing legible.

  • Paginate ONLY for per-row work over every match that no aggregate can express, and tell the user the cost before starting. Then: pass the returned nextCursor as cursor; nextCursor: null is the last page.

FILTERING (whereClause):

  • Uses Hasura-style operators on field names.

  • Safe operators (work on ALL field types): _eq, _neq, _in, _nin, _is_null

  • Numeric/date only: _gt, _gte, _lt, _lte

  • Text only: _like, _ilike

  • When unsure of a field's type, prefer _eq or _in (they always work).

  • Combine with _and, _or, _not

  • For relationship fields, use nested syntax: { "issuer": { "name": { "_ilike": "%acme%" } } } Examples: { "status": { "_eq": "unpaid" } } { "grand_total": { "_gt": 1000 } } { "local_currency": { "_eq": "EUR" } } { "_and": [{ "status": { "_eq": "unpaid" } }, { "grand_total": { "_gte": 500 } }] } { "issuer": { "name": { "_ilike": "%acme%" } } }

SORTING (orderBy):

  • Sort by any field: { field: "grand_total", direction: "desc" }

  • Default sort is by primary key ascending.

Returns { rows, totalCount, nextCursor, success }.

ParametersJSON Schema
NameRequiredDescriptionDefault
rootYesThe entity type to query — any of the 33 read-only roots (companies, people, connectors, invoices, documents, transactions, accounts, payment_means, workspace_connectors, memberships, cards, checks, ledger_accounts, journals, journal_entries, tax_rates, exchange_rates, invoice_transactions, categories, account_balances, tasks, workspaces, invoice_payment_means, chat_conversations, blueprint_runs, workspace_connector_sync_logs, media, emails, phones, web_links, locations, invoice_items, billing_events). Call well_get_schema(root) first to discover fields.
limitNoMax records to return (default 50, max 500)
cursorNoOpaque cursor for the next page. Omit for the first page, then pass nextCursor from the previous response.
fieldsNoEXTRA field paths to add to the root's display view, for values you need to reason about. Each path is an array whose first segment is the root's table name — use the paths well_get_schema(root) returns verbatim, which is the root name for every root except people (whose table is peoples); a path opening with any other segment is dropped. Additive only: they widen the payload you receive, and the columns the user sees stay the root's display view (the ones the Well web app shows) no matter what you pass here. A scalar a composite renders comes back AS that composite — asking for grand_total gets you composite_total_amount_currency, with grand_total inside it — so read `columns` for what was actually materialized. Omit unless you need a value the display view does not carry.
orderByNoSort results by a field. Example: { field: "grand_total", direction: "desc" }
allFieldsNoIf true, automatically fetches all scalar fields from schema. No need to specify fields.
whereClauseNoHasura-style filter object. Operators: _eq, _neq, _gt, _gte, _lt, _lte, _like, _ilike, _in, _nin, _is_null. Example: { "status": { "_eq": "unpaid" } }
workspace_idNoTarget workspace. Omit to use the only authorized workspace, or (for read tools) to query all authorized workspaces grouped by workspace. Required for write tools when the token authorizes more than one workspace.

Output Schema

ParametersJSON Schema
NameRequiredDescription
rowsYesQuery results
errorNo
columnsNoThe materialized columns in display order, with each composite substituted in place of the source fields it consumed. A row object's key order does not preserve this — the flattener appends reconstructed composites last — so a UI that wants the web app's column order must read it from here.
successYes
returnedYesNumber of rows returned
columnMetaNoPer-column field meaning, keyed by the same column paths as the rows. `context` = what the field means; `enrichment` = how the value is sourced (e.g. Bank sync, AI extraction). Only documented columns appear. Read this to interpret the returned values.
nextCursorNoCursor for the next page. null means last page.
totalCountYesTotal matching records
records_urlNoLogin-gated deep link to the FULL web-app records table for this root (real DataTable: composites, inline editing, resize/pin), carrying this call's `whereClause` and `orderBy` so it opens on the same rows. Hand it to the user for everything past this page — it is the answer to 'show me all of them', not pagination. Null when no workspace is in context or no web page serves the root.
Behavior5/5

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

Even with readOnlyHint=true already declared, the description adds rich behavioral context: 'fields is ADDITIVE — it widens the data you receive, never the table the user sees,' pagination guidance ('nextCursor' is NOT a to-do), aggregate-vs-paginate rules, and the return envelope { rows, totalCount, nextCursor, success }. It fully discloses the read-only nature, the additive field semantics, and the one-call-is-the-answer philosophy, going far beyond the annotations.

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

Conciseness5/5

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

The description is long but tightly organized with clear headers (WORKFLOW, ROOTS, CONNECTED TOOLS, RULES, FILTERING, SORTING) and concise examples. Each section earns its place, providing actionable guidance without fluff. The structure makes dense information scannable for an agent.

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

Completeness5/5

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

The description is exceptionally complete for a complex query tool: it covers workflow, root enumeration, filtering operators and syntax, sorting, pagination rules, output shape, and integration with sibling tools. With a high-parameter schema and output schema present, the description complements rather than repeats, leaving no major operational gap.

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

Parameters5/5

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

Schema coverage is 100%, but the description adds substantial meaning beyond the schema: fields are 'EXTRA field paths... additive only,' with detailed explanation of display-view behavior and composite types. It clarifies allFields is not preferred, documents default/max limits, distinguishes safe vs. type-specific filter operators, and explains workspace_id semantics. This is far beyond baseline.

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

Purpose5/5

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

The description clearly states 'Query records from Well's database' and enumerates all 33 read-only roots, making the scope explicit. It distinguishes itself from siblings by explicitly steering agents away from well_list_connectors and provider connector tools for data retrieval. The 'CONNECTED TOOLS' section reinforces its unique role as the primary record-reader.

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

Usage Guidelines5/5

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

The description provides explicit when-to-use vs. alternatives: 'do NOT use this tool to show the user what they have connected — call well_list_connectors instead' and 'well_invoke_connector_tool... never a way to fetch data Well already holds.' It also instructs calling well_get_schema(root) first for targeted field discovery, and gives concrete workflow examples for two common use cases.

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

well_remove_contact_channelRemove Contact ChannelA
Destructive
Inspect

Remove a contact channel from a company or person.

Wraps the resource-scoped DELETE endpoints (DELETE /v1/{companies,people}/:id/{emails,phones,web-links,locations}/:channelId).

Pass channel_id = the UUID of the specific channel row to remove (NOT the parent). Find it by reading the parent with well_query_records and selecting the channel's id field.

ParametersJSON Schema
NameRequiredDescriptionDefault
parentYesParent record type: company or person
channelYesChannel to remove: email | phone | web_link | location
parent_idYesUUID of the parent company or person
channel_idYesUUID of the specific channel row to remove
workspace_idNoTarget workspace. Omit to use the only authorized workspace, or (for read tools) to query all authorized workspaces grouped by workspace. Required for write tools when the token authorizes more than one workspace.
idempotency_keyNoOptional client-supplied key. A retried write with the same key returns the original result instead of re-applying the operation.

Output Schema

ParametersJSON Schema
NameRequiredDescription
errorNo
parentNo
channelNo
successYes
Behavior4/5

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

Annotations already mark destructiveHint=true, so the destructive nature is known. The description adds valuable behavior beyond annotations: it specifies that channel_id must be the channel row's UUID, explicitly warns 'NOT the parent', and references the DELETE endpoints. This helps prevent misuse.

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

Conciseness5/5

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

Three sentences, no fluff. The purpose, endpoint, and key caveat are front-loaded and every sentence earns its place. It is compact yet highly informative.

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

Completeness4/5

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

The description covers the operation's purpose, endpoint, required parameter distinction, and how to obtain the necessary ID. With output schema present and annotations covering destructiveness, the tool is well-rounded for the task. It does not explain error behavior but that is not essential here.

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

Parameters4/5

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

Schema coverage is 100%, so baseline is 3. The description adds meaning beyond the schema by emphasizing the distinction between channel_id and parent_id, and by advising how to find the correct channel_id via well_query_records. This extra clarification is valuable.

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

Purpose5/5

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

The first sentence clearly defines the action: 'Remove a contact channel from a company or person.' This is a specific verb + resource, and the sibling context (well_add_contact_channel) makes the inverse operation obvious. The description also names the underlying delete endpoints, reinforcing the purpose.

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

Usage Guidelines4/5

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

The description provides clear context for use: it targets contact channels not parent records, and instructs how to locate the channel_id via well_query_records. It does not explicitly mention alternative tools or when-not-to-use, but the prerequisite and scope are clearly implied.

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

well_resolve_reconciliation_taskResolve Reconciliation TaskAInspect

Approve or reject one or more reconciliation review tasks (from well_run_register_diff or the in-app review queue).

  • approve: confirms the match — the link is flipped to active.

  • reject: dismisses the match — the candidate does not silently re-surface.

Each task_id resolves independently; a failure on one (already resolved, not found) is returned in errors and does not block the rest of the batch.

ParametersJSON Schema
NameRequiredDescriptionDefault
actionYes
task_idsYesThe review tasks' task_id values.
workspace_idNoTarget workspace. Omit to use the only authorized workspace, or (for read tools) to query all authorized workspaces grouped by workspace. Required for write tools when the token authorizes more than one workspace.
idempotency_keyNoOptional client-supplied key. A retried write with the same key returns the original result instead of re-applying the operation.

Output Schema

ParametersJSON Schema
NameRequiredDescription
errorNo
errorsNo
successYes
resolvedNo
Behavior4/5

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

Annotations indicate readOnlyHint=false and destructiveHint=false, so the tool is a write operation but not destructive. The description adds important behavioral details: each task resolves independently, failures do not block the batch, and idempotency via key. These go beyond what annotations provide, though the exact reversibility could be clearer.

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

Conciseness5/5

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

The description is concise and well-structured: a lead sentence stating purpose, followed by bullet-style action explanations and additional batch behavior. Every sentence adds value, and the most critical information is front-loaded.

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

Completeness5/5

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

Given the complexity (batch, idempotency, workspace authorization) and the presence of an output schema, the description covers all essential aspects: purpose, actions, error handling, and parameter roles. No gaps remain for an agent to effectively use the tool.

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

Parameters4/5

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

Schema coverage is 75% with descriptions for workspace_id and idempotency_key. The description adds meaning to action (approve/reject effects) and explains that task_ids resolve independently, supplementing the schema's minimal description. This adds value beyond the schema.

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

Purpose5/5

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

The description clearly states that the tool approves or rejects reconciliation review tasks, specifies the source (well_run_register_diff or in-app queue), and explains the effects of each action. It distinguishes itself from similar sibling tools like well_resolve_register_diff_gap, which resolves gaps not tasks.

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

Usage Guidelines3/5

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

The description implies when to use the tool (to approve/reject reconciliation tasks) but does not explicitly state when not to use it or provide alternatives. The context is sufficient for a basic understanding, but lacks explicit guidance on selecting this tool over others.

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

well_resolve_register_diff_gapResolve Register Diff GapAInspect

Post a well_run_register_diff gap (one of missing_in_register_ids' review tasks) into QuickBooks as a Purchase or Deposit.

Requires the exact ledger_account_id (a UUID, not a name) for both:

  • bank_ledger_account_id: the bank/cash account the money moved through (e.g. Checking).

  • category_ledger_account_id: the expense or income category the gap books against.

Look these up first with well_query_records({ root: "ledger_accounts", filters: [...] }) scoped to the register connector — never guess an id or match an account by substring/fuzzy name.

Fails with an error (not a silent no-op) if gap posting is disabled for this workspace, if either account doesn't belong to this gap's register connector, or if either account no longer resolves in QuickBooks.

ParametersJSON Schema
NameRequiredDescriptionDefault
task_idYesThe gap review task's task_id.
workspace_idNoTarget workspace. Omit to use the only authorized workspace, or (for read tools) to query all authorized workspaces grouped by workspace. Required for write tools when the token authorizes more than one workspace.
idempotency_keyNoOptional client-supplied key. A retried write with the same key returns the original result instead of re-applying the operation.
bank_ledger_account_idYesledger_account_id of the bank/cash account.
category_ledger_account_idYesledger_account_id of the category account.

Output Schema

ParametersJSON Schema
NameRequiredDescription
errorNo
successYes
task_idNo
external_idNo
already_postedNo
Behavior5/5

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

The description discloses behavioral traits beyond annotations: it is a write operation (not read-only), fails with errors rather than silently no-oping, and requires prerequisites. Annotations indicate readOnlyHint=false, which is consistent, and the description adds context about failure modes and data integrity.

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

Conciseness5/5

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

The description is concise (4-5 sentences) and front-loaded with the core purpose. Every sentence adds necessary guidance without redundancy. The structure efficiently conveys purpose, prerequisites, and error conditions.

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

Completeness5/5

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

Given the tool's complexity (5 parameters, write operation, output schema present), the description is complete. It covers all important aspects: purpose, parameter details, prerequisites, error behavior, and retrieval guidance. The presence of an output schema reduces the need to describe return values.

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

Parameters5/5

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

The description adds significant meaning beyond the input schema: it clarifies that bank_ledger_account_id is the bank/cash account and category_ledger_account_id is the expense/income category. It also explains that task_id refers to a gap review task. With 100% schema coverage, the description still adds value by contextualizing the parameters.

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

Purpose5/5

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

The description clearly states the tool's purpose: 'Post a well_run_register_diff gap ... into QuickBooks as a Purchase or Deposit.' It uses a specific verb ('Post') and resource ('gap'), and distinguishes it from sibling tools like well_resolve_reconciliation_task by referencing 'register diff gap'.

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

Usage Guidelines5/5

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

The description provides explicit usage guidelines: requires exact ledger_account_ids obtained via well_query_records, warns against guessing or fuzzy matching, and specifies conditions that cause failure. This tells the agent when and how to use the tool safely.

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

well_run_register_diffRun Register DiffAInspect

Diff a workspace's bank transactions against its accounting-register transactions (e.g. QuickBooks), and persist the result.

  • Every match — hard evidence (structured reference, IBAN, tax ID) or inference-only (memo/payee reading) — is raised as a review task with the candidate already attached (raised_for_review). Nothing links automatically; resolve with well_resolve_reconciliation_task once a human decides.

  • Bank transactions with no register counterpart come back as missing_in_register_ids, each also minted as a gap review task (gaps_proposed) — resolve one with well_resolve_register_diff_gap once a human names the two ledger accounts. gaps_already_proposed counts gaps re-surfaced from an earlier run that already have an open, unresolved proposal.

  • Bank transactions NOT confirmed absent from the register come back as contended_in_register_ids — never minted as a gap. Two cases land here: (1) a plausible match lost to a higher-confidence sibling transaction this run, so the register-side movement is already accounted for by the winner; (2) the matcher couldn't produce a trustworthy answer (an invalid model response or a provider failure), so absence was never confirmed. Re-run the diff later; a genuine gap or duplicate should resolve itself once the winner's review task is handled or the matcher succeeds.

  • Register entries no bank transaction explains come back as unexplained_in_register_ids.

Returns { enabled: false, ... } with all counts 0 if the workspace's register-diff feature is off.

ParametersJSON Schema
NameRequiredDescriptionDefault
since_dateNoOnly diff bank transactions on/after this date (YYYY-MM-DD).
workspace_idNoTarget workspace. Omit to use the only authorized workspace, or (for read tools) to query all authorized workspaces grouped by workspace. Required for write tools when the token authorizes more than one workspace.
idempotency_keyNoOptional client-supplied key. A retried write with the same key returns the original result instead of re-applying the operation.
bank_workspace_connector_idYesThe bank connector's workspace_connector_id (e.g. Plaid).
register_workspace_connector_idYesThe accounting connector's workspace_connector_id (e.g. QuickBooks).

Output Schema

ParametersJSON Schema
NameRequiredDescription
errorNo
enabledNo
matchedNo
successYes
gaps_proposedNo
already_linkedNo
raised_for_reviewNo
missing_in_registerNo
contended_in_registerNo
gaps_already_proposedNo
missing_in_register_idsNo
unexplained_in_registerNo
contended_in_register_idsNo
unexplained_in_register_idsNo
Behavior5/5

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

The description fully discloses behavioral traits: persisting results, creating review tasks, handling matches, gaps, contended, and unexplained entries. It clarifies that nothing links automatically and requires human decisions via sibling tools. This goes well beyond annotations (readOnlyHint=false, destructiveHint=false) to provide detailed behavioral expectations.

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

Conciseness5/5

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

The description is concise yet comprehensive, using bullet points to organize different scenarios. Every sentence adds value without redundancy. It is front-loaded with the main purpose and then details specific behaviors efficiently.

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

Completeness5/5

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

Given the tool's complexity (5 parameters, output schema exists), the description covers all key aspects: what happens to matches, gaps, contended, and unexplained entries, how to resolve them, and edge cases like feature disabled. The presence of an output schema reduces the need to describe return values, and the description is complete.

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

Parameters3/5

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

Schema description coverage is 100%, so all parameters are already documented. The description adds minimal context beyond the schema (e.g., mentioning QuickBooks as an example for the register connector). It does not elaborate on parameter usage or format further, so a baseline score of 3 is appropriate.

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

Purpose5/5

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

The description clearly states the tool diffs bank transactions against accounting-register transactions and persists the result. It specifies the verb 'diff', the resources, and the outcome, and distinguishes from sibling tools like well_resolve_reconciliation_task and well_resolve_register_diff_gap.

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

Usage Guidelines4/5

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

The description explains when to use the tool (for reconciling bank and register transactions) and references sibling tools for subsequent steps. It also notes that if the feature is off, the tool returns enabled: false with all counts 0. However, it does not explicitly state when not to use this tool, such as when only partial matching is needed or when no persistence is desired.

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

well_update_companyUpdate CompanyA
Destructive
Inspect

Update an existing company in the current workspace.

Use this tool when the user asks to change, fix, rename, or edit a company's fields.

REQUIRED: company_id OPTIONAL (only include fields the user wants changed): name, description, domain, registered_name, trade_name, tax_id_value, tax_id_type, registry_country (ISO 3166-1 alpha-2, e.g. "FR"), business_type, registered_value, registry_name, locale (ISO 639-1 two-letter language code, e.g. "en", "fr" — not "en_US").

NOT CHANGEABLE via this tool: emails, phones, locations, linked people, media. Those require dedicated tools (not yet available).

Returns { success: true, company_id, name } on success, or { success: false, error } on failure.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoCompany name
domainNoPrimary website domain (e.g. acme.com)
localeNoPreferred language as an ISO 639-1 two-letter code (e.g. en, fr, de). Pass null to clear.
company_idYesThe UUID of the company to update (required)
trade_nameNoTrading name / DBA
descriptionNoBrief company description; pass null to clear
tax_id_typeNoTax identifier type (VAT, SIRET, EIN, ...)
tax_id_valueNoTax identifier value (VAT, SIRET, EIN, ...)
workspace_idNoTarget workspace. Omit to use the only authorized workspace, or (for read tools) to query all authorized workspaces grouped by workspace. Required for write tools when the token authorizes more than one workspace.
business_typeNoBusiness type / legal form
registry_nameNoRegistry name
idempotency_keyNoOptional client-supplied key. A retried write with the same key returns the original result instead of re-applying the operation.
registered_nameNoOfficial registered legal name
registered_valueNoRegistry identifier value
registry_countryNoISO 3166-1 alpha-2 country code of the registry (e.g. FR, US)

Output Schema

ParametersJSON Schema
NameRequiredDescription
nameNo
errorNo
successYes
company_idNo
Behavior4/5

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

Annotations already indicate destructiveHint=true, and the description adds valuable context: the NOT CHANGEABLE field list, the instruction to only include fields the user wants changed, and the return shape on success/failure. It does not contradict annotations.

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

Conciseness5/5

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

The description is well-structured with clear sections (REQUIRED, OPTIONAL, NOT CHANGEABLE, RETURNS) and is front-loaded with the core purpose. Every sentence provides necessary operational or restrictive information without unnecessary fluff.

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

Completeness4/5

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

For a 15-parameter write tool, the description covers the primary usage context, field restrictions, and return behavior. The output schema and annotations fill most remaining gaps. However, it omits mention of the workspace_id requirement when multiple workspaces are authorized, which is an important edge case left to the schema description.

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

Parameters4/5

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

Schema coverage is 100%, so baseline is 3. The description adds group-level semantics: REQUIRED vs OPTIONAL, the 'only include fields the user wants changed' rule, and format clarifications for locale and registry_country, which go beyond the individual schema descriptions.

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

Purpose5/5

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

The description clearly states the tool updates an existing company, with specific verb and resource. It distinguishes from siblings by explicitly noting fields that are NOT changeable and emphasizing 'existing' company, which separates it from well_create_company and well_delete_company.

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

Usage Guidelines4/5

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

Provides explicit usage guidance: 'Use this tool when the user asks to change, fix, rename, or edit a company's fields.' It also lists what cannot be changed and notes dedicated tools for those cases, though it does not name specific sibling tools as alternatives.

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

well_update_invoiceUpdate InvoiceA
Destructive
Inspect

Update an existing invoice in Well.

Call well_get_schema("invoices") to discover all available fields.

REQUIRED: invoice_id OPTIONAL (only pass fields you want changed):

  • reference_number, issue_date (ISO date), due_date (ISO date)

  • status (draft | issued | paid | canceled)

  • terms, description

  • grand_total, items_total, tax_total (numbers)

  • local_currency (ISO 4217 three-letter code, e.g. "EUR", "USD")

  • document_type_code (UN/CEFACT 1001 code, e.g. "380")

  • billing_context (e.g. subscription, one_time, project, ...)

  • issuer_company_id / receiver_company_id (uuid to set, null to clear, omit to leave unchanged)

Cannot change line items, payment_means, or document attachment via this tool.

ParametersJSON Schema
NameRequiredDescriptionDefault
termsNoPayment terms text; pass null to clear
statusNoInvoice lifecycle status
due_dateNoPayment due date (ISO 8601); pass null to clear
tax_totalNoTotal tax amount; pass null to clear
invoice_idYesThe UUID of the invoice to update
issue_dateNoIssue date (ISO 8601, e.g. 2026-04-27); pass null to clear
descriptionNoFree-form description; pass null to clear
grand_totalNoTotal invoice amount including tax; pass null to clear
items_totalNoSum of line items before tax; pass null to clear
workspace_idNoTarget workspace. Omit to use the only authorized workspace, or (for read tools) to query all authorized workspaces grouped by workspace. Required for write tools when the token authorizes more than one workspace.
local_currencyNoISO 4217 three-letter currency code (e.g. EUR, USD); pass null to clear
payment_statusNoUser-driven payment_status override — requires override_version (CAS)
billing_contextNoBilling context / business model; pass null to clear
idempotency_keyNoOptional client-supplied key. A retried write with the same key returns the original result instead of re-applying the operation.
override_versionNoRequired when payment_status is present — current override_version for CAS
reference_numberNoInvoice reference number (e.g. INV-2026-001); pass null to clear
issuer_company_idNoIssuer company UUID. Omit = no change, null = clear, uuid = set.
document_type_codeNoUN/CEFACT 1001 document type code (e.g. 380 for commercial invoice); pass null to clear
receiver_company_idNoReceiver company UUID. Omit = no change, null = clear, uuid = set.

Output Schema

ParametersJSON Schema
NameRequiredDescription
errorNo
successYes
invoice_idNo
reference_numberNo
Behavior4/5

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

Annotations already mark the tool as destructive (destructiveHint=true), so the bar is lower. Description adds valuable context: partial-update semantics ('only pass fields you want changed'), null-to-clear behavior, and explicit unsupported fields. No contradiction with annotations.

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

Conciseness5/5

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

Two-sentence lead with a clean bullet list. Each line earns its place: purpose, a required prerequisite, parameter grouping, and an explicit exclusion. No filler, front-loaded with the purpose.

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

Completeness4/5

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

For a 19-parameter tool with output schema, the description covers core update semantics, required parameter, optional fields, and exclusions. Directs to well_get_schema for full field discovery. However, it omits some important nuances like payment_status requiring override_version (CAS) and workspace_id rules for multi-workspace tokens, leaving the schema to carry that burden.

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

Parameters4/5

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

Schema description coverage is 100%, so baseline is 3. Description adds a grouped summary of optional fields and crucially clarifies 'null to clear, omit to leave unchanged' semantics, which is present in schema but reinforced here. It also excludes line items/payment_means/attachments, clarifying parameter boundaries. However, it omits mention of payment_status/override_version pairing and workspace_id requirement, which schema covers.

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

Purpose5/5

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

States 'Update an existing invoice in Well' with a specific verb and resource. Clearly differentiates from sibling tools like well_create_invoice_from_data and well_delete_invoice. Also notes limitations ('Cannot change line items, payment_means, or document attachment'), further clarifying its scope.

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

Usage Guidelines4/5

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

Explicitly instructs to call well_get_schema("invoices") for field discovery, and states what cannot be changed (line items, payment_means, attachments), guiding when not to use this tool. However, it doesn't name alternative tools for those excluded operations, missing a stronger when-not-to-use signal.

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

well_update_personUpdate PersonA
Destructive
Inspect

Update an existing person (contact) in the current workspace.

Use this tool when the user asks to change, fix, rename, or edit a person's fields.

REQUIRED: person_id OPTIONAL (only include fields the user wants changed): first_name, last_name, job_title.

NOT CHANGEABLE via this tool: emails, phones, locations, linked companies, media. Those require dedicated tools (not yet available).

Returns { success: true, person_id, full_name } on success, or { success: false, error } on failure.

ParametersJSON Schema
NameRequiredDescriptionDefault
job_titleNoJob title; pass null to clear
last_nameNoLast name
person_idYesThe UUID of the person to update (required)
first_nameNoFirst name
workspace_idNoTarget workspace. Omit to use the only authorized workspace, or (for read tools) to query all authorized workspaces grouped by workspace. Required for write tools when the token authorizes more than one workspace.
idempotency_keyNoOptional client-supplied key. A retried write with the same key returns the original result instead of re-applying the operation.

Output Schema

ParametersJSON Schema
NameRequiredDescription
errorNo
successYes
full_nameNo
person_idNo
Behavior4/5

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

Annotations already indicate destructiveHint=true and readOnlyHint=false, and the description aligns with that. It adds valuable context beyond annotations: it clarifies partial-update semantics ('only include fields the user wants changed'), lists fields that cannot be updated, and specifies the return format on success and failure. This exceeds the baseline, though it doesn't cover authorization or idempotency, which the schema handles.

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

Conciseness5/5

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

The description is concise and well-structured. It front-loads the core purpose, then uses labeled sections (REQUIRED, OPTIONAL, NOT CHANGEABLE, Returns) to organize information. Every sentence contributes value; there is no redundancy or filler.

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

Completeness4/5

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

For a tool with 6 parameters, the description covers the key person fields and explicitly notes what is not changeable. While it doesn't mention workspace_id or idempotency_key, those are adequately described in the schema and are common across tools. The return format is specified, and the output schema exists. Overall, it is complete enough for an agent to use confidently, with minor gaps around workspace authorization and idempotency.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3. The description adds meaningful semantic context: it identifies person_id as required, lists the optional editable fields, and emphasizes that only included fields should be changed. This reinforces the partial-update behavior and prevents the agent from sending unchanged fields. It also clarifies that job_title can be null to clear, matching the schema.

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

Purpose5/5

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

The description clearly states the tool's purpose: 'Update an existing person (contact) in the current workspace.' The verb 'update' plus resource 'person' is specific and distinguishes it from siblings like create_person and delete_person. It also enumerates the exact use case: 'change, fix, rename, or edit a person's fields.'

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

Usage Guidelines5/5

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

Explicitly states when to use: 'Use this tool when the user asks to change, fix, rename, or edit a person's fields.' It also provides clear exclusions: 'NOT CHANGEABLE via this tool: emails, phones, locations, linked companies, media. Those require dedicated tools (not yet available).' This tells the agent what not to use it for and acknowledges alternatives.

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

Discussions

No comments yet. Be the first to start the discussion!

Related MCP Servers

  • A
    license
    -
    quality
    D
    maintenance
    Enables Wave invoicing operations including listing invoices, retrieving details, and generating branded PDFs directly from AI assistants.
    7
    ISC
  • A
    license
    C
    quality
    A
    maintenance
    Enables AI assistants to manage invoices, contacts, purchases, journal entries, and other accounting operations via the Fiken API.
    100
    13
    1
    MIT
  • A
    license
    -
    quality
    D
    maintenance
    Connects AI assistants to QuickBooks Online, enabling management of invoices, customers, expenses, and reports through natural language.
    MIT
  • F
    license
    -
    quality
    D
    maintenance
    Connect Claude, Cursor, or any MCP-compatible AI client to your Wasabil account. Issue Chilean electronic invoices (DTE/SII), reconcile bank payments, and manage clients — all through natural language.

View all MCP Servers

Try in Browser

Your Connectors

Sign in to create a connector for this server.

Resources