A read-only MCP server for querying Microsoft Dataverse environments during development
Project description
Dataverse MCP Server
An MCP server for interacting with Microsoft Dataverse environments. Built with FastMCP and the official PowerPlatform-Dataverse-Client Python SDK.
Features
- Solution inspection — list solutions, get solution details, browse solution components
- Table querying — flexible OData-style queries against any Dataverse table
- Schema exploration — list tables, inspect table metadata (primary key, name attribute)
- Environment discovery — list Power Platform environments available to the authenticated user
- Multi-environment targeting — one MCP server config can query any Dataverse org the caller specifies
- Agent-friendly — rich tool descriptions designed for AI agent discoverability
- Secure — Pydantic v2 input validation, GUID format enforcement, OData injection prevention
Prerequisites
- uv — install from docs.astral.sh/uv
- Access to a Microsoft Dataverse environment
- Azure CLI (
az login) or a registered app for authentication
Installation
You can run this server either from PyPI with uvx or directly from a local checkout.
Option 1: Run from PyPI
uvx dataverse-mcp
uvx downloads and runs the package in an isolated environment.
Option 2: Run from a local checkout
git clone https://github.com/ryanmichaeljames/dataverse-mcp.git
cd dataverse-mcp
uv sync
This creates .venv, which is the local Python environment used by the source-based MCP configuration shown below.
Configuration
Configure the server through your MCP client. In VS Code, that means the env
block on the server entry in .vscode/mcp.json or your user mcp.json.
This project does not use a .env file for normal setup.
| Variable | Required | Default | Description |
|---|---|---|---|
DATAVERSE_URL |
No | — | Optional fallback org URL, set only if you want requests without dataverse_url to still work |
DATAVERSE_AUTH_TYPE |
No | azure_cli |
Auth method: interactive, client_secret, or azure_cli |
AZURE_TENANT_ID |
For client_secret |
— | Azure AD tenant ID |
AZURE_CLIENT_ID |
For client_secret |
— | App registration client ID |
AZURE_CLIENT_SECRET |
For client_secret |
— | App registration client secret |
Authentication Methods
azure_cli(default) — Uses your existingaz loginsession. Best for local development.interactive— Opens a browser window for interactive sign-in.client_secret— Uses a service principal. RequiresAZURE_TENANT_ID,AZURE_CLIENT_ID, andAZURE_CLIENT_SECRET.
Usage
This server communicates over stdio and works with any MCP-compatible client.
VS Code
Add the server to your VS Code MCP configuration. Choose either the packaged uvx form or the local source form.
Run from PyPI:
{
"servers": {
"dataverse-mcp": {
"type": "stdio",
"command": "uvx",
"args": ["dataverse-mcp"],
"env": {
"DATAVERSE_AUTH_TYPE": "azure_cli"
}
}
}
}
Run from a local checkout on the same machine:
{
"servers": {
"dataverse-mcp-local": {
"type": "stdio",
"command": "C:\\path\\to\\dataverse-mcp\\.venv\\Scripts\\python.exe",
"args": ["-m", "dataverse_mcp.server"],
"env": {
"PYTHONPATH": "C:\\path\\to\\dataverse-mcp\\src",
"DATAVERSE_AUTH_TYPE": "azure_cli"
}
}
}
}
The local source form does not require a build step. Code changes are picked up on the next server start.
If you want a fallback environment for requests that omit dataverse_url, add
DATAVERSE_URL to that same env block. Keep it in MCP config, not a .env
file.
Environment Targeting
Use a single server entry and provide dataverse_url on each tool call to target the Dataverse environment explicitly. Example tool input:
{
"dataverse_url": "https://yourorg.crm.dynamics.com",
"table_name": "account",
"select": ["name", "accountid"],
"top": 10
}
If you omit dataverse_url, the server falls back to DATAVERSE_URL when that value is configured in your MCP server env. That fallback is kept for backward compatibility only; the preferred setup is explicit environment targeting on every request.
Use dataverse_list_environments first if you need to discover which Power Platform environments are available before choosing a dataverse_url.
dataverse_list_environments does not require dataverse_url and always returns the full normalized environment payload. Optional flags let you include capacity and add-on details.
Tools
| Tool | Description |
|---|---|
dataverse_list_environments |
List Power Platform environments available to the authenticated user via the admin API, returning the full normalized payload |
dataverse_list_solutions |
List solutions with optional OData filter, select, and top |
dataverse_get_solution |
Get a single solution by unique name or GUID |
dataverse_list_solution_components |
List components in a solution with optional type filter |
dataverse_query_table |
Query records from any table with filter, select, orderby, expand, top |
dataverse_get_record |
Get a single record by table name and GUID |
dataverse_list_tables |
List available tables/entities with optional filter |
dataverse_get_table_metadata |
Get schema details for a specific table |
Project Structure
src/dataverse_mcp/
├── __init__.py # Package init
├── _app.py # FastMCP instance (avoids circular imports)
├── server.py # Entry point, logging setup, tool registration
├── client.py # DataverseClient wrapper (auth, lifecycle)
├── models.py # Pydantic v2 input models for all tools
└── tools/
├── __init__.py # Tools package init
├── environments.py # Power Platform environment discovery tool
├── solutions.py # Solution query tools
├── tables.py # Table record query tools
└── metadata.py # Table/column metadata tools
Development
# Install dependencies into .venv
uv sync
# Run the MCP inspector for testing
uv run mcp dev src/dataverse_mcp/server.py
# Run the server directly from source
uv run python -m dataverse_mcp.server
# Compile check touched modules
uv run python -m py_compile src/dataverse_mcp/server.py
If you run the server from a local checkout in VS Code, restart the MCP server after code changes so the new Python source is loaded.
License
MIT
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file dataverse_mcp-1.0.0.tar.gz.
File metadata
- Download URL: dataverse_mcp-1.0.0.tar.gz
- Upload date:
- Size: 16.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
be338fcdeafc0878dc02314b6a47c379d57f033d055f4185160ef71cef5da0ca
|
|
| MD5 |
ab7ec1868c7153c658f529f60e11843a
|
|
| BLAKE2b-256 |
04dd7319deb8cd8e02dde589634bb6b05c773fa1da44c7c7116e99f8af859f28
|
Provenance
The following attestation bundles were made for dataverse_mcp-1.0.0.tar.gz:
Publisher:
release.yml on ryanmichaeljames/dataverse-mcp
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
dataverse_mcp-1.0.0.tar.gz -
Subject digest:
be338fcdeafc0878dc02314b6a47c379d57f033d055f4185160ef71cef5da0ca - Sigstore transparency entry: 1439336005
- Sigstore integration time:
-
Permalink:
ryanmichaeljames/dataverse-mcp@79693ddd8466780391e54101f0cb3019f67bc023 -
Branch / Tag:
refs/tags/v1.0.0 - Owner: https://github.com/ryanmichaeljames
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@79693ddd8466780391e54101f0cb3019f67bc023 -
Trigger Event:
push
-
Statement type:
File details
Details for the file dataverse_mcp-1.0.0-py3-none-any.whl.
File metadata
- Download URL: dataverse_mcp-1.0.0-py3-none-any.whl
- Upload date:
- Size: 18.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ecd43675bcabc2daeca7eb4e751bee7dcd1ae39505d3e933dd279c702d90266a
|
|
| MD5 |
b7f7a4853c756d48c2dec7512dd9b64b
|
|
| BLAKE2b-256 |
8cf075fa986ceca78db9045b0a1e697399d74348b2b6ce7236a99224de060e95
|
Provenance
The following attestation bundles were made for dataverse_mcp-1.0.0-py3-none-any.whl:
Publisher:
release.yml on ryanmichaeljames/dataverse-mcp
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
dataverse_mcp-1.0.0-py3-none-any.whl -
Subject digest:
ecd43675bcabc2daeca7eb4e751bee7dcd1ae39505d3e933dd279c702d90266a - Sigstore transparency entry: 1439336017
- Sigstore integration time:
-
Permalink:
ryanmichaeljames/dataverse-mcp@79693ddd8466780391e54101f0cb3019f67bc023 -
Branch / Tag:
refs/tags/v1.0.0 - Owner: https://github.com/ryanmichaeljames
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@79693ddd8466780391e54101f0cb3019f67bc023 -
Trigger Event:
push
-
Statement type: