xrm-mcp
This MCP server provides AI agents with read and write access to Microsoft Dataverse/XRM environments via the Dataverse Web API v9.2, without requiring Microsoft admin setup, Managed Environments, or Copilot Credits.
Read Operations
ping— Test connectivity and verify authentication; returns user/org identity and auth methodfind_table— Search for a table by display name or partial logical namelist_tables— List Dataverse tables with filters for custom entities, publisher prefix, and Microsoft-prefixed tablesdescribe_table— Retrieve column names, data types, and descriptions for a specific tablequery_records— Query records using OData$filter,$select,$orderby, with a cap of 5,000 records
Write Operations
create_record— Create a new record in a specified tableupdate_record— Update specific fields on an existing record by GUIDupsert_record— Create or update a record using an alternate key (ideal for sync/import scenarios)
Key Highlights
Supports Azure CLI auth with automatic fallback to interactive MSAL device flow
Works across multiple Dataverse tenants in a single session with per-environment identity caching
The target
org_urlis passed per tool call, enabling dynamic multi-environment interaction
Provides read and write access to Microsoft Dataverse environments, enabling GitHub Copilot to query tables, describe schemas, and create, update, or upsert records via the Dataverse Web API.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@xrm-mcpShow me all contacts from myorg.crm4.dynamics.com created this week"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
xrm-mcp
A minimal MCP server that gives AI coding agents (Claude Code, GitHub Copilot, Codex CLI, Cursor, Gemini CLI) clean read + careful write access to Microsoft Dataverse / XRM environments via the Dataverse Web API v9.2.
Why this exists: Microsoft ships its own Dataverse MCP server, but it requires Power Platform admin setup, Managed Environments, and Copilot Credits per call.
xrm-mcpis a drop-in alternative that works with any Dataverse environment using your existing Azure CLI or Microsoft account. Read more →
Features
No Microsoft MCP billing — calls the Dataverse Web API directly, no Copilot Credits consumed
No admin toggles — works with any Dataverse environment you can log into
No Managed Environment required — standard environments work fine
No per-environment setup — org_url is a parameter on every tool call
Multi-tenant by design — connect to multiple orgs in the same session, with per-environment identity caching so switching between tenants doesn't require re-authenticating each time
Azure CLI + MSAL auth — tries
azfirst, falls back to interactive device flow8 MCP tools — ping, find/list tables, describe schema, query, create, update, upsert
Related MCP server: dataverse-mcp-server
Installation
Install via pipx (recommended):
pipx install git+https://github.com/jukkan/xrm-mcp.gitOr via pip:
pip install git+https://github.com/jukkan/xrm-mcp.gitUsage
Configuring your AI agent
Add xrm-mcp to your agent's MCP configuration.
Claude Desktop / Claude Code (~/.claude/claude_desktop_config.json or .mcp.json):
{
"mcpServers": {
"xrm-mcp": {
"command": "xrm-mcp"
}
}
}GitHub Copilot (VS Code) — add to .vscode/mcp.json in your workspace:
{
"servers": {
"xrm-mcp": {
"type": "stdio",
"command": "xrm-mcp"
}
}
}Once configured, pass your environment URL with every request and the agent takes it from there:
"Show me all project records from https://myorg.crm4.dynamics.com created in the last 30 days"
Running the server manually
xrm-mcpThe server uses FastMCP and communicates over stdin/stdout (stdio transport).
Authentication
XRM MCP attempts authentication in the following order:
Azure CLI — if
azis available and logged inMSAL device flow — interactive browser-based login
Tokens are cached at ~/.xrm-mcp/cache.json.
If you work across multiple tenants (e.g. your own production environment, demo
environments, and customer tenants), XRM MCP remembers which identity last
worked for each org_url in ~/.xrm-mcp/identity_cache.json and prefers it on
the next call — so switching tenants doesn't depend on which az account
happens to be active. If a call gets a 401/403, that org's cached identity
is cleared automatically and the error message tells you to just retry, which
re-discovers a working identity.
To re-authenticate, delete ~/.xrm-mcp/cache.json or use az login. To reset
which identity is used for a specific org, delete its entry from
~/.xrm-mcp/identity_cache.json.
Testing authentication manually
python -m xrm_mcp.auth https://yourorg.crm4.dynamics.comMCP Tools
Read Tools
ping(org_url)
Verify connectivity and authentication to a Dataverse environment
Returns: status, org_url, user_id, business_unit_id, org_id, auth_method, tenant_id
Call this first when connecting to a new environment;
auth_method/tenant_idlet you confirm which identity answered the call
find_table(org_url, name)
Search for a table by display name or partial logical name
Use when the user says "hour entries" and you need the exact logical name
Returns all matching tables sorted by exact display name match first
list_tables(org_url, search="", custom_only=True, prefix="", exclude_ms_prefixes=True)
List Dataverse tables, defaulting to custom entities only
custom_only=True— only return custom entities (default)prefix="na_"— filter to a specific publisher prefixexclude_ms_prefixes=False— include Microsoft solution tables (msdyn_, adx_, etc.)Returns: logical_name, display_name, entity_set_name, is_custom, description
describe_table(org_url, table)
Get columns, types and descriptions for a Dataverse table
Call this before querying when you need exact column names for $select or $filter
Returns: table_name, columns with metadata
query_records(org_url, table, select="", filter="", top=100, orderby="")
Query records from a table using OData filter syntax
Returns: {count, records}
Top is capped at 5000
selectis validated against real column names before querying; an invalid column raises a clear error naming it, instead of silently returning every column
Write Tools
create_record(org_url, table, data)
Create a single record
Returns: {id}
update_record(org_url, table, record_id, data)
Update specific fields on an existing record
Returns: {success, id}
upsert_record(org_url, table, alternate_key, alternate_value, data)
Create or update a record using an alternate key (for sync/import scenarios)
Returns: {success, alternate_key, alternate_value}
Example Usage
See CLAUDE.md for detailed agent usage examples and WHY.md for how this compares to Microsoft's own Dataverse MCP server.
Requirements
Python 3.10+
Azure CLI (optional, for
azauthentication)Access to a Dataverse / Dynamics 365 environment
Dependencies
fastmcp >= 0.1.0, < 3
msal >= 1.28.0
httpx >= 0.27.0
Development
Clone the repository:
git clone https://github.com/jukkan/xrm-mcp.git
cd xrm-mcpInstall in development mode:
pip install -e .License
MIT
Contributing
Contributions welcome! Please open an issue or pull request.
Available Tools
8 toolscreate_recordC
Create a single record in an XRM table.
| Name | Required | Description | Default |
|---|---|---|---|
| data | Yes | Dictionary of logical column names to values | |
| table | Yes | The logical name of the table | |
| org_url | Yes | The Dataverse organization URL |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full burden but only states 'create a single record'. It omits details on behavior on conflicts, error handling, authentication needs, rate limits, or side effects. The output schema exists but is not described here, so transparency is minimal.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence of 10 words with no superfluous content. It is highly concise.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given that this is a mutation tool with 3 required parameters and an output schema (not shown), the description lacks details on return values, error states, data format requirements, and validation rules. It feels incomplete for an agent to use correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 100% description coverage for all parameters, so the description does not need to add more. The baseline score of 3 is appropriate as the description adds no further semantic value beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'create' and the resource 'record in an XRM table'. It is specific enough to distinguish from sibling tools like 'update_record' and 'upsert_record', though it does not explicitly differentiate them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives (e.g., 'upsert_record' for creation or update). There is no mention of prerequisites, when not to use, or context for its usage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
describe_tableA
Get columns, types and descriptions for an XRM table.
Call this before querying when you need to know column names for $select or $filter.
| Name | Required | Description | Default |
|---|---|---|---|
| table | Yes | The logical name of the table (e.g., account, cr123_hourentry) | |
| org_url | Yes | The Dataverse organization URL |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It correctly implies a read-only operation ('Get columns, types and descriptions'). However, it does not disclose potential side effects, rate limits, or authorization requirements. The output schema exists, which helps, but more behavioral detail would be beneficial.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description consists of two concise sentences. It is front-loaded with the primary action and provides usage guidance in the second sentence. No wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's low complexity (2 parameters, both well-documented) and the presence of an output schema, the description is sufficiently complete. It adds usage context beyond the schema, making it effective for an AI agent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description adds an example for the 'table' parameter ('e.g., account, cr123_hourentry') and implies the purpose of parameters through context. It does not add extensive meaning beyond the schema but is adequate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states 'Get columns, types and descriptions for an XRM table.' This is a specific verb+resource, and it clearly distinguishes from sibling tools like list_tables (which lists table names) and find_table (which searches for tables).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly advises when to use this tool: 'Call this before querying when you need to know column names for $select or $filter.' It provides clear context for usage, though it does not mention when not to use it or name alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_tableA
Search for a table by display name or partial logical name.
Use this when the user gives a friendly name like 'hour entry' or 'hours' and you don't know the exact logical name. Returns all candidate matches from this specific environment — do not use workspace files or project notes to infer table names.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | The search term (display name or partial logical name) | |
| org_url | Yes | The Dataverse organization URL |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full burden. It states 'Returns all candidate matches from this specific environment', implying a read-only search. Could be more explicit about no side effects, but adequate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with purpose, no wasted words. Every sentence adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description sufficiently covers purpose and usage context given the simple parameter set and presence of an output schema. No missing information.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline 3. The description does not add any additional information about the parameters beyond what the schema already provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb 'search' and resource 'table', with clear scope ('by display name or partial logical name'). It differentiates from siblings like list_tables and describe_table by specifying the lookup method.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit when-to-use with examples ('hour entry', 'hours') and a negative directive ('do not use workspace files or project notes'), which clearly guides the agent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_tablesA
Lists Dataverse tables. Defaults to custom tables only, excluding Microsoft-prefixed solution tables (msdyn_, msfp_, adx_ etc).
Use prefix='na_' to filter to a specific publisher. Use exclude_ms_prefixes=False to see all custom tables.
| Name | Required | Description | Default |
|---|---|---|---|
| prefix | No | Optional prefix to filter logical names (e.g., "cr123_") | |
| search | No | Optional search term to filter tables | |
| org_url | Yes | The Dataverse organization URL (e.g., https://yourorg.crm4.dynamics.com) | |
| custom_only | No | If True, only return custom entities (default: True) | |
| exclude_ms_prefixes | No | If True, exclude Microsoft-prefixed solution tables (default: True) |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description carries the full burden. It clearly discloses default filtering behaviors (custom only, excluding Microsoft prefixes) and how to modify them. No destructive or authentication details are needed for a read-only list operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two highly informative sentences with no filler. The default behavior is stated first, followed by two specific usage hints. Every sentence adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 5 parameters and an output schema, the description covers defaults and filtering options adequately. It could mention pagination or rate limits, but this is not critical for a read-only list tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, providing baseline 3. The description adds meaning beyond the schema with concrete examples like 'na_' for prefix and mentions specific prefixes (msdyn_, msfp_, adx_). This helps agents understand usage beyond parameter types.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states the tool 'Lists Dataverse tables' with specific defaults (custom tables only, excluding Microsoft prefixes). It clearly identifies the resource and action, distinguishing from siblings like 'find_table' which searches for a specific table.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides guidance on using prefix filtering ('Use prefix='na_' to filter') and the exclude_ms_prefixes parameter ('Use exclude_ms_prefixes=False to see all custom tables'). However, it does not explicitly compare to alternatives like 'find_table' or 'describe_table' for related use cases.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pingA
Test connectivity to an XRM/Dataverse environment and verify authentication.
Call this first to verify your setup and connection to the Dataverse environment.
| Name | Required | Description | Default |
|---|---|---|---|
| org_url | Yes | The Dataverse organization URL (e.g., https://yourorg.crm4.dynamics.com) |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full burden. It indicates the tool tests connectivity and authentication, implying no destructive side effects. The output schema (context: has output schema) likely details the response, so the description is sufficient.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences with no wasted words. The key purpose and usage advice are front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the simple single-parameter tool with output schema available, the description fully captures the tool's purpose and recommendation. No additional information is needed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 100% coverage with a description for 'org_url'. The tool description does not add new semantic info beyond what the schema already provides, so baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Test connectivity to an XRM/Dataverse environment and verify authentication,' which is a specific verb+resource. It distinguishes from sibling tools (data manipulation or metadata queries) by focusing on connectivity testing.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description says 'Call this first to verify your setup,' providing explicit usage context. However, it does not mention when not to use it or alternatives, though its purpose is naturally limited.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
query_recordsA
Query records from an XRM/Dataverse table.
| Name | Required | Description | Default |
|---|---|---|---|
| top | No | Maximum records to return (hard cap 5000) | |
| table | Yes | The logical name (e.g., account, cr123_hourentry) | |
| filter | No | OData $filter expression | |
| select | No | Comma-separated column names to retrieve | |
| orderby | No | OData $orderby expression | |
| org_url | Yes | The Dataverse organization URL |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, and the description lacks any behavioral details such as authentication requirements, rate limits, pagination behavior, or error handling. It does not add value beyond the input schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence with no waste. It front-loads the key action and resource, making it efficient for an AI agent to parse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given that the tool has an output schema and all parameters are documented, the description is minimally adequate. However, it lacks context about typical usage patterns, such as how to construct OData filter expressions or handle pagination beyond the top parameter.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, meaning all parameters are described in the schema. The description does not add any additional meaning beyond what is already in the schema, resulting in a baseline score of 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action (query) and resource (records from a table). It distinguishes itself from sibling tools like create_record, update_record, upsert_record (mutations) and describe_table, find_table, list_tables (metadata).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for retrieving data, but does not explicitly state when not to use it or provide alternatives. However, the context of sibling tools makes it clear that this is for reading records.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_recordB
Update fields on a single existing XRM record.
| Name | Required | Description | Default |
|---|---|---|---|
| data | Yes | Dictionary of fields to change (only the fields to update) | |
| table | Yes | The logical name of the table | |
| org_url | Yes | The Dataverse organization URL | |
| record_id | Yes | The GUID of the record to update |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, and the description does not disclose behavioral traits such as whether the tool performs a partial update, overwrites all fields, or returns the updated record. This is insufficient for a mutation tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, concise sentence that efficiently conveys the tool's purpose without any wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the presence of an output schema and clear parameter descriptions in the schema, the description provides adequate but minimal context. However, it lacks behavioral details and usage context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the input schema already describes each parameter. The description adds no extra meaning beyond the schema, meeting the baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'Update' and the resource 'fields on a single existing XRM record', distinguishing it from sibling tools like create_record, upsert_record, and query_records.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit guidance on when to use this tool versus alternatives like create_record or upsert_record. The description does not mention preconditions or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
upsert_recordA
Create or update a record matched by an alternate key column.
Use this for sync/import scenarios where you don't have the record GUID.
| Name | Required | Description | Default |
|---|---|---|---|
| data | Yes | Dictionary of fields to set | |
| table | Yes | The logical name of the table | |
| org_url | Yes | The Dataverse organization URL | |
| alternate_key | Yes | The logical name of the alternate key column | |
| alternate_value | Yes | The value to match |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It discloses that the tool creates or updates a record (a mutation), but does not mention potential side effects, return behavior, or conflict resolution. This is adequate but leaves some uncertainty.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description consists of two concise sentences. The first sentence immediately states the purpose, and the second provides usage guidance. No extraneous words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (5 required params, nested objects, output schema present), the description is lean but functional. It covers the core purpose and usage context. However, it could be improved by noting that this is a mutation and what happens on conflict or missing data.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description adds contextual value by mentioning 'sync/import scenarios', but it does not provide additional semantics for individual parameters beyond what the schema already describes.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'Create or update' and the resource 'record', and specifies the method 'matched by an alternate key column'. This distinguishes it from sibling tools like create_record and update_record, which operate on GUIDs.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says 'Use this for sync/import scenarios where you don't have the record GUID', providing clear guidance on when to use this tool versus alternatives that require a GUID.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
8 tool updates
v0.1.1- First observed
create_record - First observed
describe_table - First observed
find_table - First observed
list_tables - First observed
ping - First observed
query_records - First observed
update_record - First observed
upsert_record
TDQS
Scored across 8 tools
Each tool targets a distinct operation (CRUD, metadata queries, connectivity test) with no functional overlap, making it easy for an agent to select the correct one.
Most tools follow a clear verb_noun pattern (create_record, query_records, etc.), but ping uses a single verb, which is a minor inconsistency.
The tool count of 8 is well-scoped for a Dataverse MCP server, covering essential operations without unnecessary bloat.
The tool set covers creation, update, query, and metadata, but lacks a delete_record tool and a direct get-by-ID tool, which may cause agent failures in typical workflows.
Maintenance
Related MCP Connectors
MCP server that lets AI assistants use all OneSchema features exposed via the public API.
MCP server for secureFlows: token-free URL builders and integration-linting tools for AI agents.
Hosted MCP server for AI-driven data ops. Create apps, manage schemas, and CRUD structured data.
MCP server for AI agents to plan, verify, and deploy Cloudflare-native apps.
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceThe most complete MCP server for Microsoft Dataverse.17714MIT
- AlicenseAqualityAmaintenanceMCP server for Microsoft Dataverse API with safe-by-default configuration. Works with any Dataverse / Dynamics 365 environment.23247MIT
- AlicenseNot gradedqualityCmaintenanceA self-hosted MCP server that enables AI assistants to inspect and manage Microsoft Power Automate cloud flows and Dataverse records locally, using your own Azure identity.MIT
- FlicenseNot gradedqualityCmaintenanceAn MCP server for OData v4 endpoints, especially Microsoft Dataverse/Dynamics 365, enabling authentication, schema discovery, querying, CRUD, and more via natural language.-