🚀 DataverseDevTools MCP Server
Model Context Protocol (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拡張機能がインストールされていること
スクリーンショット付きの手順説明:
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にBasic Userセキュリティロールを割り当てます。"
- "ユーザーJane DoeからBasic Userセキュリティロールを削除します。"
- "ユーザーJane DoeをビジネスユニットSalesに移動します。"
- "ユーザーJane DoeをチームSuper Squadに追加します。"
- "ユーザーJane DoeをチームSuper Squadから削除します。"
- "ユーザーJane DoeをSuper Squadキューに追加します。"
- "ユーザーJane DoeをSuper Squadキューから削除します。"
チーム管理
- "Super SquadチームにBasic Userセキュリティロールを割り当てます。"
- "Super SquadチームからBasic Userセキュリティロールを削除します。"
- "Super SquadチームのビジネスユニットをServiceビジネスユニットに変更します。"
セキュリティ管理
- "Basic Userセキュリティロールは'account'テーブルに対してどのような特権を持っていますか?"
- "Basic Userロールのすべての特権を表示します。"
- "accountテーブルに読み取り特権を持つセキュリティロールはどれで、どの深さですか?"
- "Basic UserとSupport userセキュリティロールの特権を比較します。"
データ管理
- "このFetchXMLクエリを実行します: <FetchXMLを貼り付ける>。"
- "Dataverse Web APIを実行します: <Web APIの詳細を貼り付ける>。"
- "アカウントタイプがプレミアムのすべての商談を取得するFetchXMLクエリを生成します。"
- "アカウントタイプがプレミアムのすべての商談を取得するWeb API Odataクエリを生成します。"
- "このJSONペイロードを使用してWeb APIで新しいアカウントを作成します。"
- "このJSONペイロードを使用してJane Doeの連絡先レコードを更新します。"
- "このペイロードを使用して代替キー(new_key='ACME')を使用してJane Doeの連絡先レコードをアップサートします。"
- "Jane Doeの連絡先レコードを削除します。"
エンティティメタデータ
- "キーワード'invoice'を含むテーブルを検索します。"
- "'account'テーブルの完全なメタデータを取得します。"
- "accountテーブルのクライアントタイプフィールドの論理名は何ですか?"
- "エンティティ'incident'のフィールド'statuscode'のOptionSet値を一覧表示します。"
- "'contact'エンティティで定義された特権を表示します。"
- "すべてのグローバルOptionSetを一覧表示します。"
- "グローバルオプションセットRatingのオプション値を取得します。"
カスタムアクションとカスタムAPI
- "キーワード'qualify'を含むカスタムアクションを検索します。"
- "カスタムアクション'new_MyCustomAction'のメタデータを取得します。"
- "名前に'calculate'を含むカスタム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クエリを実行する(ページングクッキーをサポート) |
| ExecuteWebApi |
生のDataverse Web APIリクエストを実行する |
| CreateRecord |
レコードを作成する(Web API) |
| UpdateRecord |
IDでレコードを更新する(Web API) |
| UpsertRecord |
代替キーを使用してレコードをアップサートする(Web API) |
| DeleteRecord |
IDでレコードを削除する(Web API) |
エンティティメタデータ
| ツール名 |
説明 |
| FindEntityLogicalNameUsingKeyword |
キーワードでエンティティを検索する |
| ListAllEntities |
すべてのエンティティを一覧表示する |
| GetEntityMetadata |
エンティティのメタデータ情報のみを取得する |
| GetFields |
ページング付きの属性/フィールドメタデータを取得する |
| GetRelationships |
ページング付きのリレーションシップメタデータを取得する |
| GetOptionSetValuesForEntityField |
フィールドのOptionSet値を取得する |
| FindGlobalOptionSet |
グローバルOptionSetを検索する |
| GetGlobalOptionSetValues |
グローバルOptionSetの値を取得する |
| ListAllGlobalOptionSets |
すべてのグローバルOptionSetを一覧表示する |
| GetEntityPrivileges |
エンティティに定義された特権を取得する |
カスタムアクションとカスタムAPI
| ツール名 |
説明 |
| FindCustomActionUsingKeyword |
キーワードでカスタムアクションを検索する |
| GetCustomActionMetadata |
Web APIの使用方法情報付きのカスタムアクションメタデータを取得する |
| FindCustomApiUsingKeyword |
キーワードでカスタムAPIを検索する |
| GetCustomApiMetadata |
要求/応答パラメーターとWeb APIの使用方法情報付きのカスタムAPIメタデータを取得する |
トラブルシューティング
| ツール名 |
説明 |
| GetPluginTracesByName |
タイプ名でプラグイントレースログを取得する(ページングあり) |
| GetPluginTracesByCorrId |
相関IDでプラグイントレースログを取得する(ページングあり) |
📦 インストール
.NETツールの管理
- 更新:
dotnet tool update -g vignaesh01.dataversedevtoolsmcpserver
- アンインストール:
dotnet tool uninstall -g vignaesh01.dataversedevtoolsmcpserver
- 確認:
📚 ドキュメント
注意事項
- 多くの検索操作は、ページ番号、ページあたりのレコード数、およびページングクッキーを介してページングをサポートしています。より多くのレコードが利用可能な場合、ツールは次のページトークン(ページングクッキー)を返します。
- Web APIツールの場合:
- エンティティセット名(複数形のスキーマ名)を使用します。
- ルックアップには、関連レコードのURLを含む
<SchemaName>@odata.bindを使用します。
- ツールのソースファイル:
- ユーザー管理: 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