PowerPlatform Dataverse logo

PowerPlatform Dataverse

Community
michsob

PowerPlatform CLI and MCP tools

Publishermichsob
Repositorypowerplatform-mcp
LanguageTypeScript
Forks
16
Stars
35
Available tools
0
Transport typestdio
Categories
LicenseMIT
Links
  • Connect tools to AI workflows

    PowerPlatform Dataverse exposes MCP capabilities that can be used by compatible AI clients and agents.

  • 0 available tools

    Browse the callable actions below, including names and descriptions when provided by the server.

  • Ready-to-copy setup

    Use the installation snippets to configure this server in your preferred MCP client.

  • Open source signals

    35 stars and 16 forks from the linked repository.

PowerPlatform MCP / CLI

A Model Context Protocol (MCP) server and standalone CLI for querying and configuring PowerPlatform / Dataverse environments. Supports multiple environments, entity metadata, records, plugins, flows, solutions, workflows, business rules, security roles, custom APIs, web resources, and more — including write operations for automated environment setup.

Why MCP + CLI?

MCP integrates directly with AI clients (Claude, Cursor, GitHub Copilot) for interactive, conversational exploration of your environments.

CLI writes results to a file system cache instead of returning them inline. MCP tool responses are bound by the AI client's context window, which can truncate or degrade results when querying environments with hundreds of entities, flows, or plugin steps. The CLI avoids this limitation by persisting full results to disk, making them available for follow-up analysis without context pressure. Both interfaces share the same tools and capabilities.

Installation

Requires Node.js 22+ (< 25).

MCP Server

bash
npm install -g powerplatform-mcp
# or
npx powerplatform-mcp

CLI

bash
npm install -g powerplatform-cli
# or
npx powerplatform-cli

Docker

bash
# MCP Server
docker pull ghcr.io/michsob/powerplatform-mcp
docker run --env-file .env ghcr.io/michsob/powerplatform-mcp

# CLI
docker pull ghcr.io/michsob/powerplatform-cli
docker run --env-file .env ghcr.io/michsob/powerplatform-cli entity-attributes account

Configuration

The tool supports multiple environments. Define them via environment variables:

bash
POWERPLATFORM_ENVIRONMENTS=DEV,UAT,PROD

# For each environment, set:
POWERPLATFORM_DEV_URL=https://dev-org.crm.dynamics.com
POWERPLATFORM_DEV_CLIENT_ID=your-client-id
POWERPLATFORM_DEV_CLIENT_SECRET=your-client-secret
POWERPLATFORM_DEV_TENANT_ID=your-tenant-id

POWERPLATFORM_UAT_URL=https://uat-org.crm.dynamics.com
POWERPLATFORM_UAT_CLIENT_ID=...
POWERPLATFORM_UAT_CLIENT_SECRET=...
POWERPLATFORM_UAT_TENANT_ID=...

For local development, copy .env.example to .env and fill in your credentials.

MCP Server

The MCP server is designed for AI-powered clients (Claude, Cursor, GitHub Copilot).

Available MCP Tools (67)

All tools accept an optional environment parameter to target a specific environment (defaults to the first configured).

Entity

ToolDescriptionRequired ParamsOptional
get-entity-metadataGet entity metadataentityName
get-entity-attributesList all attributes/fieldsentityName
get-entity-attributeGet a specific attributeentityName, attributeName
get-entity-relationshipsGet 1:N and N:N relationshipsentityName
create-entity-string-attributeCreate a Single Line of Text columnentityName, schemaName, displayNamemaxLength, requiredLevel, description, solutionName
get-entity-keysList alternate keys on an entityentityName
create-entity-alternate-keyCreate an alternate keyentityName, schemaName, displayName, keyAttributessolutionName

Records

ToolDescriptionRequired ParamsOptional
get-recordGet a record by IDentityNamePlural, recordId
query-recordsOData queryentityNamePlural, filtermaxRecords (default 50)

Plugins

ToolDescriptionRequired ParamsOptional
get-plugin-assembliesList plugin assembliesincludeManaged, maxRecords
get-plugin-assembly-completeAssembly with types, steps, imagesassemblyNameincludeDisabled
get-entity-plugin-pipelinePlugins executing on an entityentityNamemessageFilter, includeDisabled
get-plugin-trace-logsPlugin trace logsentityName, messageName, correlationId, pluginStepId, exceptionOnly, hoursBack, maxRecords
get-all-plugin-stepsAll SDK message processing stepsincludeDisabled, maxRecords
get-plugin-typeLook up a plugin type by class nametypeName
get-sdk-messageLook up an SDK message by namemessageName
create-plugin-stepRegister a plugin stepname, pluginTypeId, sdkMessageId, stage, moderank, supportedDeployment, description, configuration, sdkMessageFilterId, solutionName

Flows (Power Automate)

ToolDescriptionRequired ParamsOptional
get-flowsList cloud flows (smart filtering)activeOnly, maxRecords, nameContains, excludeSystem, excludeCustomerInsights, excludeCopilotSales
search-workflowsSearch workflows and flowsname, primaryEntity, description, category, statecode, includeDescription, maxResults
get-flow-definitionFull definition or parsed summaryflowIdsummary
get-flow-runsFlow run historyflowIdstatus, startedAfter, startedBefore, maxRecords
get-flow-run-detailsRun details with action-level errorsflowId, runId
cancel-flow-runCancel a running/waiting runflowId, runId
resubmit-flow-runRetry a failed runflowId, runId
scan-flow-healthBatch health scan (success rates)daysBack, maxRunsPerFlow, maxFlows, activeOnly
get-flow-inventoryLightweight flow inventorymaxRecords

Solutions

ToolDescriptionRequired ParamsOptional
get-publishersList non-readonly publishers
get-solutionsList visible solutions
get-solutionGet solution by unique nameuniqueName
get-solution-componentsList components in a solutionsolutionUniqueName
export-solutionExport solution (base64)solutionNamemanaged
add-solution-componentAdd a component to a solutionsolutionUniqueName, componentId, componentTypeaddRequiredComponents
publish-customizationsPublish entity or all customizationsentityLogicalName

Workflows (Classic)

ToolDescriptionRequired ParamsOptional
get-workflowsList classic workflowsactiveOnly, maxRecords
get-workflow-definitionXAML definition or summaryworkflowIdsummary
get-ootb-workflowsBackground, BPFs, actions, on-demandmaxRecords, categories

Business Rules

ToolDescriptionRequired ParamsOptional
get-business-rulesList business rulesactiveOnly, maxRecords
get-business-ruleBusiness rule with XAMLworkflowId

Option Sets

ToolDescriptionRequired Params
get-global-option-setGet a global option set definitionoptionSetName

Configuration

ToolDescriptionRequired ParamsOptional
get-connection-referencesConnection referencesmaxRecords, managedOnly, hasConnection, inactive
get-environment-variablesEnvironment variable definitions + valuesmaxRecords, managedOnly
create-environment-variableCreate an environment variable definitionschemaName, displayName, typedefaultValue, description, solutionName
set-environment-variable-valueSet or update an environment variable valuedefinitionId, valueexistingValueId

Custom APIs

ToolDescriptionRequired ParamsOptional
get-custom-apisList Custom API definitionsmaxRecords, includeManaged
get-custom-apiGet a Custom API by unique nameuniqueName
create-custom-apiCreate a Custom API definitionuniqueName, name, displayName, bindingType, isFunction, isPrivate, allowedCustomProcessingStepTypedescription, pluginTypeId, pluginTypeName, boundEntityLogicalName, solutionName
get-custom-api-response-propertiesList response propertiescustomApiId
create-custom-api-response-propertyCreate a response propertycustomApiId, uniqueName, name, displayName, typedescription, logicalEntityName, isOptional, solutionName
get-custom-api-request-parametersList request parameterscustomApiId
create-custom-api-request-parameterCreate a request parametercustomApiId, uniqueName, name, displayName, typedescription, logicalEntityName, isOptional, solutionName

Web Resources

ToolDescriptionRequired ParamsOptional
get-web-resourcesList web resourcesmaxRecords, webResourceType, nameFilter
get-web-resourceGet a web resource by namename
create-web-resourceUpload a new web resourcename, displayName, webResourceType, contentdescription, solutionName

Security Roles

ToolDescriptionRequired ParamsOptional
get-security-rolesList customizable security rolessolutionUniqueName, excludeSystemRoles, includePrivileges, maxRecords
get-security-role-privilegesPrivileges for a role (name, accessright, depth mask)roleIdentityFilter, accessRightFilter
list-privilegesBrowse the system privilege catalog to discover privilegeId GUIDs and supported depthsentityFilter, accessRightFilter, maxRecords
create-security-roleCreate a new role (defaults to root BU); optional solutionUniqueName adds it to a solution in one stepnamebusinessUnitId, description, solutionUniqueName
clone-security-roleClone a role with its privileges. Uses CloneAsRole with a create-then-copy fallback when the action isn't availablesourceRoleIdnewName, targetBusinessUnitId, solutionUniqueName
update-security-roleUpdate a role's name, description, or business unitroleIdname, description, businessUnitId, solutionUniqueName
delete-security-roleDelete a role (destructive — requires confirm: true)roleId, confirm
add-security-role-privilegesAppend privileges to a role (AddPrivilegesRole — leaves existing privileges intact)roleId, privileges[]
remove-security-role-privilegesRemove privileges from a role (loops RemovePrivilegeRole)roleId, privilegeIds[]
replace-security-role-privilegesWipe and replace the full privilege set (ReplacePrivilegesRole — destructive, requires confirm: true)roleId, privileges[], confirm

Each item in privileges[] is { privilegeId, depth, businessUnitId? }. Depth is one of Basic (user), Local (BU), Deep (BU + child), Global (org).

Dependencies

ToolDescriptionRequired Params
check-component-dependenciesDependencies blocking deletioncomponentId, componentType
check-delete-eligibilityCheck if a component can be deletedcomponentId, componentType

Service Endpoints

ToolDescriptionOptional
get-service-endpointsService Bus, webhooks, Event Hub, Event GridmaxRecords

MCP Prompts

PromptDescriptionRequired Args
entity-overviewEntity overview with key attributes and relationshipsentityName
attribute-detailsDetailed attribute info (type, format, requirements)entityName, attributeName
query-templateOData query template with example filtersentityName
relationship-mapComplete 1:N and N:N relationship mapentityName

CLI

Same tools as the MCP server, but results are cached to the file system for full-fidelity output on large data sets.

Global Option

--env <name> — target environment (defaults to first configured).

Commands

Entity

entity-metadata <entityName>
entity-attributes <entityName>
entity-attribute <entityName> <attributeName>
entity-relationships <entityName>
entity-keys <entityName>
create-entity <schemaName> <displayName> <displayCollectionName>  [--primary-name-schema <name>] [--primary-name-display <name>] [--description <desc>] [--ownership <UserOwned|OrganizationOwned>] [--has-activities] [--has-notes] [--solution <name>]
create-entity-string-attribute <entityName> <schemaName> <displayName>  [--max-length <n>] [--required-level <level>] [--description <desc>] [--solution <name>]
create-entity-memo-attribute <entityName> <schemaName> <displayName>  [--max-length <n>] [--required-level <level>] [--description <desc>] [--solution <name>]
create-entity-integer-attribute <entityName> <schemaName> <displayName>  [--min <n>] [--max <n>] [--required-level <level>] [--description <desc>] [--solution <name>]
create-entity-decimal-attribute <entityName> <schemaName> <displayName>  [--precision <n>] [--min <n>] [--max <n>] [--required-level <level>] [--description <desc>] [--solution <name>]
create-entity-money-attribute <entityName> <schemaName> <displayName>  [--precision-source <0|1|2>] [--precision <n>] [--min <n>] [--max <n>] [--required-level <level>] [--description <desc>] [--solution <name>]
create-entity-boolean-attribute <entityName> <schemaName> <displayName>  [--true-label <label>] [--false-label <label>] [--default-value <true|false>] [--required-level <level>] [--description <desc>] [--solution <name>]
create-entity-datetime-attribute <entityName> <schemaName> <displayName>  [--format <DateOnly|DateAndTime>] [--behavior <UserLocal|DateOnly|TimeZoneIndependent>] [--required-level <level>] [--description <desc>] [--solution <name>]
create-entity-picklist-attribute <entityName> <schemaName> <displayName>  [-o <value:label>]... [--required-level <level>] [--description <desc>] [--solution <name>]
create-entity-lookup <referencingEntity> <referencedEntity> <relationshipSchemaName> <lookupSchemaName> <displayName>  [--required-level <level>] [--description <desc>] [--cascade-delete <NoCascade|RemoveLink|Restrict|Cascade>] [--solution <name>]
create-entity-alternate-key <entityName> <schemaName> <displayName> <keyAttributes...>  [--solution <name>]
delete-entity-attribute <entityName> <attributeName>

Records

record <entityNamePlural> <recordId>
query-records <entityNamePlural> <filter>  [--max <n>]
create-record <entityNamePlural> <jsonBody>
update-record <entityNamePlural> <recordId> <jsonBody>
delete-record <entityNamePlural> <recordId>
associate-records <entityNamePlural> <recordId> <navigationProperty> <relatedEntityNamePlural> <relatedRecordId>
disassociate-records <entityNamePlural> <recordId> <navigationProperty> [relatedRecordId]

Plugins

plugin-assemblies                          [--include-managed] [--max <n>]
plugin-assembly <assemblyName>             [--include-disabled]
plugin-packages                            [--include-managed] [--max <n>]
plugin-type <typeName>
entity-pipeline <entityName>               [--message <msg>] [--include-disabled]
plugin-trace-logs                          [--entity <name>] [--message <msg>] [--correlation-id <id>] [--step-id <id>] [--hours <n>] [--max <n>] [--exceptions-only]
all-plugin-steps                           [--include-disabled] [--max <n>]
sdk-message <messageName>
register-plugin-package <filePath>         [--pkg-version <version>] [--solution <name>]
update-plugin-package <filePath>           --plugin-package-id <id> [--pkg-version <version>]
create-plugin-step <name> <pluginTypeId> <sdkMessageId>  [--stage <n>] [--mode <n>] [--rank <n>] [--supported-deployment <n>] [--description <desc>] [--configuration <cfg>] [--message-filter-id <id>] [--solution <name>]
create-plugin-step-image <stepId>          [--name <name>] [--entity-alias <alias>] [--image-type <0|1|2>] [--message-property-name <name>] [--attributes <csv>]

Flows

flows                                      [--active] [--name <contains>] [--include-managed] [--max <n>]
flow-definition <flowId>                   [--summary]
flow-inventory                             [--max <n>]
flow-runs <flowId>                         [--status <s>] [--after <iso>] [--before <iso>] [--max <n>]
flow-run-details <flowId> <runId>
flow-health                                [--days <n>] [--max-runs <n>] [--max-flows <n>] [--active]
search-workflows                           [--name <name>] [--entity <entity>] [--category <n>] [--active] [--max <n>]
create-cloud-flow <clientDataFile>         [--primary-entity <entity>] [--solution <name>]
activate-flow <flowId>
deactivate-flow <flowId>

Solutions

solutions
solution <uniqueName>
solution-components <uniqueName>
publishers
add-solution-component <solutionUniqueName> <componentId> <componentType>  [--add-required]
publish-customizations                     [--entity <logicalName>]

Workflows

workflows                                  [--active] [--max <n>]
workflow-definition <workflowId>           [--summary]
ootb-workflows                             [--categories <0,1,2,3,4>]

Business Rules

business-rules                             [--active] [--max <n>]
business-rule <workflowId>

Option Sets

optionset <optionSetName>

Dependencies

check-dependencies <componentId> <componentType>

Configuration

connection-references                      [--managed-only] [--has-connection] [--no-connection] [--inactive] [--max-records <n>]
create-connection-reference <logicalName> <displayName> <connectorId>  [--description <desc>] [--solution <name>]
environment-variables                      [--managed-only] [--max-records <n>]
create-environment-variable <schemaName> <displayName>  [--type <type>] [--default-value <val>] [--description <desc>] [--solution <name>]
set-environment-variable-value <definitionId> <value>   [--existing-value-id <id>]

Custom APIs

custom-apis                                [--include-managed] [--max <n>]
custom-api <uniqueName>
create-custom-api <uniqueName> <displayName>  [--binding-type <n>] [--bound-entity <name>] [--is-function] [--is-private] [--processing-type <n>] [--plugin-type-id <id>] [--plugin-type-name <name>] [--description <desc>] [--solution <name>]
custom-api-response-properties <customApiId>
create-custom-api-response-property <customApiId> <uniqueName> <displayName>  [--type <n>] [--description <desc>] [--solution <name>]
custom-api-request-parameters <customApiId>
create-custom-api-request-parameter <customApiId> <uniqueName> <displayName>  [--type <n>] [--description <desc>] [--optional] [--solution <name>]

Web Resources

web-resources                              [--type <n>] [--name <contains>] [--max <n>]
web-resource <name>
create-web-resource <name> <displayName> <filePath>  [--type <n>] [--description <desc>] [--solution <name>]
set-entity-icon <entityName> <svgFilePath>  [--solution <name>] [--web-resource-name <name>] [--display-name <name>] [--no-publish]

Forms & Views

entity-forms <entityName>                  [--type <n>]
entity-form-fields <formId>
add-form-field <entityName> <formId> <attributeName>
remove-form-field <entityName> <formId> <attributeName>
entity-views <entityName>
add-view-column <entityName> <viewId> <attributeName>   [--width <n>]
set-view-columns <entityName> <viewId> <columns...>     [--order-by <attr>] [--desc]
remove-view-column <entityName> <viewId> <attributeName>

PAC Integration

pac-auth                                   Authenticate pac CLI using environment credentials
generate-models <outdirectory>             [--settings <path>] [--entities <filter>] [--namespace <ns>]
deploy-plugin <pluginFile>                 --plugin-id <id> [--type <Nuget|Assembly>] [--configuration <config>]

Security Roles

security-roles                             [--solution <name>] [--include-system] [--include-privileges] [--max-records <n>]
security-role-privileges <roleId>          [--entity <name>] [--access-right <type>]
privileges                                 [--entity <name>] [--access-right <type>] [--max-records <n>]
create-security-role                       --name <name> [--bu <id>] [--description <desc>] [--solution <name>]
clone-security-role <sourceRoleId>         [--name <name>] [--target-bu <id>] [--solution <name>]
update-security-role <roleId>              [--name <name>] [--description <desc>] [--bu <id>] [--solution <name>]
delete-security-role <roleId>              --yes
add-role-privileges <roleId>               --privileges <spec>     # JSON array or shorthand <guid>:<Basic|Local|Deep|Global>,...
remove-role-privileges <roleId>            --privileges <id,id,id>
replace-role-privileges <roleId>           --privileges <spec> --yes

Service Endpoints

service-endpoints                          [--max <n>]

Development

bash
git clone https://github.com/michsob/powerplatform-mcp.git
cd powerplatform-mcp
npm install
cp .env.example .env   # fill in credentials
npm run build
npm run inspector      # test with MCP Inspector

Releasing

To publish a new version:

  1. Update version in package.json
  2. Commit the change to main
  3. Create and push a version tag:
    bash
    git tag v1.0.2
    git push origin v1.0.2

GitHub Actions will automatically publish:

PackagenpmGitHub PackagesDocker (GHCR)
MCP Servernpm i powerplatform-mcpnpm i @michsob/powerplatform-mcpghcr.io/michsob/powerplatform-mcp
CLInpm i powerplatform-clinpm i @michsob/powerplatform-clighcr.io/michsob/powerplatform-cli

npm publishing uses Trusted Publishing (OIDC) — no tokens or secrets needed. GitHub Packages and GHCR use the built-in GITHUB_TOKEN automatically.

License

MIT

MseeP.ai Security Assessment Badge

Installation

TypingMind
Prerequisites:

Node.js 18+

{
  "mcpServers": {
    "powerplatform-mcp": {
      "command": "npx",
      "args": [
        "-y",
        "powerplatform-mcp"
      ],
      "env": {
        "POWERPLATFORM_URL": "https://yourenvironment.crm.dynamics.com",
        "POWERPLATFORM_CLIENT_ID": "your-azure-app-client-id",
        "POWERPLATFORM_CLIENT_SECRET": "your-azure-app-client-secret",
        "POWERPLATFORM_TENANT_ID": "your-azure-tenant-id"
      }
    }
  }
}

Use PowerPlatform Dataverse MCP with multiple AI models

TypingMind connects MCP tools at the workspace level, so once PowerPlatform Dataverse is connected, you can use it with different AI models in TypingMind instead of setting it up separately for each model. This MCP runs locally through the TypingMind MCP connector on your device.

Setup guide to use the local connector

Use this when the MCP server needs access to local files, apps, or private resources on your computer.

1

Open the MCP settings

In TypingMind, go to Settings, Advanced Settings, then Model Context Protocol and choose Setup Connector.

  1. Open TypingMind in your browser.
  2. Click the Settings icon.
  3. Go to Advanced Settings.
  4. Open the Model Context Protocol section.
  5. Click Setup Connector and choose This Device.
TypingMind MCP connector setup screen with This Device selected
2

Run the connector command

Choose This Device, copy the command from TypingMind, and run it in Terminal. Keep the process running while you use MCP.

  1. Copy the setup command shown by TypingMind.
  2. Open Terminal on macOS or Windows Terminal on Windows.
  3. Paste and run the command.
  4. Approve the package install if Terminal asks you to proceed.
  5. Keep the Terminal window running while using MCP tools.
3

Add PowerPlatform Dataverse as a server

When the connector status is Ready, click Edit Servers and paste the MCP server configuration.

  1. Wait until the connector status shows Ready.
  2. Click Edit Servers.
  3. Paste the PowerPlatform Dataverse MCP server configuration.
  4. Save the server list.
  5. Refresh if you want to confirm the connector is still ready.
TypingMind MCP settings showing active server and Edit Servers button
{
  "mcpServers": {
    "powerplatform-dataverse": {
      "command": "npx",
      "args": [
        "-y",
        "powerplatform-mcp"
      ]
    }
  }
}
4

Use it across models

Save the server list, open Plugins, enable the PowerPlatform Dataverse MCP tools, then select any supported AI model in TypingMind and use the tools in chat or assign them to an AI agent.

  1. Open the Plugins page in TypingMind.
  2. Enable the PowerPlatform Dataverse MCP tools.
  3. Start a chat and choose the AI model you want to use.
  4. Use the MCP tools in chat or assign them to an AI agent.
  5. Switch to another AI model whenever needed without reconnecting MCP.
TypingMind chat using enabled MCP tools with a selected AI model
Can you use PowerPlatform Dataverse to help me with this task?
PowerPlatform Dataverse
Sure. I read it.
Here is what I found using PowerPlatform Dataverse.

Frequently asked questions

What is the PowerPlatform Dataverse MCP server used for?

PowerPlatform Dataverse is an MCP server that lets compatible AI clients connect to external tools and context. In TypingMind, you can add this MCP server once and make its tools available in your AI workspace.

Can I use PowerPlatform Dataverse MCP with multiple AI models in TypingMind?

Yes. TypingMind connects MCP tools at the workspace level, so you can use PowerPlatform Dataverse with different AI models such as Claude, ChatGPT, Gemini, or other models you have configured in TypingMind without setting up the MCP server separately for each model.

Why use PowerPlatform Dataverse MCP with TypingMind?

TypingMind is one of the best frontends for LLM chat because it brings multiple AI models, prompts, plugins, AI agents, API keys, and MCP tools into one workspace. With PowerPlatform Dataverse connected, you can use its MCP tools across your preferred models while keeping your chat workflow organized in TypingMind.

How do I connect PowerPlatform Dataverse MCP to TypingMind?

PowerPlatform Dataverse runs through the TypingMind local MCP connector. This is best when the MCP server needs access to local files, desktop apps, command-line tools, or private resources on your computer.

What tools does PowerPlatform Dataverse MCP provide in TypingMind?

PowerPlatform Dataverse exposes MCP capabilities that can be enabled from the TypingMind Plugins page and used in chat or assigned to AI agents.

Do I need to share my API keys with TypingMind to use PowerPlatform Dataverse MCP?

No. TypingMind is local-first and lets you keep your model providers, API keys, prompts, and MCP configuration under your control. If PowerPlatform Dataverse requires authentication, add the required headers, OAuth settings, or local configuration for that MCP server when you create the connection.

Related MCP Servers

View all

Set up your own AI workspace now

Get notified about new features and future giveaways by subscribing to our newsletter 👇