Estimated reading time: 9 minutes
Ready to build Power Platform solutions with AI? This comprehensive tutorial covers the complete Dataverse Skills installation process for both GitHub Copilot and Claude Code. Learn how to configure PAC CLI authentication, enable the Dataverse MCP server in Managed Environments, and build your first agent-driven solution from a single natural language prompt. Includes enterprise-tested authentication patterns, troubleshooting common errors, and a real-world project tracking system built entirely by AI. Perfect for Power Platform developers transitioning to intent-driven development workflows.
Introduction
In Part 1 of this series – From Scripts to Intent: How Dataverse Skills Redefines Enterprise Development, we examined the paradigm shift from manual tool orchestration to intent-driven development. The theoretical foundation matters, but enterprise adoption requires practical proof. This article bridges that gap with a production-grade installation guide that accounts for real-world enterprise constraints: Managed Environment policies, authentication complexity, and multi-agent toolchain integration.
The setup process we’re about to walk through reflects lessons learned from early adopter organizations across consulting firms, ISVs, and enterprise CoE teams. I’ve distilled dozens of installation attempts—successful and failed—into the critical path you see here. This isn’t just “how to install”—it’s “how to install correctly the first time in an enterprise context.”
By the end of this article, you will have:
- The Dataverse MCP server enabled and configured according to enterprise security best practices
- The Dataverse Skills plugin installed in your preferred coding agent with proper authentication lifecycle management
- A working Dataverse solution built entirely from natural language—proving the end-to-end workflow
- Understanding of where this fits in your broader Power Platform governance framework

Prerequisites Checklist
Before you start, ensure you have the following:
| Requirement | How to verify | Install link |
| Power Platform environment (Managed) | Admin center → Environments | Power Platform admin center |
| PAC CLI installed | pac --version | aka.ms/PowerAppsCLI |
| Node.js 18 or later | node --version | nodejs.org |
| Python 3.10 or later | python --version | python.org |
| Azure CLI (recommended) | az --version | aka.ms/installazurecliwindows |
| Claude Code CLI or GitHub Copilot (VS Code or CLI) | claude --version / Copilot extension | See agent sections below |
Enterprise Reality Check — Managed Environments: The Dataverse MCP server requires a Managed Environment. This is not a technical limitation—it’s a deliberate architectural decision by Microsoft. Managed Environments provide the governance boundary necessary for agent access: DLP enforcement, usage telemetry, and IP firewall controls. If your developer environment is not managed (common in legacy tenant setups), you have two paths forward: (1) Request environment conversion to Managed status through your Power Platform admin team, or (2) Use the Python SDK and PAC CLI portions of Dataverse Skills exclusively, accepting that MCP-based natural language queries won’t work. In practice, most organizations pursuing Dataverse Skills adoption take path #1—the governance benefits of Managed Environments extend far beyond just agent access.
Step 1: Install PAC CLI and Configure Authentication
1.1 Install PAC CLI
The recommended installation method for cross-platform use is the .NET tool:
dotnet tool install --global Microsoft.PowerApps.CLIOr via npm:
npm install -g @microsoft/powerplatform-cliVerify the installation:
pac --version
# Microsoft PowerPlatform CLI Version: 1.30+1.2 Authenticate with your tenant
pac auth create --name MyDevThis opens a browser window for interactive Azure AD authentication. After sign-in, you will see confirmation of the authentication profile.
Professional Context: PAC CLI authentication uses the same OAuth 2.0 device code flow as Azure CLI—a pattern familiar to infrastructure engineers but sometimes new to Power Platform developers coming from maker portal backgrounds. Understanding this flow matters for troubleshooting: if authentication fails, the issue is usually at the Entra ID conditional access policy level, not with PAC CLI itself. Work with your identity team to ensure the “Microsoft PowerApps Checker” enterprise app has the necessary grant permissions in your tenant.
For automation scenarios (CI/CD, service principals):
pac auth create \
--name MyDev-SPN \
--applicationId <your-app-id> \
--clientSecret <your-secret> \
--tenant <your-tenant-id>1.3 Select your target environment
# List available environments
pac org list
# Select by name or URL
pac org select --environment "Your Dev Environment"
# Verify
pac org whoThe pac org who command is your equivalent of a Dataverse WhoAmI request — it confirms which user and environment are active.
1.4 Authenticate with Azure CLI (recommended alongside PAC CLI)
Dataverse Skills’ Connect phase can use Azure CLI as an alternative authentication path, and the Python SDK uses Azure Identity providers. Having Azure CLI authenticated avoids additional prompts:
az login
az account set --subscription "<your-subscription-id>"Step 2: Enable the Dataverse MCP Server
The Dataverse MCP server represents Microsoft’s strategic bet on the Model Context Protocol as the standard for agent-to-data connectivity. Enabled by default for Copilot Studio (Microsoft’s own agent platform), the MCP server requires explicit enablement for third-party clients like GitHub Copilot and Claude Code. This is governance by design, not accident—every external client connection point is a potential security boundary that needs conscious approval.
From an enterprise architecture perspective, this approval gating aligns with zero-trust principles: assume no client has access until explicitly granted, with the approval authority resting with environment admins rather than individual developers.
2.1 Enable in Power Platform Admin Center
- Go to admin.powerplatform.microsoft.com
- Select Manage → Environments
- Select your target environment
- Go to Settings → Product → Features
- Scroll to Dataverse Model Context Protocol
- Ensure Allow MCP clients to interact with Dataverse MCP server is On
- Click Advanced Settings
- Enable the specific clients you need:
Microsoft GitHub Copilot— for VS Code / Copilot CLIDataverse CLI(App ID:0c412cc3-0dd6-449b-987f-05b053db9457) — for Claude Code and other non-Microsoft clients via local proxy
2.2 Find your MCP server URL
Your Dataverse MCP server URL follows this format:
https://{your-org-name}.crm.dynamics.com/api/mcp
You can find your organization URL in:
- Power Apps maker portal → Settings (gear icon) → Session details → Instance URL
- PAC CLI:
pac org whooutputs the environment URL
Preview endpoint: There is also a preview endpoint at /api/mcp_preview with early-access features. The stable endpoint /api/mcp is recommended for general use.
Step 3: Install Dataverse Skills in Claude Code
3.1 Install Claude Code
If you do not have Claude Code installed:
npm install -g @anthropic-ai/claude-codeVerify:
claude --version3.2 Install the Dataverse Skills plugin
The automated installer handles prerequisites and registers the plugin:
# Clone the repository
git clone https://github.com/microsoft/Dataverse-skills.git
cd Dataverse-skills
# Run the installer
./install.sh # macOS/Linux
# or
.\install.ps1 # Windows PowerShellAlternatively, for one-command installation via the marketplace (once available):
claude plugin install microsoft/dataverse-skills3.3 Verify installation
Open Claude Code in your project directory and test the connection:
claude
> Connect to my Dataverse environment and list available solutionsClaude Code will invoke the Connect phase skills automatically: discover your PAC CLI auth profiles, select the active environment, and list solutions via the MCP server.
3.4 Claude Code with direct MCP connection (non-proxy)
For direct connection to the Dataverse MCP server (without the local proxy), you need to register an Entra app with mcp.tools permissions on the Dynamics CRM API, then configure Claude Code with the MCP URL:
Add to your Claude Code MCP configuration (~/.claude/mcp_config.json):
{
"mcpServers": {
"DataverseMcp": {
"type": "http",
"url": "https://yourorg.crm.dynamics.com/api/mcp"
}
}
}Step 4: Install Dataverse Skills in GitHub Copilot
4.1 Prerequisites for GitHub Copilot
- Visual Studio Code with the GitHub Copilot extension, or
- GitHub Copilot CLI (
gh copilot)
4.2 Add the Dataverse MCP server in VS Code
- Open VS Code
- Press
Ctrl+Shift+P→ typeMCP: Add Server→ press Enter - Select HTTP or Server Sent Events
- Paste your MCP URL:
https://yourorg.crm.dynamics.com/api/mcp - Press Enter
This generates the MCP server configuration in VS Code’s settings.
4.3 Install via the Awesome Copilot marketplace
The Awesome Copilot marketplace provides a Dataverse plugin that includes an mcp-configure skill for interactive setup:
# Add the Awesome Copilot marketplace
copilot plugin marketplace add github/awesome-copilotThen in a Copilot chat session, use the skill:
/dataverse:mcp-configure
The skill walks you through environment discovery and endpoint selection.
4.4 Configure MCP for Copilot CLI
Edit your Copilot CLI MCP configuration file:
// Global: ~/.copilot/mcp-config.json
// Project: .mcp/copilot/mcp.json
{
"mcpServers": {
"DataverseMcp": {
"type": "http",
"url": "https://yourorg.crm.dynamics.com/api/mcp"
}
}
}4.5 Install Dataverse Skills for Copilot
From the Dataverse Skills repository:
# The install script detects your coding agent<br>./install.shThe installer registers the marketplace with any detected AI coding assistants.
Step 5: Your First Intent-Driven Build
With everything configured, let’s build a real Dataverse solution from a single prompt.
The prompt
Open your coding agent (Claude Code or GitHub Copilot agent mode) in your working directory and type:
I need a simple project tracking system for a consulting firm.
Create tables for Projects, Clients, Consultants, and Assignments
(with a many-to-many between Projects and Consultants).
Add a status choice column to Projects with values:
Proposal, Active, On Hold, Completed.
Use the publisher prefix 'aidevme'.
Create everything in a solution called 'ConsultingTracker',
load 10 realistic sample records per table,
and show me all active projects with their assigned consultants.What the agent does (observable steps)
Connect phase:
> Checking PAC CLI authentication...
> Active profile: MyDev → https://yourorg.crm.dynamics.com<br>> Registering Dataverse MCP server...
> MCP connection established. 23 tables available.Build phase:
> Creating solution 'ConsultingTracker' (publisher: aievme)...
> Creating table: aidevme_Project<br>> + Text column: aidevme_projectname + Choice column: aidevme_status (Proposal | Active | On Hold | Completed) + Currency column: aidevme_budget
> Creating table: aidevme_Client
> Creating table: aidevme_Consultant
> Creating table: aidevme_Assignment (Activity table, M:N junction)
> Creating relationship: aidevme_project_consultant (M:N)
> Adding all components to ConsultingTracker solution...Operate phase:
> Generating sample data script (Python)...<br>> Creating 10 Client records...
> Creating 10 Consultant records...
> Creating 10 Project records...
> Creating Assignment relationships...
> Running query: Active projects with assigned consultants...Result:
Active Projects and Assigned Consultants:<br><br>Project: "Digital Transformation – Stadtwerke Basel" Status: Active | Budget: CHF 450,000 Consultants: Klaus Weber (Senior Architect), Petra Müller (Developer) Project: "CRM Migration – Schweizer Bank AG" Status: Active | Budget: CHF 280,000 Consultants: Andreas Huber (Solution Architect) [... 3 more active projects]The entire operation — from empty environment to queryable data — in a single prompt.
Understanding What Happened Under the Hood
Which tools were used and when
The agent selected tools based on the operation type:
| Operation | Tool used | Why |
| Environment discovery | PAC CLI (pac org list) | Authoritative source for environment metadata |
| Solution creation | PAC CLI (pac solution create) | Native ALM operation |
| Table/column creation | Dataverse Web API (OData) | Full schema control, supports all column types |
| MCP registration | @microsoft/dataverse npm package | Local proxy for Claude Code connectivity |
| Metadata reads during build | Dataverse MCP (describe_table) | Fastest path for read-only schema queries |
| Sample data generation | Dataverse Python SDK | Bulk operations (CreateMultiple) for efficiency |
| Analytical query | Dataverse MCP (read_query) | Natural language to OData translation |
The skill files at work
You can inspect exactly which skills the agent loaded by examining the repository:
Dataverse-skills/
└── .github/plugins/dataverse/skills/
├── connect/
│ ├── authenticate.md
│ └── mcp-register.md
├── build/
│ ├── create-solution.md
│ ├── create-table.md
│ ├── create-column.md
│ └── create-relationship.md
└── operate/
├── load-data.md
└── query.md
Each file contains structured instructions that the agent interprets, including safety checks (for example, the build skills warn against creating tables with the same logical name as system tables).
Common Errors and How to Fix Them
Error: “MCP client not allowed in this environment”
Cause: The MCP client (GitHub Copilot or Dataverse CLI) has not been enabled in the Power Platform Admin Center.
Fix: Follow Step 2.1 above. Enable the specific client app ID for your environment.
Error: “pac: command not found”
Cause: PAC CLI is not on your PATH, or only installed via the VS Code extension.
Fix: Install via .NET tool (dotnet tool install) or add the extension’s bin directory to your system PATH.
Error: “No active auth profile” in Claude Code
Cause: The Dataverse Skills Connect phase could not find a valid PAC CLI authentication profile.
Fix:
pac auth create --name DevProfile
pac org select --environment "Your Environment Name"
pac org who # Verify the active contextError: Python SDK bulk create fails with 400
Cause: Likely missing alternate key configuration for upsert operations, or incorrect column logical names (remember the publisher prefix).
Fix: Verify column logical names match your publisher prefix:
# Wrong — missing publisher prefix<br>client.records.create("project", [{"name": "Test"}])<br><br># Correct<br>client.records.create("aiddevme_project", [{"aidevme_projectname": "Test"}])Error: “Table not found in solution”
Cause: The build skill created the table but failed to add it to the solution before the operate phase ran.
Fix: Manually add the table to the solution:
pac solution add-solution-component \
--solutionUniqueName ConsultingTracker \
--component aidevme_project \
--componentType 1Next Steps
You now have a working Dataverse Skills setup. In the next articles in this series, we go deeper:
- Part 3 — The technical internals: how skill Markdown files work, tool selection logic, and how to write your own custom skills
- Part 4 — Enterprise architecture view: Managed Environments, MCP billing, ALM pipelines, and governance considerations
To experiment further right now, try these prompts:
Add a view showing projects by status
Add a public view to the aidevme_Project table that groups projects by status and shows project name, client, total budget, and assigned consultant count.
Import from CSV Import the attached projects.csv file into the aidevme_Project table, mapping the 'project_title' column to aidevme_projectname and 'state' to the aidevme_status choice column.
Profile data quality Profile the data quality of all tables in the ConsultingTracker solution and report on null percentages and value distributions.Frequently Asked Questions
Do I need both Claude Code and GitHub Copilot installed?
No. Dataverse Skills works with either agent. Install whichever you use. The plugin covers both agents with the same skill files.
Does the agent modify production environments?
The agent uses whichever authentication profile and environment are active in your PAC CLI context. Always verify pac org who before running prompts. It is strongly recommended to use dedicated development environments, not production.
Can I use Dataverse Skills with a trial Power Platform environment?
Yes for the PAC CLI and Python SDK portions. The MCP server requires a Managed Environment, which trial environments typically are not. Check your environment type in the admin center.
Can multiple developers share the same Dataverse Skills plugin configuration?
Yes. The plugin files live in the repository (.claude-plugin/ and .github/plugins/ directories). Commit the configuration alongside your solution source. Each developer authenticates independently via their own PAC CLI profiles.
What happens if I run the build prompt twice?
The build skills include safety checks that detect existing tables and columns. They will warn you before creating duplicates. If a component already exists with the correct schema, the skill skips creation. This makes the prompts largely idempotent.
References & Further Reading
Dataverse Skills
MCP Configuration
- Connect to Dataverse with MCP (Microsoft Learn)
- Configure the Dataverse MCP server
- Connect Dataverse MCP with GitHub Copilot in VS Code
- Connect to Dataverse MCP from non-Microsoft clients
PAC CLI
Python SDK
- Dataverse SDK for Python overview
- PowerPlatform-Dataverse-Client on PyPI
- Python SDK GitHub Repository
Claude Code
Previous: Part 1 — From Scripts to Intent: How Dataverse Skills Redefines Enterprise Development
Next: Part 3 — Under the Hood: Skill Markdown Format, Tool Selection Logic, and Writing Your Own Skills

Leave a Reply