Dataverse MCP Server
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| LOG_LEVEL | No | Optional: Log level (debug, info, warn, error; default: info) | |
| MAX_RETRIES | No | Optional: Maximum number of retries (default: 3) | |
| DATAVERSE_URL | Yes | The URL of your Dataverse environment (e.g., https://yourorg.crm.dynamics.com) | |
| AZURE_CLIENT_ID | No | Optional: Your own Azure App Registration client ID | |
| AZURE_TENANT_ID | No | Optional: Your Azure AD tenant ID | |
| TOKEN_CACHE_PATH | No | Optional: Path to token cache file (default: ./.token-cache.json) | |
| REQUEST_TIMEOUT_MS | No | Optional: HTTP request timeout in milliseconds (default: 30000) | |
| METADATA_CACHE_TTL_MS | No | Optional: Metadata cache TTL in milliseconds (default: 300000) |
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 | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| whoamiA | Show the currently signed-in Microsoft account. Use this to verify authentication status before running Dataverse operations. |
| sign_outA | Sign out and clear the cached Microsoft credentials. The next Dataverse operation will trigger a fresh login. |
| get_recordA | Fetch a single Dataverse record by its GUID. Use 'select' to limit returned fields and 'expand' to include related records. |
| query_recordsA | Query records from a Dataverse table using OData. Supports $filter, $select, $orderby, $top, $expand, and pagination. When the result has hasNextPage=true, pass the returned nextLink to fetch subsequent pages. |
| execute_fetchxmlA | Execute a FetchXML query against Dataverse. FetchXML supports aggregate functions, linked entities, and grouping that cannot be expressed in OData. Use this for complex reporting or analytical queries. |
| create_recordA | Create a single record in a Dataverse table. Returns the new record's GUID. Use describe_table first to discover correct field names and types. |
| update_recordA | Update specific fields on an existing Dataverse record (PATCH semantics — only provided fields are changed). Fails with an error if the record does not exist. |
| upsert_recordA | Create or update a Dataverse record with a known GUID (PUT semantics). Use mode='createOrUpdate' to create if not exists, update if exists. 'createOnly' fails if the record exists. 'updateOnly' fails if it does not exist. |
| delete_recordA | Delete a single Dataverse record by its GUID. This is irreversible. |
| associate_recordsA | Create a relationship link between two Dataverse records via a navigation property. Use isSingleValued=true for lookup (N:1) properties; false for collection (1:N) navigation. |
| disassociate_recordsA | Remove a relationship link between two Dataverse records. For collection navigation properties, provide relatedRecordId to remove a specific link. For single-valued (lookup) navigation, omit relatedRecordId. |
| bulk_create_recordsA | Create multiple records in a single OData $batch operation. Up to 1000 records per call (processed in chunks of 100). Tracks per-record success/failure — partial success is supported. |
| bulk_update_recordsA | Update multiple records in a single OData $batch operation. Up to 1000 records per call (processed in chunks of 100). Each item requires a recordId and a data object (PATCH semantics — only provided fields change). Tracks per-record success/failure — partial success is supported. |
| bulk_delete_recordsA | Delete multiple records in a single OData $batch operation. Up to 1000 GUIDs per call. Tracks per-record success/failure — partial success is supported. |
| batch_transactionA | Execute multiple Dataverse write operations atomically in a single batch. If ANY operation fails, ALL are rolled back — all-or-nothing semantics. Supports mixed operations: create, update, delete, upsert across different tables. |
| execute_actionA | Execute a Dataverse unbound or bound action. Examples: WinOpportunity, SendEmail, custom workflow actions. For bound actions, provide boundTableName and boundRecordId. |
| describe_tableA | Fetch the full metadata schema for a Dataverse table: all columns (names, types, required level, create/update validity), plus all 1:N, N:1, and N:N relationships. ALWAYS call this before creating or updating records to discover correct field names and types. For Lookup fields, the response includes 'targets' (the entity the lookup points to) — use the target's entitySetName with @odata.bind syntax to set the value: { "fieldname@odata.bind": "/entitysetname(guid)" }. Results are cached for 5 minutes. |
| list_tablesA | List all available Dataverse tables (entities). Use customOnly=true to see only custom tables. Use nameContains to search by name substring. Results are cached for 5 minutes. |
| get_option_set_valuesA | Fetch all option values (integer code + label) for a Dataverse choice column or global option set. Use tableName + attributeName for a local choice/picklist/status/state column. Use optionSetName for a global option set shared across tables. Returns every option with its numeric value and display label — use these values when filtering or writing records. |
| refresh_metadata_cacheA | Invalidate cached table metadata so the next call to describe_table or list_tables fetches fresh data. Use this after schema changes (new fields, new relationships) in your Dataverse environment. |
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/LosslessFunction/dataverse-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server