---
title: "Virtuous CRM MCP server for AI agents - actionlake"
description: "Give Claude 290 Virtuous CRM actions through one MCP server: contacts, gifts, reminders. Your agent never holds the credential. 100,000 calls a month free."
canonical: https://actionlake.com/connectors/virtuous-crm
updated: 2026-10-23
---

Connectors · CRM & sales

# Virtuous CRM MCP server for AI agents.

actionlake is an MCP gateway: one remote MCP server that connects Claude and other MCP clients to Virtuous CRM and the rest of your systems. It gives your agent 290 Virtuous CRM actions (174 reads, 92 writes and 24 that wait for a confirmation) and holds the Virtuous CRM credential itself, so the agent never does. It paces Virtuous CRM's limits and records every call.

[Connect Virtuous CRM free](https://actionlake.com/console?start=sandbox) [See pricing](https://actionlake.com/pricing)

100,000 free calls a month. No card, no email, no password: press Start a free sandbox on the next screen and keep the key it shows you.

`claude mcp add --transport http actionlake https://connect.actionlake.com/mcp`

the first call

```
do {
  action: "virtuous.events.list",
  intent: "check which Virtuous CRM account is connected"
}
# Get Events · read · 1 upstream call
```

- 290 actions in one signed file
- 174 read look, never change
- 92 write create and update
- 24 wait for a yes destructive, confirmed first

Set up

## Connect Virtuous CRM in three steps.

1. 01
   ### Add actionlake to Claude.
   Run the command once in Claude Code; its consent page can create a free sandbox: 100,000 calls a month, no card. In the Claude app, add a custom connector with the URL below and paste your key on the consent page. Creating a new sandbox from the Claude app is not yet tested by us.
   `https://connect.actionlake.com/mcp`
2. 02
   ### Connect Virtuous CRM.
   Bearer token. No consent screen: your agent can connect it for you, but the key then passes through your chat. To keep it out of the model's context, paste it in the console instead. actionlake stores what you paste write-only, sealed under your tenant's key.
   - `access_token` Virtuous API key: in Virtuous, Settings > Connectivity > API Keys > Create a Key (choose a permission group)
   ```
   account { op: "connections.requirements", service: "virtuous" }
   # free: exactly what to paste, and what is found for you
   ```
3. 03
   ### Make the first call. Check before a write.
   Ask in plain words; Claude picks the action. Before anything changes, `check` validates the call and prices it, for free.
   ```
   do    { action: "virtuous.events.list" }
   # get events · read · 1 upstream call
   check { action: "virtuous.events.create", input: { … } }
   # free: inputs, permissions, cost and confirmations, nothing sent
   ```

Virtuous CRM at a glance

**Sign-in**

Bearer token. No consent screen: your agent can connect it for you, but the key then passes through your chat. To keep it out of the model's context, paste it in the console instead.

**You provide**

`access_token`

**Limits we pace to**

1,500 calls an hour, per connection

**API covered**

Virtuous REST API (Postman reference collection, latest)`api.virtuoussoftware.com`

**Built from**

Virtuous CRM's documentation, read 23 October 2026[docs.virtuoussoftware.com](https://docs.virtuoussoftware.com/api/collections/19331481/UVeAuTw4?segregateAuth=true&versionTag=latest) [docs.virtuoussoftware.com](https://docs.virtuoussoftware.com/)

**Service file**

Version 1.0.0, signed (Ed25519)

**Cached reads**

174 of 174 reads, for up to 5 minutes; a write clears what it affects

**Shared entities**

5, so ask can line Virtuous CRM up with your other systems

**Data**

Processed and stored in Sydney, Australia. No US region yet

Capabilities

## What an AI agent can do in Virtuous CRM.

290 actions in 45 areas. Every one carries its effect, so a key can allow the reads and hold the rest.

- **174** read look, never change
- **92** write create and update
- **24** destructive wait for a confirmation

1. ### Contacts
   22
   15 read · 7 write · 0 destructive
   Create a Contact · Get a Contact · Query Contacts with Abbreviated Details · Update a Contact
2. ### Gifts
   18
   10 read · 7 write · 1 destructive
   Create a Gift · Query Gifts with Abbreviated Details · Get a Gift · Update a Gift
3. ### Reminders
   16
   9 read · 7 write · 0 destructive
   Create Manual Reminder · Create Milestone Reminder · Create Recurring Reminder · Gets Reminder Frequency Types
4. ### Projects
   12
   7 read · 5 write · 0 destructive
   Create a Project · Get Project · Update a Project · Query Projects
5. ### Contact notes
   11
   7 read · 3 write · 1 destructive
   Create a Note for a Contact · Get a Note · Update a Note · Query Contact Notes
6. ### Individuals
   11
   8 read · 2 write · 1 destructive
   Create an Individual · Query Individuals · Get an Individual · Update an Individual
7. ### Events
   10
   7 read · 2 write · 1 destructive
   Get Events · Create an Event · Get an Event · Update an Event
8. ### Grants
   10
   7 read · 2 write · 1 destructive
   Create a Grant · Query Grants · Get Grant · Update a Grant

**37 more areas · 180 actions**

- Premiums **10**
- Contact methods **8**
- Event attendees **8**
- Gift asks **8**
- Planned gifts **8**
- Pledges **8**
- Recurring gifts **8**
- Volunteer opportunities **8**
- Communications **7**
- Contact addresses **7**
- Project roles **7**
- Volunteers **7**
- Organization groups **6**
- Project notes **6**
- Segments **6**
- Project expenses **5**
- Relationships **5**
- Volunteer attendance **5**
- Webhooks **5**
- Campaigns **4**
- Contact collections **4**
- Event contacts **4**
- Individual collections **4**
- Tasks **4**
- Volunteer organizers **4**
- Contact tags **3**
- Organizations **3**
- Tributes **3**
- Contact receipts **2**
- Contact references **2**
- Email lists **2**
- Emails **2**
- Gift designations **2**
- Tags **2**
- Permissions **1**
- Recurring gift payments **1**
- Search **1**

Top actions

## The Virtuous CRM API, shaped for agents.

The ids your agent types, what each does, and the one name it shares with other systems. 56 of Virtuous CRM's 57 action names are shared with at least one other connector, so an agent learns them once.

| Action | What it does | Effect | Same name in |
| --- | --- | --- | --- |
| `virtuous.events.list` Get Events | Get Events. | read | `comm.event.list` 61 connectors |
| `virtuous.tags.list` Get all Tags | Get all Tags. | read | `crm.tag.list` 65 connectors |
| `virtuous.events.create` Create an Event | Create an Event. | write | `comm.event.create` 52 connectors |
| `virtuous.contacts.create` Create a Contact | Create a Contact. | write | `crm.contact.create` 161 connectors |
| `virtuous.contacts.get` Get a Contact | Get a Contact. | read | `crm.contact.get` 176 connectors |
| `virtuous.contact_notes.create` Create a Note for a Contact | Create a Note for a Contact. | write | `crm.contact_note.create` 28 connectors |
| `virtuous.projects.create` Create a Project | Create a Project. | write | `work.project.create` 102 connectors |
| `virtuous.projects.get` Get Project | Get Project. | read | `work.project.get` 106 connectors |
| `virtuous.contact_notes.get` Get a Note | Get a Note. | read | `crm.contact_note.get` 21 connectors |
| `virtuous.events.delete` Delete an Event | Delete an Event. | destructive | `comm.event.delete` 45 connectors |
| `virtuous.segments.create` Create a Segment | Create a Segment. | write | `comm.audience_segment.create` 16 connectors |
| `virtuous.campaigns.get` Get Campaign | Get Campaign. | read | `comm.campaign.get` 39 connectors |

Try it

## Prompts to paste into Claude.

Each one names the Virtuous CRM actions it will call, so you know what it reads and what it changes before you send it.

1. Read read
   Give me a one-line status for every active Virtuous CRM project.
   calls `virtuous.projects.query`
2. Write write
   Create an Event in Virtuous CRM. Show me exactly what you will send before you save it.
   calls `virtuous.events.create`
3. Across systems read
   Which contacts are in both Virtuous CRM and HaloPSA, and how many are in only one of them?
   calls `virtuous.contacts.query` `halopsa.users.list`

Across your systems

## Virtuous CRM, joined to the rest of your business.

One `ask` fetches from Virtuous CRM and another system, joins the rows on the same customer on our side, and hands your agent the answer, not every row.

- Which contacts are in both Virtuous CRM and HaloPSA, and how many are in only one of them?
  `virtuous.contacts.query` + `halopsa.users.list`, on `crm.contact` · [HaloPSA](https://actionlake.com/connectors/halopsa)
- Which contacts are in both Virtuous CRM and NetSuite, and how many are in only one of them?
  `virtuous.contacts.query` + `netsuite.views.contacts`, on `crm.contact` · [NetSuite](https://actionlake.com/connectors/netsuite)

Also mapped by other connectors `crm.contact` **192** `work.project` **116** `comm.event` **47** `crm.tag` **47** `crm.contact_note` **9**

ask

```
ask {
  intent: "which contacts are in both Virtuous CRM and HaloPSA, and how many are in only one of them",
  steps: [
    { action: "virtuous.contacts.query", as: "people", input: {}, limit: 100, max_pages: 5 },
    { action: "halopsa.users.list", as: "people2", input: {}, limit: 100, max_pages: 5 },
    { join: {
        left: "people",
        right: "people2",
        on: "crm.contact",
        group_by: "people.email",
        select: ["people.email", "count(people2.id) as in_halopsa"]
    } }
  ]
}
```

Example. Run it through check first: it validates the steps and prices them, and it is free.

Governance for Virtuous CRM

## Destructive actions wait for a yes.

24 Virtuous CRM actions are destructive. These are all of them:

- Delete an Event `virtuous.events.delete`
- Delete a Note `virtuous.contact_notes.delete`
- Delete an Event Attendee `virtuous.event_attendees.delete`
- Delete a Webhook `virtuous.webhooks.delete`
- Delete a Contact Tag `virtuous.contact_tags.delete`
- Delete a Project Note `virtuous.project_notes.delete`
- Delete a Gift `virtuous.gifts.delete`
- Delete a Grant `virtuous.grants.delete`
- Write-off the Pledge `virtuous.pledges.write_off`
- Delete a Volunteer `virtuous.volunteers.delete`
- Delete an Individual `virtuous.individuals.delete`
- Delete a Project Role `virtuous.project_roles.delete`
- Delete a Relationship `virtuous.relationships.delete`
- Delete an Event Contact `virtuous.event_contacts.delete`
- Delete a Contact Method `virtuous.contact_methods.delete`
- Delete a Contact Address `virtuous.contact_addresses.delete`
- Delete a Contact Reference `virtuous.contact_references.delete`
- Delete Collection for a Contact `virtuous.contact_collections.delete`
- Delete a Volunteer Attendance `virtuous.volunteer_attendance.delete`
- Delete a Volunteer Organizer `virtuous.volunteer_organizers.delete`
- Delete Collection for an Individual `virtuous.individual_collections.delete`
- Delete a Volunteer Opportunity `virtuous.volunteer_opportunities.delete`
- Remove a Contact from an Organization Group `virtuous.organization_groups.remove_contact`
- Cancel a Recurring Gift `virtuous.recurring_gifts.cancel`

A destructive action runs only with `confirm: true`. Under the `human` policy the agent cannot confirm for itself: the run stops until a named person approves, in the console or from a signed link in an email. The cap on a key is refused before the call is sent, never after.

do virtuous.events.delete confirm_policy: **human**

Delete an Event?

**intent:** the user asked me to delete an Event

run suspended · waiting for a named person · key _virtuous-agent_ cannot confirm itself

In the console, or from an emailed signed link.

a key for this connector

```
account {
  op: "keys.create", name: "virtuous-agent",
  allowed_actions: ["virtuous.*"], cap_calls: 2000,
  confirm_policy: "human_for_writes",
  approval_rules: [
    { match: "virtuous.events.delete", approver: "lead@example.com" },
    { match: "virtuous.contact_notes.delete", approver: "lead@example.com" },
    { match: "virtuous.event_attendees.delete", approver: "lead@example.com" }
  ]
}
```

Illustrative. Scoped to Virtuous CRM only, capped at 2,000 upstream calls, every write confirmed, and the destructive ones approved by a named person.

Cost

## What Virtuous CRM costs on actionlake.

Every Virtuous CRM action is one upstream call, the only thing actionlake bills. Searching, `check`, `cost`, `account` and any call Virtuous CRM refused with 401, 403, 429 or a 5xx are free. Paid plans start at US$49 a month for 250,000 calls, with overage from US$0.30 down to US$0.18 per 1,000.

- 1 upstream call per action all 290 Virtuous CRM actions
- 290 actions page each page of a long list is one call
- 174 reads can be cached a cache hit costs nothing
- 100,000 calls a month, free paid plans from US$49 a month for 250,000

[See pricing](https://actionlake.com/pricing)

Action index

## Every Virtuous CRM action.

290 actions by area: the id your agent calls, what it does, and its effect.

**Contacts 22**

- `virtuous.contacts.archive` Archive a Contact write
- `virtuous.contacts.create` Create a Contact write
- `virtuous.contacts.create_import_batch` Create a Contact Import that will be processed for changes and duplicates write
- `virtuous.contacts.create_transaction` Create a Contact that will go through the import process write
- `virtuous.contacts.custom_fields` Get Contact Custom Fields Available read
- `virtuous.contacts.find` Find a Contact by Email Address or Reference Source and ID read
- `virtuous.contacts.get` Get a Contact read
- `virtuous.contacts.get_by_reference` Get a Contact by Reference ID read
- `virtuous.contacts.get_by_reference_source` Get a Contact by Reference Source and ID read
- `virtuous.contacts.list_by_tag` Get Contacts by Tag ID read
- `virtuous.contacts.list_following` Get the Contacts the current user is following read
- `virtuous.contacts.list_following_activity` Get the Activity for the Contacts the current user is following read
- `virtuous.contacts.prefixes` Get Contact Name Prefixes and Titles read
- `virtuous.contacts.proximity` Find all Contacts within a given proximity of a geocoordinate read
- `virtuous.contacts.query` Query Contacts with Abbreviated Details read
- `virtuous.contacts.query_full_contact` Query Contacts with Full Details read
- `virtuous.contacts.query_options` Get Contact Query Options read
- `virtuous.contacts.search` Find all Contacts that match, fully or partially, the given search parameters read
- `virtuous.contacts.toggle_follow` Follow or Unfollow a Contact for the current user write
- `virtuous.contacts.types` Get Contact Types read
- `virtuous.contacts.unarchive` Unarchive a Contact write
- `virtuous.contacts.update` Update a Contact write

**Gifts 18**

- `virtuous.gifts.create` Create a Gift write
- `virtuous.gifts.create_many` Create many Gifts write
- `virtuous.gifts.create_reversing_transaction` Create a Reversing Transaction write
- `virtuous.gifts.create_transaction` Create a Gift Transaction write
- `virtuous.gifts.create_transactions` Create a Batch of Gift Transactions write
- `virtuous.gifts.custom_fields` Get Gift Custom Fields Available read
- `virtuous.gifts.delete` Delete a Gift destructive
- `virtuous.gifts.get` Get a Gift read
- `virtuous.gifts.get_by_transaction` Get a Gift by Transaction Source and ID read
- `virtuous.gifts.list_by_contact` Get Gifts for a Contact read
- `virtuous.gifts.list_by_reference` Get Gifts for a Contact by Reference ID read
- `virtuous.gifts.list_passthrough_by_contact` Get Passthrough Gifts for a Contact read
- `virtuous.gifts.non_cash_gift_types` Get Non-Cash Gift Types Available read
- `virtuous.gifts.query` Query Gifts with Abbreviated Details read
- `virtuous.gifts.query_full_gift` Query Gifts with Full Details read
- `virtuous.gifts.query_options` Get Gift Query Options read
- `virtuous.gifts.update` Update a Gift write
- `virtuous.gifts.update_many` Update many Gifts write

**Reminders 16**

- `virtuous.reminders.complete` Complete Reminder write
- `virtuous.reminders.create` Create Manual Reminder write
- `virtuous.reminders.create_milestone` Create Milestone Reminder write
- `virtuous.reminders.create_recurring` Create Recurring Reminder write
- `virtuous.reminders.dismiss` Dismiss Reminder write
- `virtuous.reminders.frequency_types` Gets Reminder Frequency Types read
- `virtuous.reminders.list_active` Get Active Reminders (for current user) read
- `virtuous.reminders.list_active_by_contact` Get Active Manual Reminders by Contact read
- `virtuous.reminders.list_inactive_by_contact` Get Inactive Manual Reminders by Contact read
- `virtuous.reminders.list_saved` Get Saved Reminders (for current user) read
- `virtuous.reminders.list_unresolved_by_contact` Get Unresolved Manual Reminders by Contact read
- `virtuous.reminders.milestone_types` Gets Milestone Types read
- `virtuous.reminders.reminder_types` Get Reminder Types read
- `virtuous.reminders.source_types` Get Reminder Source Types read
- `virtuous.reminders.update_milestone` Update Milestone Reminder write
- `virtuous.reminders.update_recurring` Update Recurring Reminder write

**Projects 12**

- `virtuous.projects.create` Create a Project write
- `virtuous.projects.custom_fields` Get Project Custom Fields Available read
- `virtuous.projects.get` Get Project read
- `virtuous.projects.get_by_code` Get a Project using a unique Code read
- `virtuous.projects.query` Query Projects read
- `virtuous.projects.query_options` Get Project Query Options read
- `virtuous.projects.search` Find Projects read
- `virtuous.projects.set_inventory_status` Temporarily Change Project Inventory Status write
- `virtuous.projects.types` Get Project Types read
- `virtuous.projects.update` Update a Project write
- `virtuous.projects.update_balance` Update Project Balance write
- `virtuous.projects.update_many` Update many Projects write

**Contact notes 11**

- `virtuous.contact_notes.create` Create a Note for a Contact write
- `virtuous.contact_notes.create_from_email` Create a Note using an Email write
- `virtuous.contact_notes.custom_fields` Gets the custom fields for contact note read
- `virtuous.contact_notes.delete` Delete a Note destructive
- `virtuous.contact_notes.get` Get a Note read
- `virtuous.contact_notes.list_by_contact` Get the Notes for a Contact read
- `virtuous.contact_notes.list_important_by_contact` Get the Important Notes for a Contact read
- `virtuous.contact_notes.query` Query Contact Notes read
- `virtuous.contact_notes.query_options` Get Contact Note Query Options read
- `virtuous.contact_notes.types` Get Contact Note Types read
- `virtuous.contact_notes.update` Update a Note write

**Individuals 11**

- `virtuous.individuals.create` Create an Individual write
- `virtuous.individuals.custom_fields` Gets the custom fields for contact individuals read
- `virtuous.individuals.delete` Delete an Individual destructive
- `virtuous.individuals.find` Find an individual by email address read
- `virtuous.individuals.get` Get an Individual read
- `virtuous.individuals.get_avatar` Gets the avatar for a specified contact individual read
- `virtuous.individuals.list_by_contact` Get Individuals for a Contact read
- `virtuous.individuals.list_email_lists` Get Email Lists for an Individual read
- `virtuous.individuals.query` Query Individuals read
- `virtuous.individuals.query_options` Get Individual Query Options read
- `virtuous.individuals.update` Update an Individual write

**Events 10**

- `virtuous.events.create` Create an Event write
- `virtuous.events.custom_fields` Get Event Custom Fields Available read
- `virtuous.events.delete` Delete an Event destructive
- `virtuous.events.find` Find an Event read
- `virtuous.events.get` Get an Event read
- `virtuous.events.list` Get Events read
- `virtuous.events.query` Query Events read
- `virtuous.events.query_options` Get Event Query Options read
- `virtuous.events.types` Get the Event Types read
- `virtuous.events.update` Update an Event write

**Grants 10**

- `virtuous.grants.create` Create a Grant write
- `virtuous.grants.custom_fields` Get Grant Custom Fields Available read
- `virtuous.grants.delete` Delete a Grant destructive
- `virtuous.grants.get` Get Grant read
- `virtuous.grants.get_by_reference` Get a Grant by Reference ID read
- `virtuous.grants.list_by_contact` Get Grants for a Contact read
- `virtuous.grants.list_gifts` Get the Gifts applied to a Grant read
- `virtuous.grants.query` Query Grants read
- `virtuous.grants.query_options` Get Grant Query Options read
- `virtuous.grants.update` Update a Grant write

**Premiums 10**

- `virtuous.premiums.create` Create a Premium write
- `virtuous.premiums.custom_fields` Get Premium Custom Fields Available read
- `virtuous.premiums.decrement_inventory` Decrement the inventory count write
- `virtuous.premiums.get` Get Premium read
- `virtuous.premiums.get_by_code` Get Premium using a unique Code read
- `virtuous.premiums.increment_inventory` Increment the inventory count write
- `virtuous.premiums.query` Query Premiums read
- `virtuous.premiums.query_options` Get Premium Query Options read
- `virtuous.premiums.search` Find Premiums read
- `virtuous.premiums.update` Update a Premium write

**Contact methods 8**

- `virtuous.contact_methods.archive` Archive a Contact Method write
- `virtuous.contact_methods.create` Create a Contact Method for an Individual write
- `virtuous.contact_methods.delete` Delete a Contact Method destructive
- `virtuous.contact_methods.get` Get a Contact Method read
- `virtuous.contact_methods.related_types` Get Contact Methods Types related to the Base Type read
- `virtuous.contact_methods.types` Get Contact Method Types read
- `virtuous.contact_methods.unarchive` Unarchive a Contact Method write
- `virtuous.contact_methods.update` Update a Contact Method write

**Event attendees 8**

- `virtuous.event_attendees.create` Create an Event Attendee write
- `virtuous.event_attendees.custom_fields` Get Event Attendee Custom Fields Available read
- `virtuous.event_attendees.delete` Delete an Event Attendee destructive
- `virtuous.event_attendees.get` Get an Event Attendee read
- `virtuous.event_attendees.list` Get Event Attendees for an Event read
- `virtuous.event_attendees.query` Query Event Attendees read
- `virtuous.event_attendees.query_options` Get Event Attendee Query Options read
- `virtuous.event_attendees.update` Update an Event Attendee write

**Gift asks 8**

- `virtuous.gift_asks.create` Create a Gift Ask write
- `virtuous.gift_asks.custom_fields` Get Gift Ask Custom Fields Available read
- `virtuous.gift_asks.get` Get a Gift Ask read
- `virtuous.gift_asks.list_by_contact` Get Gift Asks for a Contact read
- `virtuous.gift_asks.list_gifts` Get the Gifts applied to a Gift Ask read
- `virtuous.gift_asks.query` Query Gift Asks read
- `virtuous.gift_asks.query_options` Get Gift Ask Query Options read
- `virtuous.gift_asks.update` Update a Gift Ask write

**Planned gifts 8**

- `virtuous.planned_gifts.create` Create a Planned Gift write
- `virtuous.planned_gifts.custom_fields` Get Planned Gift Custom Fields Available read
- `virtuous.planned_gifts.get` Get Planned Gift read
- `virtuous.planned_gifts.list_by_contact` Get Planned Gifts for a Contact read
- `virtuous.planned_gifts.list_gifts` Get Gifts Applied to a Planned Gift read
- `virtuous.planned_gifts.query` Query Planned Gifts read
- `virtuous.planned_gifts.query_options` Get Planned Gift Query Options read
- `virtuous.planned_gifts.update` Update a Planned Gift write

**Pledges 8**

- `virtuous.pledges.create` Create a Pledge write
- `virtuous.pledges.custom_fields` Get Pledge Custom Fields Available read
- `virtuous.pledges.get` Get Pledge read
- `virtuous.pledges.list_by_contact` Get Pledges for a Contact read
- `virtuous.pledges.query` Query Pledges read
- `virtuous.pledges.query_options` Get Pledge Query Options read
- `virtuous.pledges.update` Update a Pledge write
- `virtuous.pledges.write_off` Write-off the Pledge destructive

**Recurring gifts 8**

- `virtuous.recurring_gifts.cancel` Cancel a Recurring Gift destructive
- `virtuous.recurring_gifts.create` Create a Recurring Gift write
- `virtuous.recurring_gifts.custom_fields` Get Recurring Gift Custom Fields Available read
- `virtuous.recurring_gifts.get` Get a Recurring Gift read
- `virtuous.recurring_gifts.list_by_contact` Get Recurring Gifts for a Contact read
- `virtuous.recurring_gifts.query` Query Recurring Gifts read
- `virtuous.recurring_gifts.query_options` Get Recurring Gift Query Options read
- `virtuous.recurring_gifts.update` Update a Recurring Gift write

**Volunteer opportunities 8**

- `virtuous.volunteer_opportunities.create` Create a Volunteer Opportunity write
- `virtuous.volunteer_opportunities.custom_fields` Get Custom Fields Available read
- `virtuous.volunteer_opportunities.delete` Delete a Volunteer Opportunity destructive
- `virtuous.volunteer_opportunities.get` Get Volunteer Opportunity read
- `virtuous.volunteer_opportunities.list` Get Volunteer Opportunities read
- `virtuous.volunteer_opportunities.query` Queries Volunteer Opportunities read
- `virtuous.volunteer_opportunities.query_options` Get Query Options read
- `virtuous.volunteer_opportunities.update` Update a Volunteer Opportunity write

**Communications 7**

- `virtuous.communications.channel_types` Get Channel Types read
- `virtuous.communications.communication_types` Get Communication Types read
- `virtuous.communications.create` Create Communication write
- `virtuous.communications.get` Get Communication read
- `virtuous.communications.list_by_campaign` Get Communications for a Campaign read
- `virtuous.communications.query` Query Communications read
- `virtuous.communications.query_options` Communication Query Options read

**Contact addresses 7**

- `virtuous.contact_addresses.archive` Archive a Contact Address write
- `virtuous.contact_addresses.create` Create a Contact Address write
- `virtuous.contact_addresses.delete` Delete a Contact Address destructive
- `virtuous.contact_addresses.get` Get a Contact Address read
- `virtuous.contact_addresses.list_by_contact` Get the Contact Addresses for a Contact read
- `virtuous.contact_addresses.unarchive` Unarchive a Contact Address write
- `virtuous.contact_addresses.update` Update a Contact Address write

**Project roles 7**

- `virtuous.project_roles.create` Create a Project Role write
- `virtuous.project_roles.delete` Delete a Project Role destructive
- `virtuous.project_roles.get` Get Project Role read
- `virtuous.project_roles.list_by_contact` Get Project Roles for a Contact read
- `virtuous.project_roles.list_by_project` Get Project Roles for a Project read
- `virtuous.project_roles.types` Get Project Role Types read
- `virtuous.project_roles.update` Update a Project Role write

**Volunteers 7**

- `virtuous.volunteers.create` Create a Volunteer write
- `virtuous.volunteers.delete` Delete a Volunteer destructive
- `virtuous.volunteers.get` Get Volunteer read
- `virtuous.volunteers.list` Get Volunteers for a Volunteer Opportunity read
- `virtuous.volunteers.query` Query Volunteers read
- `virtuous.volunteers.query_options` Get Query Options read
- `virtuous.volunteers.search` Search for Volunteers read

**Organization groups 6**

- `virtuous.organization_groups.add_contact` Assign a Contact to an Organization Group write
- `virtuous.organization_groups.get` Get an Organization Group read
- `virtuous.organization_groups.list` Get all Organization Groups read
- `virtuous.organization_groups.list_by_contact` Get Organization Groups for a Contact read
- `virtuous.organization_groups.list_contacts` Get the Contacts in an Organization Group read
- `virtuous.organization_groups.remove_contact` Remove a Contact from an Organization Group destructive

**Project notes 6**

- `virtuous.project_notes.create` Create a Project Note write
- `virtuous.project_notes.delete` Delete a Project Note destructive
- `virtuous.project_notes.get` Get Project Note read
- `virtuous.project_notes.list_by_project` Get Notes for a Project read
- `virtuous.project_notes.types` Get Project Note Types read
- `virtuous.project_notes.update` Update a Project Note write

**Segments 6**

- `virtuous.segments.create` Create a Segment write
- `virtuous.segments.get` Get a Segment read
- `virtuous.segments.get_by_code` Get a Segment using a unique Code read
- `virtuous.segments.list_by_contact` Get the Segments for a Contact read
- `virtuous.segments.search` Find Segments read
- `virtuous.segments.update` Update a Segment write

**Project expenses 5**

- `virtuous.project_expenses.create` Create a Project Expense write
- `virtuous.project_expenses.create_many` Create many Project Expenses write
- `virtuous.project_expenses.get` Get Project Expense read
- `virtuous.project_expenses.list` Get Project Expenses for a Project read
- `virtuous.project_expenses.update` Update a Project Expense write

**Relationships 5**

- `virtuous.relationships.create` Create a Relationship write
- `virtuous.relationships.delete` Delete a Relationship destructive
- `virtuous.relationships.list_by_contact` Get Relationships for a Contact read
- `virtuous.relationships.types` Get Relationship Types read
- `virtuous.relationships.update` Update a Relationship write

**Volunteer attendance 5**

- `virtuous.volunteer_attendance.create` Create a Volunteer Attendance write
- `virtuous.volunteer_attendance.delete` Delete a Volunteer Attendance destructive
- `virtuous.volunteer_attendance.get` Get Volunteer Attendance read
- `virtuous.volunteer_attendance.list` Get Volunteer Attendance for a Volunteer read
- `virtuous.volunteer_attendance.update` Update a Volunteer Attendance write

**Webhooks 5**

- `virtuous.webhooks.create` Create a Webhook write
- `virtuous.webhooks.delete` Delete a Webhook destructive
- `virtuous.webhooks.get` Get a Webhook read
- `virtuous.webhooks.set_active` Set the active state of a Webhook write
- `virtuous.webhooks.update` Update a Webhook write

**Campaigns 4**

- `virtuous.campaigns.get` Get Campaign read
- `virtuous.campaigns.list_steps` Gets Campaign Steps read
- `virtuous.campaigns.query` Query Campaigns read
- `virtuous.campaigns.query_options` Get Campaign Query Options read

**Contact collections 4**

- `virtuous.contact_collections.create` Create Collection for a Contact write
- `virtuous.contact_collections.delete` Delete Collection for a Contact destructive
- `virtuous.contact_collections.list_definitions` Get Custom Collections for Contacts read
- `virtuous.contact_collections.update` Update Collection for a Contact write

**Event contacts 4**

- `virtuous.event_contacts.create` Create an Event Contact write
- `virtuous.event_contacts.delete` Delete an Event Contact destructive
- `virtuous.event_contacts.get` Get an Event Contact read
- `virtuous.event_contacts.list` Get Event Contacts for an Event read

**Individual collections 4**

- `virtuous.individual_collections.create` Create Collection for an Individual write
- `virtuous.individual_collections.delete` Delete Collection for an Individual destructive
- `virtuous.individual_collections.list_definitions` Get Custom Collections for Individuals read
- `virtuous.individual_collections.update` Update Collection for an Individual write

**Tasks 4**

- `virtuous.tasks.create` Create a Task write
- `virtuous.tasks.query` Query Tasks read
- `virtuous.tasks.query_options` Get Task Query Options read
- `virtuous.tasks.types` Get Task Types read

**Volunteer organizers 4**

- `virtuous.volunteer_organizers.create` Create a Volunteer Organizer write
- `virtuous.volunteer_organizers.delete` Delete a Volunteer Organizer destructive
- `virtuous.volunteer_organizers.get` Get Volunteer Organizer read
- `virtuous.volunteer_organizers.list` Get Volunteer Organizers read

**Contact tags 3**

- `virtuous.contact_tags.create` Create a Contact Tag write
- `virtuous.contact_tags.delete` Delete a Contact Tag destructive
- `virtuous.contact_tags.list_by_contact` Get Tags for a Contact read

**Organizations 3**

- `virtuous.organizations.current` Get the Current Organization for the current user read
- `virtuous.organizations.list` Get the Organizations the current user belongs to read
- `virtuous.organizations.switch` Switch the Current Organization write

**Tributes 3**

- `virtuous.tributes.create` Create a Tribute write
- `virtuous.tributes.search` Search for Tributes read
- `virtuous.tributes.update` Update a Tribute write

**Contact receipts 2**

- `virtuous.contact_receipts.get` Get Receipt read
- `virtuous.contact_receipts.list` Receipts read

**Contact references 2**

- `virtuous.contact_references.create` Create a Contact Reference write
- `virtuous.contact_references.delete` Delete a Contact Reference destructive

**Email lists 2**

- `virtuous.email_lists.add_individuals` Add Individuals to an Email List write
- `virtuous.email_lists.search` Search for an Email List read

**Emails 2**

- `virtuous.emails.search` Get Emails read
- `virtuous.emails.send` Send an Email to a list of Contacts write

**Gift designations 2**

- `virtuous.gift_designations.query` Query Gift Designations read
- `virtuous.gift_designations.query_options` Get Gift Designation Query Options read

**Tags 2**

- `virtuous.tags.list` Get all Tags read
- `virtuous.tags.search` Find all Tags that match, fully or partially read

**Permissions 1**

- `virtuous.permissions.list` Get Permissions for the current user read

**Recurring gift payments 1**

- `virtuous.recurring_gift_payments.list` Get Payments for a Recurring Gift read

**Search 1**

- `virtuous.search.search` Search for Contacts, Individuals or Entities read

Questions

## The Virtuous CRM MCP server, answered.

**Is there a Virtuous CRM MCP server for Claude?**

Yes. actionlake is an MCP gateway: a remote MCP server that gives Claude, or another MCP client, 290 Virtuous CRM actions across contacts, gifts, reminders and projects, through the same eight tools it uses for every other connector. actionlake is independent; it is not made or endorsed by Virtuous CRM.

**What do I need to connect Virtuous CRM?**

Virtuous API key: in Virtuous, Settings > Connectivity > API Keys > Create a Key (choose a permission group). The free call account { op: "connections.requirements", service: "virtuous" } lists exactly what to paste.

**Can an AI agent delete or change things in Virtuous CRM?**

Only if its key allows it, and only with an explicit confirmation. 24 Virtuous CRM actions are destructive, including delete an Event, delete a Note and delete an Event Attendee. Each runs only with confirm: true. Under the human confirm policy, or an approval rule on the key, the run waits until a named person approves it.

**Will an AI agent use up my Virtuous CRM API limit?**

actionlake paces every call to the limits in the Virtuous CRM service file: 1,500 calls an hour per connection. Repeated reads are answered from cache (174 Virtuous CRM actions can be), which never reaches Virtuous CRM.

**What does a Virtuous CRM action cost?**

One upstream call, the only unit actionlake bills. A list that pages bills one call per page (290 Virtuous CRM actions page). Cache hits, searches, dry runs and calls Virtuous CRM refused with 401, 403, 429 or a 5xx are free. The Free plan includes 100,000 calls a month with no card. Paid plans start at US$49 a month for 250,000 calls, with overage from US$0.30 down to US$0.18 per 1,000.

**Which Virtuous CRM API does it cover?**

The Virtuous REST API (Postman reference collection, latest) at api.virtuoussoftware.com. It is built from Virtuous CRM's documentation as read on 23 October 2026. 290 actions in 45 areas, each one in the signed service file (version 1.0.0).

**Can I combine Virtuous CRM with my other systems?**

Yes. ask joins Virtuous CRM to HaloPSA or NetSuite on the same customer and returns the answer rather than every row. Virtuous CRM maps crm.contact, which 192 other connectors also map.

**Does actionlake keep my Virtuous CRM data, and where?**

actionlake processes and stores data in Sydney, Australia; there is no US region yet. Reads may be cached for up to 5 minutes, and a write clears the reads it affects. Each run's request and response is kept, sealed, for your plan's trace window: 1 day on Free, 3 days on Starter, 7 days on Pro, 14 days on Team, 30 days on Business and 30 days on Enterprise. Your Virtuous CRM credential is sealed under your tenant's key, never logged and never returned. Your traffic is not used to train models.

**Which AI clients can use it?**

Claude Code, tested by us end to end, and the Claude app as a custom connector, tested by us with an existing key. Other MCP clients that support remote servers over Streamable HTTP (MCP revisions 2025-06-18 and 2025-11-25) and OAuth dynamic client registration, or a bearer header, should connect the same way; we have not tested them. Or plain REST, under the same action names.

## More connectors like Virtuous CRM

Shares the most action names with

- [VaultRE 15](https://actionlake.com/connectors/vaultre)
- [Copper 15](https://actionlake.com/connectors/copper)
- [Reply.io 13](https://actionlake.com/connectors/reply-io)
- [AccuLynx 11](https://actionlake.com/connectors/acculynx)
- [Bonterra EveryAction / NGP VAN 11](https://actionlake.com/connectors/bonterra-everyaction-ngp-van)
- [Neon CRM 11](https://actionlake.com/connectors/neon-crm)

Joins with, on shared entities

- [Odoo 4](https://actionlake.com/connectors/odoo)
- [HaloPSA 3](https://actionlake.com/connectors/halopsa)
- [Unified.to 3](https://actionlake.com/connectors/unified-to)
- [ERPNext (Frappe) 3](https://actionlake.com/connectors/erpnext-frappe)
- [Accelo 3](https://actionlake.com/connectors/accelo)
- [ScalePad 3](https://actionlake.com/connectors/scalepad)

Browse

- [All CRM & sales connectors](https://actionlake.com/connectors/category/crm-and-sales)
- [All connectors](https://actionlake.com/connectors)
- [How actionlake compares](https://actionlake.com/compare)

actionlake is independent. It is not made or endorsed by Virtuous CRM; the name is the vendor's own. Counts are from the Virtuous CRM service file, version 1.0.0.

## Give your agent Virtuous CRM today.

[Connect Virtuous CRM free](https://actionlake.com/console?start=sandbox) [See pricing](https://actionlake.com/pricing)

Start free - 100,000 calls/month, no card. No signup. Hard caps on every key. Cached answers are free.

---

Source: https://actionlake.com/connectors/virtuous-crm
More: https://actionlake.com/llms.txt
