MCPInstall

erp-xpp

X++ code development lifecycle for Finance and Operations — scaffold models, author classes, custom services/APIs, and data entities, install matching SDKs, compile deployable packages, deploy packages, synchronize databases, and verify deployed artifacts. Use when the user explicitly requests creating, building, compiling, packaging, deploying, DB-syncing, or verifying X++ customizations, or an end-to-end ERP code change.

Installs
125
Last 24h
—
Trending rank
—
Security
Not audited

Install

Works with every agent the skills CLI supports.

npx skills add https://github.com/microsoft/dataverse-skills --skill erp-xpp
  1. 01

    Install

    Run the command in your project. The CLI asks which agents to install for.

  2. 02

    Describe the task

    Ask your agent for something this skill covers. It loads erp-xpp automatically when relevant.

  3. 03

    Review the result

    The agent follows the SKILL.md steps, scripts and references bundled with the skill.

SKILL.md

The instructions your agent reads when the skill is triggered.

Skill: Finance and Operations X++ Development

Critical safety rules — read first

  1. Windows only. pac tool xpp install and pac package compile --package-type erp require Windows. Do not invent a Linux/macOS or SDK-based fallback.
  2. Confirm the target before any deploy or DB sync. Show the Dataverse environment URL, obtain explicit confirmation, then run pac org who --environment <url> and verify both the Dataverse URL and linked ERP URL/version.
  3. Never assume Full DB sync. Although standalone pac package db-sync defaults to Full, require the user to choose Full, Module, or Incremental when the request is ambiguous.
  4. Do not call deployment successful until PAC reaches a successful terminal state. Preserve and report the async operation ID on failure.
  5. Do not overwrite existing models or source files. Inspect .erp/xpp.json, descriptors, and target metadata paths before scaffolding or editing.
  6. Pin every runtime surface before ERP verification. PAC and the Dataverse CLI have separate active profiles. Before any dataverse ... --target erp check, require dataverse auth who and dataverse org who --json to match the confirmed Dataverse and linked ERP URLs. Validate ERP MCP according to its transport: direct HTTP must target <erp-url>/mcp; an stdio proxy must receive the base <erp-url> and route effectively to /mcp. Profile selection does not retarget an existing MCP connection.
  7. Treat runtime verification as possible data mutation. After the separate post-deployment opt-in, inspect the X++ implementation, disclose exact test inputs and expected mutations, and obtain confirmation for those inputs and effects. Do not apply a generic test matrix to non-idempotent operations.
  8. All additional validation after an ERP X++ package deployment is opt-in. After pac package deploy --package-type erp, capture PAC's terminal result, then ask whether the user wants any further validation and which checks to run. Do not query the async operation, execute an X++ artifact, query its ERP entity, or test its security unless selected. For runtime validation, confirm exact inputs, success criteria, and failure criteria; never invent values or execute an unapproved failure path. This rule is scoped to ERP X++ package deployment, not Dataverse solution ALM.

PAC CLI is the managed surface for the X++ lifecycle. Do not replace these commands with raw Dataverse APIs, direct calls to the ERP sidecar, LCS upload automation, or hand-written compiler invocations.

For a planning-only X++ request, loading skills and reading local references is allowed; do not make environment calls or write local files.

Intent routing

User intentAction
Create an ERP package/modelpac package init --package-type erp
Install compiler metadata for an environmentpac tool xpp install
Check/remove local SDKspac tool xpp list / pac tool xpp uninstall
Compile or build X++pac package compile --package-type erp
Deploy one prebuilt ZIPpac package deploy --package-type erp --package <zip>
Deploy all models in a repopac package deploy --package-type erp --solution-root <root>
Run DB sync onlypac package db-sync
Create an ERP custom serviceAuthor its X++ class/contracts plus AxService and AxServiceGroup metadata, then compile and deploy
Create an ERP ICustomAPI actionAuthor an ICustomAPI class, action menu item, and privilege/duty/role security, then compile, deploy, DB-sync when required, and verify through ERP MCP
Author, compile, deploy, and verifyFollow End-to-end workflow

There is no pac package build or top-level pac xpp command. For ERP, pac package compile --package-type erp compiles labels and X++, runs best-practice checks, and builds deployable managed ZIPs.

Skill boundaries

NeedUse instead
Connect/authenticate, install or update PAC CLIdv-connect
Read or analyze ERP business datadv-query
Create/update/delete ERP business records or import DMF datadv-data
List/cancel ERP batch jobsdv-admin
Dataverse solution ALMdv-solution
ERP UI personalization, workflow editing, or environment lifecycleFinance and Operations UI / Power Platform admin tooling; not covered

Preflight

  1. Confirm Windows.
  2. Run pac and inspect its banner; pac --version is invalid. These commands require the PAC CLI .NET tool version 2.11.1 or later.
  3. Run pac package help and pac tool xpp help. If compile, db-sync, or tool xpp is absent, load dv-connect and update to the latest .NET tool installation before continuing.
  4. For environment operations, run:
pac auth list
pac org who --environment <dataverse-url>

The output must identify the confirmed Dataverse environment and include a linked ERP URL/version. Do not substitute the ERP URL for --environment; PAC accepts the Dataverse URL and resolves ERP linkage.

  1. Before runtime verification through the Dataverse CLI or ERP MCP, run:
dataverse auth who
dataverse org who --json \
  --context "app=dataverse-skills/<ver>;skill=erp-xpp;agent=<agent>"

Require the selected CLI profile's environment URL and returned erpUrl to match the PAC target confirmed above. If they do not, run dataverse auth select --name <profile-name>, then repeat both checks. Pass --environment <dataverse-url> on commands that support it, but never treat that option as a substitute for selecting the correct profile; some ERP data commands have no environment override.

For ERP MCP verification, inspect the active server configuration. Require direct HTTP to use the confirmed <erp-url>/mcp, or require an stdio proxy such as dataverse mcp to receive the confirmed base <erp-url> and use its effective /mcp endpoint. If it differs, stop and reconnect or reinitialize the matching ERP MCP server before discovery or invocation.

Before every MCP runtime invocation, establish a fresh transport-specific session and verify its caller through an MCP-originated identity/current-session check. dataverse auth who proves only the CLI identity. If MCP cannot prove its caller, do not invoke through that session. For security acceptance, the proven caller must be the intended non-administrator test user.

  1. Before a first SDK install, explain that it downloads roughly 4 GB and expands to roughly 16 GB under %LOCALAPPDATA%\Microsoft\Dynamics365\<version>\PackagesLocalDirectory.

Command quick reference

# Scaffold one or more models
pac package init --outputDirectory <root> --package-type erp \
  --model <ModelA,ModelB> --publisher <publisher> --layer ISV

# SDK lifecycle
pac tool xpp install --environment <dataverse-url>
pac tool xpp list
pac tool xpp uninstall --version <four-part-version>

# Compile/build all configured models
pac package compile --solution-root <root> --package-type erp \
  --app-version <four-part-version> --language en-US

# Compile one model during the edit loop
pac package compile --solution-root <root> --package-type erp \
  --model <ModelName> --app-version <four-part-version> \
  --language en-US --incremental

# Deploy one compiled package, without DB sync
pac package deploy --environment <dataverse-url> --package-type erp \
  --package <root>/bin/<Model>_<version>_managed.zip \
  --build-type Full --release-type Dev --db-sync None \
  --logConsole --logFile <deployment-log-path>

# Deploy every model in .erp/xpp.json in dependency order
pac package deploy --environment <dataverse-url> --package-type erp \
  --solution-root <root> --build-type Full --release-type Dev \
  --db-sync None --logConsole --logFile <deployment-log-path>

Use explicit values rather than relying on defaults in automation. Full argument tables and DB-sync rules are in references/commands.md.

Authoring X++ source

The repo root contains .erp/xpp.json; source defaults to src/. Each model has a descriptor and metadata under:

<root>/
  .erp/xpp.json
  src/<Model>/Descriptor/<Model>.xml
  src/<Model>/<Model>/AxClass/<Class>.xml

Run pac package init instead of hand-writing the descriptor/config. Add metadata files surgically after inspecting existing paths. PAC compiles and packages authored metadata; it does not scaffold custom services, ICustomAPI actions, or data entities. For runnable classes, labels, custom services, ICustomAPI actions, public OData data entities, and artifact-specific verification, use references/authoring.md.

Compile/build rules

  • A normal compile runs labels -> X++ -> best-practice checks -> deployable ZIP.
  • Use --incremental only for the edit loop. Run a non-incremental compile before a final deployment.
  • Do not use --skip-bp unless the user explicitly requests it and understands the reduced validation.
  • If multiple SDKs are installed, pass --app-version; otherwise PAC may reject ambiguous selection.
  • Treat Compile summary: ... failed or any nonzero exit as failure even if a ZIP already exists from an earlier run.
  • Verify the output ZIP was produced by the current run under <root>/bin/.
  • If label compilation reports XPPLC2010 and PAC fails despite exit code 0 from LabelC, add a valid label resource; do not delete logs or bypass the stage.

Deploy and DB-sync rules

  • Deploy-only means --db-sync None.
  • --build-type controls how the server applies the package: Full, Incremental, or Delete; it is not a local build command.
  • --release-type Dev is the normal test/development choice. Release forces Full DB sync server-side when a sync is requested.
  • Delete ignores DB-sync settings.
  • Single-package deployment uses --package <zip>. Solution-mode deployment omits --package, reads .erp/xpp.json, topologically orders models, deploys them, then runs one requested DB sync.
  • PAC injects fnomoduledefinition.json into the ZIP at deploy time. Copy the artifact first if an immutable checksum must be retained.
  • Standalone DB sync and deploy-with-sync are separate supported workflows; never redeploy merely to satisfy a DB-sync-only request.

See references/workflows.md for compile-only, deploy-only, DB-sync-only, multi-model, and full lifecycle sequences. Apply the success gates, diagnostics flow, and error mappings in references/validation.md to every compile, deployment, DB sync, and runtime verification.

End-to-end workflow

For “make this X++ change and deploy it”:

  1. Inspect the repo and preserve existing work.
  2. Confirm model/class names, publisher, and layer before scaffolding a new model.
  3. Run pac package init --package-type erp only when the model does not exist.
  4. Add or edit the requested X++ metadata, such as classes, contracts, custom services, service groups, ICustomAPI actions and security, public data entities, and required labels.
  5. Confirm/authenticate the target environment and verify ERP linkage/version.
  6. Install or reuse the matching SDK.
  7. Compile non-incrementally and require zero compile errors. Address best-practice warnings unless the user accepts them.
  8. Deploy with explicit build/release/DB-sync modes.
  9. Capture PAC's exit code, async operation ID, terminal state, and DB-sync result as part of the deployment command. Do not run additional validation automatically.
  10. Ask whether the user wants post-deployment validation and which checks they authorize: async-operation re-query, API/action discovery, runtime behavior, data-entity query, multiple-case testing, and/or security acceptance. Earlier deployment approval and selection of one check do not authorize another.
  11. If all validation is declined, report the PAC deployment result and state that no additional validation was performed. If runtime validation is selected, inspect only the deployed custom artifact and its contract, then ask for each required input plus the expected success and failure criteria. Repeat exact values or criteria already in the prompt for confirmation; never invent or broaden them.
  12. For selected runtime checks, pin the Dataverse CLI profile and transport-specific ERP MCP target to the confirmed environment, then verify only the approved artifact:
  • Runnable class: open https://<erp-host>/?mi=SysClassRunner&cls=<ClassName>.
  • Custom service: inspect the X++ implementation for side effects before invoking erp:<ServiceGroup>/<Service>/<Operation> with dataverse api invoke --target erp --context "app=dataverse-skills/<ver>;skill=erp-xpp;agent=<agent>"; use list/describe only for discovery.
  • ICustomAPI action: if discovery was selected, use ERP MCP api_find_actions to validate its action menu item and contract. If execution was selected, invoke only approved inputs using the confirmed source contract or approved discovery result, then compare every returned property and expected mutation with the observed result.
  • Public OData data entity: if discovery was selected, inspect it with dataverse data describe --target erp. If query execution was selected, query the confirmed entity set with dataverse data query --target erp. Add --context "app=dataverse-skills/<ver>;skill=erp-xpp;agent=<agent>" to each command that runs.
  • Security acceptance: only when runtime execution and security acceptance were both selected, invoke the approved case as a non-administrator test user assigned the intended custom role. Administrator execution is diagnostic only and does not validate the privilege/duty/role chain.
  1. Report the package path, environment, async operation ID, terminal status, DB-sync mode, the validation checks accepted or declined, and results only for checks actually performed.

Common mistakes — do not use these

WrongCorrect
pac xpp installpac tool xpp install
pac xpp compilepac package compile --package-type erp
pac package buildpac package compile --package-type erp
pac package deploy --package-type xpp--package-type erp
Passing the ERP URL to --environmentPass the linked Dataverse URL
Omitting --package for one ZIPAdd --package <zip>
Adding --package for repo-wide deploymentOmit it and use --solution-root
pac package db-sync --db-sync NoneNone is deploy-only; standalone modes are Full, Module, Incremental
Module sync without --modulesAdd --modules ModelA,ModelB
Incremental sync without --argument-fileAdd a valid IncrementalSyncParameters JSON file

FAQ

What does the erp-xpp skill do?

X++ code development lifecycle for Finance and Operations — scaffold models, author classes, custom services/APIs, and data entities, install matching SDKs, compile deployable packages, deploy packages, synchronize databases, and verify deployed artifacts. Use when the user explicitly requests creating, building, compiling, packaging, deploying, DB-syncing, or verifying X++ customizations, or an end-to-end ERP code change.

How do I install erp-xpp?

Run npx skills add https://github.com/microsoft/dataverse-skills --skill erp-xpp in your project. The skills CLI detects the agents you use and copies the skill into the right folder. For Claude Code you can also place the skill folder at ~/.claude/skills/erp-xpp/ (personal) or .claude/skills/erp-xpp/ (project).

Which AI agents can use erp-xpp?

Any agent that supports the open Agent Skills format (a folder with a SKILL.md file), including Claude Code, Codex, Cursor, GitHub Copilot, Gemini CLI, Windsurf, Cline, OpenCode and more.

Is erp-xpp safe to install?

No partner security audit is available yet. Skills can run commands and scripts, so read the SKILL.md and any bundled files before installing.

Who maintains erp-xpp?

It is published by microsoft in microsoft/dataverse-skills. It has 125 recorded installs.

More from microsoft/dataverse-skills

View all →

dv-connect

microsoft/dataverse-skills

Open the skill to read its SKILL.md instructions.

Official222 installs

dv-metadata

microsoft/dataverse-skills

Dataverse schema authoring and inspection — tables, columns, relationships, forms, and views. Use when the user wants to define, evolve, or inspect the data model — add a column, create a table, set up a lookup, customize a form, build a view, or list existing columns and relationships.

Official218 installs

dv-overview

microsoft/dataverse-skills

Foundational cross-cutting context for Dataverse / Power Platform work — scope and the skill map, the tool-capability reference, the safety rules, and the safe change lifecycle. Use when the user mentions Dataverse, Dynamics 365, Power Platform, CRM, or ERP; load this first for orientation. Specialist skills self-route via their own frontmatter triggers. Finance and Operations / F&O business-data requests also require this skill first, then dv-query for reads.

OfficialBusiness & Finance217 installs

dv-solution

microsoft/dataverse-skills

Open the skill to read its SKILL.md instructions.

Official213 installs

dv-query

microsoft/dataverse-skills

Bulk reads, multi-page iteration, and analytics over Dataverse data. Use when the user wants to read, list, filter, aggregate, group, join, or analyze records — including pandas DataFrame workflows and notebook exploration. Also covers ERP (Finance and Operations / F&O) business-data reads and runtime entity, schema, or action discovery; load dv-overview first, then this skill.

OfficialData & Databases208 installs

dv-data

microsoft/dataverse-skills

Open the skill to read its SKILL.md instructions.

Official203 installs

Popular devops & cloud skills

View category →

microsoft-foundry

microsoft/azure-skills

Build, deploy, evaluate, optimize, fine-tune, and manage Microsoft Foundry agents, models, and resources end to end. USE FOR: foundry, azd ai agent, azd provision/deploy, hosted agent scaffold/develop/run/deploy/troubleshoot, prompt agent create, managed harness agent create, GitHub Copilot harness agent, create agent, update agent, add tool to agent, invoke agent, agent insights, evaluate agent, batch eval, continuous eval, continuous monitoring, agent CI/CD, optimize prompt, improve prompt, optimize agent instructions, Agent Optimizer scaffold, dataset curation from traces, deploy model, model fine-tuning (SFT/DPO/RFT), Foundry project, RBAC, role assignment, permissions, quota, capacity, region, deployment failure, AI Services, create Foundry resource, knowledge index, customize deployment, onboard, availability, training-data, grader, distillation, large file upload. DO NOT USE FOR: Azure Functions, App Service, general Azure deploy (use azure-deploy), general Azure prep (use azure

OfficialDevOps & Cloud579.1K installs

azure-diagnostics

microsoft/azure-skills

Debug Azure production issues on Azure using AppLens, Azure Monitor, resource health, and safe triage. WHEN: debug production issues, troubleshoot app service, app service high CPU, app service deployment failure, troubleshoot container apps, container app 503 or target port mismatch, troubleshoot functions, function telemetry missing or stopped after a config/connection-string change, troubleshoot AKS, VM RDP, Linux SSH, VM black screen, can't connect to VM, reset VM password, NSG or firewall blocking, kubectl cannot connect, kube-system/CoreDNS failures, pod pending, crashloop, node not ready, upgrade failures, analyze logs, KQL, insights, image pull failures, cold start issues, health probe failures, resource health, root cause of errors, troubleshoot event hubs, troubleshoot service bus, messaging SDK error, AMQP connection failure, message lock lost, lock renewal during long-running processing, service bus dead letter.

OfficialDevOps & Cloud569.8K installs

azure-prepare

microsoft/azure-skills

Prepare azd-based Azure projects for deployment: generates azure.yaml, infrastructure (Bicep/Terraform), and Dockerfiles for the Azure Developer CLI (azd) workflow. USE ONLY when the user explicitly wants to use azd as the deployment tool, or the project already has an azure.yaml file. DO NOT USE FOR: non-azd deployments, Python App Service code-only deploys (use python-appservice-deploy), or cross-cloud migration (use azure-cloud-migrate). WHEN: prepare app for azd, create azure.yaml, set up azd infrastructure, modernize app for Azure with azd, deploy with azd, function app, timer trigger, service bus trigger, event-driven function, managed identity, generate Bicep, generate Terraform, create and deploy to Azure.

OfficialDevOps & Cloud569K installs

azure-ai

microsoft/azure-skills

Use for Azure AI: Search, Speech, OpenAI, Document Intelligence. Helps with search, vector/hybrid search, speech-to-text, text-to-speech, transcription, OCR. WHEN: AI Search, query search, vector search, hybrid search, semantic search, speech-to-text, text-to-speech, transcribe, OCR, convert text to speech.

OfficialDevOps & Cloud568.8K installs

azure-deploy

microsoft/azure-skills

Execute Azure deployments for ALREADY-PREPARED applications that have existing .azure/deployment-plan.md and infrastructure files. DO NOT use this skill when the user asks to CREATE a new application — use azure-prepare instead. This skill runs azd up, azd deploy, terraform apply, and az deployment commands with built-in error recovery. Requires .azure/deployment-plan.md from azure-prepare and validated status from azure-validate. WHEN: "run azd up", "run azd deploy", "execute deployment", "push to production", "push to cloud", "go live", "ship it", "bicep deploy", "terraform apply", "publish to Azure", "launch on Azure". DO NOT USE WHEN: "create and deploy", "build and deploy", "create a new app", "set up infrastructure", "create and deploy to Azure using Terraform" — use azure-prepare for these.

OfficialDevOps & Cloud568.6K installs

azure-validate

microsoft/azure-skills

Pre-deployment validation for Azure readiness. Run deep checks on configuration, infrastructure (Bicep or Terraform), RBAC role assignments, managed identity permissions, and prerequisites before deploying. WHEN: validate my app, check deployment readiness, run preflight checks, verify configuration, check if ready to deploy, validate azure.yaml, validate Bicep, test before deploying, troubleshoot deployment errors, validate Azure Functions, validate function app, validate serverless deployment, verify RBAC roles, check role assignments, review managed identity permissions, what-if analysis, validate Container Apps deployment.

OfficialDevOps & Cloud568K installs