-
Notifications
You must be signed in to change notification settings - Fork 0
Tools Solutions
This page is generated from the code by scripts/gen_wiki_tools.py — do not edit by hand.
21 tools · category token solutions · enable with DATAVERSE_TOOLS=solutions (unset enables every category)
Write tools additionally require DATAVERSE_ALLOW_WRITE=true; delete tools require DATAVERSE_ALLOW_DELETE=true.
Write · non-idempotent · category solutions
Add an existing component to a Dataverse solution via AddSolutionComponent.
Requires DATAVERSE_ALLOW_WRITE=true.
| Param | Type | Req | Default | Notes |
|---|---|---|---|---|
| dataverse_url | str |
yes | — | Required Dataverse organization URL for this request (e.g., 'https://yourorg.crm.dynamics.com'). |
| solution_unique_name | str | None |
no | None |
Solution unique name. Provide either this or solution_id, not both. (pattern=^[a-zA-Z_][a-zA-Z0-9_]*$) |
| solution_id | str | None |
no | None |
Solution GUID. Provide either this or solution_unique_name, not both. |
| component_id | str |
yes | — | GUID of the component to add (min_len=1) |
| component_type | int |
yes | — | Dataverse solution component type code |
| add_required_components | bool |
no | False |
Whether Dataverse should include required dependencies |
| do_not_include_subcomponents | bool |
no | False |
Whether Dataverse should skip adding subcomponents |
Returns {"added": ..., "solution_unique_name": ..., "solution_id": ..., "component_id": ..., "component_type": ...}. Errors return {"error": true, "message": "..."}.
Read · idempotent · category solutions
Analyze dependencies for a Dataverse solution component.
Exposes three directions via the direction parameter:
- blocking_delete: components that must be removed before this one can be deleted.
- dependents: all components that reference/depend on this component.
- required: all components this component requires to exist.
Use component_type integer codes (1=Entity, 2=Attribute, 61=WebResource, etc.) and the component's metadata GUID for component_id.
| Param | Type | Req | Default | Notes |
|---|---|---|---|---|
| dataverse_url | str |
yes | — | Required Dataverse organization URL for this request (e.g., 'https://yourorg.crm.dynamics.com'). |
| component_id | str |
yes | — | GUID of the solution component to analyze (e.g., an entity metadata id, attribute metadata id). (min_len=36) |
| component_type | int |
yes | — | Integer component type code. Common values: 1=Entity, 2=Attribute, 3=Relationship, 9=OptionSet, 20=SecurityRole, 26=SavedQuery, 29=Workflow, 60=SystemForm, 61=WebResource, 62=SiteMap, 91=PluginAssembly, 92=SDKMessageProcessingStep, 300=CanvasApp. See https://learn.microsoft.com/power-apps/developer/data-platform/reference/entities/solutioncomponent. (ge=1) |
| direction | Literal['blocking_delete', 'dependents', 'required'] |
no | 'blocking_delete' |
Which dependency direction to retrieve: 'blocking_delete' — components that block deletion of this component; 'dependents' — all components that depend on this component; 'required' — all components this component requires. |
Returns {"component": ..., "direction": ..., "function": ..., "count": ..., "dependencies": ...}. Errors return {"error": true, "message": "..."}.
Write · non-idempotent · category solutions
Clone a solution as a patch via the unbound CloneAsPatch action.
Resolves the parent solution to its unique name (accepting either a GUID or unique name), then POSTs to the unbound /CloneAsPatch action with ParentSolutionUniqueName in the body. Returns the new patch solution GUID. Requires DATAVERSE_ALLOW_WRITE=true.
| Param | Type | Req | Default | Notes |
|---|---|---|---|---|
| dataverse_url | str |
yes | — | Required Dataverse organization URL for this request (e.g., 'https://yourorg.crm.dynamics.com'). |
| solution_unique_name | str | None |
no | None |
Solution unique name. Provide either this or solution_id, not both. (pattern=^[a-zA-Z_][a-zA-Z0-9_]*$) |
| solution_id | str | None |
no | None |
Solution GUID. Provide either this or solution_unique_name, not both. |
| display_name | str |
yes | — | Display name for the new patch solution. (min_len=1) |
| version_number | str |
yes | — | Version string for the patch (e.g., '1.0.0.2'). Must share the parent solution's major.minor version and be greater. (min_len=1) |
Returns {"cloned": ..., "patch_solution_id": ..., "parent_solution_unique_name": ..., "version_number": ...}. Errors return {"error": true, "message": "..."}.
Write · non-idempotent · category solutions
Create a Dataverse publisher that owns the customization prefix for solutions.
Requires DATAVERSE_ALLOW_WRITE=true.
| Param | Type | Req | Default | Notes |
|---|---|---|---|---|
| dataverse_url | str |
yes | — | Required Dataverse organization URL for this request (e.g., 'https://yourorg.crm.dynamics.com'). |
| uniquename | str |
yes | — | Unique name for the publisher (e.g., 'contoso'). Use lowercase logical-name style characters. (min_len=1) |
| display_name | str |
yes | — | Friendly display name for the publisher (min_len=1) |
| customization_prefix | str |
yes | — | Customization prefix for publisher-owned components (e.g., 'new'). (min_len=1) |
| option_value_prefix | int |
yes | — | Customization option value prefix (e.g., 10000) (ge=1, le=2147483647) |
Returns {"created": ..., "uniquename": ..., "display_name": ..., "location": ...}. Errors return {"error": true, "message": "..."}.
Write · non-idempotent · category solutions
Create a new Dataverse solution scoped to a publisher.
Requires DATAVERSE_ALLOW_WRITE=true.
| Param | Type | Req | Default | Notes |
|---|---|---|---|---|
| dataverse_url | str |
yes | — | Required Dataverse organization URL for this request (e.g., 'https://yourorg.crm.dynamics.com'). |
| solution_unique_name | str |
yes | — | Unique name for the solution (e.g., 'contoso_core') (min_len=1, pattern=^[a-zA-Z_][a-zA-Z0-9_]*$) |
| display_name | str |
yes | — | Friendly display name for the solution (min_len=1) |
| publisher_id | str |
yes | — | GUID of the publisher that owns this solution (min_len=1) |
| version | str |
yes | — | Solution version string (typically major.minor.build.revision) (min_len=1) |
| description | str | None |
no | None |
Optional solution description |
Returns {"created": ..., "solution_unique_name": ..., "version": ..., "location": ...}. Errors return {"error": true, "message": "..."}.
Delete · non-idempotent · category solutions
Apply a solution upgrade by promoting the holding _Upgrade solution and deleting obsolete components via DeleteAndPromote.
This is the second step of the two-step upgrade path. Use it after dataverse_import_solution with hold_for_upgrade=true, which stages the new version as a holding ('_Upgrade') solution without deleting anything.
Calling this tool applies the solution upgrade: it promotes the holding _Upgrade solution over the base solution and deletes all components absent from the new version (DeleteComponents phase). This is a synchronous, potentially long-running call — the Web API blocks until the promotion is complete.
Returns solution_id (the GUID of the promoted solution) on success.
For a single-step alternative, use dataverse_stage_and_upgrade_solution instead.
Requires DATAVERSE_ALLOW_WRITE=true.
| Param | Type | Req | Default | Notes |
|---|---|---|---|---|
| dataverse_url | str |
yes | — | Required Dataverse organization URL for this request (e.g., 'https://yourorg.crm.dynamics.com'). |
| solution_unique_name | str |
yes | — | Unique name of the solution to promote (e.g., 'MyCustomApp'). This must be the base solution name — not the 'Upgrade' holding variant. The holding solution (created by hold_for_upgrade=true) must already exist. (min_len=1, pattern=^[a-zA-Z][a-zA-Z0-9_]*$) |
Returns {"upgraded": ..., "solution_id": ..., "solution_unique_name": ..., "message": ...}. Errors return {"error": true, "message": "..."}.
Read · idempotent · category solutions
Export a Dataverse solution as a base64-encoded zip.
Calls the ExportSolution unbound action. Large solutions (>~3 MB base64) must be saved to disk via output_path — supply a local filesystem path and the server writes the decoded .zip there, returning metadata only (no base64 in the response). Small solutions are returned inline when output_path is omitted. This tool is read-only for the org (no mutations); writing a local .zip when output_path is set is local I/O only and does not require DATAVERSE_ALLOW_WRITE.
| Param | Type | Req | Default | Notes |
|---|---|---|---|---|
| dataverse_url | str |
yes | — | Required Dataverse organization URL for this request (e.g., 'https://yourorg.crm.dynamics.com'). |
| solution_name | str |
yes | — | Unique name of the solution to export (e.g., 'MyCustomApp'). Use lowercase logical name — not the display name. (min_len=1) |
| managed | bool |
no | False |
When True, export as a managed solution. When False (default), export as unmanaged. |
| output_path | str | None |
no | None |
See note below. |
| export_general_settings | bool | None |
no | None |
Export general environment settings. Omitted from request when None. |
| export_customization_settings | bool | None |
no | None |
Export customization settings. Omitted from request when None. |
| export_email_tracking_settings | bool | None |
no | None |
Export email tracking settings. Omitted from request when None. |
| export_auto_numbering_settings | bool | None |
no | None |
Export auto-numbering settings. Omitted from request when None. |
| export_calendar_settings | bool | None |
no | None |
Export calendar settings. Omitted from request when None. |
| export_relationship_roles | bool | None |
no | None |
Export relationship roles. Omitted from request when None. |
| export_isv_config | bool | None |
no | None |
Export ISV configuration. Omitted from request when None. |
| export_sales | bool | None |
no | None |
Export sales settings. Omitted from request when None. |
| export_marketing_settings | bool | None |
no | None |
Export marketing settings. Omitted from request when None. |
| export_outlook_synchronization_settings | bool | None |
no | None |
Export Outlook synchronization settings. Omitted from request when None. |
- output_path — Local filesystem path to write the exported solution .zip to (e.g., '/tmp/MySolution.zip' or 'C:\exports\MySolution.zip'). When provided, the zip is decoded and written to disk (parent directories are created if missing); the response contains metadata only (no base64 payload). When omitted, the base64 payload is returned inline if it is under ~3 MB; otherwise a structured error asks you to supply output_path. If the server sets DATAVERSE_FILE_BASE_DIR, the resolved path must stay inside that directory — '..' traversal or an absolute path elsewhere is rejected with an error and nothing is written. When that variable is unset the path is not confined.
Returns {"solution_file_base64": ..., "size_bytes": ..., "solution": ..., "managed": ...} or {"written": ..., "path": ..., "size_bytes": ..., "solution": ..., "managed": ...}. Errors return {"error": true, "message": "..."}.
Read · idempotent · category solutions
Retrieve a single importjob record by its GUID to check import progress.
Returns progress (0–100), completedon, solutionname, and other tracking fields. The large result XML ('data' column) is excluded by default; set include_data=true to fetch it when diagnosing failures. Use dataverse_import_solution or dataverse_stage_and_upgrade_solution to start an operation and obtain the import_job_id.
When include_data=true, the 'data' result XML contains component-level detail for all import phases, including the DeleteComponents phase of an upgrade. Error code 0x8004F037 (image-column dependency failures) and other component-level errors from the deletion phase appear in this XML.
| Param | Type | Req | Default | Notes |
|---|---|---|---|---|
| dataverse_url | str |
yes | — | Required Dataverse organization URL for this request (e.g., 'https://yourorg.crm.dynamics.com'). |
| import_job_id | str |
yes | — | GUID of the importjob to retrieve. This is the client-supplied ImportJobId GUID returned by dataverse_import_solution. (min_len=36) |
| include_data | bool |
no | False |
When True, the response includes the result XML from the 'data' column. The data column can be very large — use only to inspect failure details. |
Returns {"record": ..., "completed": ..., "progress": ...}. Errors return {"error": true, "message": "..."}.
Read · idempotent · category solutions
Answer "WHY did this solution import fail?" — the readable import results.
Calls the unbound RetrieveFormattedImportJobResults function, which returns the platform's own human-readable results document for one import job.
This is the companion to dataverse_get_import_job, which returns the importjob RECORD (progress, completedon, solutionname) and, with include_data=true, the raw 'data' column — a large opaque XML blob you then have to parse yourself to find the failure. This tool asks Dataverse to format those results instead. Use dataverse_list_import_jobs (most recent first) or the import_job_id returned by dataverse_import_solution / dataverse_stage_and_upgrade_solution to get an id.
RESPONSE SHAPE — LIVE-VERIFIED. The document arrives as ONE string property named FormattedResults, and the body carries nothing else. It is surfaced as 'results', with results_source naming the property it was read from. Nothing in the document is interpreted: the text is passed through verbatim. Microsoft Learn documents the function and its return type but NOT that type's inner properties, so the property is still located by name and then by shape rather than assumed; if the payload cannot be identified unambiguously, normalized is false, no length or summary is reported, and the payload comes back unchanged (minus the @odata.* envelope) under raw_response — read it yourself rather than trusting a guess.
WHAT YOU GET BACK IS A SPREADSHEET. Live-verified: 'results' is a SpreadsheetML (Excel XML) workbook — root element Workbook, an mso-application progid="Excel.Sheet" processing instruction and the urn:schemas-microsoft-com:office:spreadsheet namespace — NOT a Dataverse results schema. Its element names are spreadsheet furniture (Worksheet, Table, Row, Cell, Data, Style, Font, Interior, Border...) and NONE of them is named error, warning or failure. The meaning lives in the CELL VALUES, so to find out why an import failed you must read the TEXT of the document, not its tags. The same format came back for a completed job and a still-running one.
THE DOCUMENT IS TRIMMED BY DEFAULT, AND IT IS BIG. The function has no server-side paging — it returns the whole document in one string, and observed documents ran to tens of thousands of characters (about 14,000 for a small import, about 71,000 for a larger one), so the default WILL usually truncate. The first max_chars characters (default 20,000) are returned inline and the true size is never hidden: results_length is ALWAYS the full character count Dataverse returned and truncated says whether anything was cut. Raise max_chars (max 2,000,000) to read more; an import failure's reason is usually near the top, but spreadsheet markup is verbose, so budget generously.
A STRUCTURAL SUMMARY, NOT A VERDICT. When the document parses as XML, the summary reports root_tag, element_count, distinct_tag_count and element_counts (a per-tag tally) — computed over the WHOLE document, not just the returned slice, so it describes what you did not see as well as what you did. It is deliberately descriptive only: no node is labelled an error, a warning or a failure, because the document's schema is undocumented and a wrong "the import succeeded" verdict is worse than none. Given the SpreadsheetML format above, the tally counts spreadsheet structure and tells you little about the import itself — element_counts_note repeats that warning in the response. Read the text. If the document does not parse (it may be HTML or plain text), markup_parsed is false with a note explaining why and the text is still returned in full. Parsing uses a hardened parser that refuses XML entity declarations and external entity references outright.
Note the two ids are not interchangeable: this takes the importjob GUID (ImportJobId / importjobid), not the separate ImportJobKey string that ImportSolutionAsync also returns.
| Param | Type | Req | Default | Notes |
|---|---|---|---|---|
| dataverse_url | str |
yes | — | Required Dataverse organization URL for this request (e.g., 'https://yourorg.crm.dynamics.com'). |
| import_job_id | str |
yes | — | GUID of the import job whose formatted results to read — the importjobid primary key, which is the same client-supplied ImportJobId that dataverse_import_solution and dataverse_stage_and_upgrade_solution return as import_job_id. Use dataverse_list_import_jobs to find recent import jobs (most recent first), or dataverse_get_import_job to check one job's progress before reading its results. |
| max_chars | int |
no | 20000 |
See note below. |
- max_chars — Maximum number of characters of the results document to return inline. RetrieveFormattedImportJobResults has no server-side paging — it returns the whole document in one string — so the slice is taken here. results_length always reports the FULL character count Dataverse returned regardless of trimming, and truncated says whether anything was cut, so the true size is never hidden. Any document summary is likewise computed over the WHOLE document, not just the returned slice. Raise this (max 2,000,000) to read more. (ge=1000, le=2000000)
Returns JSON. Errors return {"error": true, "message": "..."}.
Read · idempotent · category solutions
Retrieve a single Dataverse solution by its unique name or GUID.
Returns full details including version, publisher, and managed status. Provide solution_unique_name or solution_id — not both.
| Param | Type | Req | Default | Notes |
|---|---|---|---|---|
| dataverse_url | str |
yes | — | Required Dataverse organization URL for this request (e.g., 'https://yourorg.crm.dynamics.com'). |
| solution_unique_name | str | None |
no | None |
The unique name of the solution (e.g., 'MyCustomApp'). Provide either this or solution_id, not both. (pattern=^[a-zA-Z_][a-zA-Z0-9_]*$) |
| solution_id | str | None |
no | None |
The GUID of the solution (e.g., 'a1b2c3d4-...'). Provide either this or solution_unique_name, not both. |
| select | list[str] | None |
no | None |
Columns to return. Defaults to all standard solution columns. |
Returns {"record": ...}. Errors return {"error": true, "message": "..."}.
Read · idempotent · category solutions
Retrieve a single solution history record by its GUID.
Returns import/upgrade/export operation details including result, timing, error messages, and publisher information from msdyn_solutionhistories.
The msdyn_suboperation field distinguishes operation sub-types:
- 3: Import/Update (in-place overlay; obsolete components are NOT deleted)
- 5: Upgrade-with-deletion (DeleteComponents phase; obsolete components ARE deleted)
| Param | Type | Req | Default | Notes |
|---|---|---|---|---|
| dataverse_url | str |
yes | — | Required Dataverse organization URL for this request (e.g., 'https://yourorg.crm.dynamics.com'). |
| solution_history_id | str |
yes | — | GUID of the msdyn_solutionhistory record to retrieve (e.g., 'a1b2c3d4-1234-5678-abcd-ef0123456789'). (min_len=36) |
| select | list[str] | None |
no | None |
Columns to return. Defaults to a standard solution history projection. |
Returns {"record": ...}. Errors return {"error": true, "message": "..."}.
Write · non-idempotent · category solutions
Import a Dataverse solution asynchronously via ImportSolutionAsync.
Accepts the solution zip as inline base64 (customization_file) or a local filesystem path (input_path). Returns import_job_id, async_operation_id, and import_job_key immediately — poll dataverse_get_import_job with import_job_id to track progress and retrieve failure details. Requires DATAVERSE_ALLOW_WRITE=true.
IMPORTANT — import mode vs. upgrade mode:
-
hold_for_upgrade=false (default): performs an in-place UPDATE (overlay). Components removed from the new solution version are NOT deleted from the environment. This is NOT a true upgrade.
-
hold_for_upgrade=true: stages the solution as a holding ('_Upgrade') variant without deleting anything yet. Follow up with dataverse_delete_and_promote_solution to complete the upgrade and delete obsolete components (two-step path).
For a single-step true upgrade (stage + delete obsolete + promote in one call), use dataverse_stage_and_upgrade_solution instead.
| Param | Type | Req | Default | Notes |
|---|---|---|---|---|
| dataverse_url | str |
yes | — | Required Dataverse organization URL for this request (e.g., 'https://yourorg.crm.dynamics.com'). |
| customization_file | str | None |
no | None |
Base64-encoded solution .zip content to import inline. Provide this XOR input_path — not both and not neither. Rejected if the base64 string exceeds ~3 MB; use input_path instead. |
| input_path | str | None |
no | None |
See note below. |
| overwrite_unmanaged_customizations | bool |
no | True |
When True, overwrite existing unmanaged customizations with those in the solution being imported. |
| publish_workflows | bool |
no | True |
When True, publish workflows (cloud flows) included in the solution. |
| hold_for_upgrade | bool |
no | False |
When True, hold the solution as a holding solution for staged upgrade. Maps to HoldingSolution in the ImportSolutionAsync request. |
| skip_product_update_dependencies | bool |
no | False |
When True, skip enforcing product update dependencies during import. |
| import_job_id | str | None |
no | None |
Client-supplied GUID to use as the importjob primary key. When omitted, one is generated automatically. Use this value to poll dataverse_get_import_job for progress. |
- input_path — Local filesystem path to the solution .zip to import (e.g., '/tmp/MySolution.zip'). The server reads the file and base64-encodes it before posting. Provide this XOR customization_file — not both and not neither. If the server sets DATAVERSE_FILE_BASE_DIR, the resolved path must stay inside that directory — '..' traversal or an absolute path elsewhere is rejected with an error and nothing is read. When that variable is unset the path is not confined.
Returns {"accepted": ..., "import_job_id": ..., "async_operation_id": ..., "import_job_key": ..., "message": ...}. Errors return {"error": true, "message": "..."}.
Read · idempotent · category solutions
List importjob records, optionally filtered by solution unique name.
The large result XML ('data' column) is excluded from all records by default. Results are ordered by createdon descending (most recent first).
| Param | Type | Req | Default | Notes |
|---|---|---|---|---|
| dataverse_url | str |
yes | — | Required Dataverse organization URL for this request (e.g., 'https://yourorg.crm.dynamics.com'). |
| solution_name | str | None |
no | None |
Optional solution unique name to filter results by (e.g., 'MyCustomApp'). Maps to an OData filter on the solutionname column. |
| top | int |
no | 50 |
Maximum number of import job records to return. (ge=1, le=5000) |
| select | list[str] | None |
no | None |
Columns to return. Defaults to a projection that excludes the large 'data' XML column. Specify explicitly to override. |
Returns {"records": ..., "count": ..., "has_more": ...}. Errors return {"error": true, "message": "..."}.
Read · idempotent · category solutions
List components within a Dataverse solution, with human-readable type names.
Use component_type to filter by type code (1=Entity, 61=Web Resource, 300=Canvas App, 91=Plugin Assembly, 92=SDK Message Processing Step).
| Param | Type | Req | Default | Notes |
|---|---|---|---|---|
| dataverse_url | str |
yes | — | Required Dataverse organization URL for this request (e.g., 'https://yourorg.crm.dynamics.com'). |
| solution_id | str |
yes | — | The GUID of the solution whose components to list (min_len=1) |
| component_type | int | None |
no | None |
Filter by component type code. Common values: 1=Entity, 2=Attribute, 3=Relationship, 9=OptionSet, 10=EntityRelationship, 26=View, 29=Workflow, 60=SystemForm, 61=WebResource, 300=CanvasApp, 371=Connector |
| top | int |
no | 50 |
Maximum number of components to return (ge=1, le=5000) |
Returns {"records": ..., "count": ..., "has_more": ...}. Errors return {"error": true, "message": "..."}.
Read · idempotent · category solutions
List solution history records from msdyn_solutionhistories.
Tracks import, upgrade, and export operations on solutions. Optionally filter by solution_id or solution_unique_name (mutually exclusive). solution_id is resolved to the solution unique name first, then used to filter history records via msdyn_name. Omit both to list all.
The msdyn_suboperation field distinguishes operation sub-types:
- 3: Import/Update (in-place overlay; obsolete components are NOT deleted)
- 5: Upgrade-with-deletion (DeleteComponents phase; obsolete components ARE deleted)
Use msdyn_suboperation to determine whether a history record represents a standard update or a true upgrade with component deletion.
| Param | Type | Req | Default | Notes |
|---|---|---|---|---|
| dataverse_url | str |
yes | — | Required Dataverse organization URL for this request (e.g., 'https://yourorg.crm.dynamics.com'). |
| solution_id | str | None |
no | None |
Optional GUID of the solution to filter history records by. Provide either this or solution_unique_name, not both. |
| solution_unique_name | str | None |
no | None |
Optional unique name of the solution to filter history records by (e.g., 'MyCustomApp'). Provide either this or solution_id, not both. (pattern=^[a-zA-Z_][a-zA-Z0-9_]*$) |
| select | list[str] | None |
no | None |
Columns to return. Defaults to a standard solution history projection. |
| top | int |
no | 50 |
Maximum number of solution history records to return. (ge=1, le=5000) |
Returns {"records": ..., "count": ..., "has_more": ...}. Errors return {"error": true, "message": "..."}.
Read · idempotent · category solutions
List solutions in the Dataverse environment with name, version, and managed status.
Use filter to narrow results (e.g., "ismanaged eq false"). Use dataverse_get_solution for full details on a specific solution.
| Param | Type | Req | Default | Notes |
|---|---|---|---|---|
| dataverse_url | str |
yes | — | Required Dataverse organization URL for this request (e.g., 'https://yourorg.crm.dynamics.com'). |
| filter | str | None |
no | None |
OData $filter expression to narrow results. Use lowercase logical names (e.g., "ismanaged eq true", "uniquename eq 'MyApp'") |
| select | list[str] | None |
no | None |
Columns to return. Defaults to solutionid, uniquename, friendlyname, version, ismanaged, installedon, modifiedon |
| top | int |
no | 50 |
Maximum number of solutions to return (ge=1, le=5000) |
Returns {"records": ..., "count": ..., "has_more": ...}. Errors return {"error": true, "message": "..."}.
Delete · idempotent · category solutions
Remove a component from a Dataverse solution via RemoveSolutionComponent.
Removes the component from the solution only — does not delete the component. Requires DATAVERSE_ALLOW_DELETE=true.
| Param | Type | Req | Default | Notes |
|---|---|---|---|---|
| dataverse_url | str |
yes | — | Required Dataverse organization URL for this request (e.g., 'https://yourorg.crm.dynamics.com'). |
| solution_unique_name | str | None |
no | None |
Solution unique name. Provide either this or solution_id, not both. (pattern=^[a-zA-Z_][a-zA-Z0-9_]*$) |
| solution_id | str | None |
no | None |
Solution GUID. Provide either this or solution_unique_name, not both. |
| component_id | str |
yes | — | GUID of the underlying component to remove (RemoveSolutionComponent ComponentId) (min_len=1) |
| component_type | int |
yes | — | Dataverse solution component type code |
Returns {"removed": ..., "solution_unique_name": ..., "solution_id": ..., "component_id": ..., "component_type": ...}. Errors return {"error": true, "message": "..."}.
Delete · non-idempotent · category solutions
Perform a single-step true solution upgrade via StageAndUpgradeAsync.
Stages the new solution version as a holding solution, deletes components that are no longer present in the new version (DeleteComponents phase), and promotes the result — all in one async operation. This is the correct tool for a true upgrade that removes obsolete components.
Accepts the solution zip as inline base64 (customization_file) or a local filesystem path (input_path). Returns import_job_id, async_operation_id, and import_job_key immediately — poll dataverse_get_import_job with import_job_id to track progress. Component-level deletion errors (e.g., 0x8004F037 image-column dependency failures) surface in the importjob 'data' XML when include_data=true.
Compare to dataverse_import_solution (hold_for_upgrade=false): that tool performs an in-place UPDATE (overlay) and does NOT delete removed components. For the two-step path, use dataverse_import_solution with hold_for_upgrade=true, then call dataverse_delete_and_promote_solution.
Requires DATAVERSE_ALLOW_WRITE=true.
| Param | Type | Req | Default | Notes |
|---|---|---|---|---|
| dataverse_url | str |
yes | — | Required Dataverse organization URL for this request (e.g., 'https://yourorg.crm.dynamics.com'). |
| customization_file | str | None |
no | None |
Base64-encoded solution .zip content to stage and upgrade inline. Provide this XOR input_path — not both and not neither. Rejected if the base64 string exceeds ~3 MB; use input_path instead. |
| input_path | str | None |
no | None |
See note below. |
| overwrite_unmanaged_customizations | bool |
no | True |
When True, overwrite existing unmanaged customizations with those in the solution being upgraded. |
| publish_workflows | bool |
no | True |
When True, publish workflows (cloud flows) included in the solution. |
| skip_product_update_dependencies | bool |
no | False |
When True, skip enforcing product update dependencies during the upgrade. |
- input_path — Local filesystem path to the solution .zip to stage and upgrade (e.g., '/tmp/MySolution.zip'). The server reads the file and base64-encodes it before posting. Provide this XOR customization_file — not both and not neither. If the server sets DATAVERSE_FILE_BASE_DIR, the resolved path must stay inside that directory — '..' traversal or an absolute path elsewhere is rejected with an error and nothing is read. When that variable is unset the path is not confined.
Returns {"accepted": ..., "import_job_id": ..., "async_operation_id": ..., "import_job_key": ..., "message": ...}. Errors return {"error": true, "message": "..."}.
Write · idempotent · category solutions
Update a Dataverse publisher's display name, customization prefix, or option value prefix.
Requires DATAVERSE_ALLOW_WRITE=true.
| Param | Type | Req | Default | Notes |
|---|---|---|---|---|
| dataverse_url | str |
yes | — | Required Dataverse organization URL for this request (e.g., 'https://yourorg.crm.dynamics.com'). |
| publisher_id | str |
yes | — | GUID of the publisher to update (min_len=1) |
| display_name | str | None |
no | None |
Updated friendly display name |
| customization_prefix | str | None |
no | None |
Updated customization prefix |
| option_value_prefix | int | None |
no | None |
Updated customization option value prefix (ge=1, le=2147483647) |
Returns {"updated": ..., "publisher_id": ...}. Errors return {"error": true, "message": "..."}.
Write · idempotent · category solutions
Update a Dataverse solution's display name, description, or publisher.
Requires DATAVERSE_ALLOW_WRITE=true.
| Param | Type | Req | Default | Notes |
|---|---|---|---|---|
| dataverse_url | str |
yes | — | Required Dataverse organization URL for this request (e.g., 'https://yourorg.crm.dynamics.com'). |
| solution_unique_name | str | None |
no | None |
Solution unique name. Provide either this or solution_id, not both. (pattern=^[a-zA-Z_][a-zA-Z0-9_]*$) |
| solution_id | str | None |
no | None |
Solution GUID. Provide either this or solution_unique_name, not both. |
| display_name | str | None |
no | None |
Updated friendly display name |
| description | str | None |
no | None |
Updated solution description |
| publisher_id | str | None |
no | None |
Updated publisher GUID |
Returns {"updated": ..., "solution_id": ..., "solution_unique_name": ...}. Errors return {"error": true, "message": "..."}.
Write · idempotent · category solutions
Update a Dataverse solution's version string only (e.g., '1.0.0.1' → '1.0.0.2').
Requires DATAVERSE_ALLOW_WRITE=true.
| Param | Type | Req | Default | Notes |
|---|---|---|---|---|
| dataverse_url | str |
yes | — | Required Dataverse organization URL for this request (e.g., 'https://yourorg.crm.dynamics.com'). |
| solution_unique_name | str | None |
no | None |
Solution unique name. Provide either this or solution_id, not both. (pattern=^[a-zA-Z_][a-zA-Z0-9_]*$) |
| solution_id | str | None |
no | None |
Solution GUID. Provide either this or solution_unique_name, not both. |
| version | str |
yes | — | New solution version string (min_len=1) |
Returns {"updated": ..., "solution_id": ..., "solution_unique_name": ..., "version": ...}. Errors return {"error": true, "message": "..."}.
dataverse-mcp 3.9.1 — Repository · PyPI · Issues · Changelog · MIT
Get started
Configure
Tools
- Tool-Index
- Tools-Core
- Tools-Schema
- Tools-Solutions
- Tools-Plugins
- Tools-Security
- Tools-Custom-APIs
- Tools-Apps
- Tools-Variables
- Tools-Flows
- Tools-Views
- Tools-Forms
- Tools-Connections
- Tools-Web-Resources
- Tools-Jobs
Understand