virtuous-mcp
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| VIRTUOUS_API_KEY | Yes | Bearer API key / Application Key for Virtuous CRM+ | |
| VIRTUOUS_BASE_URL | No | API base URL | https://api.virtuoussoftware.com |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
| logging | {} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
| extensions | {
"io.modelcontextprotocol/ui": {}
} |
| experimental | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| 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. |
| 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 |
| describe_endpointA | Get full metadata for a single endpoint (method, path, title, resource, read/write, path + query parameters). Read-only. |
| 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. |
| 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. |
| query_recordsB | Run a read-only bulk query against a Virtuous object type. Read-only. |
| query_allA | Auto-paginate a query and return up to Convenience over |
| get_recordB | Fetch a single record by id via GET /api/{object_type}/{record_id}. Read-only. |
| 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. |
| search_contactsB | Fuzzy-search contacts by a free-text string. Read-only. |
| get_gifts_by_contactB | Get all gifts for a contact via GET /api/Gift/ByContact/{id}. Read-only. |
| get_contact_notesB | Get notes for a contact. Read-only. |
| get_individuals_by_contactC | Get the individuals that make up a contact. Read-only. |
| 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 |
| 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. |
| 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 |
| 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. |
| read_paged_requestA | Auto-page arbitrary read-only GET endpoints that use Use for list-style GET endpoints such as |
| 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
|
| 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. |
| archive_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. |
| 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. |
| 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. |
| 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). |
| 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 |
| 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. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
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.