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
| Ferramenta | Descrição | Parâmetros obrigatórios | Opcional |
|---|---|---|---|
get-entity-metadata | Obter metadados da entidade | entityName | |
get-entity-attributes | Listar todos os atributos/campos | entityName | |
get-entity-attribute | Obter um atributo específico | entityName, attributeName | |
get-entity-relationships | Obter relacionamentos 1:N e N:N | entityName | |
create-entity-string-attribute | Criar uma coluna de Texto de Linha Única | entityName, schemaName, displayName | maxLength, requiredLevel, description, solutionName |
get-entity-keys | Listar chaves alternativas em uma entidade | entityName | |
create-entity-alternate-key | Criar uma chave alternativa | entityName, schemaName, displayName, keyAttributes | solutionName |
Registros
| Ferramenta | Descrição | Parâmetros obrigatórios | Opcional |
|---|---|---|---|
get-record | Obter um registro por ID | entityNamePlural, recordId | |
query-records | Consulta OData | entityNamePlural, filter | maxRecords (padrão 50) |
Plugins
| Ferramenta | Descrição | Parâmetros obrigatórios | Opcional |
|---|---|---|---|
get-plugin-assemblies | Listar assemblies de plugins | includeManaged, maxRecords | |
get-plugin-assembly-complete | Assembly com tipos, etapas, imagens | assemblyName | includeDisabled |
get-entity-plugin-pipeline | Plugins executando em uma entidade | entityName | messageFilter, includeDisabled |
get-plugin-trace-logs | Logs de rastreamento de plugins | entityName, messageName, correlationId, pluginStepId, exceptionOnly, hoursBack, maxRecords | |
get-all-plugin-steps | Todas as etapas de processamento de mensagens SDK | includeDisabled, maxRecords | |
get-plugin-type | Pesquisar um tipo de plugin pelo nome da classe | typeName | |
get-sdk-message | Pesquisar uma mensagem SDK pelo nome | messageName | |
create-plugin-step | Registrar uma etapa de plugin | name, pluginTypeId, sdkMessageId, stage, mode | rank, supportedDeployment, description, configuration, sdkMessageFilterId, solutionName |
Fluxos (Power Automate)
| Ferramenta | Descrição | Parâmetros obrigatórios | Opcional |
|---|---|---|---|
get-flows | Listar fluxos de nuvem (filtragem inteligente) | activeOnly, maxRecords, nameContains, excludeSystem, excludeCustomerInsights, excludeCopilotSales | |
search-workflows | Pesquisar workflows e fluxos | name, primaryEntity, description, category, statecode, includeDescription, maxResults | |
get-flow-definition | Definição completa ou resumo analisado | flowId | summary |
get-flow-runs | Histórico de execuções do fluxo | flowId | status, startedAfter, startedBefore, maxRecords |
get-flow-run-details | Detalhes da execução com erros no nível da ação | flowId, runId | |
cancel-flow-run | Cancelar uma execução em andamento/aguardando | flowId, runId | |
resubmit-flow-run | Repetir uma execução com falha | flowId, runId | |
scan-flow-health | Verificação de saúde em lote (taxas de sucesso) | daysBack, maxRunsPerFlow, maxFlows, activeOnly | |
get-flow-inventory | Inventário leve de fluxos | maxRecords |
Soluções
| Ferramenta | Descrição | Parâmetros obrigatórios | Opcional |
|---|---|---|---|
get-publishers | Listar editores não somente leitura | ||
get-solutions | Listar soluções visíveis | ||
get-solution | Obter solução pelo nome exclusivo | uniqueName | |
get-solution-components | Listar componentes em uma solução | solutionUniqueName | |
export-solution | Exportar solução (base64) | solutionName | managed |
add-solution-component | Adicionar um componente a uma solução | solutionUniqueName, componentId, componentType | addRequiredComponents |
publish-customizations | Publicar entidade ou todas as personalizações | entityLogicalName |
Workflows (Clássico)
| Ferramenta | Descrição | Parâmetros obrigatórios | Opcional |
|---|---|---|---|
get-workflows | Listar workflows clássicos | activeOnly, maxRecords | |
get-workflow-definition | Definição XAML ou resumo | workflowId | summary |
get-ootb-workflows | Em segundo plano, BPFs, ações, sob demanda | maxRecords, categories |
Regras de Negócio
| Ferramenta | Descrição | Parâmetros obrigatórios | Opcional |
|---|---|---|---|
get-business-rules | Listar regras de negócio | activeOnly, maxRecords | |
get-business-rule | Regra de negócio com XAML | workflowId |
Conjuntos de Opções
| Ferramenta | Descrição | Parâmetros obrigatórios |
|---|---|---|
get-global-option-set | Obter definição de conjunto de opções global | optionSetName |
Configuração
| Ferramenta | Descrição | Parâmetros obrigatórios | Opcional |
|---|---|---|---|
get-connection-references | Referências de conexão | maxRecords, managedOnly, hasConnection, inactive | |
get-environment-variables | Definições de variáveis de ambiente + valores | maxRecords, managedOnly | |
create-environment-variable | Criar uma definição de variável de ambiente | schemaName, displayName, type | defaultValue, description, solutionName |
set-environment-variable-value | Definir ou atualizar um valor de variável de ambiente | definitionId, value | existingValueId |
APIs Personalizadas
| Ferramenta | Descrição | Parâmetros obrigatórios | Opcional |
|---|---|---|---|
get-custom-apis | Listar definições de API personalizada | maxRecords, includeManaged | |
get-custom-api | Obter uma API personalizada pelo nome exclusivo | uniqueName | |
create-custom-api | Criar uma definição de API personalizada | uniqueName, name, displayName, bindingType, isFunction, isPrivate, allowedCustomProcessingStepType | description, pluginTypeId, pluginTypeName, boundEntityLogicalName, solutionName |
get-custom-api-response-properties | Listar propriedades de resposta | customApiId | |
create-custom-api-response-property | Criar uma propriedade de resposta | customApiId, uniqueName, name, displayName, type | description, logicalEntityName, isOptional, solutionName |
get-custom-api-request-parameters | Listar parâmetros de solicitação | customApiId | |
create-custom-api-request-parameter | Criar um parâmetro de solicitação | customApiId, uniqueName, name, displayName, type | description, logicalEntityName, isOptional, solutionName |
Recursos Web
| Ferramenta | Descrição | Parâmetros obrigatórios | Opcional |
|---|---|---|---|
get-web-resources | Listar recursos web | maxRecords, webResourceType, nameFilter | |
get-web-resource | Obter um recurso web pelo nome | name | |
create-web-resource | Enviar um novo recurso web | name, displayName, webResourceType, content | description, solutionName |
Perfis de Segurança
| Ferramenta | Descrição | Parâmetros obrigatórios | Opcional |
|---|---|---|---|
get-security-roles | Listar perfis de segurança personalizáveis | solutionUniqueName, excludeSystemRoles, includePrivileges, maxRecords | |
get-security-role-privileges | Privilégios para um perfil (nome, direito de acesso, máscara de profundidade) | roleId | entityFilter, accessRightFilter |
list-privileges | Navegar pelo catálogo de privilégios do sistema para descobrir GUIDs de privilegeId e profundidades suportadas | entityFilter, accessRightFilter, maxRecords | |
create-security-role | Criar um novo perfil (padrão para BU raiz); solutionUniqueName opcional adiciona-o a uma solução em uma única etapa | name | businessUnitId, description, solutionUniqueName |
clone-security-role | Clonar um perfil com seus privilégios. Usa CloneAsRole com fallback de criar-depois-copiar quando a ação não está disponível | sourceRoleId | newName, targetBusinessUnitId, solutionUniqueName |
update-security-role | Atualizar nome, descrição ou unidade de negócio de um perfil | roleId | name, description, businessUnitId, solutionUniqueName |
delete-security-role | Excluir um perfil (destrutivo — requer confirm: true) | roleId, confirm | |
add-security-role-privileges | Acrescentar privilégios a um perfil (AddPrivilegesRole — mantém os privilégios existentes intactos) | roleId, privileges[] | |
remove-security-role-privileges | Remover privilégios de um perfil (faz loop em RemovePrivilegeRole) | roleId, privilegeIds[] | |
replace-security-role-privileges | Apagar 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
| Ferramenta | Descrição | Parâmetros obrigatórios |
|---|---|---|
check-component-dependencies | Dependências que bloqueiam exclusão | componentId, componentType |
check-delete-eligibility | Verificar se um componente pode ser excluído | componentId, componentType |
Endpoints de Serviço
| Ferramenta | Descrição | Opcional |
|---|---|---|
get-service-endpoints | Service Bus, webhooks, Event Hub, Event Grid | maxRecords |
Prompts MCP
| Prompt | Descrição | Argumentos obrigatórios |
|---|---|---|
entity-overview | Visão geral da entidade com atributos e relacionamentos principais | entityName |
attribute-details | Informações detalhadas do atributo (tipo, formato, requisitos) | entityName, attributeName |
query-template | Modelo de consulta OData com filtros de exemplo | entityName |
relationship-map | Mapa completo de relacionamentos 1:N e N:N | entityName |
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:
- Atualize
versionempackage.json - Faça commit da alteração para
main - Crie e envie uma tag de versão:
git tag v1.0.2 git push origin v1.0.2
O GitHub Actions publicará automaticamente:
| Pacote | npm | GitHub Packages | Docker (GHCR) |
|---|---|---|---|
| MCP Server | npm i powerplatform-mcp | npm i @michsob/powerplatform-mcp | ghcr.io/michsob/powerplatform-mcp |
| CLI | npm i powerplatform-cli | npm i @michsob/powerplatform-cli | ghcr.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
