Skip to content

Commit 85a538b

Browse files
authored
Merge pull request #781 from lupritz/addDataverseMcpInstaller
New dataverse-mcp plugin with mcp-setup command
2 parents 81f7996 + e30f35d commit 85a538b

6 files changed

Lines changed: 281 additions & 0 deletions

File tree

.github/plugin/marketplace.json

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,12 @@
6464
"description": "Database administration, SQL optimization, and data management tools for PostgreSQL, SQL Server, and general database development best practices.",
6565
"version": "1.0.0"
6666
},
67+
{
68+
"name": "dataverse",
69+
"source": "dataverse",
70+
"description": "Comprehensive collection for Microsoft Dataverse integrations. Includes MCP setup commands.",
71+
"version": "1.0.0"
72+
},
6773
{
6874
"name": "dataverse-sdk-for-python",
6975
"source": "dataverse-sdk-for-python",

docs/README.plugins.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ See [CONTRIBUTING.md](../CONTRIBUTING.md#adding-plugins) for guidelines on how t
2929
| [csharp-dotnet-development](../plugins/csharp-dotnet-development/README.md) | Essential prompts, instructions, and chat modes for C# and .NET development including testing, documentation, and best practices. | 9 items | csharp, dotnet, aspnet, testing |
3030
| [csharp-mcp-development](../plugins/csharp-mcp-development/README.md) | Complete toolkit for building Model Context Protocol (MCP) servers in C# using the official SDK. Includes instructions for best practices, a prompt for generating servers, and an expert chat mode for guidance. | 2 items | csharp, mcp, model-context-protocol, dotnet, server-development |
3131
| [database-data-management](../plugins/database-data-management/README.md) | Database administration, SQL optimization, and data management tools for PostgreSQL, SQL Server, and general database development best practices. | 6 items | database, sql, postgresql, sql-server, dba, optimization, queries, data-management |
32+
| [dataverse](../plugins/dataverse/README.md) | Comprehensive collection for Microsoft Dataverse integrations. Includes MCP setup commands. | 1 items | dataverse, mcp |
3233
| [dataverse-sdk-for-python](../plugins/dataverse-sdk-for-python/README.md) | Comprehensive collection for building production-ready Python integrations with Microsoft Dataverse. Includes official documentation, best practices, advanced features, file operations, and code generation prompts. | 4 items | dataverse, python, integration, sdk |
3334
| [devops-oncall](../plugins/devops-oncall/README.md) | A focused set of prompts, instructions, and a chat mode to help triage incidents and respond quickly with DevOps tools and Azure resources. | 3 items | devops, incident-response, oncall, azure |
3435
| [edge-ai-tasks](../plugins/edge-ai-tasks/README.md) | Task Researcher and Task Planner for intermediate to expert users and large codebases - Brought to you by microsoft/edge-ai | 2 items | architecture, planning, research, tasks, implementation |

docs/README.skills.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,7 @@ See [CONTRIBUTING.md](../CONTRIBUTING.md#adding-skills) for guidelines on how to
136136
| [make-skill-template](../skills/make-skill-template/SKILL.md) | Create new Agent Skills for GitHub Copilot from prompts or by duplicating this template. Use when asked to "create a skill", "make a new skill", "scaffold a skill", or when building specialized AI capabilities with bundled resources. Generates SKILL.md files with proper frontmatter, directory structure, and optional scripts/references/assets folders. | None |
137137
| [markdown-to-html](../skills/markdown-to-html/SKILL.md) | Convert Markdown files to HTML similar to `marked.js`, `pandoc`, `gomarkdown/markdown`, or similar tools; or writing custom script to convert markdown to html and/or working on web template systems like `jekyll/jekyll`, `gohugoio/hugo`, or similar web templating systems that utilize markdown documents, converting them to html. Use when asked to "convert markdown to html", "transform md to html", "render markdown", "generate html from markdown", or when working with .md files and/or web a templating system that converts markdown to HTML output. Supports CLI and Node.js workflows with GFM, CommonMark, and standard Markdown flavors. | `references/basic-markdown-to-html.md`<br />`references/basic-markdown.md`<br />`references/code-blocks-to-html.md`<br />`references/code-blocks.md`<br />`references/collapsed-sections-to-html.md`<br />`references/collapsed-sections.md`<br />`references/gomarkdown.md`<br />`references/hugo.md`<br />`references/jekyll.md`<br />`references/marked.md`<br />`references/pandoc.md`<br />`references/tables-to-html.md`<br />`references/tables.md`<br />`references/writing-mathematical-expressions-to-html.md`<br />`references/writing-mathematical-expressions.md` |
138138
| [mcp-cli](../skills/mcp-cli/SKILL.md) | Interface for MCP (Model Context Protocol) servers via CLI. Use when you need to interact with external tools, APIs, or data sources through MCP servers, list available MCP servers/tools, or call MCP tools from command line. | None |
139+
| [mcp-configure](../skills/mcp-configure/SKILL.md) | Configure an MCP server for GitHub Copilot with your Dataverse environment. | None |
139140
| [mcp-copilot-studio-server-generator](../skills/mcp-copilot-studio-server-generator/SKILL.md) | Generate a complete MCP server implementation optimized for Copilot Studio integration with proper schema constraints and streamable HTTP support | None |
140141
| [mcp-create-adaptive-cards](../skills/mcp-create-adaptive-cards/SKILL.md) | Skill converted from mcp-create-adaptive-cards.prompt.md | None |
141142
| [mcp-create-declarative-agent](../skills/mcp-create-declarative-agent/SKILL.md) | Skill converted from mcp-create-declarative-agent.prompt.md | None |
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
{
2+
"name": "dataverse",
3+
"description": "Comprehensive collection for Microsoft Dataverse integrations. Includes MCP setup commands.",
4+
"version": "1.0.0",
5+
"author": {
6+
"name": "Awesome Copilot Community"
7+
},
8+
"repository": "https://github.com/github/awesome-copilot",
9+
"license": "MIT",
10+
"keywords": [
11+
"dataverse",
12+
"mcp"
13+
],
14+
"skills": [
15+
"./skills/mcp-configure/"
16+
]
17+
}

plugins/dataverse/README.md

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
# Dataverse MCP
2+
3+
Comprehensive collection for Microsoft Dataverse integrations. Includes MCP setup commands that guide you through configuring Dataverse MCP servers for GitHub Copilot.
4+
5+
## Installation
6+
7+
```bash
8+
# Using Copilot CLI
9+
copilot plugin install dataverse@awesome-copilot
10+
```
11+
12+
## What's Included
13+
14+
### Skills
15+
16+
| Skill | Description |
17+
|-------|-------------|
18+
| `/dataverse:mcp-configure` | Configure Dataverse MCP server for GitHub Copilot with global or project-scoped settings.. |
19+
20+
## Source
21+
22+
This plugin is part of [Awesome Copilot](https://github.com/github/awesome-copilot), a community-driven collection of GitHub Copilot extensions.
23+
24+
## License
25+
26+
MIT

skills/mcp-configure/SKILL.md

Lines changed: 230 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,230 @@
1+
---
2+
name: mcp-configure
3+
description: Configure an MCP server for GitHub Copilot with your Dataverse environment.
4+
---
5+
6+
# Configure Dataverse MCP for GitHub Copilot
7+
8+
This skill configures the Dataverse MCP server for GitHub Copilot with your organization's environment URL. Each organization is registered with a unique server name based on the org identifier (e.g., `DataverseMcporgbc9a965c`). If the user provided a URL it is: $ARGUMENTS.
9+
10+
## Instructions
11+
12+
### 0. Ask for MCP scope
13+
14+
Ask the user whether they want to configure the MCP server globally or for this project only:
15+
16+
> Would you like to configure the Dataverse MCP server:
17+
> 1. **Globally** (available in all projects)
18+
> 2. **Project-only** (available only in this project)
19+
20+
Based on their choice, set the `CONFIG_PATH` variable:
21+
- **Global**: `~/.copilot/mcp-config.json` (use the user's home directory)
22+
- **Project**: `.mcp/copilot/mcp.json` (relative to the current working directory)
23+
24+
Store this path for use in steps 1 and 6.
25+
26+
### 1. Check already-configured MCP servers
27+
28+
Read the MCP configuration file at `CONFIG_PATH` (determined in step 0) to check for already-configured servers.
29+
30+
The configuration file is a JSON file with the following structure:
31+
32+
```json
33+
{
34+
"mcpServers": {
35+
"ServerName1": {
36+
"type": "http",
37+
"url": "https://example.com/api/mcp"
38+
}
39+
}
40+
}
41+
```
42+
43+
Or it may use `"servers"` instead of `"mcpServers"` as the top-level key.
44+
45+
Extract all `url` values from the configured servers and store them as `CONFIGURED_URLS`. For example:
46+
47+
```json
48+
["https://orgfbb52bb7.crm.dynamics.com/api/mcp"]
49+
```
50+
51+
If the file doesn't exist or is empty, treat `CONFIGURED_URLS` as empty (`[]`). This step must never block the skill.
52+
53+
### 2. Ask how to get the environment URL
54+
55+
Ask the user:
56+
57+
> How would you like to provide your Dataverse environment URL?
58+
> 1. **Auto-discover** — List available environments from your Azure account (requires Azure CLI)
59+
> 2. **Manual entry** — Enter the URL directly
60+
61+
Based on their choice:
62+
- If **Auto-discover**: Proceed to step 2a
63+
- If **Manual entry**: Skip to step 2b
64+
65+
### 2a. Auto-discover environments
66+
67+
**Check prerequisites:**
68+
- Verify Azure CLI (`az`) is installed (check with `which az` or `where az` on Windows)
69+
- If not installed, inform the user and fall back to step 2b
70+
71+
**Make the API call:**
72+
73+
1. Check if the user is logged into Azure CLI:
74+
```bash
75+
az account show
76+
```
77+
If this fails, prompt the user to log in:
78+
```bash
79+
az login
80+
```
81+
82+
2. Get an access token for the Power Apps API:
83+
```bash
84+
az account get-access-token --resource https://service.powerapps.com/ --query accessToken --output tsv
85+
```
86+
87+
3. Call the Power Apps API to list environments:
88+
```
89+
GET https://api.powerapps.com/providers/Microsoft.PowerApps/environments?api-version=2016-11-01
90+
Authorization: Bearer {token}
91+
Accept: application/json
92+
```
93+
94+
4. Parse the JSON response and filter for environments where `properties?.linkedEnvironmentMetadata?.instanceUrl` is not null.
95+
96+
5. For each matching environment, extract:
97+
- `properties.displayName` as `displayName`
98+
- `properties.linkedEnvironmentMetadata.instanceUrl` (remove trailing slash) as `instanceUrl`
99+
100+
6. Create a list of environments in this format:
101+
```json
102+
[
103+
{ "displayName": "My Org (default)", "instanceUrl": "https://orgfbb52bb7.crm.dynamics.com" },
104+
{ "displayName": "Another Env", "instanceUrl": "https://orgabc123.crm.dynamics.com" }
105+
]
106+
```
107+
108+
**If the API call succeeds**, proceed to step 3.
109+
110+
**If the API call fails** (user not logged in, network error, no environments found, or any other error), tell the user what went wrong and fall back to step 2b.
111+
112+
### 2b. Manual entry — ask for the URL
113+
114+
Ask the user to provide their environment URL directly:
115+
116+
> Please enter your Dataverse environment URL.
117+
>
118+
> Example: `https://myorg.crm10.dynamics.com`
119+
>
120+
> You can find this in the Power Platform Admin Center under Environments.
121+
122+
Then skip to step 4.
123+
124+
### 3. Ask the user to select an environment
125+
126+
Present the environments as a numbered list. For each environment, check whether any URL in `CONFIGURED_URLS` starts with that environment's `instanceUrl` — if so, append **(already configured)** to the line.
127+
128+
> I found the following Dataverse environments on your account. Which one would you like to configure?
129+
>
130+
> 1. My Org (default) — `https://orgfbb52bb7.crm.dynamics.com` **(already configured)**
131+
> 2. Another Env — `https://orgabc123.crm.dynamics.com`
132+
>
133+
> Enter the number of your choice, or type "manual" to enter a URL yourself.
134+
135+
If the user selects an already-configured environment, confirm that they want to re-register it (e.g. to change the endpoint type) before proceeding.
136+
137+
If the user types "manual", fall back to step 2b.
138+
139+
### 4. Confirm the selected URL
140+
141+
Take the `instanceUrl` from the chosen environment (or the manually entered URL) and strip any trailing slash. This is `USER_URL` for the remainder of the skill.
142+
143+
### 5. Confirm if the user wants "Preview" or "Generally Available (GA)" endpoint
144+
145+
Ask the user:
146+
147+
> Which endpoint would you like to use?
148+
> 1. **Generally Available (GA)**`/api/mcp` (recommended)
149+
> 2. **Preview**`/api/mcp_preview` (latest features, may be unstable)
150+
151+
Based on their choice:
152+
- If **GA**: set `MCP_URL` to `{USER_URL}/api/mcp`
153+
- If **Preview**: set `MCP_URL` to `{USER_URL}/api/mcp_preview`
154+
155+
### 6. Register the MCP server
156+
157+
Update the MCP configuration file at `CONFIG_PATH` (determined in step 0) to add the new server.
158+
159+
**Generate a unique server name** from the `USER_URL`:
160+
1. Extract the subdomain (organization identifier) from the URL
161+
- Example: `https://orgbc9a965c.crm10.dynamics.com``orgbc9a965c`
162+
2. Prepend `DataverseMcp` to create the server name
163+
- Example: `DataverseMcporgbc9a965c`
164+
165+
This is the `SERVER_NAME`.
166+
167+
**Update the configuration file:**
168+
169+
1. If `CONFIG_PATH` is for a **project-scoped** configuration (`.mcp/copilot/mcp.json`), ensure the directory exists first:
170+
```bash
171+
mkdir -p .mcp/copilot
172+
```
173+
174+
2. Read the existing configuration file at `CONFIG_PATH`, or create a new empty config if it doesn't exist:
175+
```json
176+
{}
177+
```
178+
179+
3. Determine which top-level key to use:
180+
- If the config already has `"servers"`, use that
181+
- Otherwise, use `"mcpServers"`
182+
183+
4. Add or update the server entry:
184+
```json
185+
{
186+
"mcpServers": {
187+
"{SERVER_NAME}": {
188+
"type": "http",
189+
"url": "{MCP_URL}"
190+
}
191+
}
192+
}
193+
```
194+
195+
5. Write the updated configuration back to `CONFIG_PATH` with proper JSON formatting (2-space indentation).
196+
197+
**Important notes:**
198+
- Do NOT overwrite other entries in the configuration file
199+
- Preserve the existing structure and formatting
200+
- If `SERVER_NAME` already exists, update it with the new `MCP_URL`
201+
202+
Proceed to step 7.
203+
204+
### 7. Confirm success and instruct restart
205+
206+
Tell the user:
207+
208+
> ✅ Dataverse MCP server configured for GitHub Copilot at `{MCP_URL}`.
209+
>
210+
> Configuration saved to: `{CONFIG_PATH}`
211+
>
212+
> **IMPORTANT: You must restart your editor for the changes to take effect.**
213+
>
214+
> Restart your editor or reload the window, then you will be able to:
215+
> - List all tables in your Dataverse environment
216+
> - Query records from any table
217+
> - Create, update, or delete records
218+
> - Explore your schema and relationships
219+
220+
### 8. Troubleshooting
221+
222+
If something goes wrong, help the user check:
223+
224+
- The URL format is correct (`https://<org>.<region>.dynamics.com`)
225+
- They have access to the Dataverse environment
226+
- The environment URL matches what's shown in the Power Platform Admin Center
227+
- Their Environment Admin has enabled "Dataverse CLI MCP" in the Allowed Clients list
228+
- Their Environment has Dataverse MCP enabled, and if they're trying to use the preview endpoint that is enabled
229+
- For project-scoped configuration, ensure the `.mcp/copilot/mcp.json` file was created successfully
230+
- For global configuration, check permissions on the `~/.copilot/` directory

0 commit comments

Comments
 (0)