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 |
Capabilities
Features and capabilities supported by this server
| 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 | |
Latest Blog Posts
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/colecantu904/virtuous-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server