dataverse-mcp-server
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| DATAVERSE_CLIENT_ID | Yes | Your app registration client ID | |
| DATAVERSE_TENANT_ID | Yes | Your Azure tenant ID | |
| DATAVERSE_ALLOW_DELETE | No | Optional flag to enable delete operations (set to 'true' to enable) | |
| DATAVERSE_RESOURCE_URL | Yes | Your Dataverse environment URL (e.g., https://your-org.crm.dynamics.com) | |
| DATAVERSE_CLIENT_SECRET | Yes | Your client secret | |
| DATAVERSE_ENTITY_PREFIX | No | Optional default prefix filter for list_entities | |
| DATAVERSE_SOLUTION_NAME | No | Optional default solution unique name for list_entities |
Capabilities
Features and capabilities supported by this server
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| list_entitiesA | List Dataverse tables (entities) with optional prefix and solution filters |
| list_solutionsB | List Dataverse solutions (uniquename is used to filter list_entities) |
| get_entity_schemaB | Get attributes (columns) of a specific Dataverse table |
| query_recordsB | Query records from a Dataverse table with OData filters |
| get_recordA | Get a single record by ID from a Dataverse table |
| create_recordB | Create a new record in a Dataverse table |
| update_recordC | Update an existing record in a Dataverse table |
| delete_recordB | Delete a record from a Dataverse table (currently disabled) |
| create_entityC | Create a new Dataverse table (entity) with specified attributes |
| add_attributeB | Add a column (attribute) to an existing Dataverse table |
| create_relationshipC | Create a relationship between two Dataverse tables |
| update_attributeA | Update metadata of an existing column (display name, description, required level, max length, min/max value, precision). The column's type and logical name CANNOT be changed by Dataverse — for those, create a new column, migrate data, then delete the old one. |
| delete_attributeA | Delete a column from a Dataverse table (currently disabled for safety) |
| get_attribute_dependenciesA | List CRM components (forms, views, workflows, business rules, calculated columns, plugins, …) that reference a given attribute. Use this when delete_attribute fails with error 0x8004f01f, or proactively before any destructive change. Returns a flat array of { component_type, component_type_name, object_id, name }; name is best-effort (resolved for common types — SystemForm, SavedQuery, Workflow, Report, WebResource, FieldSecurityProfile, AppModule, SDKMessageProcessingStep — null otherwise). Backed by the Dataverse RetrieveDependenciesForDelete function. |
| list_entity_keysA | List alternate keys defined on a Dataverse table. Returns a flat array of { logical_name, schema_name, display_name, key_attributes, entity_key_index_status, metadata_id }. entity_key_index_status reflects the background index build (Pending → Active, or Failed) — alt keys are not usable for keyed-PATCH upserts until Active. |
| add_entity_keyA | Create an alternate key on a Dataverse table (composite supported via key_attributes). Use for race-safe upserts via keyed-PATCH or to enforce a uniqueness constraint that the primary key doesn't cover. NOTE: Dataverse builds the supporting unique index asynchronously — the key is not usable for keyed lookups until its EntityKeyIndexStatus becomes 'Active'. Poll with list_entity_keys. |
| delete_entity_keyA | Delete an alternate key from a Dataverse table (currently disabled for safety) |
| add_picklist_optionA | Add an option to an existing Local or Global OptionSet (Dataverse InsertOptionValue action). Requires Customizer or System Administrator role; HTTP 403 otherwise. |
| update_picklist_optionA | Update an existing option's label/description on a Local or Global OptionSet (Dataverse UpdateOptionValue action). Requires Customizer or System Administrator role. |
| delete_picklist_optionA | Remove an option from a Local or Global OptionSet (currently disabled for safety) |
| get_picklist_optionsA | Read options of a Local or Global OptionSet as a flat [{ value, label }] list. |
| invoke_actionA | Invoke a Dataverse Web API action (POST) — bound or unbound. Use for operations that are not plain CRUD, e.g. PublishDuplicateRule (bound to a duplicaterule) or QualifyLead (bound to a lead), or UnpublishDuplicateRule (unbound, takes DuplicateRuleId). Whether an action is bound is defined in the Web API $metadata. Pass entity_set+id for bound actions, neither for unbound. parameters becomes the JSON request body. |
| invoke_functionA | Invoke a Dataverse Web API function (GET) — bound or unbound. Use for read-only operations exposed as functions, e.g. WhoAmI (unbound) or RetrieveDuplicates. Pass entity_set+id for bound functions, neither for unbound. parameters are inlined into the URL as OData function arguments. |
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/rededis/dataverse-mcp-server'
If you have feedback or need assistance with the MCP directory API, please join our Discord server