virtuous-mcp
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@virtuous-mcpshow me contacts who donated in the last 30 days"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Virtuous CRM+ MCP Server
An MCP server, built with FastMCP, that lets an AI assistant work with Virtuous CRM+: query and read data freely, and—only with explicit user confirmation—create, update, archive, or delete data.
It provides complete coverage of the entire Virtuous API (all 291 endpoints across 39 resource groups) through a small set of convenience tools plus a generic discovery + call layer, so any endpoint can be reached without needing a separate tool per endpoint.
Safety model: reads are free, writes require confirmation
Reading (querying, searching, looking up, listing reference data) runs freely.
Every tool that changes data is "mutating" and is guarded in three layers:
Instructions — the server and each mutating tool tell the model it must describe the exact change and get explicit user approval before acting.
confirmflag — every mutating tool takesconfirm(defaultfalse). Withconfirm=falsethe tool makes no API call and returns a preview of what it would do, so the model can show the user and ask.Client backstop — the HTTP client raises
ConfirmationRequiredif a write is ever attempted without explicit confirmation, so an accidentalconfirm=trueis the only way a write can happen.
A request is classified as a read if it's a GET, or a POST to a
/Query, /QueryOptions, /Search, /Find, or /Proximity path. Everything
else is a write.
Related MCP server: SQL Server MCP
Operational protocols
The HTTP layer is aligned with Virtuous's documented operational behavior:
Connection pooling — a single
httpx.AsyncClientis reused for the life of the process (per base URL), so TLS/keep-alive connections are reused instead of re-established on every call.Rate limits — Virtuous enforces an org-wide budget (documented at 5,000 requests/hour) shared by every API key/integration in the org, and returns
X-RateLimit-Limit,X-RateLimit-Remaining, andX-RateLimit-Reseton every response. The client records the latest values; callget_rate_limit_statusto inspect remaining budget.Retries + backoff — transient
429and5xxresponses are retried (up to 3 times).429waits honorRetry-After/X-RateLimit-Reset; otherwise an exponential backoff with jitter is used.Pagination — query endpoints cap at 1000 records/call;
query_allauto-pages (with a hard ceiling) so you don't manually loopskip/take.Bulk writes —
create_batchposts many contacts/gifts in one request via the recommended batch endpoints, conserving the shared rate budget.
Tools
Full-API discovery + generic call
The entire API is reachable through these. Use discovery to find the exact
method + path, then call_endpoint to invoke it.
Tool | Purpose |
| List all 39 resource groups and their read/write endpoint counts. |
| Discover any endpoint (filter by resource, text search, or |
| Full metadata + parameters for one endpoint. |
| Invoke any endpoint. Reads run freely; writes obey the confirmation gate. |
call_endpoint resolves :placeholders in the path from path_params (e.g.
/api/Contact/:contactId + {"contactId": 123}), and works even for endpoints
not in the bundled registry.
Read tools (no confirmation)
Tool | Purpose |
| List queryable object types + reference-data keys. |
| Discover queryable fields, data types, and allowed operators for an object. |
| Run a filtered bulk query (single page). |
| Auto-paginate a query up to |
| Fetch a single record by id. |
| Look up one contact. |
| Fuzzy free-text contact search. |
| All gifts for a contact. |
| Notes for a contact. |
| Individuals that make up a contact. |
| Lookup lists: contact/gift/project/task types, tags, custom fields, org groups, etc. |
| Current organization + the API key's permissions. |
| Latest observed rate-limit headers (remaining org-wide budget + reset time). |
| Escape hatch for arbitrary read-only |
| Auto-page read-only |
Write tools (MUTATING — require confirm=true after explicit user approval)
Tool | Purpose |
| Recommended way to import a single Contact or Gift (matched/validated). |
| Bulk-import many Contacts or Gifts in one request (rate-limit-friendly). |
| Create a record (e.g. ContactNote, ContactTag, Task, Relationship). |
| Update a record (PUT). |
| Archive/unarchive a record. |
| Destructive delete. |
| Escape hatch for any other write (cancel recurring gift, write off pledge, send email, toggle webhook, etc.). |
With confirm omitted/false, write tools (and call_endpoint on a write
endpoint) return a confirmation_required preview and change nothing.
Note:
call_endpointis the universal way to reach any write endpoint and is subject to the same confirmation gate. The dedicated write tools above are just ergonomic shortcuts for the most common operations.
How queries work
A query body is made of groups. Conditions within a group are AND-ed;
separate groups are OR-ed. Each condition is:
{ "parameter": "<field name>", "operator": "<operator>", "value": "<value>" }Use get_query_options to get the exact parameter and operator strings for
an object. Example: contacts created on/after 2024-01-01, sorted by id desc:
{
"object_type": "Contact",
"groups": [
{ "conditions": [
{ "parameter": "Create Date", "operator": "GreaterThanOrEqual", "value": "01/01/2024" }
] }
],
"sort_by": "Id",
"descending": true,
"take": 100
}Query endpoints return at most 1000 records per call; use skip/take to
page manually, or query_all to auto-paginate up to a max_records ceiling.
For non-query GET endpoints that expose the same skip/take pattern (for
example contacts by tag or organization-group members), use
read_paged_request.
Tasks & reminders (non-obvious gotchas)
These are surfaced at runtime via describe_endpoint (notes + body_params)
and in the server instructions, but documented here too:
Create a task with
POST /api/Task. The assignee field isownerEmail(the user's email) — notowner,ownerId, orassignedTo. A wrong key is silently ignored and the task is created unassigned, and the success response does not echoownerEmailback (its absence is not a failure).Tasks have no update or delete endpoint. To remove/resolve a task, use the Reminder endpoints:
PUT /api/Reminder/Dismissed/{id}(dismiss ≈ delete) orPUT /api/Reminder/Completed/{id}(mark resolved). There is no un-dismiss / reactivate endpoint via the API (UI only).To check if tasks are dismissed/resolved, query
Taskwith theResolvedfilter (IsTrue= dismissed/completed,IsFalse= active). The query result does not expose the owner or an explicit resolved field; theAssigned Userfilter expects an internal user id (not an email), and no users-list endpoint is exposed.
Setup
Get a Virtuous API key: in Virtuous, Settings → All Settings → Connectivity → Application Keys → Create an Application Key.
Copy
.env.exampleto.envand setVIRTUOUS_API_KEY.
Install uv
This project is managed with uv, a fast Python
package and project manager. Install it once in your environment:
# macOS / Linux
curl -LsSf https://astral.sh/uv/install.sh | sh# Windows (PowerShell)
powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"uv is also available via other package managers if you prefer:
# Homebrew (macOS)
brew install uv
# pipx
pipx install uvAfter installing, restart your shell (or follow the printed instructions) so the
uv command is on your PATH, then verify:
uv --versionuv manages the virtual environment and can even provision a compatible Python
(3.10+) for you, so you don't need to set up Python separately.
Install dependencies
uv syncThis creates a virtual environment and installs the exact dependencies pinned in
uv.lock.
Run
VIRTUOUS_API_KEY=your_key uv run virtuous-mcpThe server speaks MCP over stdio.
Use with an MCP client
Every client below uses the same server entry — only the file it lives in (and the surrounding scope) changes:
{
"mcpServers": {
"virtuous-mcp": {
"command": "uv",
"args": ["run", "--directory", "/Users/cole.j.cantu/Programs/custom-mcp/virtuous-mcp", "virtuous-mcp"],
"env": { "VIRTUOUS_API_KEY": "your_api_key_here" }
}
}
}Cursor (global / all projects)
Add it to your global Cursor config so it's available in every project:
macOS / Linux:
~/.cursor/mcp.jsonWindows:
%USERPROFILE%\.cursor\mcp.json
Create the file if it doesn't exist and paste the JSON block above (top-level
mcpServers key). For a single project instead, use .cursor/mcp.json in that
project's root — project config takes precedence over global if both define a
server with the same name. Reload Cursor (or toggle the server in
Settings → Tools & Integrations → MCP) after saving.
Claude Code (user scope / all projects)
User scope makes the server available to you across all projects. Two ways:
CLI (recommended):
claude mcp add virtuous-mcp \
--scope user \
--env VIRTUOUS_API_KEY=your_api_key_here \
-- uv run --directory /Users/cole.j.cantu/Programs/custom-mcp/virtuous-mcp virtuous-mcp--scope user writes to ~/.claude.json under the top-level mcpServers
key. (Other scopes: project → .mcp.json in the repo root, shared with
everyone who clones it; local (default) → your private entry for the current
project only.) Everything after -- is the command Claude Code runs to launch
the server.
Edit ~/.claude.json directly:
Add the server under the top-level mcpServers object (this is what makes
it user-scoped — not nested under a specific project's entry):
{
"mcpServers": {
"virtuous-mcp": {
"command": "uv",
"args": ["run", "--directory", "/Users/cole.j.cantu/Programs/custom-mcp/virtuous-mcp", "virtuous-mcp"],
"env": { "VIRTUOUS_API_KEY": "your_api_key_here" }
}
}
}~/.claude.json also holds other Claude Code settings, so merge into the
existing mcpServers object rather than overwriting the file. Restart your
Claude Code session afterward so it re-reads the config.
Claude Code scope reference
Scope | Where it's stored | Available to |
|
| You, this project only |
|
| Anyone who clones the repo |
|
| You, all projects |
Claude Desktop
Same JSON block in Claude Desktop's claude_desktop_config.json (under
mcpServers).
Configuration
Env var | Required | Default | Description |
| yes | — | Bearer API key / Application Key. |
| no |
| API base URL. |
Available Tools
26 toolsarchive_recordA
MUTATING: archive (or unarchive) a record via PUT /api/{object_type}/Archive/{id}.
DO NOT call with confirm=true unless the user explicitly approved it. With confirm=false this performs no change and returns a preview.
| Name | Required | Description | Default |
|---|---|---|---|
| confirm | No | Must be true to actually run. Set ONLY after explicit user approval. | |
| record_id | Yes | The id of the record. | |
| unarchive | No | Unarchive instead of archive. | |
| object_type | Yes | Object that supports archiving, e.g. 'Contact', 'ContactAddress'. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description bears full burden. It discloses the mutating nature, the confirmation gate, and the preview behavior. However, it lacks details on the effects of archiving (e.g., permanence, impact on related data) and return values.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, no redundancy, front-loaded with 'MUTATING' for immediate attention. Every sentence serves a purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the 4-parameter, no-output-schema, mutating tool, the description covers key behaviors (confirm gate, archive/unarchive, preview). However, it omits error handling, return format, and post-archive state changes, leaving some gaps for a complete context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Input schema covers all 4 parameters with descriptions (100% coverage). The description reiterates the confirmation rule already present in the schema, adding little new semantic value beyond the schema itself.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states the tool archives or unarchives a record via a PUT endpoint. The specific verb 'archive' and resource distinction from siblings (no other sibling does archiving) makes purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly warns not to call with confirm=true without user approval, and states that confirm=false performs a preview only. This provides clear when-to-use and when-not-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
call_endpointA
Invoke ANY Virtuous API endpoint. This gives full coverage of the entire API.
Reads (GET, and POST to Query/QueryOptions/Search/Find/Proximity) run freely. WRITE endpoints (any other POST/PUT/PATCH/DELETE) MODIFY data and obey the confirmation policy: with confirm=false NO call is made and a preview is returned so you can show the user and ask. Only pass confirm=true after the user has explicitly approved the exact action.
Use list_endpoints / describe_endpoint to find the right method + path first.
| Name | Required | Description | Default |
|---|---|---|---|
| body | No | JSON request body (for POST/PUT/PATCH). | |
| path | Yes | Path template from list_endpoints, e.g. '/api/Contact/:contactId'. | |
| method | Yes | HTTP method: GET, POST, PUT, PATCH, or DELETE. | |
| confirm | No | Required (true) for any WRITE endpoint. Set ONLY after explicit user approval. | |
| path_params | No | Values for :placeholders in the path, e.g. {"contactId": 123}. | |
| query_params | No | Query-string parameters, e.g. {"skip": 0, "take": 50}. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, but description covers key behaviors: reads run freely, writes require confirmation with preview. Could mention error handling or response format for completeness.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two well-structured paragraphs, front-loaded with purpose. Slightly verbose in places (e.g., 'full coverage' repeated), but overall efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the generic nature and lack of output schema, the description covers usage policy, read/write distinction, and suggests discovery tools. Missing a brief note on return values or error handling.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so baseline is 3. Description adds context for confirm and path_params, but schema already adequately describes parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states that the tool invokes any Virtuous API endpoint, providing full coverage. It distinctly sets itself apart from sibling tools like create_record or delete_record by being the generic fallback.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly explains when to use (all endpoints) and when not to use (writes without confirmation). Provides clear policy: confirm=false returns preview, confirm=true only after explicit user approval. Also recommends using list_endpoints/describe_endpoint first.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_batchA
MUTATING: submit a BULK import of contacts or gifts (the rate-limit-friendly, Virtuous-recommended way to load many records at once).
Virtuous best practices say: to load many gifts/contacts, post them through the BATCH endpoints rather than one transaction per call. This both runs the records through Virtuous's matching/validation/dedupe pipeline AND makes far fewer requests against the ORG-WIDE rate budget (one batch call instead of N).
'contact' -> POST /api/Contact/Batch 'gift' -> POST /api/v2/Gift/Transactions DO NOT call with confirm=true unless the user explicitly approved it. With confirm=false this performs no change and returns a preview (including how many records are in the batch).
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | Bulk payload. For 'gift' this is typically a list of gift transaction objects (same shape as a single gift transaction). For 'contact' this is the contact-import batch payload. Use describe_endpoint on the target path for the exact schema. | |
| kind | Yes | 'contact' or 'gift' — which bulk import to submit. | |
| confirm | No | Must be true to actually submit. Set ONLY after explicit user approval. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses mutation, rate-limit benefits, preview behavior on confirm=false, and the need for user approval for confirm=true, compensating for absent annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with 'MUTATING' and clear purpose; every sentence adds value despite length, with no redundant phrases.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers all aspects needed given no output schema: explains preview on confirm=false, validates behavior, and references best practices, making it fully actionable.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Adds meaning beyond schema: explains body references describe_endpoint for exact schema, kind lists 'contact' or 'gift', and confirm must be set only after user approval.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description explicitly states it submits bulk imports of contacts or gifts, specifying 'BULK import' and distinguishing from single-record tools like create_record and create_transaction.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Clearly states when to use (loading many records), mentions it's rate-limit-friendly and Virtuous-recommended, and warns against calling with confirm=true without explicit approval.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_recordA
MUTATING: create a new record via POST /api/{object_type}.
DO NOT call with confirm=true unless the user has explicitly approved creating
this exact record. With confirm=false this performs no change and returns a
preview to show the user. NOTE: to create Contacts/Gifts safely, prefer
create_transaction (it runs through Virtuous matching/validation).
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | JSON body for the new record. | |
| confirm | No | Must be true to actually create. Set ONLY after explicit user approval. | |
| object_type | Yes | Object to create, e.g. 'ContactNote', 'ContactTag', 'Task', 'Relationship'. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, description fully discloses that confirm=false returns a preview with no change, and confirm=true performs actual creation. Also notes mutation and safe alternatives.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with 'MUTATING', then concise action statement, followed by essential warnings. No wasted sentences; every sentence adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Explains preview vs actual creation modes, but does not describe return value or error handling. However, given tool's nature, this is sufficient for most use cases. Slight gap for completeness.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%; description adds critical behavior details for confirm parameter, examples for object_type, and clarifies body is JSON. Additional warning enhances clarity.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states it creates a new record via POST, with explicit mention of mutating action. Differentiates from sibling create_transaction by noting it is safer for Contacts/Gifts.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly warns against calling with confirm=true without explicit user approval. Recommends create_transaction for Contacts/Gifts, providing clear when-not-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_transactionA
MUTATING: submit a Contact or Gift transaction (the recommended, matched/validated way to import contacts and gifts).
'contact' -> POST /api/Contact/Transaction 'gift' -> POST /api/v2/Gift/Transaction DO NOT call with confirm=true unless the user explicitly approved it. With confirm=false this performs no change and returns a preview.
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | Transaction JSON body. | |
| kind | Yes | 'contact' or 'gift' — which transaction import to create. | |
| confirm | No | Must be true to actually submit. Set ONLY after explicit user approval. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden. It warns about mutating behavior and explains confirm=false behavior, but lacks details on auth requirements, rate limits, or success/error responses.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise, front-loaded with purpose, and every sentence adds value without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema and 3 parameters, the description covers core behavior but omits return values, error handling, and rate limits. It is functional but not exhaustive.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, giving a baseline of 3. The description adds value by mapping kind to specific API endpoints and explaining the confirm parameter's role in preview vs. actual submission.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool submits Contact or Gift transactions, specifying it as the recommended way to import contacts and gifts. It distinguishes itself from sibling tools by focusing on transaction imports.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit guidance on the confirm parameter (only use true after user approval, false gives preview). It indicates this is the recommended method for importing contacts/gifts but does not directly contrast with siblings like create_record or write_request.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_recordA
MUTATING + DESTRUCTIVE: delete a record via DELETE /api/{object_type}/{id}.
This permanently removes data. DO NOT call with confirm=true unless the user has explicitly approved deleting this exact record. With confirm=false this performs no change and returns a preview.
| Name | Required | Description | Default |
|---|---|---|---|
| confirm | No | Must be true to actually delete. Set ONLY after explicit user approval. | |
| record_id | Yes | The id of the record to delete. | |
| object_type | Yes | Object to delete, e.g. 'ContactNote', 'ContactTag'. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, but description fully carries the burden: it explicitly states the operation is mutating, destructive, and permanently removes data, and explains the preview behavior for confirm=false.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with critical warning, no unnecessary words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive tool with no output schema, it covers safety, preview, and parameter purpose. Could specify return format for confirm=true but not essential.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, baseline 3. Description adds value by explaining the confirm parameter's role and warning, and clarifies the preview behavior.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it deletes a record permanently using a DELETE endpoint. It emphasizes destructive nature but does not explicitly differentiate from archive_record.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit guidance: do not use confirm=true without user approval, and explains that confirm=false returns a preview with no changes.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
describe_endpointA
Get full metadata for a single endpoint (method, path, title, resource, read/write, path + query parameters). Read-only.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Exact path template with :placeholders, e.g. '/api/Contact/:contactId'. | |
| method | Yes | HTTP method, e.g. 'GET', 'POST', 'PUT'. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses the read-only nature and lists the kind of data returned (method, path, title, etc.), though with no annotations, it adequately conveys the behavior, as it is a straightforward retrieval.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences that front-load the purpose, with no redundant or unnecessary information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple metadata retrieval tool with no output schema, the description provides a good overview of the returned fields, though it could optionally list all fields for completeness.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Both parameters are fully described in the schema (100% coverage), and the tool's description adds no additional detail beyond what is already present in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states it returns full metadata for a single endpoint, distinguishing it from sibling tools like list_endpoints which return multiple endpoints.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description indicates it is a read-only operation, which suggests safe usage, but does not explicitly mention when to use versus alternatives like list_endpoints or call_endpoint.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_contactA
Find a single contact by email, or by reference source + id. Read-only.
Provide either an email or a reference_source + reference_id.
| Name | Required | Description | Default |
|---|---|---|---|
| No | Email address to look up. | ||
| reference_id | No | Reference id within the source. | |
| reference_source | No | Reference source, e.g. 'Stripe'. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full burden. It states the tool is 'Read-only,' which is a key behavioral trait. However, it does not disclose behavior on not found, error handling, or rate limits, which is acceptable for a simple lookup but minimal.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise with two sentences, front-loading the purpose and usage. No redundant information, every word earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (3 optional parameters, no output schema), the description is complete enough. It covers purpose, usage, and read-only nature. Could optionally mention behavior when no results, but not necessary for a lookup tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% with each parameter already described. The description adds value by explaining the grouping constraint: 'Provide either an email or a reference_source + reference_id.' This clarifies mutual exclusivity beyond the schema's individual descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Find a single contact by email, or by reference source + id.' It specifies the verb 'find' and the resource 'contact,' and distinguishes itself from sibling tools like 'search_contacts' (which likely returns multiple) and 'get_contact_notes' (different resource).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear guidance: 'Provide either an email or a reference_source + reference_id.' It states that the tool is read-only, implying no side effects. However, it does not explicitly compare with alternatives or mention when not to use it, 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.
get_contact_notesB
Get notes for a contact. Read-only.
| Name | Required | Description | Default |
|---|---|---|---|
| contact_id | Yes | The contact id. | |
| important_only | No | Only return important notes. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description includes 'Read-only', which is a key behavioral trait, but it does not disclose other details like authorization requirements, rate limits, or return format. With no annotations, more behavioral context is expected.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise with only two sentences, no redundancy, and front-loads the core purpose. Every word earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the simplicity (2 params, no nested objects, no output schema), the description is lacking details about the nature of notes, ordering, pagination, or limits. A more complete description would improve usability.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, and the schema already describes both parameters clearly. The description adds no additional meaning beyond what is in the schema, meeting the baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description 'Get notes for a contact' clearly states the verb (get) and the resource (notes for a contact), and it is distinct from sibling tools like 'get_gifts_by_contact' and 'get_individuals_by_contact' which handle different data.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this tool versus alternatives such as 'get_record' or 'find_contact'. The 'Read-only' label is a safety hint but does not provide context for selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_current_contextA
Get the current organization and the API key's permissions. Read-only.
Useful to understand what the key is allowed to read/write before attempting any action.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must cover behavioral aspects. It declares 'Read-only', which is good, but it does not detail the output structure or any potential side effects (though none expected). The description is adequate but not exhaustive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description consists of two concise sentences that are front-loaded with the core purpose. No extraneous information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has no parameters and no output schema. The description mentions what information is returned (organization and permissions) but does not specify the format or structure. For a simple read tool, it is moderately complete but could be more explicit.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There are no parameters, and the input schema is empty with 100% coverage. Per guidelines, baseline is 4. No additional semantics needed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool retrieves the current organization and API key permissions. The verb 'Get' and resource 'current context' are specific, and the tool is distinct from sibling tools which focus on CRUD or query operations.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly advises using this tool before other actions to understand permissions. It does not provide negative guidance or alternatives, but given the unique context, that is acceptable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_gifts_by_contactB
Get all gifts for a contact via GET /api/Gift/ByContact/{id}. Read-only.
| Name | Required | Description | Default |
|---|---|---|---|
| contact_id | Yes | The contact id. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so the description must disclose behaviors. It only states 'Read-only,' which implies no side effects, but lacks details on rate limits, pagination, or other important behavioral traits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, efficient sentence that includes the HTTP path and read-only nature. No wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple (one parameter, read-only), but the description omits return value structure or pagination details. For a get-all tool, some mention of expected response format would improve completeness.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already describes contact_id with 100% coverage. The description adds no further meaning beyond what the schema provides, so baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Get all gifts'), the resource ('for a contact'), and the HTTP method ('via GET'). It is specific and distinguishes from sibling tools, as no other gift-related tool exists.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit guidance on when to use this tool versus alternatives. It does not mention prerequisites, exclusions, or when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_individuals_by_contactC
Get the individuals that make up a contact. Read-only.
| Name | Required | Description | Default |
|---|---|---|---|
| contact_id | Yes | The contact id. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must carry the full burden of behavioral disclosure. It states 'Read-only,' which is beneficial for safety, but omits other behavioral traits such as whether it returns a list or single object, pagination, or response structure. This leaves significant gaps for an agent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise with two sentences and no redundant information. It is front-loaded with the primary action and resource, making it efficient for an agent to parse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite the tool's simplicity (one parameter, no nested objects, no output schema), the description fails to explain what the tool returns. An agent needs to know whether the response is a list, object, or other structure, especially without an output schema. This is a notable omission.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 100% description coverage, so the baseline is 3. The description adds no additional meaning beyond what the schema provides for the single parameter (contact_id). It neither clarifies formatting, constraints, nor relationships, so it does not exceed the baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Get') and resource ('individuals that make up a contact'), which clearly indicates the tool's function. It distinguishes from sibling tools like get_contact_notes or get_gifts_by_contact by focusing on individuals. However, it doesn't explicitly contrast with alternatives, so a minor deduction.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus alternatives like find_contact or search_contacts. The description simply states what it does, leaving the agent to infer usage context without any exclusions or prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_query_optionsA
Get the queryable fields, data types, and allowed operators for an object type so you can construct a valid query. Read-only.
| Name | Required | Description | Default |
|---|---|---|---|
| object_type | Yes | e.g. 'Contact', 'Gift', 'Project'. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description states 'Read-only' which is a key behavioral trait, but lacks details on error handling, rate limits, or authentication requirements. With no annotations, more behavioral context would be beneficial.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two short sentences, front-loaded with the primary action, and contains no fluff. Every word serves a purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema, the description does not detail the return structure (e.g., format of fields, types, operators). This missing information reduces completeness for constructing valid queries.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with a clear parameter description. The description adds context ('so you can construct a valid query') but does not significantly enhance parameter meaning beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the specific action: getting queryable fields, data types, and allowed operators for an object type. It is informative and distinguishes the metadata nature from sibling query tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies use before constructing a query ('so you can construct a valid query'), but it does not explicitly contrast with siblings like 'list_query_object_types' or 'query_all', nor does it state when not to use this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_rate_limit_statusA
Report the most recently observed Virtuous rate-limit headers. Read-only.
Virtuous enforces an ORG-WIDE request budget (documented at 5,000
requests/hour) shared by every API key/integration in the organization.
This returns the latest X-RateLimit-Limit, X-RateLimit-Remaining,
reset_at, and seconds_until_reset seen on a response — useful before
kicking off a large batch or many queries. It is empty until at least one
request has been made in this session, so a low remaining here reflects
other integrations' usage too.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses read-only status, explains that it is empty until first request, and details what headers are returned. No annotations to contradict.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with purpose, no unnecessary words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Fully explains the tool's purpose, usage, and behavior for a zero-parameter tool with an output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
No parameters exist; baseline of 4 for zero parameters per guidelines.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it reports the most recently observed rate-limit headers, distinguishing it from sibling tools that manipulate or query records.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly suggests using it before large batches and explains org-wide sharing, but does not list when not to use.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_recordB
Fetch a single record by id via GET /api/{object_type}/{record_id}. Read-only.
| Name | Required | Description | Default |
|---|---|---|---|
| record_id | Yes | The id of the record to fetch. | |
| object_type | Yes | e.g. 'Contact', 'Gift', 'Project'. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description mentions 'Read-only' which indicates no side effects, but with no annotations provided, the description should disclose more behavioral traits such as authentication requirements, rate limits, or what happens if the record doesn't exist. The API path is given, but the overall transparency is insufficient.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise with two sentences. Every word earns its place: the purpose, the API path, and the read-only nature. No fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description lacks information about the return value (no output schema) and error handling. For a simple fetch tool, this is a moderate gap. The agent knows it returns a record but not the structure or fields.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with parameter descriptions already present. The description adds minimal extra value by showing the path template, but does not explain the object_type values beyond the schema examples. This meets the baseline expectation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'Fetch', the resource 'a single record by id', and specifies the API path and HTTP method. This precisely distinguishes it from sibling tools like query_records (list many) or update_record (mutate).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no explicit guidance on when to use this tool versus alternatives. With 25 sibling tools, stating that this is for fetching a known single record by ID, not for searching or listing, would help the agent choose correctly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_reference_dataA
Fetch a reference/lookup list (contact types, tags, custom fields, task types, project types, etc.) used to build queries or understand allowed values. Read-only.
Auto-paginates: these list endpoints default to only 10 rows server-side (a
silent-truncation footgun — e.g. /api/OrganizationGroup has 30 groups but
returned just 10, hiding the 'Pending Portfolio Assignment' holding group).
When the response is a paged {"list", "total"} envelope this walks every
page and returns the FULL list (with a returned count) so callers never
reason over a truncated reference set.
| Name | Required | Description | Default |
|---|---|---|---|
| key | Yes | Reference list key (see list_query_object_types -> reference_data_keys). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description fully discloses important behavior: auto-pagination, the default 10-row truncation footgun, and the full list return with a 'returned' count. This is highly transparent and warns about a subtle issue.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the purpose and then delves into auto-pagination. Each sentence adds value, but the second paragraph is somewhat lengthy. Could be slightly more concise without losing critical warnings.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the single parameter, no output schema, and the complexity of auto-pagination behavior, the description is complete. It explains the return envelope, the pagination issue, and the key reference source, fully covering what an agent needs.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is only one parameter ('key') with a schema description that directs to list_query_object_types for valid keys. The description adds value by referencing the source of allowed values, going beyond the schema's basic description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it fetches reference/lookup lists, provides concrete examples (contact types, tags), and specifies it is read-only. It distinguishes itself from siblings by focusing on reference data retrieval.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description indicates it is used to 'build queries or understand allowed values,' which provides clear context. However, it lacks explicit guidance on when not to use this tool versus alternatives, such as get_query_options or list_query_object_types.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_endpointsA
Discover Virtuous API endpoints across the ENTIRE API. Read-only.
Returns matching endpoints with their method, path template (with
:placeholders), title, whether they read or write, and parameter names. Use
the returned method+path with call_endpoint (or describe_endpoint first).
| Name | Required | Description | Default |
|---|---|---|---|
| only | No | Filter by kind: 'reads' or 'writes'. Omit for both. | |
| search | No | Case-insensitive substring to match in the title or path. | |
| resource | No | Filter to one resource group, e.g. 'Contact'. See list_resources. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description explicitly states 'Read-only' and describes the return fields (method, path, title, etc.). Since no annotations are provided, the description carries the full burden. It does not mention rate limits or other constraints, but for a discovery tool the behavioral disclosure is adequate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise, with three sentences: the first states purpose and safety, the second lists return fields, and the third explains usage. It is front-loaded and contains no unnecessary words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given that an output schema exists, the description adequately covers the tool's behavior: it lists what endpoints are returned and how to use the results. The filtering parameters are implied, and the completeness is sufficient for an agent to understand and invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds limited additional value beyond the schema's parameter descriptions, except by explaining the return fields which helps understand the filters. This justifies the baseline score.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it discovers Virtuous API endpoints across the entire API. It specifies that it is read-only and lists the return fields (method, path template, title, read/write indicator, parameter names). This distinguishes it from sibling tools like call_endpoint and describe_endpoint.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description advises using the returned method+path with call_endpoint or describe_endpoint first, which provides clear guidance on when to use this tool. However, it does not explicitly state when not to use it or mention alternatives beyond these two tools, so some explicitness is missing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_query_object_typesA
List Virtuous object types that can be queried/read, with descriptions.
Read-only. Use the returned keys with get_query_options, query_records, and get_record.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description bears full responsibility. It marks the tool as 'Read-only', which implies no side effects. However, it does not specify any other behavioral traits such as whether the list is static, cached, or if there are any limitations. For a zero-parameter list, this is minimally acceptable but could be improved.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise, consisting of two sentences. The first sentence states the purpose, and the second provides usage guidance. Every word adds value, and there is no fluff. It is front-loaded and efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has no parameters, a rich output schema (implied), and is a simple listing, the description covers the key points: what it returns and how to use the results. It could mention that it is the starting point for object type queries, but overall it is sufficient.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so the description does not need to add parameter meaning. The baseline for no parameters is 4, and the description appropriately focuses on the tool's purpose and usage without redundant parameter info.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool lists Virtuous object types that can be queried/read, with descriptions. It provides a specific verb ('list') and resource ('object types'), and distinguishes from sibling tools that perform write operations or other reads. However, it does not explicitly differentiate from other listing tools like list_endpoints or list_resources, but the context of queryable object types narrows the scope.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says to use the returned keys with get_query_options, query_records, and get_record, establishing a clear usage flow. It also labels the tool as read-only, implying it is safe to call. There is no guidance on when not to use it, but the context is straightforward for a listing tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_resourcesA
List every Virtuous API resource group (Contact, Gift, Project, Event, Webhook, etc.) and how many endpoints each has. Read-only.
Use with list_endpoints to drill into a resource.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Despite no annotations, the description declares read-only behavior, adding value. It does not detail output format, but output schema exists to cover structure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences with no redundancy, front-loading the main action and scope.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no parameters, an output schema, and clear purpose/usage hints, the description is fully adequate for the tool's complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
No parameters, so baseline 4. No extra parameter information needed; schema coverage is 100%.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states the tool lists every Virtuous API resource group (e.g., Contact, Gift) along with endpoint counts. Differentiates from sibling list_endpoints by mentioning drill-down usage.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly suggests using with list_endpoints for drilling into a resource, and notes read-only nature, providing clear context for when to use.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
query_allA
Auto-paginate a query and return up to max_records records. Read-only.
Convenience over query_records: instead of you managing skip/take,
this loops through pages (each capped at 1000 by the API) until it has
max_records, the result set is exhausted, or the QUERY_ALL_HARD_CAP
safety ceiling is hit. Because every page is a request against the
ORG-WIDE rate budget, keep max_records as small as the task needs and
prefer a precise groups filter. The response includes a rate_limit
snapshot so you can see remaining budget after the sweep.
| Name | Required | Description | Default |
|---|---|---|---|
| groups | No | Filter groups (same structure/value-shape rules as query_records): [{"conditions": [{"parameter", "operator", "value"}, ...]}]. Conditions within a group are AND-ed; groups are OR-ed. Multi-value ops use `values`: [...]; Between uses `value` + `secondaryValue`; unknown `parameter` names are rejected. | |
| sort_by | No | Field to sort by. | |
| page_size | No | Records per page request (max 1000). | |
| descending | No | Sort descending. | |
| full_detail | No | Use full-detail variant (Contact/Gift only). | |
| max_records | No | Stop after collecting this many records (hard cap 10000). | |
| object_type | Yes | Object type to query, e.g. 'Contact' or 'Gift'. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Since no annotations are provided, the description fully discloses behavioral traits: it loops through pages each capped at 1000, stops under various conditions, includes a rate_limit snapshot in the response, and is read-only. It also warns about org-wide rate budget consumption. No contradictions with annotations (none exist).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two well-structured paragraphs with the main purpose front-loaded. Every sentence adds value, avoiding fluff. It is concise yet informative, covering key behavioral aspects and usage tips efficiently.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity and lack of output schema, the description covers most important aspects: pagination behavior, caps, rate limit considerations, and distinction from sibling tool. It falls short of fully specifying the return format beyond the rate_limit snapshot, but is otherwise complete for an auto-pagination query tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Input schema coverage is 100%, so baseline is 3. The description does not add additional semantics to individual parameters beyond what is already in the schema; it provides overall context and behavior but does not enhance parameter understanding beyond schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Auto-paginate a query and return up to max_records records. Read-only.' It uses a specific verb ('auto-paginate') and resource ('query'), and explicitly distinguishes it from the sibling tool 'query_records' by highlighting its convenience and automated pagination.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit guidance on when to use this tool versus alternatives: 'Convenience over query_records: instead of you managing skip/take, this loops through pages...' It also gives best practices, such as keeping max_records small and preferring precise groups filters, and mentions the safety ceiling and rate budget impact.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
query_recordsB
Run a read-only bulk query against a Virtuous object type. Read-only.
| Name | Required | Description | Default |
|---|---|---|---|
| skip | No | Records to skip (pagination). | |
| take | No | Records to return (max 1000). | |
| groups | No | Filter groups: [{"conditions": [{"parameter", "operator", "value"}, ...]}]. Conditions within a group are AND-ed; groups are OR-ed. Omit/empty for all records. VALUE SHAPE (auto-normalized, but get it right): single-value ops use `value`; multi-value ops (In/NotIn/IsAnyOf/IsNoneOf) use `values`: [a, b, ...]; range ops (Between/NotBetween) use `value` + `secondaryValue` (a 2-item list is auto-split). `parameter` MUST be an exact name from get_query_options — unknown names are rejected (Virtuous would otherwise silently ignore them and return everything). | |
| sort_by | No | Field to sort by. | |
| descending | No | Sort descending. | |
| full_detail | No | Use full-detail variant (Contact/Gift only). | |
| object_type | Yes | Object type to query, e.g. 'Contact' or 'Gift'. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The only behavioral trait disclosed is 'read-only', which is positive. However, with no annotations, the description should elaborate on pagination (skip/take), rate limits, or auth requirements. It does not.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single concise sentence that front-loads the purpose. It is efficient, though could include a bit more context without becoming verbose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 7 parameters, no output schema, and no annotations, the description is too brief. It does not explain return values, pagination behavior, or when to use full_detail, leaving gaps for an agent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and all parameters have descriptions. The tool description adds no extra meaning beyond 'read-only bulk query', so it meets the baseline but does not exceed it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description 'Run a read-only bulk query against a Virtuous object type. Read-only.' clearly states the verb (query), resource (Virtuous object type), and scope (read-only, bulk). It distinguishes this from mutation siblings like create_record, delete_record, and update_record.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this tool vs. siblings like query_all, search_contacts, or find_contact. The description only states that it is read-only, but does not provide exclusions or alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
read_paged_requestA
Auto-page arbitrary read-only GET endpoints that use skip/take.
Use for list-style GET endpoints such as /api/Contact/ByTag/{tagId} or
/api/OrganizationGroup/{id}/contacts. If the first response is not a
{"list": [...], "total": N} envelope, the original response is returned.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Read-only GET API path beginning with /api/. | |
| params | No | Optional query params other than skip/take. | |
| page_size | No | GET records per page (max 1000). | |
| max_records | No | Stop after this many records (hard cap 10000). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations, so description bears full burden. Discloses auto-paging and envelope expectation, but doesn't explain how it modifies requests (e.g., adding skip/take params) or rate limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with key idea, no wasted words. Every sentence contributes essential information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema, but description explains return behavior (original or paginated envelope). Does not cover error handling or edge cases, but sufficient for typical use.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3, but description adds significant value by explaining the tool's purpose and expected return format, which is not in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool auto-pages read-only GET endpoints that use skip/take, giving specific verb and resource. It distinguishes from siblings like read_request by focusing on paging.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit use cases (list-style GET endpoints) and explains the expected response envelope. Does not explicitly state when not to use, but context with siblings makes it clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
read_requestA
Escape hatch for arbitrary READ-ONLY GET requests to the Virtuous API.
Only GET is allowed here. Use when no dedicated read tool fits. Read-only.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | API path beginning with /api/, e.g. '/api/Contact/123'. | |
| params | No | Optional query-string params. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Without annotations, the description fully states read-only and GET-only behavior. Could mention error handling or response format but sufficient for an escape hatch.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three concise sentences with minimal redundancy, though 'Read-only' is repeated. No filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool is an escape hatch and no output schema, the description adequately conveys its purpose. Could mention raw response nature but not critical.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so description adds no new parameter meaning beyond the schema's examples and descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Explicitly states it is an escape hatch for arbitrary read-only GET requests to the Virtuous API, distinguishing it from siblings like write_request and call_endpoint.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Clearly states 'Use when no dedicated read tool fits' and 'Only GET is allowed', providing explicit when-to-use and when-not-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_contactsB
Fuzzy-search contacts by a free-text string. Read-only.
| Name | Required | Description | Default |
|---|---|---|---|
| skip | No | ||
| take | No | ||
| search | Yes | Free-text search (name, etc.). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Without annotations, the description carries full burden. It discloses read-only and fuzzy-search behavior. However, it omits pagination details (defaults for skip/take) and no mention of result format or limits beyond schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Exceptionally concise: two short sentences front-load the key action and safety property. No wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple tool with no output schema and no annotations, the description covers purpose but lacks detail on pagination behavior, expected result structure, and when to use exact vs fuzzy search. Adequate but not complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only the 'search' parameter has a schema description (free-text). The description redundantly mentions 'free-text string' but adds no new meaning. Skip and take are completely undocumented in both schema and description, leaving 2/3 parameters with no semantic guidance.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool performs fuzzy search on contacts using free-text. It distinguishes from sibling 'find_contact' by implying approximate matching, but does not explicitly contrast.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is given on when to use this tool vs alternatives like find_contact or get_contact_notes. The read-only hint is useful but insufficient for decision-making.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_recordA
MUTATING: update a record via PUT /api/{object_type}/{record_id}.
DO NOT call with confirm=true unless the user has explicitly approved this exact change. With confirm=false this performs no change and returns a preview.
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | Full JSON body with updated fields. | |
| confirm | No | Must be true to actually update. Set ONLY after explicit user approval. | |
| record_id | Yes | The id of the record to update. | |
| object_type | Yes | Object to update, e.g. 'Contact', 'Gift', 'ContactNote'. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full burden. It clearly discloses that the tool performs a PUT mutation and describes the two-phase pattern (preview vs actual update). It does not detail authentication or error behavior, but the core behavioral trait is well explained.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description consists of two efficient sentences. The first states the purpose and endpoint, the second provides critical usage guidance. No wasted words, and the key information is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has 4 parameters (3 required) and nested objects, the description covers the essential behavioral aspect (confirm pattern). It mentions 'returns a preview' for confirm=false, which is helpful, though it could be more specific about the preview contents or success/error responses.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. The description adds value by explaining that body is a 'Full JSON body with updated fields' and reinforces the confirm parameter's purpose with 'Set ONLY after explicit user approval.' This goes beyond the schema's description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description starts with 'MUTATING: update a record via PUT /api/{object_type}/{record_id}', clearly stating the action (update) and resource (record). This distinguishes it from sibling tools like create_record, delete_record, and archive_record.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit guidance on when to use confirm=false vs confirm=true, and warns against calling confirm=true without user approval. However, it does not explicitly state when to use this tool over siblings like archive_record or delete_record.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
write_requestA
MUTATING escape hatch for any write endpoint not covered by a dedicated tool (e.g. cancel a recurring gift, write off a pledge, send an email, toggle a webhook).
DO NOT call with confirm=true unless the user has explicitly approved this exact
request. With confirm=false this performs no change and returns a preview. If the
request is actually read-only it will be rejected — use read_request for reads.
| Name | Required | Description | Default |
|---|---|---|---|
| body | No | Optional JSON body. | |
| path | Yes | API path beginning with /api/, e.g. '/api/RecurringGift/Cancel/123'. | |
| method | Yes | HTTP method: POST, PUT, PATCH, or DELETE. | |
| confirm | No | Must be true to actually run. Set ONLY after explicit user approval. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Despite no annotations, the description discloses mutating nature, preview mode with confirm=false, and rejection of read-only requests. However, lacks details on side effects, auth requirements, or rate limits, which would be useful for an escape hatch.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two focused sentences with purpose first, then usage guidance. No redundant words. Every sentence adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a general escape hatch, the description adequately covers usage, preview behavior, and distinction from read_request. Lacks return value details, but no output schema is expected.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema provides descriptions for all 4 parameters (100% coverage). The description adds critical context: confirm must be set true only after user approval, and body is optional JSON. This augments schema meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies the tool as a 'MUTATING escape hatch for any write endpoint not covered by a dedicated tool', listing concrete examples like canceling gifts or writing off pledges. This provides a specific verb and resource scope, distinguishing it from siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use (mutating endpoints not covered) and when not to ('use read_request for reads'). Includes a strong warning about confirm=true requiring explicit user approval, and describes preview behavior with confirm=false.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
26 tool updates
v0.1.0- First observed
archive_record - First observed
call_endpoint - First observed
create_batch - First observed
create_record - First observed
create_transaction - First observed
delete_record - First observed
describe_endpoint - First observed
find_contact - First observed
get_contact_notes - First observed
get_current_context - First observed
get_gifts_by_contact - First observed
get_individuals_by_contact - First observed
get_query_options - First observed
get_rate_limit_status - First observed
get_record - First observed
get_reference_data - First observed
list_endpoints - First observed
list_query_object_types - First observed
list_resources - First observed
query_all - First observed
query_records - First observed
read_paged_request - First observed
read_request - First observed
search_contacts - First observed
update_record - First observed
write_request
TDQS
Scored across 26 tools
Tools generally have distinct purposes, but query_all and query_records overlap, and generic escape hatches (call_endpoint, read_request, write_request) can create ambiguity with dedicated tools. Descriptions help clarify, but the potential for misselection exists.
All tool names follow a consistent 'verb_noun' pattern with underscore separation. Verbs are varied but predictable, and naming is uniform throughout the set.
26 tools is on the higher side but appropriate for a comprehensive CRM API server. Each tool serves a clear purpose, and the count is justified by the scope of the API.
The tool surface covers CRUD operations, querying, bulk imports, metadata discovery, rate limits, and escape hatches for missing endpoints. No obvious gaps; the generic tools ensure full API coverage.
Maintenance
Related MCP Connectors
MCP server that lets AI assistants use all OneSchema features exposed via the public API.
- ZapierOAuthcom.zapier
Hosted MCP server connecting AI assistants to 9,000+ apps and 40,000+ actions via Zapier.
MCP server unifying ERPs, CRMs, APIs and knowledge base for Claude, ChatGPT and Gemini.
The HubSpot MCP Server acts as a bridge that enables AI assistants and Large Language Models to securely interact with HubSpot CRM data through natural conversation, without requiring users to understand complex API structures. It provides read-only access to standard CRM objects (contacts, companies, deals, tickets, products, invoices, and more) and their associations, secured via OAuth 2.0, allowing AI agents to perform tasks like summarizing deals, fetching company updates, and looking up record changes.
Related MCP Servers
- FlicenseDqualityDmaintenanceAn MCP server that allows AI assistants to interact with the ServiceTitan API, requiring client credentials for authentication.4-
- AlicenseBqualityDmaintenanceAn MCP server that connects AI assistants to Microsoft SQL Server databases, enabling schema exploration and read-only queries safely.495 npm4MIT
- AlicenseAqualityBmaintenanceMCP server that lets an AI assistant perform scoped Okta identity operations with an out-of-band human-approval gate on destructive actions.5MIT
- FlicenseNot gradedqualityCmaintenanceA single MCP server that exposes safe, permission-checked tools for AI assistants to reach file systems, databases, APIs, Git, cloud services, and business applications.-