powerplatform-mcp

Um servidor Model Context Protocol (MCP) e CLI independente para consultar ambientes PowerPlatform / Dataverse. Suporta múltiplos ambientes, metadados de entidades, registros, plugins, fluxos, soluções, workflows, regras de negócio, funções de segurança e muito mais.

Documentação

PowerPlatform MCP / CLI

Um servidor Model Context Protocol (MCP) e CLI independente para consultar e configurar ambientes PowerPlatform / Dataverse. Suporta múltiplos ambientes, metadados de entidades, registros, plugins, fluxos, soluções, workflows, regras de negócio, perfis de segurança, APIs personalizadas, recursos web e muito mais — incluindo operações de escrita para configuração automatizada de ambientes.

Por que MCP + CLI?

MCP integra-se diretamente com clientes de IA (Claude, Cursor, GitHub Copilot) para exploração interativa e conversacional dos seus ambientes.

CLI grava resultados em um cache do sistema de arquivos em vez de retorná-los inline. As respostas das ferramentas MCP são limitadas pela janela de contexto do cliente de IA, o que pode truncar ou degradar resultados ao consultar ambientes com centenas de entidades, fluxos ou etapas de plugins. A CLI evita essa limitação persistindo resultados completos em disco, disponibilizando-os para análises posteriores sem pressão de contexto. Ambas as interfaces compartilham as mesmas ferramentas e capacidades.

Instalação

Requer Node.js 22+ (< 25).

Servidor MCP

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

Configuração

A ferramenta suporta múltiplos ambientes. Defina-os por meio de variáveis de ambiente:

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=...

Para desenvolvimento local, copie .env.example para .env e preencha suas credenciais.

Servidor MCP

O servidor MCP é projetado para clientes com tecnologia de IA (Claude, Cursor, GitHub Copilot).

Ferramentas MCP disponíveis (67)

Todas as ferramentas aceitam um parâmetro opcional environment para direcionar um ambiente específico (o padrão é o primeiro configurado).

Entidade

FerramentaDescriçãoParâmetros obrigatóriosOpcional
get-entity-metadataObter metadados da entidadeentityName
get-entity-attributesListar todos os atributos/camposentityName
get-entity-attributeObter um atributo específicoentityName, attributeName
get-entity-relationshipsObter relacionamentos 1:N e N:NentityName
create-entity-string-attributeCriar uma coluna de Texto de Linha ÚnicaentityName, schemaName, displayNamemaxLength, requiredLevel, description, solutionName
get-entity-keysListar chaves alternativas em uma entidadeentityName
create-entity-alternate-keyCriar uma chave alternativaentityName, schemaName, displayName, keyAttributessolutionName

Registros

FerramentaDescriçãoParâmetros obrigatóriosOpcional
get-recordObter um registro por IDentityNamePlural, recordId
query-recordsConsulta ODataentityNamePlural, filtermaxRecords (padrão 50)

Plugins

FerramentaDescriçãoParâmetros obrigatóriosOpcional
get-plugin-assembliesListar assemblies de pluginsincludeManaged, maxRecords
get-plugin-assembly-completeAssembly com tipos, etapas, imagensassemblyNameincludeDisabled
get-entity-plugin-pipelinePlugins executando em uma entidadeentityNamemessageFilter, includeDisabled
get-plugin-trace-logsLogs de rastreamento de pluginsentityName, messageName, correlationId, pluginStepId, exceptionOnly, hoursBack, maxRecords
get-all-plugin-stepsTodas as etapas de processamento de mensagens SDKincludeDisabled, maxRecords
get-plugin-typePesquisar um tipo de plugin pelo nome da classetypeName
get-sdk-messagePesquisar uma mensagem SDK pelo nomemessageName
create-plugin-stepRegistrar uma etapa de pluginname, pluginTypeId, sdkMessageId, stage, moderank, supportedDeployment, description, configuration, sdkMessageFilterId, solutionName

Fluxos (Power Automate)

FerramentaDescriçãoParâmetros obrigatóriosOpcional
get-flowsListar fluxos de nuvem (filtragem inteligente)activeOnly, maxRecords, nameContains, excludeSystem, excludeCustomerInsights, excludeCopilotSales
search-workflowsPesquisar workflows e fluxosname, primaryEntity, description, category, statecode, includeDescription, maxResults
get-flow-definitionDefinição completa ou resumo analisadoflowIdsummary
get-flow-runsHistórico de execuções do fluxoflowIdstatus, startedAfter, startedBefore, maxRecords
get-flow-run-detailsDetalhes da execução com erros no nível da açãoflowId, runId
cancel-flow-runCancelar uma execução em andamento/aguardandoflowId, runId
resubmit-flow-runRepetir uma execução com falhaflowId, runId
scan-flow-healthVerificação de saúde em lote (taxas de sucesso)daysBack, maxRunsPerFlow, maxFlows, activeOnly
get-flow-inventoryInventário leve de fluxosmaxRecords

Soluções

FerramentaDescriçãoParâmetros obrigatóriosOpcional
get-publishersListar editores não somente leitura
get-solutionsListar soluções visíveis
get-solutionObter solução pelo nome exclusivouniqueName
get-solution-componentsListar componentes em uma soluçãosolutionUniqueName
export-solutionExportar solução (base64)solutionNamemanaged
add-solution-componentAdicionar um componente a uma soluçãosolutionUniqueName, componentId, componentTypeaddRequiredComponents
publish-customizationsPublicar entidade ou todas as personalizaçõesentityLogicalName

Workflows (Clássico)

FerramentaDescriçãoParâmetros obrigatóriosOpcional
get-workflowsListar workflows clássicosactiveOnly, maxRecords
get-workflow-definitionDefinição XAML ou resumoworkflowIdsummary
get-ootb-workflowsEm segundo plano, BPFs, ações, sob demandamaxRecords, categories

Regras de Negócio

FerramentaDescriçãoParâmetros obrigatóriosOpcional
get-business-rulesListar regras de negócioactiveOnly, maxRecords
get-business-ruleRegra de negócio com XAMLworkflowId

Conjuntos de Opções

FerramentaDescriçãoParâmetros obrigatórios
get-global-option-setObter definição de conjunto de opções globaloptionSetName

Configuração

FerramentaDescriçãoParâmetros obrigatóriosOpcional
get-connection-referencesReferências de conexãomaxRecords, managedOnly, hasConnection, inactive
get-environment-variablesDefinições de variáveis de ambiente + valoresmaxRecords, managedOnly
create-environment-variableCriar uma definição de variável de ambienteschemaName, displayName, typedefaultValue, description, solutionName
set-environment-variable-valueDefinir ou atualizar um valor de variável de ambientedefinitionId, valueexistingValueId

APIs Personalizadas

FerramentaDescriçãoParâmetros obrigatóriosOpcional
get-custom-apisListar definições de API personalizadamaxRecords, includeManaged
get-custom-apiObter uma API personalizada pelo nome exclusivouniqueName
create-custom-apiCriar uma definição de API personalizadauniqueName, name, displayName, bindingType, isFunction, isPrivate, allowedCustomProcessingStepTypedescription, pluginTypeId, pluginTypeName, boundEntityLogicalName, solutionName
get-custom-api-response-propertiesListar propriedades de respostacustomApiId
create-custom-api-response-propertyCriar uma propriedade de respostacustomApiId, uniqueName, name, displayName, typedescription, logicalEntityName, isOptional, solutionName
get-custom-api-request-parametersListar parâmetros de solicitaçãocustomApiId
create-custom-api-request-parameterCriar um parâmetro de solicitaçãocustomApiId, uniqueName, name, displayName, typedescription, logicalEntityName, isOptional, solutionName

Recursos Web

FerramentaDescriçãoParâmetros obrigatóriosOpcional
get-web-resourcesListar recursos webmaxRecords, webResourceType, nameFilter
get-web-resourceObter um recurso web pelo nomename
create-web-resourceEnviar um novo recurso webname, displayName, webResourceType, contentdescription, solutionName

Perfis de Segurança

FerramentaDescriçãoParâmetros obrigatóriosOpcional
get-security-rolesListar perfis de segurança personalizáveissolutionUniqueName, excludeSystemRoles, includePrivileges, maxRecords
get-security-role-privilegesPrivilégios para um perfil (nome, direito de acesso, máscara de profundidade)roleIdentityFilter, accessRightFilter
list-privilegesNavegar pelo catálogo de privilégios do sistema para descobrir GUIDs de privilegeId e profundidades suportadasentityFilter, accessRightFilter, maxRecords
create-security-roleCriar um novo perfil (padrão para BU raiz); solutionUniqueName opcional adiciona-o a uma solução em uma única etapanamebusinessUnitId, description, solutionUniqueName
clone-security-roleClonar um perfil com seus privilégios. Usa CloneAsRole com fallback de criar-depois-copiar quando a ação não está disponívelsourceRoleIdnewName, targetBusinessUnitId, solutionUniqueName
update-security-roleAtualizar nome, descrição ou unidade de negócio de um perfilroleIdname, description, businessUnitId, solutionUniqueName
delete-security-roleExcluir um perfil (destrutivo — requer confirm: true)roleId, confirm
add-security-role-privilegesAcrescentar privilégios a um perfil (AddPrivilegesRole — mantém os privilégios existentes intactos)roleId, privileges[]
remove-security-role-privilegesRemover privilégios de um perfil (faz loop em RemovePrivilegeRole)roleId, privilegeIds[]
replace-security-role-privilegesApagar e substituir o conjunto completo de privilégios (ReplacePrivilegesRole — destrutivo, requer confirm: true)roleId, privileges[], confirm

Cada item em privileges[] é { privilegeId, depth, businessUnitId? }. A profundidade é uma de Basic (usuário), Local (BU), Deep (BU + filho), Global (org).

Dependências

FerramentaDescriçãoParâmetros obrigatórios
check-component-dependenciesDependências que bloqueiam exclusãocomponentId, componentType
check-delete-eligibilityVerificar se um componente pode ser excluídocomponentId, componentType

Endpoints de Serviço

FerramentaDescriçãoOpcional
get-service-endpointsService Bus, webhooks, Event Hub, Event GridmaxRecords

Prompts MCP

PromptDescriçãoArgumentos obrigatórios
entity-overviewVisão geral da entidade com atributos e relacionamentos principaisentityName
attribute-detailsInformações detalhadas do atributo (tipo, formato, requisitos)entityName, attributeName
query-templateModelo de consulta OData com filtros de exemploentityName
relationship-mapMapa completo de relacionamentos 1:N e N:NentityName

CLI

Mesmas ferramentas do servidor MCP, mas os resultados são armazenados em cache no sistema de arquivos para saída com fidelidade total em grandes conjuntos de dados.

Opção Global

--env <name> — ambiente de destino (padrão para o primeiro configurado).

Comandos

Entidade

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>

Registros

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

Fluxos

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>

Soluções

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

Fluxos de Trabalho

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

Regras de Negócio

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

Conjuntos de Opções

optionset <optionSetName>

Dependências

check-dependencies <componentId> <componentType>

Configuração

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

APIs Personalizadas

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

Recursos da Web

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]

Formulários e Exibições

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>

Integração PAC

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

Funções de Segurança

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

Endpoints de Serviço

service-endpoints                          [--max <n>]

Desenvolvimento

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

Publicação

Para publicar uma nova versão:

  1. Atualize version em package.json
  2. Faça commit da alteração para main
  3. Crie e envie uma tag de versão:
    git tag v1.0.2
    git push origin v1.0.2
    

O GitHub Actions publicará automaticamente:

PacotenpmGitHub 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

A publicação npm usa Trusted Publishing (OIDC) — nenhum token ou segredo é necessário. O GitHub Packages e o GHCR usam o GITHUB_TOKEN integrado automaticamente.

Licença

MIT

PowerPlatform MCP server

MseeP.ai Security Assessment Badge