dataverse_mcp_server

lucamilletti99/dataverse_mcp_server

3.2

If you are the rightful owner of dataverse_mcp_server and would like to certify it and/or have it hosted online, please leave a comment on the right or send an email to dayong@mcphub.com.

The API Registry MCP Server is a Databricks app designed to facilitate the discovery, registration, and management of external API endpoints through an AI-powered chat interface.

Tools
6
Resources
0
Prompts
0

🔌 Dataverse MCP Server

A Model Context Protocol (MCP) server for Microsoft Dataverse, enabling AI assistants like Claude to interact with Dataverse data through natural language.

Built on: Model Context Protocol | Microsoft Dataverse MCP Spec


What is This?

This MCP server exposes Microsoft Dataverse tables and records through the Model Context Protocol, allowing AI assistants to:

  • 📊 List and explore Dataverse tables (entities)
  • 🔍 Query records with OData filters and sorting
  • ✏️ Create new records in any table
  • 🔄 Update existing records by GUID
  • 🤖 Natural language interface via Claude Desktop, VS Code, or any MCP client

Quick Start

1. Prerequisites

  • Python 3.11+
  • Dataverse environment with API access
  • Azure AD app registration with Dataverse permissions

2. Install

# Install dependencies
pip install fastapi uvicorn requests python-dotenv fastmcp

# Or with uv (recommended)
uv pip install fastapi uvicorn requests python-dotenv fastmcp

3. Configure

Run the setup script:

chmod +x setup_dataverse.sh
./setup_dataverse.sh

Or manually create .env.local:

DATAVERSE_HOST=https://org1bfe9c69.api.crm.dynamics.com
DATAVERSE_TENANT_ID=your-tenant-id
DATAVERSE_CLIENT_ID=your-client-id
DATAVERSE_CLIENT_SECRET=your-client-secret

4. Test Connection

python test_dataverse.py

Expected output: ✅ All tests passed! Dataverse MCP server is ready.

5. Start Server

Option A: Run Locally

./watch.sh
# Or: uvicorn server.app:combined_app --reload --port 8000

Option B: Deploy to Databricks Apps

./deploy.sh --create

📖 See for deployment guide.

Server endpoints:

  • 🔧 MCP: http://localhost:8000/mcp (local) or https://your-app.databricksapps.com/apps/your-app/mcp (cloud)
  • 📖 Docs: http://localhost:8000/docs
  • ❤️ Health: http://localhost:8000/api/health

Documentation

DocumentDescription
5-minute quick start guide
Detailed Azure AD & Dataverse setup
Deploy to Databricks Apps
Complete reference documentation

Available MCP Tools

Phase 1 (Implemented)

ToolDescription
healthServer health check
list_tablesList all Dataverse tables
describe_tableGet table schema and columns
read_queryQuery records with OData filters
create_recordCreate new records
update_recordUpdate existing records

Phase 2 (Planned)

  • delete_record - Delete records
  • create_table / update_table / delete_table - Table management
  • list_knowledge_sources / retrieve_knowledge - Copilot Studio integration
  • list_prompts / execute_prompt - Custom prompts

Usage Examples

Claude Desktop

Configure ~/Library/Application Support/Claude/claude_desktop_config.json:

{
  "mcpServers": {
    "dataverse": {
      "url": "http://localhost:8000/mcp"
    }
  }
}

Then in Claude:

You: "List all custom tables in my Dataverse environment"
Claude: [Calls list_tables with custom_only=True]

You: "Show me accounts with revenue over $1M"
Claude: [Calls read_query with filter]

You: "Create a new account called Fabrikam with $2M revenue"
Claude: [Calls create_record]

cURL

# List tables
curl -X POST http://localhost:8000/mcp/call-tool \
  -H "Content-Type: application/json" \
  -d '{"name": "list_tables", "arguments": {"top": 10}}'

# Query accounts
curl -X POST http://localhost:8000/mcp/call-tool \
  -H "Content-Type: application/json" \
  -d '{
    "name": "read_query",
    "arguments": {
      "table_name": "account",
      "select": ["name", "revenue"],
      "filter_query": "revenue gt 1000000",
      "top": 10
    }
  }'

Python

import requests

response = requests.post('http://localhost:8000/mcp/call-tool', json={
    "name": "describe_table",
    "arguments": {"table_name": "account"}
})

print(response.json())

Project Structure

dataverse_mcp_server/
├── server/
│   ├── app.py                      # FastAPI + MCP server
│   ├── dataverse_tools.py          # MCP tool implementations
│   ├── dataverse/
│   │   ├── auth.py                 # OAuth authentication
│   │   ├── client.py               # Dataverse Web API client
│   │   └── __init__.py
│   └── routers/                    # FastAPI REST endpoints
│       ├── health.py               # Health check
│       ├── mcp_info.py             # MCP metadata
│       └── user.py                 # User info
├── client/                         # React frontend (future)
├── test_dataverse.py              # Connection tests
├── setup_dataverse.sh             # Interactive setup
├── watch.sh                       # Dev server with hot reload
├── config.yaml                    # MCP server config
├── env.example                    # Environment template
├── DATAVERSE_QUICKSTART.md        # Quick start guide
├── DATAVERSE_SETUP.md             # Detailed setup
└── README_DATAVERSE.md            # Full reference

Architecture

Authentication: Service Principal (OAuth 2.0 client credentials flow)
API: Dataverse Web API v9.2
Protocol: Model Context Protocol (MCP)
Framework: FastAPI + FastMCP

MCP Clients (Claude, VS Code) 
    ↓ HTTP/MCP
Dataverse MCP Server (FastAPI)
    ↓ HTTPS/OAuth
Microsoft Dataverse

Troubleshooting

ProblemSolution
401 Authentication ErrorCheck client secret validity and API permissions
403 Permission DeniedAssign security role to app user in Power Platform Admin Center
Table Not FoundUse list_tables() to find correct logical name
Connection TimeoutVerify DATAVERSE_HOST and network connectivity

See for detailed troubleshooting.


Development

# Run tests
python test_dataverse.py

# Start dev server
./watch.sh

# Check lints
ruff check server/

# Format code
ruff format server/

Reference Links


License

See

Security

Report vulnerabilities via


Questions? See or

Built with ❤️ for the Dataverse and MCP communities