powerplatform-mcp

A Model Context Protocol (MCP) server and standalone CLI for querying PowerPlatform / Dataverse environments. Supports multiple environments, entity metadata, records, plugins, flows, solutions, workflows, business rules, security roles, and more.

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

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

CLI

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

Docker

# 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:

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, 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, 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 roleroleIdentityFilter, accessRightFilter

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>
create-entity-string-attribute <entityName> <schemaName> <displayName>  [--max-length <n>] [--required-level <level>] [--description <desc>] [--solution <name>]
entity-keys <entityName>
create-entity-alternate-key <entityName> <schemaName> <displayName> <keyAttributes...>  [--solution <name>]

Records

record <entityNamePlural> <recordId>
query-records <entityNamePlural> <filter>  [--max <n>]

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>] [--hours <n>] [--max <n>] [--exceptions-only]
all-plugin-steps                           [--include-disabled] [--max <n>]
sdk-message <messageName>
register-plugin-package <filePath>         --name <name> --unique-name <uniqueName> [--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>] [--solution <name>]

Flows

flows                                      [--active] [--name <contains>] [--max <n>]
flow-definition <flowId>                   [--summary]
search-workflows                           (interactive filters)

Solutions

solutions
solution <uniqueName>
solution-components <uniqueName>
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>]
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>] [--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>]

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>]

Service Endpoints

service-endpoints                          [--max <n>]

Development

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:
    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

PowerPlatform MCP server

MseeP.ai Security Assessment Badge

Related Servers

NotebookLM Web Importer

Import web pages and YouTube videos to NotebookLM with one click. Trusted by 200,000+ users.

Install Chrome Extension