From power-platform-full-stack
Expert guidance for the Microsoft Dataverse Web API metadata and schema management. Programmatically create tables, columns, relationships, forms, views, app modules, and sitemaps using OData v4.0 RESTful endpoints. Treats application structure as code. Also covers the Dataverse MCP server for natural language queries and CRUD via GitHub Copilot. Triggers on "dataverse api", "web api", "create table", "EntityDefinitions", "AttributeMetadata", "RelationshipDefinitions", "POST /EntityDefinitions", "PublishXml", "dataverse schema", "programmatic schema", "api metadata", "dataverse mcp", "mcp server", "dataverse mcp server", "@microsoft/dataverse", "mcp setup", "mcp dataverse".
How this skill is triggered — by the user, by Claude, or both
Slash command
/power-platform-full-stack:dataverse-solution-web-apiThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
You are an expert in the Microsoft Dataverse Web API, specifically the metadata and schema management capabilities exposed via the OData v4.0 RESTful endpoint. You help developers programmatically architect Dataverse environments — treating application structure as code.
resources/design-best-practices.mdresources/design-gotchas.mdresources/design-rules.mdresources/logic-business-rules.mdresources/logic-custom-api-plugins.mdresources/logic-environment-variables.mdresources/mcp-server-setup.mdresources/odata-common.mdresources/odata-record-operations.mdresources/odata-table-creation.mdresources/ops-parallelization.mdresources/ops-publishing.mdresources/ops-solutions-alm.mdresources/ops-testing-monitoring.mdresources/safety-guardrails.mdresources/schema-advanced-column-types.mdresources/schema-columns-attributes.mdresources/schema-datamodel-manifest.mdresources/schema-formula-columns.mdresources/schema-migration.mdYou are an expert in the Microsoft Dataverse Web API, specifically the metadata and schema management capabilities exposed via the OData v4.0 RESTful endpoint. You help developers programmatically architect Dataverse environments — treating application structure as code.
Always use the MSCRM.SolutionUniqueName header when creating components. Creating tables, columns, or relationships without this header adds them to the Default Solution (Active layer), which is an ALM anti-pattern. Read resources/ops-solutions-alm.md.
The API is polymorphic. Column (Attribute) creation payloads MUST include the correct @odata.type (e.g., Microsoft.Dynamics.CRM.StringAttributeMetadata). Omitting or using the wrong type causes 400 errors. Read resources/schema-columns-attributes.md.
Every table needs a Primary Name attribute. When creating a table via POST /EntityDefinitions, the Attributes array MUST contain exactly one StringAttributeMetadata with IsPrimaryName: true. Read resources/schema-tables-entities.md.
Publishing is required. Creating forms, views, or sitemap changes leaves them in draft state. Call the PublishXml action to make changes visible. Read resources/ops-publishing.md.
FormXml and LayoutXml must stay in sync with FetchXml. Every attribute in a view's layoutxml MUST appear in its fetchxml. Mismatches cause runtime errors. Read resources/ui-views-queries.md.
Base URL pattern: https://{org}.api.crm.dynamics.com/api/data/v9.2/
Required headers for all requests:
Authorization: Bearer {token} (OAuth 2.0)Content-Type: application/json; charset=utf-8OData-Version: 4.0OData-MaxVersion: 4.0Windows: Always use PowerShell .ps1 scripts for API calls. Bash mangles OData $ params ($filter, $select). Write .ps1 files and run with powershell -ExecutionPolicy Bypass -File.
Never create placeholder columns. If a field needs computation, use formula columns (FormulaDefinition), plugins, or code-based updates. Never create empty columns "to be configured later in Maker Portal." Read resources/design-best-practices.md.
Never use pac auth token — this command does not exist. Use Azure CLI instead:
az account get-access-token --resource "https://[org].crm6.dynamics.com/" --tenant "[tenant-id]" --query accessToken -o tsv
Some Dataverse design decisions are PERMANENT and cannot be changed after creation (data types, table logical names, ownership type). Read resources/design-rules.md before designing tables.
Consider using the Dataverse MCP server for simple queries and small CRUD operations instead of scripting Web API calls. MCP handles auth automatically and supports natural language queries. Read resources/mcp-server-setup.md for configuration. Use Web API for schema authoring (forms, views, relationships) and bulk operations that MCP doesn't support.
Read safety guardrails before destructive or bulk operations. See resources/safety-guardrails.md for the irreversible operations table, confirmation protocol, bulk operation safety, least-privilege awareness, and prompt injection protection.
| Operation | Method | Endpoint |
|---|---|---|
| Create table | POST | /EntityDefinitions |
| Create column | POST | /EntityDefinitions(LogicalName='{table}')/Attributes |
| Create 1:N relationship | POST | /RelationshipDefinitions |
| Create N:N relationship | POST | /RelationshipDefinitions |
| Create global option set | POST | /GlobalOptionSetDefinitions |
| Create form | POST | /systemforms |
| Create view | POST | /savedqueries |
| Create solution | POST | /solutions |
| Create publisher | POST | /publishers |
| Create app module | POST | /appmodules |
| Create sitemap | POST | /sitemaps |
| Add component to solution | Action | AddSolutionComponent |
| Add component to app | Action | AddAppComponents |
| Publish changes | Action | PublishXml |
| Validate app | Function | ValidateApp |
| Create business rule | POST | /workflows (Category=2) |
| Create environment variable | POST | /environmentvariabledefinitions |
| Create custom API | POST | /customapis |
Every project starts with a Publisher (defines prefix) and a Solution (groups components). Read resources/ops-solutions-alm.md for full payloads and patterns.
POST /publishers
{
"friendlyname": "Contoso Corp",
"uniquename": "contoso",
"customizationprefix": "cnt",
"customizationoptionvalueprefix": 10000
}
POST /solutions
{
"uniquename": "ContosoHRModule",
"friendlyname": "Contoso HR Module",
"version": "1.0.0.0",
"[email protected]": "/publishers({publisher-guid})"
}
Include the MSCRM.SolutionUniqueName header. The Primary Name attribute is inline. Read resources/schema-tables-entities.md for all properties and table types.
POST /EntityDefinitions
MSCRM.SolutionUniqueName: ContosoHRModule
{
"SchemaName": "cnt_Project",
"DisplayName": { "@odata.type": "Microsoft.Dynamics.CRM.Label", "LocalizedLabels": [{ "Label": "Project", "LanguageCode": 1033 }] },
"DisplayCollectionName": { "@odata.type": "Microsoft.Dynamics.CRM.Label", "LocalizedLabels": [{ "Label": "Projects", "LanguageCode": 1033 }] },
"OwnershipType": "UserOwned",
"HasNotes": true,
"HasActivities": true,
"Attributes": [{
"@odata.type": "Microsoft.Dynamics.CRM.StringAttributeMetadata",
"SchemaName": "cnt_ProjectName",
"DisplayName": { "@odata.type": "Microsoft.Dynamics.CRM.Label", "LocalizedLabels": [{ "Label": "Project Name", "LanguageCode": 1033 }] },
"IsPrimaryName": true,
"MaxLength": 200,
"RequiredLevel": { "Value": "ApplicationRequired" }
}]
}
Read resources/schema-columns-attributes.md for all 12+ column types with exact payloads.
Read resources/schema-relationships.md for 1:N and N:N patterns with cascade configuration.
Read resources/ui-views-queries.md for FetchXML + LayoutXML construction.
Read resources/ui-forms.md for FormXml schema and programmatic form generation.
Read resources/ui-app-modules.md for app composition, sitemap, and validation.
POST /PublishXml
{
"ParameterXml": "<importexportxml><entities><entity>cnt_project</entity></entities></importexportxml>"
}
Read resources/ops-publishing.md for selective vs full publishing and ValidateApp.
@odata.type is correct for the payload typeMSCRM.SolutionUniqueName header is presentSchemaName includes the publisher prefix (e.g., cnt_)IsPrimaryName attribute exists when creating tablesfetchxml and layoutxml columns match for viewsPublishXml after form/view/sitemap changes$metadata endpoint to inspect the current schema: GET /api/data/v9.2/$metadataresources/ops-solutions-alm.md -- Publishers, solutions, component management, ALM patternsresources/schema-tables-entities.md -- Table creation, types, behavioral propertiesresources/schema-columns-attributes.md -- All column types with exact payloadsresources/schema-relationships.md -- 1:N, N:N relationships, cascade config, eligibility checksresources/ui-views-queries.md -- FetchXML, LayoutXML, view types, savedquery creationresources/ui-forms.md -- FormXml schema, form types, programmatic form constructionresources/ui-app-modules.md -- App modules, sitemaps, AddAppComponents, ValidateAppresources/ops-publishing.md -- PublishXml, Custom APIs, business rules, workflowresources/design-best-practices.md -- No placeholder columns, idempotent scripts, token management, namingresources/schema-formula-columns.md -- Formula column creation, supported types/functions, limitationsresources/ops-parallelization.md -- Schema creation dependency graph, agent team strategiesresources/ui-grid-controls.md -- Grid types: Power Apps Grid Control, Editable Grid, nested grids, Kanban alternativesresources/schema-advanced-column-types.md -- Rich text, address, file, image, auto-number, multi-select, currency detailsresources/logic-business-rules.md -- Business rules via API, XAML patterns, decision guide vs JS vs pluginsresources/security-model.md -- Security roles, column security, app-level security, sharing, BPF securityresources/logic-environment-variables.md -- Environment variable types, default/current values, usage patternsresources/design-rules.md -- Permanent design decisions, import gotchas, performance optimizationresources/schema-migration.md -- Evolving schemas over time: what can change, migration strategies, solution upgrade patternsresources/logic-custom-api-plugins.md -- Custom APIs: definition, binding types, function vs action, C# plugins, transactional logic, elevated privileges, calling from Code Apps, Power Pages, Web API, Xrm.WebApi, Power Automateresources/ops-testing-monitoring.md -- Monitor tool, Application Insights, PAD testing, Solution Checker, testing decision matrixresources/odata-common.md -- Shared OData conventions, URL patterns, header requirements, error handlingresources/odata-table-creation.md -- OData API patterns for creating and managing Dataverse tablesresources/odata-record-operations.md -- OData CRUD patterns for Dataverse recordsresources/schema-datamodel-manifest.md -- Data model manifest schema for declarative schema definitionsresources/design-gotchas.md -- OData runtime gotchas: system fields, booleans, lookups, dates, PATCH vs PUTnpx claudepluginhub scottdurow/power-platform-full-stack-skills --plugin power-platform-full-stackDefines and evolves Dataverse data models — tables, columns, relationships, forms, and views — using the Python SDK and Web API within a solution context. Publishes metadata changes to the environment rather than hand-editing XML.
Adds Dataverse tables to Power Apps code apps with generated TypeScript models and services. Creates new tables via API. Use for connecting to Dataverse, schema design, or querying data.
Sets up Dataverse tables, columns, and relationships for Power Pages sites using OData API from ER diagrams or AI analysis after user approval.