🚀 DataverseDevTools MCP Server
DataverseDevTools MCP Server 是一个模型上下文协议(MCP)服务器,它提供了可直接使用的 Dataverse 工具,用于用户和安全管理、数据操作、元数据探索以及故障排除。作为 Dynamics 365/Dataverse 开发人员,你无需切换到 XrmToolBox、make.powerapps.com 或 admin.powerplatform.com 来执行常见任务,可直接在 Visual Studio/VS Code 或任何支持 MCP 的客户端中运行这些任务。
🚀 快速开始
🔍 前提条件
- .NET 8.0 SDK 或更高版本
- Dataverse 环境 URL(例如,https://org.crm.dynamics.com)
- 在 Dataverse 中执行请求操作的权限
- 若要获取插件跟踪日志,请确保在环境中启用了插件跟踪日志
📦 安装为全局 .NET 工具
dotnet tool install --global vignaesh01.dataversedevtoolsmcpserver
注意:可执行命令名称是与包一起发布的工具命令。如果不确定,请使用 dotnet tool list -g 进行检查。
💻 在 MCP 客户端中进行设置
你可以从喜欢的支持 MCP 的客户端使用该服务器。以下是在 Windows 系统上为 VS Code、Visual Studio 和 Claude 进行快速设置的说明。
VS Code(GitHub Copilot Chat)
前提条件:
- 最新版本的 VS Code
- 已安装 GitHub Copilot 和 GitHub Copilot Chat 扩展
带截图的详细步骤说明:
请访问:在 VS Code 中进行设置
mcp.json - 使用全局工具(推荐)
{
"servers": {
"dvmcp": {
"type": "stdio",
"command": "dataversedevtoolsmcpserver",
"args": [
"--environmentUrl",
"https://yourorg.crm.dynamics.com"
]
}
}
}
mcp.json - 使用客户端凭证身份验证(服务主体)
对于自动化场景或无法进行交互式登录的情况,你可以使用 Azure AD 应用程序进行客户端凭证身份验证:
{
"servers": {
"dvmcp": {
"type": "stdio",
"command": "dataversedevtoolsmcpserver",
"args": [
"--environmentUrl",
"https://yourorg.crm.dynamics.com",
"--tenantId",
"your-tenant-id",
"--clientId",
"your-client-id",
"--clientSecret",
"your-client-secret"
]
}
}
}
注意:要使用客户端凭证身份验证,你需要:
- 在 Azure Active Directory 中注册一个应用程序。
- 为该应用程序创建一个客户端密钥。
- 在 Dataverse 中添加具有适当安全角色的应用程序用户。
- 在配置中使用租户 ID、客户端 ID(应用程序 ID)和客户端密钥。
mcp.json - 适用于位于代理后面的企业网络
根据需要使用经过身份验证/未经过身份验证的代理地址:
{
"servers": {
"dvmcp": {
"type": "stdio",
"command": "dataversedevtoolsmcpserver",
"args": [
"--environmentUrl",
"https://yourorg.crm.dynamics.com"
],
"env":{
"HTTP_PROXY": "http://<username@domain.com>:<password>@<proxy.domain.com>:8080",
"HTTPS_PROXY": "http://<username@domain.com>:<password>@<proxy.domain.com>:8080"
}
}
}
}
如果你克隆了 GitHub 仓库(适用于探索者)的示例 mcp.json
{
"servers": {
"dvmcp": {
"type": "stdio",
"command": "dotnet",
"args": [
"run",
"--project",
"C:/Projects/DataverseDevToolsMcpServer/DataverseDevToolsMcpServer/DataverseDevToolsMcpServer.csproj",
"--environmentUrl",
"https://yourorg.crm.dynamics.com"
]
}
}
}
带有客户端凭证的示例 mcp.json(适用于使用克隆仓库的探索者)
{
"servers": {
"dvmcp": {
"type": "stdio",
"command": "dotnet",
"args": [
"run",
"--project",
"C:/Projects/DataverseDevToolsMcpServer/DataverseDevToolsMcpServer/DataverseDevToolsMcpServer.csproj",
"--environmentUrl",
"https://yourorg.crm.dynamics.com",
"--tenantId",
"your-tenant-id",
"--clientId",
"your-client-id",
"--clientSecret",
"your-client-secret"
]
}
}
}
- 启动 MCP 服务器。
使用方法:在代理模式下打开 Copilot Chat 并请求使用 Dataverse 工具或 dvmcp 工具,客户端将自动发现服务器。
Visual Studio(GitHub Copilot Chat)
前提条件:
- Visual Studio 2022 17.10 或更高版本
- 已安装 GitHub Copilot 和 Copilot Chat
- 如果你的 VS 版本需要,需启用 MCP 功能(预览/实验性)
- 参考:https://learn.microsoft.com/en-us/visualstudio/ide/mcp-servers?view=vs-2022#configuration-example-with-a-github-mcp-server
带截图的详细步骤说明:
请访问:在 Visual Studio 中进行设置
Claude Desktop
前提条件:
- 如果你还没有这样做,请从此处下载并安装 Claude 桌面版。
- 启动 Claude 桌面版并导航到“文件” -> “设置”。
- 选择“开发人员” -> “编辑配置”。
- 你将进入 Claude 目录:
- 在 Visual Studio Code 中打开
claude_desktop_config.json 并将以下配置粘贴到 JSON 文件中。
{
"mcpServers": {
"dvmcp": {
"type": "stdio",
"command": "dataversedevtoolsmcpserver",
"args": [
"--environmentUrl",
"https://yourorg.crm.dynamics.com"
]
}
}
}
使用客户端凭证
{
"mcpServers": {
"dvmcp": {
"type": "stdio",
"command": "dataversedevtoolsmcpserver",
"args": [
"--environmentUrl",
"https://yourorg.crm.dynamics.com",
"--tenantId",
"your-tenant-id",
"--clientId",
"your-client-id",
"--clientSecret",
"your-client-secret"
]
}
}
}
- 保存此文件并返回 Claude。退出 Claude(不要只是关闭窗口,而是使用菜单退出)。
💬 示例提示
在 MCP 客户端中使用自然语言提示,客户端将把它们映射到工具调用。
用户管理
- "我当前的 Dataverse 用户和业务部门是什么?"
- "查找用户 'Jane Doe' 并显示她的队列和团队。"
- "列出用户 Jane Doe 的安全角色。"
- "为用户 Jane Doe 分配基本用户安全角色。"
- "从用户 Jane Doe 移除基本用户安全角色。"
- "将用户 Jane Doe 移动到业务部门销售部。"
- "将用户 Jane Doe 添加到团队超级小队。"
- "从团队超级小队移除用户 Jane Doe。"
- "将用户 Jane Doe 添加到超级小队队列。"
- "从超级小队队列移除用户 Jane Doe。"
团队管理
- "为超级小队团队分配基本用户安全角色。"
- "从超级小队团队移除基本用户安全角色。"
- "将超级小队团队的业务部门更改为服务业务部门。"
安全管理
- "基本用户安全角色在 '账户' 表上有哪些权限?"
- "显示基本用户角色的所有权限。"
- "哪些安全角色在账户表上具有读取权限,以及权限深度如何?"
- "比较基本用户和支持用户安全角色的权限。"
数据管理
- "执行此 FetchXML 查询:<粘贴 FetchXML>。"
- "执行 Dataverse Web API:<粘贴 Web API 详细信息>。"
- "生成一个 FetchXML 查询,以获取所有账户类型为高级的商机。"
- "生成一个 Web API Odata 查询,以获取所有账户类型为高级的商机。"
- "使用此 JSON 有效负载通过 Web API 创建一个新账户。"
- "使用此 JSON 有效负载更新 Jane Doe 的联系人记录。"
- "使用备用键(new_key='ACME')和此有效负载对 Jane Doe 的联系人记录进行插入或更新操作。"
- "删除 Jane Doe 的联系人记录。"
实体元数据
- "查找包含关键字 '发票' 的表。"
- "获取 '账户' 表的完整元数据。"
- "账户表中客户类型字段的逻辑名称是什么?"
- "列出 '事件' 实体的 '状态码' 字段的选项集值。"
- "显示 '联系人' 实体上定义的权限。"
- "列出所有全局选项集。"
- "获取全局选项集 '评级' 的选项值。"
自定义操作和自定义 API
- "查找包含关键字 '限定' 的自定义操作。"
- "获取自定义操作 'new_MyCustomAction' 的元数据。"
- "查找名称中包含 '计算' 的自定义 API。"
- "获取自定义 API 'contoso_CalculateTotal' 的完整元数据和参数。"
- "展示如何通过 Web API 调用自定义 API 'new_ProcessOrder'。"
故障排除
- "获取插件 'Contoso.Plugins.AccountPreCreate' 的插件跟踪日志。"
- "获取关联 ID 为 'aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee' 的插件跟踪日志。"
✨ 主要特性
以下是服务器按类别公开的工具,每个工具项都链接到其源代码。
用户、团队和队列管理
| 工具名称 |
描述 |
| GetCurrentUser |
获取当前登录用户的详细信息 |
| GetUserById |
通过用户 ID 获取用户详细信息 |
| SearchUsersByKeyword |
按关键字搜索全名包含该关键字的用户(支持分页) |
| GetUserQueues |
列出用户的队列(支持分页) |
| GetUserTeams |
列出用户的团队(支持分页) |
| GetUserRoles |
列出用户的安全角色 |
| SearchBUByKeyword |
按关键字搜索业务部门(支持分页) |
| GetRootBU |
获取根业务部门 |
| SearchRolesByKeywordAndBU |
在业务部门中按关键字搜索角色(支持分页) |
| AssignRoleToUser |
为用户分配角色 |
| RemoveRoleFromUser |
从用户移除角色 |
| ChangeUserBU |
更改用户的业务部门 |
| SearchQueuesByKeyword |
按关键字搜索队列(支持分页) |
| AddUserToQueue |
将用户添加到队列 |
| RemoveUserFromQueue |
从队列移除用户 |
| SearchTeamsByKeyword |
按关键字搜索团队(支持分页) |
| AddUserToTeam |
将用户添加到团队 |
| RemoveUserFromTeam |
从团队移除用户 |
| AssignRoleToTeam |
为团队分配角色 |
| RemoveRoleFromTeam |
从团队移除角色 |
| ChangeTeamBU |
更改团队的业务部门 |
| GetRolesByTeamId |
列出分配给团队的角色 |
安全管理
| 工具名称 |
描述 |
| GetEntityPrivByRoleId |
获取角色在特定实体上的权限 |
| GetAllPrivByRoleId |
获取角色的所有权限 |
| ListRolesByPrivId |
列出具有特定权限 ID 的角色 |
数据管理
| 工具名称 |
描述 |
| ExecuteFetchXml |
运行 FetchXML 查询(支持分页 cookie) |
| ExecuteWebApi |
执行原始 Dataverse Web API 请求 |
| CreateRecord |
通过 Web API 创建记录 |
| UpdateRecord |
通过 ID 更新记录(Web API) |
| UpsertRecord |
使用备用键进行插入或更新操作(Web API) |
| DeleteRecord |
通过 ID 删除记录(Web API) |
实体元数据
| 工具名称 |
描述 |
| FindEntityLogicalNameUsingKeyword |
按关键字查找实体 |
| ListAllEntities |
列出所有实体 |
| GetEntityMetadata |
仅获取实体元数据信息 |
| GetFields |
分页获取属性/字段元数据 |
| GetRelationships |
分页获取关系元数据 |
| GetOptionSetValuesForEntityField |
获取字段的选项集值 |
| FindGlobalOptionSet |
查找全局选项集 |
| GetGlobalOptionSetValues |
获取全局选项集的值 |
| ListAllGlobalOptionSets |
列出所有全局选项集 |
| GetEntityPrivileges |
获取实体上定义的权限 |
自定义操作和自定义 API
| 工具名称 |
描述 |
| FindCustomActionUsingKeyword |
按关键字查找自定义操作 |
| GetCustomActionMetadata |
获取自定义操作的元数据和 Web API 使用信息 |
| FindCustomApiUsingKeyword |
按关键字查找自定义 API |
| GetCustomApiMetadata |
获取自定义 API 的元数据、请求/响应参数和 Web API 使用信息 |
故障排除
| 工具名称 |
描述 |
| GetPluginTracesByName |
按类型名称获取插件跟踪日志(支持分页) |
| GetPluginTracesByCorrId |
按关联 ID 获取插件跟踪日志(支持分页) |
🛠️ 管理 .NET 工具
📌 注意事项
- 许多搜索操作支持通过页码、每页记录数和分页 cookie 进行分页。当有更多记录可用时,工具将返回下一页的令牌(分页 cookie)。
- 对于 Web API 工具:
- 使用实体集名称(复数架构名称)。
- 对于查找操作,使用
<SchemaName>@odata.bind 并指定相关记录的 URL。
- 工具的源文件:
- 用户管理:DataverseDevToolsMcpServer/Tools/UserManagementTools.cs
- 安全管理:DataverseDevToolsMcpServer/Tools/SecurityManagementTools.cs
- 数据管理:DataverseDevToolsMcpServer/Tools/DataManagementTools.cs
- 实体元数据:DataverseDevToolsMcpServer/Tools/EntityMetadataTools.cs
- 自定义操作和自定义 API:DataverseDevToolsMcpServer/Tools/CustomActionApiTools.cs
- 故障排除:DataverseDevToolsMcpServer/Tools/TroubleshootingTools.cs