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 | |
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- 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