civicrm-mcp
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| CIVICRM_CMS | Yes | The CMS type (drupal, wordpress, standalone, backdrop). | |
| CIVICRM_API_KEY | Yes | The API key for the bot contact. | |
| CIVICRM_BASE_URL | Yes | The base URL of your CiviCRM installation. | |
| CIVICRM_SITE_KEY | No | The site key if the site-key guard is enabled. | |
| CIVICRM_AUTH_MODE | No | Authentication mode: authx or legacy. | |
| CIVICRM_ALLOW_WRITES | No | Enable write tools. | false |
| CIVICRM_ALLOW_DELETES | No | Enable delete tools. | false |
| CIVICRM_TOOLS_ENABLED | No | Comma-separated allowlist of tool names; empty = all. | |
| CIVICRM_TOOLS_DISABLED | No | Comma-separated denylist of tool names; wins over enabled. | |
| CIVICRM_DRY_RUN_DEFAULT | No | Set to true to make every write/delete a dry-run. | false |
| CIVICRM_ALLOW_GENERIC_API | No | Enable generic API passthrough. | false |
Capabilities
Features and capabilities supported by this server
| Capability | Details |
|---|---|
| tools | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| civicrm_system_infoA | Connectivity sanity check — returns CiviCRM version (via Domain entity), the authenticated bot contact, and a count of installed extensions. Run first when debugging auth or URL setup. |
| civicrm_whoamiA | Resolves the authenticated bot contact and probes which CiviCRM entities it can read. Use this first when setting up the server — it surfaces the most common misconfigurations (wrong API key, missing 'authenticate with api key' permission, bot contact lacks 'access CiviCRM'). Does not probe writes. |
| civicrm_find_contactsA | Search CiviCRM contacts by name or primary email. Returns id, display name, type, primary email and phone. |
| civicrm_get_contactA | Fetch a single CiviCRM contact by id. Returns core profile plus primary email/phone/address; pass |
| civicrm_get_relationshipsA | List relationships (family, employer, membership, custom types) for a contact. Resolves the other party's display name and direction automatically. |
| civicrm_get_contributionsA | List contributions (donations, dues, event fees) with optional filters by contact, date window, status, and financial type. Resolves donor display name and human-readable status labels. |
| civicrm_list_eventsA | List CiviEvent events. Defaults to upcoming only. Returns id, title, type, dates, public/online flags. |
| civicrm_list_saved_searchesA | List SavedSearch records (the SearchKit queries an admin has built in the UI). Use this to discover what's available to run via civicrm_run_saved_search. |
| civicrm_run_saved_searchA | Execute a SavedSearch and return its rows via SearchDisplay.run. Pair with civicrm_list_saved_searches to discover available searches. This is the safest and cheapest way to run complex queries — the admin curates the query in the UI, the agent just calls it by name. |
| civicrm_list_entitiesA | List all CiviCRM APIv4 entities available on this install (including those added by extensions). Optional substring filter. |
| civicrm_describe_entityA | Introspect an APIv4 entity — returns available fields (incl. custom fields) and actions. Call this before civicrm_api4 when unsure of field names or action support. |
| civicrm_describe_field_optionsA | Return the option list (pseudoconstant values) for a single field on an entity. Far cheaper than civicrm_describe_entity when you only need to know the valid values for one enum-like field — e.g. 'what are the legal activity_type values'. |
| civicrm_create_contactB | Create a new CiviCRM contact. Chains email and phone creation when provided. Requires CIVICRM_ALLOW_WRITES=true. |
| civicrm_update_contactA | Update fields on a single CiviCRM contact by id. Requires CIVICRM_ALLOW_WRITES=true. |
| civicrm_log_activityB | Record an Activity against a target contact. Requires CIVICRM_ALLOW_WRITES=true. |
| civicrm_record_contributionB | Record a donation / contribution for a contact. Requires CIVICRM_ALLOW_WRITES=true. |
| civicrm_add_to_groupA | Add a contact to a group (GroupContact status='Added'). Idempotent — updates an existing row rather than creating duplicates. Requires CIVICRM_ALLOW_WRITES=true. |
| civicrm_remove_from_groupA | Mark a contact as Removed from a group (GroupContact status='Removed'). Preserves history — does not hard-delete. Requires CIVICRM_ALLOW_WRITES=true. |
| civicrm_register_for_eventA | Create a Participant record registering a contact for an event. Requires CIVICRM_ALLOW_WRITES=true. |
| civicrm_create_membershipA | Create a Membership record for a contact. CiviCRM will auto-calculate start/end dates from the membership type's duration if omitted. Requires CIVICRM_ALLOW_WRITES=true. |
| civicrm_add_noteA | Attach a free-text Note to a contact, contribution, activity, case, or relationship. Requires CIVICRM_ALLOW_WRITES=true. Notes are the right place for unstructured context that doesn't belong in a custom field. |
| civicrm_tag_contactsA | Add a tag to one or more contacts in a single call. Idempotent — re-tagging an already-tagged contact is a no-op. Requires CIVICRM_ALLOW_WRITES=true. |
| civicrm_untag_contactsA | Remove a tag from one or more contacts in a single call. Requires CIVICRM_ALLOW_WRITES=true AND CIVICRM_ALLOW_DELETES=true (EntityTag rows are hard-deleted). |
| civicrm_send_contribution_receiptA | Send (or re-send) the standard receipt email for a contribution. Wraps Contribution.sendconfirmation. Requires CIVICRM_ALLOW_WRITES=true because the call triggers an outbound email. |
| civicrm_api4A | Generic APIv4 call. Accepts entity + action + params. Disabled unless CIVICRM_ALLOW_GENERIC_API=true; writes additionally need CIVICRM_ALLOW_WRITES and deletes need CIVICRM_ALLOW_DELETES. Use civicrm_describe_entity first if unsure of field names. |
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/YogiAdhik/civicrm-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server