🚀 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