-
Notifications
You must be signed in to change notification settings - Fork 0
Tools Schema
This page is generated from the code by scripts/gen_wiki_tools.py — do not edit by hand.
35 tools · category token schema · enable with DATAVERSE_TOOLS=schema (unset enables every category)
Write tools additionally require DATAVERSE_ALLOW_WRITE=true; delete tools require DATAVERSE_ALLOW_DELETE=true.
Write · non-idempotent · category schema
Add a new option to a global or local (column-specific) choice.
Provide option_set_name for a global choice, or entity_logical_name + attribute_logical_name for a local choice — not both. 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 |
Unique name of an unmanaged solution to associate this metadata change with (e.g., 'MySolution'). When provided, Dataverse automatically adds the created or updated component to that solution. Leave unset to create components outside of any solution. (pattern=^[a-zA-Z_][a-zA-Z0-9_]*$) |
| option_set_name | str | None |
no | None |
Logical name of the global choice to add the option to (e.g., 'cr123_mychoice'). Provide this OR entity_logical_name + attribute_logical_name for a local choice — not both. |
| entity_logical_name | str | None |
no | None |
Logical name of the table that owns the local choice column. Required when adding to a local (column-specific) choice. |
| attribute_logical_name | str | None |
no | None |
Logical name of the local choice column. Required when entity_logical_name is provided. |
| label | str |
yes | — | Display label for the new option. (min_len=1) |
| value | int | None |
no | None |
Integer code for the new option. If omitted, Dataverse assigns one automatically. Custom option values typically start at 100000000. |
Returns {"created": ..., "value": ..., "label": ...}. Errors return {"error": true, "message": "..."}.
Read · idempotent · category schema
Pre-validate whether a table supports a specific relationship role before creating a relationship.
Only call this immediately before dataverse_create_one_to_many_relationship or dataverse_create_many_to_many_relationship — do not use for general queries or data reads. Returns eligible (bool) for the requested check_type (see check_type field for valid values).
This tool answers "is THIS ONE table OK?" — a boolean about a table you can already name. To answer "WHICH tables are OK?" — the enumeration, when you do not yet know which table to point at — use dataverse_get_valid_relationship_entities, whose role values mirror this tool's check_type values one for one.
| Param | Type | Req | Default | Notes |
|---|---|---|---|---|
| dataverse_url | str |
yes | — | Required Dataverse organization URL for this request (e.g., 'https://yourorg.crm.dynamics.com'). |
| table_logical_name | str |
yes | — | Logical name of the table to check (e.g., 'account', 'contact'). Use lowercase. (min_len=1, pattern=^[a-zA-Z_][a-zA-Z0-9_]*$) |
| check_type | str |
yes | — | The eligibility check to perform. 'referenced' — can this table be the primary (one) side of a 1:N? 'referencing' — can this table be the related (many) side of a 1:N? 'many_to_many' — can this table participate in an N:N? |
Returns {"table_logical_name": ..., "check_type": ..., "eligible": ...}. Errors return {"error": true, "message": "..."}.
Write · non-idempotent · category schema
Create an alternate key on a Dataverse table.
Alternate keys let integration tools identify records by business values (e.g., an account number or external ID) instead of GUIDs, which is required for alternate-key upserts.
Key creation triggers an asynchronous SQL index build. The response includes entity_key_index_status and async_job_id so callers can track progress. Wait until EntityKeyIndexStatus='Active' before using the key for upserts. Use dataverse_list_alternate_keys to poll status. 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'). |
| table_logical_name | str |
yes | — | Logical name of the table on which to create the alternate key (e.g., 'account'). (min_len=1, pattern=^[a-zA-Z_][a-zA-Z0-9_]*$) |
| schema_name | str |
yes | — | Schema name for the new alternate key (e.g., 'new_AccountCode'). Must include the publisher prefix. (min_len=1, pattern=^[a-zA-Z_][a-zA-Z0-9_]*$) |
| display_name | str |
yes | — | Display label for the alternate key (English, language code 1033). (min_len=1) |
| key_attributes | list[str] |
yes | — | Ordered list of attribute logical names that form the key (e.g., ['accountnumber'] or ['cr123_code', 'cr123_region']). All attributes must already exist on the table. (min_len=1) |
| solution_unique_name | str | None |
no | None |
Optional solution unique name to associate the key with a solution (sets the MSCRM.SolutionUniqueName request header). (pattern=^[a-zA-Z_][a-zA-Z0-9_]*$) |
Returns {"created": ..., "table_logical_name": ..., "schema_name": ..., "logical_name": ..., "key_attributes": ..., "entity_key_index_status": ..., "async_job_id": ..., "metadata_id": ..., "location": ..., "note": ...}. Errors return {"error": true, "message": "..."}.
Write · non-idempotent · category schema
Create a new GLOBAL choice (option set) that can be reused across multiple columns.
Call dataverse_publish_customizations after creating global choices. 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 |
Unique name of an unmanaged solution to associate this metadata change with (e.g., 'MySolution'). When provided, Dataverse automatically adds the created or updated component to that solution. Leave unset to create components outside of any solution. (pattern=^[a-zA-Z_][a-zA-Z0-9_]*$) |
| name | str |
yes | — | Logical name for the global choice with publisher prefix (e.g., 'cr123_mychoice'). Used to reference the choice in columns. (min_len=3) |
| display_name | str |
yes | — | Display name for the global choice shown in the UI. (min_len=1) |
| options | list[ChoiceOptionItem] |
yes | — | Initial list of options. Each option requires 'value' (int) and 'label' (str). Example: [{'value': 100000000, 'label': 'Option A'}]. (min_len=1) |
Returns {"created": ..., "name": ..., "entity_id": ...}. Errors return {"error": true, "message": "..."}.
Write · non-idempotent · category schema
Add a new typed column (attribute) to a Dataverse table.
Supported types: String, Memo, Integer, Decimal, DateTime, Boolean, Lookup, Picklist, MultiSelectPicklist. Boolean columns automatically get an OptionSet — use boolean_true_label/boolean_false_label to set option labels. Picklist/MultiSelectPicklist columns can bind to an existing global choice via global_choice_name. Memo columns default MaxLength to 2000 and omit IsValidForAdvancedFind (Dataverse rejects it for Memo type). Use type_specific_properties for additional type-specific fields (e.g., String → {"MaxLength": 100}). Call dataverse_publish_customizations after creating columns. 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 |
Unique name of an unmanaged solution to associate this metadata change with (e.g., 'MySolution'). When provided, Dataverse automatically adds the created or updated component to that solution. Leave unset to create components outside of any solution. (pattern=^[a-zA-Z_][a-zA-Z0-9_]*$) |
| table_logical_name | str |
yes | — | Logical name of the table to add the column to (e.g., 'account', 'cr123_widget'). (min_len=1, pattern=^[a-zA-Z_][a-zA-Z0-9_]*$) |
| schema_name | str |
yes | — | Schema name for the new column. Must include the publisher prefix (e.g., 'cr123_Description', 'new_Priority'). The logical name is derived as the lowercase version of this value. (min_len=3, pattern=^[a-zA-Z_][a-zA-Z0-9_]*$) |
| attribute_type | str |
yes | — | Column type. One of: String, Memo, Integer, Decimal, DateTime, Boolean, Lookup, Picklist, MultiSelectPicklist. |
| display_name | str |
yes | — | Display label for the column shown in the UI. (min_len=1) |
| required_level | str | None |
no | 'None' |
Whether the column is required. One of: 'None' (optional), 'Recommended', 'ApplicationRequired' (required). Defaults to 'None'. |
| type_specific_properties | dict | None |
no | None |
Optional dict of type-specific properties merged into the attribute definition body. Examples: String → {'MaxLength': 100}; Integer → {'MinValue': 0, 'MaxValue': 100000}; Decimal → {'Precision': 2}; DateTime → {'Format': 'DateOnly'}. |
| boolean_true_label | str | None |
no | 'Yes' |
Display label for the True option of a Boolean column. Only used when attribute_type is 'Boolean'. Defaults to 'Yes'. |
| boolean_false_label | str | None |
no | 'No' |
Display label for the False option of a Boolean column. Only used when attribute_type is 'Boolean'. Defaults to 'No'. |
| global_choice_name | str | None |
no | None |
Logical name of an existing global choice (option set) to bind this column to. Only used when attribute_type is 'Picklist' or 'MultiSelectPicklist'. When set, the column references the global choice instead of having a local option set. (pattern=^[a-zA-Z_][a-zA-Z0-9_]*$) |
Returns {"created": ..., "table_logical_name": ..., "schema_name": ..., "entity_id": ...}. Errors return {"error": true, "message": "..."}.
Write · non-idempotent · category schema
Create an N:N relationship and its intersect (junction) table between two tables.
Optionally call dataverse_check_relationship_eligibility first to pre-validate eligibility. Call dataverse_publish_customizations after creating relationships. 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 |
Unique name of an unmanaged solution to associate this metadata change with (e.g., 'MySolution'). When provided, Dataverse automatically adds the created or updated component to that solution. Leave unset to create components outside of any solution. (pattern=^[a-zA-Z_][a-zA-Z0-9_]*$) |
| schema_name | str |
yes | — | Schema name for the relationship (e.g., 'cr123_account_contact'). Must include a publisher prefix. (min_len=3, pattern=^[a-zA-Z_][a-zA-Z0-9_]*$) |
| entity1_logical_name | str |
yes | — | Logical name of the first entity in the many-to-many relationship. (min_len=1) |
| entity2_logical_name | str |
yes | — | Logical name of the second entity in the many-to-many relationship. (min_len=1) |
| intersect_entity_name | str |
yes | — | Name for the junction (intersect) table that Dataverse creates to store the relationship links (e.g., 'cr123_account_contact'). (min_len=1) |
Returns {"created": ..., "schema_name": ..., "entity_id": ...}. Errors return {"error": true, "message": "..."}.
Write · non-idempotent · category schema
Create a polymorphic (multi-table) lookup column that can reference multiple tables.
The lookup is added to owning_entity and can point to any of the target_entities. Call dataverse_publish_customizations after creating lookup columns. 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 |
Unique name of an unmanaged solution to associate this metadata change with (e.g., 'MySolution'). When provided, Dataverse automatically adds the created or updated component to that solution. Leave unset to create components outside of any solution. (pattern=^[a-zA-Z_][a-zA-Z0-9_]*$) |
| lookup_schema_name | str |
yes | — | Schema name for the polymorphic lookup column (e.g., 'cr123_Customer'). Must include a publisher prefix. (min_len=3) |
| lookup_display_name | str |
yes | — | Display label for the polymorphic lookup column. (min_len=1) |
| owning_entity | str |
yes | — | Logical name of the table that will own the lookup column (e.g., 'cr123_order'). (min_len=1) |
| target_entities | list[str] |
yes | — | List of table logical names the lookup can reference (e.g., ['account', 'contact']). Must contain at least one entry. (min_len=1) |
Returns {"created": ..., "lookup_schema_name": ..., "result": ...}. Errors return {"error": true, "message": "..."}.
Write · non-idempotent · category schema
Create a 1:N relationship between two tables and its lookup column on the referencing side.
Optionally call dataverse_check_relationship_eligibility first to pre-validate eligibility. Call dataverse_publish_customizations after creating relationships. 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 |
Unique name of an unmanaged solution to associate this metadata change with (e.g., 'MySolution'). When provided, Dataverse automatically adds the created or updated component to that solution. Leave unset to create components outside of any solution. (pattern=^[a-zA-Z_][a-zA-Z0-9_]*$) |
| schema_name | str |
yes | — | Schema name for the relationship (e.g., 'cr123_account_contacts'). Must include a publisher prefix. (min_len=3, pattern=^[a-zA-Z_][a-zA-Z0-9_]*$) |
| referenced_entity | str |
yes | — | Logical name of the 'one' (referenced/parent) side table (e.g., 'account'). (min_len=1) |
| referencing_entity | str |
yes | — | Logical name of the 'many' (referencing/child) side table (e.g., 'contact'). A lookup column is created on this table. (min_len=1) |
| lookup_schema_name | str |
yes | — | Schema name for the lookup column created on the referencing entity (e.g., 'cr123_AccountId'). Must include a publisher prefix. (min_len=3) |
| lookup_display_name | str |
yes | — | Display label for the lookup column. (min_len=1) |
Returns {"created": ..., "schema_name": ..., "entity_id": ...}. Errors return {"error": true, "message": "..."}.
Write · non-idempotent · category schema
Create a new custom table (entity) in the Dataverse environment.
The schema_name must include a publisher prefix (e.g., 'cr123_Widget'); the logical name is its lowercase form. Call dataverse_publish_customizations afterward. 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 |
Unique name of an unmanaged solution to associate this metadata change with (e.g., 'MySolution'). When provided, Dataverse automatically adds the created or updated component to that solution. Leave unset to create components outside of any solution. (pattern=^[a-zA-Z_][a-zA-Z0-9_]*$) |
| display_name | str |
yes | — | Singular display name for the table (e.g., 'Widget'). Shown in the UI as the record label. (min_len=1) |
| display_collection_name | str |
yes | — | Plural display name for the table (e.g., 'Widgets'). Used in navigation and list views. (min_len=1) |
| schema_name | str |
yes | — | Schema name for the table. Must include a publisher prefix followed by an underscore and a PascalCase name (e.g., 'cr123_Widget', 'new_MyTable'). The logical name will be derived as the lowercase version of this value. (min_len=3, pattern=^[a-zA-Z_][a-zA-Z0-9_]*$) |
| ownership_type | str |
no | 'UserOwned' |
Ownership model for the table. 'UserOwned' — records are owned by a user or team (default). 'OrganizationOwned' — records are owned by the organization. |
| primary_name_attribute_schema_name | str |
yes | — | Schema name for the required primary name text column (e.g., 'cr123_Name'). Must use the same publisher prefix as schema_name. (min_len=3) |
| description | str | None |
no | None |
Optional description for the table. |
Returns {"created": ..., "schema_name": ..., "logical_name": ..., "location": ...}. Errors return {"error": true, "message": "..."}.
Delete · idempotent · category schema
Delete an alternate key from a Dataverse table by its logical name.
Removes the alternate key definition and drops the underlying SQL index. Any upsert operations that reference this key will fail after deletion. Use dataverse_list_alternate_keys to find the key_logical_name before deleting. 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'). |
| table_logical_name | str |
yes | — | Logical name of the table that owns the alternate key (e.g., 'account'). (min_len=1, pattern=^[a-zA-Z_][a-zA-Z0-9_]*$) |
| key_logical_name | str |
yes | — | Logical name of the alternate key to delete (e.g., 'new_accountcode'). Use dataverse_list_alternate_keys to discover the logical name. (min_len=1, pattern=^[a-zA-Z_][a-zA-Z0-9_]*$) |
Returns {"deleted": ..., "table_logical_name": ..., "key_logical_name": ...}. Errors return {"error": true, "message": "..."}.
Delete · non-idempotent · category schema
Delete a GLOBAL choice (option set) by logical name.
Deleting a global choice still referenced by a column will fail; remove those columns first. Call dataverse_publish_customizations afterward. 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'). |
| name | str |
yes | — | Logical name of the global choice to delete (e.g., 'cr123_mychoice'). Confirm no columns reference it first via dataverse_get_choice. (min_len=1, pattern=^[a-zA-Z_][a-zA-Z0-9_]*$) |
Returns {"deleted": ..., "name": ...}. Errors return {"error": true, "message": "..."}.
Delete · non-idempotent · category schema
Remove a specific option value from a global or local choice.
Provide option_set_name for a global choice, or entity_logical_name + attribute_logical_name for a local choice — not both. 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 |
Unique name of an unmanaged solution to associate this metadata change with (e.g., 'MySolution'). When provided, Dataverse automatically adds the created or updated component to that solution. Leave unset to create components outside of any solution. (pattern=^[a-zA-Z_][a-zA-Z0-9_]*$) |
| option_set_name | str | None |
no | None |
Logical name of the global choice (e.g., 'cr123_mychoice'). Provide this OR entity_logical_name + attribute_logical_name. |
| entity_logical_name | str | None |
no | None |
Logical name of the table for a local choice column. |
| attribute_logical_name | str | None |
no | None |
Logical name of the local choice column. |
| value | int |
yes | — | Integer code of the option to remove. |
Returns {"deleted": ..., "value": ...}. Errors return {"error": true, "message": "..."}.
Delete · non-idempotent · category schema
Permanently delete a custom column and all its data from a table — irreversible.
Only custom, unmanaged columns can be deleted. Call dataverse_publish_customizations after deleting columns. 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'). |
| table_logical_name | str |
yes | — | Logical name of the table that owns the column. (min_len=1, pattern=^[a-zA-Z_][a-zA-Z0-9_]*$) |
| column_logical_name | str |
yes | — | Logical name of the column to delete (e.g., 'cr123_description'). Only custom columns can be deleted. (min_len=1, pattern=^[a-zA-Z_][a-zA-Z0-9_]*$) |
Returns {"deleted": ..., "table_logical_name": ..., "column_logical_name": ...}. Errors return {"error": true, "message": "..."}.
Delete · non-idempotent · category schema
Delete a custom relationship by MetadataId — permanent; deletes the associated lookup column for 1:N.
Only custom, unmanaged relationships can be deleted. Call dataverse_publish_customizations afterward. 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'). |
| metadata_id | str |
yes | — | MetadataId GUID of the relationship to delete. Obtain via dataverse_get_relationship. (min_len=36) |
Returns {"deleted": ..., "metadata_id": ...}. Errors return {"error": true, "message": "..."}.
Delete · non-idempotent · category schema
Permanently delete a custom table and all its records — irreversible.
Only custom, unmanaged tables (IsCustomEntity=true, IsManaged=false) can be deleted. 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'). |
| table_logical_name | str |
yes | — | Logical name of the custom table to delete (e.g., 'cr123_widget'). Use lowercase. Only custom tables (IsCustomEntity=true) can be deleted. (min_len=1, pattern=^[a-zA-Z_][a-zA-Z0-9_]*$) |
Returns {"deleted": ..., "table_logical_name": ...}. Errors return {"error": true, "message": "..."}.
Read · idempotent · category schema
Get one GLOBAL choice (option set) — all option values, codes, and labels — by name or MetadataId.
For the options of a specific column's LOCAL choice use dataverse_list_choice_column_options instead. Provide either name or metadata_id; name takes precedence when both are given.
| Param | Type | Req | Default | Notes |
|---|---|---|---|---|
| dataverse_url | str |
yes | — | Required Dataverse organization URL for this request (e.g., 'https://yourorg.crm.dynamics.com'). |
| consistency_strong | bool |
no | False |
When True, adds the 'Consistency: Strong' request header, bypassing Dataverse's 30-second metadata cache. Use immediately after creating or updating metadata to ensure the latest schema is returned. Incurs a performance penalty; omit in normal read scenarios. |
| name | str | None |
no | None |
Logical name of the global choice (e.g., 'incident_prioritycode', 'new_my_globalchoice'). Use lowercase. Either name or metadata_id must be provided. (pattern=^[a-zA-Z_][a-zA-Z0-9_]*$) |
| metadata_id | str | None |
no | None |
GUID MetadataId of the global choice definition. Either name or metadata_id must be provided. |
Returns {"choice": ...}. Errors return {"error": true, "message": "..."}.
Read · idempotent · category schema
Get full metadata for a single column on a Dataverse table, including type-specific properties.
Returns all properties including MaxLength, Precision, RequiredLevel, Format, and IsValidForCreate. Use before updating a column — pass the returned object as full_definition to dataverse_update_column. For Picklist/MultiSelectPicklist option values use dataverse_list_choice_column_options.
| Param | Type | Req | Default | Notes |
|---|---|---|---|---|
| dataverse_url | str |
yes | — | Required Dataverse organization URL for this request (e.g., 'https://yourorg.crm.dynamics.com'). |
| consistency_strong | bool |
no | False |
When True, adds the 'Consistency: Strong' request header, bypassing Dataverse's 30-second metadata cache. Use immediately after creating or updating metadata to ensure the latest schema is returned. Incurs a performance penalty; omit in normal read scenarios. |
| table_logical_name | str |
yes | — | Logical name of the table (e.g., 'account', 'contact'). Use lowercase. (min_len=1, pattern=^[a-zA-Z_][a-zA-Z0-9_]*$) |
| column_logical_name | str |
yes | — | Logical name of the column (e.g., 'name', 'telephone1', 'new_customfield'). Use lowercase. (min_len=1, pattern=^[a-zA-Z_][a-zA-Z0-9_]*$) |
Returns {"column": ...}. Errors return {"error": true, "message": "..."}.
Read · idempotent · category schema
Get full metadata for a single relationship by schema name — cascade configuration and navigation properties.
Schema names are case-sensitive; use the exact SchemaName from dataverse_list_relationships. Use this to fetch the full definition before updating with dataverse_update_relationship.
| Param | Type | Req | Default | Notes |
|---|---|---|---|---|
| dataverse_url | str |
yes | — | Required Dataverse organization URL for this request (e.g., 'https://yourorg.crm.dynamics.com'). |
| consistency_strong | bool |
no | False |
When True, adds the 'Consistency: Strong' request header, bypassing Dataverse's 30-second metadata cache. Use immediately after creating or updating metadata to ensure the latest schema is returned. Incurs a performance penalty; omit in normal read scenarios. |
| schema_name | str |
yes | — | Schema name of the relationship (e.g., 'account_contacts', 'contact_customer_accounts'). Schema names are case-sensitive and their exact casing/format depends on how the relationship was defined. Always match the SchemaName value exactly. (min_len=1, pattern=^[a-zA-Z_][a-zA-Z0-9_]*$) |
Returns {"relationship": ...}. Errors return {"error": true, "message": "..."}.
Read · idempotent · category schema
Get schema details for a single Dataverse table by logical name.
Returns the entity set name, primary key attribute, and primary name attribute. Use dataverse_list_tables to discover available table logical names.
| Param | Type | Req | Default | Notes |
|---|---|---|---|---|
| dataverse_url | str |
yes | — | Required Dataverse organization URL for this request (e.g., 'https://yourorg.crm.dynamics.com'). |
| consistency_strong | bool |
no | False |
When True, adds the 'Consistency: Strong' request header, bypassing Dataverse's 30-second metadata cache. Use immediately after creating or updating metadata to ensure the latest schema is returned. Incurs a performance penalty; omit in normal read scenarios. |
| table_name | str |
yes | — | Logical name of the table (e.g., 'account', 'contact', 'new_customtable'). Use lowercase logical names. (min_len=1, pattern=^[a-zA-Z_][a-zA-Z0-9_]*$) |
Returns {"table": ...}. Errors return {"error": true, "message": "..."}.
Read · idempotent · category schema
List WHICH tables may take part in a relationship — the enumeration, before you pick a target.
Answers "which tables are eligible?" when you do not yet know what to point a lookup at. Its counterpart dataverse_check_relationship_eligibility answers "is THIS ONE table OK?" — a boolean about a table you can already name. The role values here mirror that tool's check_type values one for one, so use this to discover a candidate and that one to confirm a specific choice.
Call it before dataverse_create_one_to_many_relationship or dataverse_create_many_to_many_relationship: a table the platform excludes (many system and virtual tables) fails the create late and opaquely.
role selects one of three unbound functions:
- 'referenced' — tables that can be the PRIMARY (one) side of a 1:N, i.e. valid lookup TARGETS.
- 'referencing' — tables that can be the RELATED (many) side of a 1:N, i.e. tables that can HOLD a lookup.
- 'many_to_many' — tables that can participate in an N:N. Takes no table_logical_name; supplying one is an input error rather than being ignored, because ignoring it would answer the environment-wide question while looking scoped.
table_logical_name DOES NOT NARROW THE ANSWER. It is optional for the two 1:N roles and Dataverse does validate it server-side (an unknown table is HTTP 400 [0x80041102] "not found in the MetadataCache"), but supplying it was measured live to return a BYTE-IDENTICAL list to omitting it, for every table tried. Every role therefore answers the environment-wide question: the tables eligible for that role at all. Passing a name buys you exactly one thing — proof the table exists — so pass it only when you want that check, and never read the result as "the tables THIS table may point at". This holds for CUSTOM tables as well as system ones: scoping by a custom table returned the same byte-identical 575-name list that 'account' and 'systemuser' did. The response says so explicitly via table_logical_name_filtered.
To ask about one specific table, use dataverse_check_relationship_eligibility, which returns a real per-table boolean. This tool cannot answer that question.
Supply a lowercase logical name ('account', not 'accounts'). Omitting it removes the parameter from the call entirely rather than sending an empty one — the two are different requests, even though they answer the same.
THE ANSWER IS BIG and 'referenced' is the biggest. Measured live: referenced 575 names / ~13 KB, many_to_many 305 / ~7 KB, referencing 166 / ~4 KB. None of these functions pages server-side, so names are trimmed to top (default 250) while count, total_count and has_more always describe the full set Dataverse returned.
The list is returned under EntityNames (live-confirmed for all three functions), which is tried first, then a by-shape fallback (a sole top-level list of strings); source names where it was actually found. If it cannot be located unambiguously, table_logical_names and the counts are OMITTED, normalized is false, and the untouched body is returned under raw_response — an unreadable payload is never reported as an empty list.
An empty list from a readable payload IS a real answer: it means no table qualifies for that role. A nonexistent table name is an HTTP error, not an empty list.
| Param | Type | Req | Default | Notes |
|---|---|---|---|---|
| dataverse_url | str |
yes | — | Required Dataverse organization URL for this request (e.g., 'https://yourorg.crm.dynamics.com'). |
| role | Literal['referenced', 'referencing', 'many_to_many'] |
yes | — | See note below. |
| table_logical_name | str | None |
no | None |
See note below. |
| top | int |
no | 250 |
Maximum number of table names to return. These functions have no server-side paging and the answers are large — measured live at 575 names for role='referenced', 305 for 'many_to_many' and 166 for 'referencing' — so results are trimmed client-side; total_count and has_more always describe the full set Dataverse returned. (ge=1, le=5000) |
- role — Which side of a relationship to enumerate. Every role answers the ENVIRONMENT-WIDE question — which tables are eligible for that role at all. 'referenced' — tables that can be the primary (one) side of a 1:N, i.e. valid targets for a lookup. 'referencing' — tables that can be the related (many) side of a 1:N, i.e. tables that can hold a lookup. 'many_to_many' — tables that can participate in an N:N; takes no table_logical_name.
- table_logical_name — Optional logical name of a table (lowercase, e.g. 'account'). IT DOES NOT NARROW THE ANSWER: measured live, supplying it returns the same list as omitting it. Dataverse does validate the name server-side (an unknown table is an HTTP 400), so pass it only to prove the table exists; use dataverse_check_relationship_eligibility to ask about one table. MUST be omitted when role='many_to_many' — that function accepts no parameter, so a value here is rejected rather than silently ignored. An empty string is NOT the same as omitting the field and is rejected. (min_len=1, max_len=50, pattern=^[a-zA-Z_][a-zA-Z0-9_]*$)
Returns JSON. Errors return {"error": true, "message": "..."}.
Read · idempotent · category schema
Check whether a solution component can be customized BEFORE trying to edit it.
Calls the unbound IsComponentCustomizable function. Nothing is read or modified — it is a cheap pre-flight check for the metadata write tools (dataverse_update_table, dataverse_update_column, dataverse_update_relationship, dataverse_update_choice, dataverse_delete_column, ...), which otherwise fail late and opaquely when the target belongs to a managed solution that locked it down. Run this first when editing anything you did not create yourself.
Pass the component's own GUID (a table's or column's MetadataId, a form's or web resource's record id — NOT a solution id) plus the integer component_type code that says what the GUID refers to. The codes are the same set dataverse_analyze_dependencies uses (1=Entity, 2=Attribute, 3=Relationship, 9=OptionSet, 60=SystemForm, 61=WebResource, 300=CanvasApp, ...); the resolved name is echoed back as component_type_name so a mismatched code is easy to spot.
The verdict is returned as a top-level is_customizable boolean. Dataverse's response was verified live and is flat, carrying exactly one property named after the function itself — {"IsComponentCustomizable": true} — which is read directly; is_customizable_source names the property the value came from. If a future platform version answers in some other shape, a lone boolean anywhere in the payload is still accepted as a fallback, and when no verdict can be identified unambiguously the key is OMITTED rather than guessed or returned as null, with normalized false and a message saying so. Never read a missing is_customizable as false. The payload is always echoed unchanged under raw_response (minus the @odata.* envelope).
A false answer means the component belongs to a managed solution whose publisher locked it down. A true answer is not a guarantee that every edit will succeed: individual managed properties (for example IsRenameable or IsValidForAdvancedFind) can still block a specific change on an otherwise customizable component.
DO NOT ASSUME SYSTEM COMPONENTS ANSWER false. Core out-of-the-box tables report true (systemuser, component type 1, was verified as true) because the platform permits customizations such as adding columns even though the base asset itself is managed. The tool does discriminate — a managed web resource (type 61) returned false while an unmanaged one returned true.
A well-formed GUID that matches no component is an HTTP 400 carrying [0x80040216] "There should be at least one metadata entity returned for EntityName: ...", surfaced through the standard {"error": true, "message": ...} envelope: it means the component id (or the component_type paired with it) is wrong, not that the component is locked.
| 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 check. This is the component's own id, NOT a solution id: the MetadataId of a table (from dataverse_get_table_metadata) or of a column (from dataverse_get_column), the MetadataId of a relationship or global choice, or the record id of a form, view, web resource or canvas app. |
| component_type | int |
yes | — | See note below. |
- component_type — Integer component type code saying what component_id refers to. This is the same code set dataverse_analyze_dependencies takes — use that tool's documentation for the full list. 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, le=100000)
Returns JSON. Errors return {"error": true, "message": "..."}.
Read · idempotent · category schema
List alternate keys (EntityKeyMetadata) defined on a Dataverse table.
Alternate keys let integration tools upsert records by business values instead of GUIDs. Returns SchemaName, LogicalName, KeyAttributes, and EntityKeyIndexStatus (which tracks async index build progress). Use the LogicalName with dataverse_delete_alternate_key to remove a key.
| Param | Type | Req | Default | Notes |
|---|---|---|---|---|
| dataverse_url | str |
yes | — | Required Dataverse organization URL for this request (e.g., 'https://yourorg.crm.dynamics.com'). |
| table_logical_name | str |
yes | — | Logical name of the table whose alternate keys to list (e.g., 'account', 'contact'). (min_len=1, pattern=^[a-zA-Z_][a-zA-Z0-9_]*$) |
| top | int |
no | 50 |
Maximum number of alternate keys to return. (ge=1, le=5000) |
Returns {"alternate_keys": ..., "count": ..., "has_more": ...}. Errors return {"error": true, "message": "..."}.
Read · idempotent · category schema
Get option values and labels for a Picklist or MultiSelectPicklist column's LOCAL option set.
Use this before filtering records with choice columns — the integer value is required for OData filter expressions (e.g., "statuscode eq 1"). For GLOBAL choices shared across tables use dataverse_get_choice instead. Handles both Picklist and MultiSelectPicklist automatically.
| Param | Type | Req | Default | Notes |
|---|---|---|---|---|
| dataverse_url | str |
yes | — | Required Dataverse organization URL for this request (e.g., 'https://yourorg.crm.dynamics.com'). |
| consistency_strong | bool |
no | False |
When True, adds the 'Consistency: Strong' request header, bypassing Dataverse's 30-second metadata cache. Use immediately after creating or updating metadata to ensure the latest schema is returned. Incurs a performance penalty; omit in normal read scenarios. |
| table_logical_name | str |
yes | — | Logical name of the table (e.g., 'account', 'lead'). Use lowercase. (min_len=1, pattern=^[a-zA-Z_][a-zA-Z0-9_]*$) |
| column_logical_name | str |
yes | — | Logical name of the Picklist or MultiSelectPicklist column (e.g., 'statuscode', 'new_category'). Use lowercase. (min_len=1, pattern=^[a-zA-Z_][a-zA-Z0-9_]*$) |
Returns {"options": ..., "count": ...}. Errors return {"error": true, "message": "..."}.
Read · idempotent · category schema
List GLOBAL choice (option set) definitions in the Dataverse environment.
Option values and labels are not returned here — use dataverse_get_choice to retrieve the full option set for a specific choice. $filter is not supported by this endpoint; top is applied client-side.
| Param | Type | Req | Default | Notes |
|---|---|---|---|---|
| dataverse_url | str |
yes | — | Required Dataverse organization URL for this request (e.g., 'https://yourorg.crm.dynamics.com'). |
| consistency_strong | bool |
no | False |
When True, adds the 'Consistency: Strong' request header, bypassing Dataverse's 30-second metadata cache. Use immediately after creating or updating metadata to ensure the latest schema is returned. Incurs a performance penalty; omit in normal read scenarios. |
| select | list[str] | None |
no | None |
Metadata properties to return (PascalCase). Defaults to MetadataId, Name, DisplayName, OptionSetType, IsGlobal, IsManaged. Note: 'Options' is not selectable on the list endpoint — use dataverse_get_choice to retrieve the full option values and labels for a specific choice. Example: ['Name', 'DisplayName', 'OptionSetType'] |
| top | int | None |
no | 50 |
Maximum number of choices to return (1–500). (ge=1, le=500) |
Returns {"choices": ..., "count": ..., "has_more": ...}. Errors return {"error": true, "message": "..."}.
Read · idempotent · category schema
List column (attribute) definitions for a Dataverse table.
Use attribute_type to narrow by column type (e.g., 'Lookup', 'Picklist'). For full metadata on a single column use dataverse_get_column. For Picklist/MultiSelectPicklist option values use dataverse_list_choice_column_options.
| Param | Type | Req | Default | Notes |
|---|---|---|---|---|
| dataverse_url | str |
yes | — | Required Dataverse organization URL for this request (e.g., 'https://yourorg.crm.dynamics.com'). |
| consistency_strong | bool |
no | False |
When True, adds the 'Consistency: Strong' request header, bypassing Dataverse's 30-second metadata cache. Use immediately after creating or updating metadata to ensure the latest schema is returned. Incurs a performance penalty; omit in normal read scenarios. |
| table_logical_name | str |
yes | — | Logical name of the table whose columns to list (e.g., 'account', 'contact', 'new_customtable'). Use lowercase. (min_len=1, pattern=^[a-zA-Z_][a-zA-Z0-9_]*$) |
| attribute_type | str | None |
no | None |
Filter columns by AttributeType. Common values: 'String', 'Integer', 'Decimal', 'Double', 'Boolean', 'DateTime', 'Lookup', 'Picklist', 'MultiSelectPicklist', 'Memo', 'Money', 'Uniqueidentifier', 'File', 'Image'. Case-sensitive (use PascalCase). |
| select | list[str] | None |
no | None |
Metadata properties to return (PascalCase). Defaults to LogicalName, SchemaName, AttributeType, DisplayName, RequiredLevel, IsValidForRead, IsValidForCreate, IsValidForUpdate. Example: ['LogicalName', 'AttributeType', 'MaxLength'] |
Returns {"columns": ..., "count": ...}. Errors return {"error": true, "message": "..."}.
Read · idempotent · category schema
List an environment's language codes (LCIDs) — which are usable, which are merely installed.
Call this before writing any localized label. provisioned is the load-bearing answer: those are the LCIDs that are actually ENABLED in this environment and therefore the only ones a LocalizedLabels entry may use (the LanguageCode on a DisplayName / Description label passed to dataverse_create_table, dataverse_create_column, dataverse_create_choice, ...). A LocalizedLabel for a language that is installed but NOT provisioned is rejected or silently dropped, so never assume 1033 (English) is provisioned — verify it.
Three unbound, zero-parameter functions are called CONCURRENTLY and their answers reconciled. THE THREE SETS CAN BE MUTUALLY DISJOINT — on the org this tool was verified against, available was [1033], provisioned was [1033], and installed_packs held 44 OTHER LCIDs not including 1033. Read each for what it literally reports and do not infer one from another:
- provisioned (RetrieveProvisionedLanguages) — the LCIDs enabled for use in this environment. THE LOAD-BEARING ONE: this is the set a LocalizedLabels entry may use, and the only one worth deciding anything from.
- available (RetrieveAvailableLanguages, container LocaleIds) — what this function reports the environment as offering. Observed live as a SHORT list that matched provisioned exactly and shared nothing with installed_packs; it is NOT "every language whose pack is on the server".
- installed_packs (RetrieveInstalledLanguagePacks) — the language packs present on the server. Observed live as by far the largest of the three and DISJOINT from both of the others. A pack being installed does not make its LCID provisioned, and this tool does not know which of them could be.
Each list is echoed exactly as Dataverse sent it (order included, not sorted) with a matching *_count. Two derived diffs are computed only when both of their inputs were read successfully, and are named after the exact subtraction they perform rather than implying one is the actionable answer: available_not_provisioned (available minus provisioned) and installed_not_provisioned (installed_packs minus provisioned). Neither is a list of languages an administrator can simply turn on — provisioning has its own prerequisites — so treat both as leads to investigate, not as a to-do list.
THE THREE CALLS FAIL INDEPENDENTLY. A function that is unavailable or privilege-gated is reported in partial_errors and the others' data is still returned, so ALWAYS read partial_errors before concluding a language is absent — a missing key means "not answered", never "empty". Only a failure of all three yields the standard {"error": true, "message": ...} envelope.
The three container property names genuinely differ (LocaleIds for the available list; the function's own name for the other two) and all three are LIVE-CONFIRMED. Each is still tried by name and then by shape (a sole list of integers), so a future change degrades rather than lies. sources reports the property each list was actually found under — check it. If a payload cannot be read unambiguously, its keys are OMITTED, normalized is false, and the untouched body appears under raw_responses; nothing is fabricated and no empty list is invented.
LCIDs are Windows locale ids (1033 = English (United States), 1036 = French (France), 1031 = German (Germany), 3082 = Spanish (Spain)); they are returned as raw integers and are not mapped to language names here.
| Param | Type | Req | Default | Notes |
|---|---|---|---|---|
| dataverse_url | str |
yes | — | Required Dataverse organization URL for this request (e.g., 'https://yourorg.crm.dynamics.com'). |
Returns JSON. Errors return {"error": true, "message": "..."}.
Read · idempotent · category schema
List relationship definitions for a table (OneToMany, ManyToOne, ManyToMany) or the whole environment.
Use the returned SchemaName with dataverse_get_relationship for full cascade and navigation property details. Navigation property names from the results are required for OData $expand queries and for dataverse_associate_records.
| Param | Type | Req | Default | Notes |
|---|---|---|---|---|
| dataverse_url | str |
yes | — | Required Dataverse organization URL for this request (e.g., 'https://yourorg.crm.dynamics.com'). |
| consistency_strong | bool |
no | False |
When True, adds the 'Consistency: Strong' request header, bypassing Dataverse's 30-second metadata cache. Use immediately after creating or updating metadata to ensure the latest schema is returned. Incurs a performance penalty; omit in normal read scenarios. |
| table_logical_name | str | None |
no | None |
Logical name of the table to scope the query to (e.g., 'account', 'contact'). If omitted, all relationships in the environment are returned. (pattern=^[a-zA-Z_][a-zA-Z0-9_]*$) |
| relationship_type | str | None |
no | None |
Filter by relationship type. Accepted values: 'OneToMany', 'ManyToOne', 'ManyToMany'. If omitted and table_logical_name is set, all three types are returned. Ignored when table_logical_name is omitted. |
| top | int |
no | 50 |
Maximum number of relationships to return (1–500). (ge=1, le=500) |
Returns {"relationships": ..., "count": ..., "has_more": ...}. Errors return {"error": true, "message": "..."}.
Read · idempotent · category schema
List tables (entities) in the Dataverse environment with their logical names and display names.
Use filter to narrow results (e.g., "IsCustomEntity eq true" for custom tables only). Use dataverse_get_table_metadata for full schema details on one table. Use dataverse_get_entity_sets to discover OData collection names for record queries.
| Param | Type | Req | Default | Notes |
|---|---|---|---|---|
| dataverse_url | str |
yes | — | Required Dataverse organization URL for this request (e.g., 'https://yourorg.crm.dynamics.com'). |
| consistency_strong | bool |
no | False |
When True, adds the 'Consistency: Strong' request header, bypassing Dataverse's 30-second metadata cache. Use immediately after creating or updating metadata to ensure the latest schema is returned. Incurs a performance penalty; omit in normal read scenarios. |
| filter | str | None |
no | None |
OData $filter for table metadata. Examples: "IsCustomEntity eq true", "IsManaged eq false" |
| select | list[str] | None |
no | None |
Metadata properties to return. Defaults to LogicalName, SchemaName, DisplayName, IsCustomEntity, IsManaged |
| top | int |
no | 50 |
Maximum number of records to return. (ge=1, le=5000) |
Returns {"tables": ..., "count": ..., "has_more": ...}. Errors return {"error": true, "message": "..."}.
Write · idempotent · category schema
Publish Dataverse schema customizations to make changes visible in model-driven apps.
Use targeted mode (entities/option_sets/relationships) to publish specific components, or set publish_all=True to publish all unpublished customizations (may take several minutes). 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'). |
| entities | list[str] |
no | [] |
Logical names of tables to publish (e.g., ['account', 'contact']). Provide this to publish only specific tables and their components. |
| option_sets | list[str] |
no | [] |
Logical names of global choices to publish (e.g., ['cr123_mychoice']). Provide this to publish only specific global choices. |
| relationships | list[str] |
no | [] |
Schema names of relationships to publish (e.g., ['cr123_account_contacts']). Provide this to publish only specific relationships. |
| web_resource_ids | list[str] |
no | [] |
GUIDs of web resources to publish (e.g., ['a1b2c3d4-...')]. Use instead of publish_all to publish only specific web resources — much faster than PublishAllXml. |
| publish_all | bool |
no | False |
When True, publishes ALL unpublished customizations in the environment using PublishAllXml. This may take several minutes for large environments. Ignores all other parameters when True. |
Returns {"published": ..., "action": ..., "parameter_xml": ...} or {"published": ..., "action": ...}. Errors return {"error": true, "message": "..."}.
Write · idempotent · category schema
Reorder all options of a global or local choice by supplying the full ordered list of values.
Provide option_set_name for a global choice, or entity_logical_name + attribute_logical_name for a local choice — not both. 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 |
Unique name of an unmanaged solution to associate this metadata change with (e.g., 'MySolution'). When provided, Dataverse automatically adds the created or updated component to that solution. Leave unset to create components outside of any solution. (pattern=^[a-zA-Z_][a-zA-Z0-9_]*$) |
| option_set_name | str | None |
no | None |
Logical name of the global choice (e.g., 'cr123_mychoice'). Provide this OR entity_logical_name + attribute_logical_name. |
| entity_logical_name | str | None |
no | None |
Logical name of the table for a local choice column. |
| attribute_logical_name | str | None |
no | None |
Logical name of the local choice column. |
| values | list[int] |
yes | — | Ordered list of all integer option codes in the desired display order. Must include every existing option value. (min_len=1) |
Returns {"reordered": ..., "values": ...}. Errors return {"error": true, "message": "..."}.
Write · idempotent · category schema
Update a global choice's metadata — the metadata API requires a full PUT, not a partial update.
First fetch the current definition with dataverse_get_choice, change the fields you need, then pass the whole object as full_definition. Call dataverse_publish_customizations after updating global choices.
| 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 |
Unique name of an unmanaged solution to associate this metadata change with (e.g., 'MySolution'). When provided, Dataverse automatically adds the created or updated component to that solution. Leave unset to create components outside of any solution. (pattern=^[a-zA-Z_][a-zA-Z0-9_]*$) |
| metadata_id | str |
yes | — | MetadataId GUID of the global choice to update. Obtain via dataverse_get_choice. (min_len=36) |
| full_definition | dict |
yes | — | Complete OptionSetMetadata JSON obtained from dataverse_get_choice. Apply your changes before passing here. The Dataverse metadata API requires a full PUT. To update individual option labels, use dataverse_update_choice_option instead. |
Returns {"updated": ..., "metadata_id": ...}. Errors return {"error": true, "message": "..."}.
Write · idempotent · category schema
Update the display label of an existing option in a global or local choice.
Provide option_set_name for a global choice, or entity_logical_name + attribute_logical_name for a local choice — not both. 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 |
Unique name of an unmanaged solution to associate this metadata change with (e.g., 'MySolution'). When provided, Dataverse automatically adds the created or updated component to that solution. Leave unset to create components outside of any solution. (pattern=^[a-zA-Z_][a-zA-Z0-9_]*$) |
| option_set_name | str | None |
no | None |
Logical name of the global choice (e.g., 'cr123_mychoice'). Provide this OR entity_logical_name + attribute_logical_name. |
| entity_logical_name | str | None |
no | None |
Logical name of the table for a local choice column. |
| attribute_logical_name | str | None |
no | None |
Logical name of the local choice column. |
| value | int |
yes | — | Integer code of the option to update. |
| label | str |
yes | — | New display label for the option. (min_len=1) |
| merge_labels | bool |
no | False |
When True, preserves labels for other languages and only updates the provided label. When False (default), replaces all language labels. |
Returns {"updated": ..., "value": ..., "label": ...}. Errors return {"error": true, "message": "..."}.
Write · idempotent · category schema
Update a column's metadata — the metadata API requires a full PUT, not a partial update.
First fetch the current definition with dataverse_get_column, change the fields you need, then pass the whole object as full_definition. Call dataverse_publish_customizations after updating columns.
| 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 |
Unique name of an unmanaged solution to associate this metadata change with (e.g., 'MySolution'). When provided, Dataverse automatically adds the created or updated component to that solution. Leave unset to create components outside of any solution. (pattern=^[a-zA-Z_][a-zA-Z0-9_]*$) |
| table_logical_name | str |
yes | — | Logical name of the table that owns the column. (min_len=1, pattern=^[a-zA-Z_][a-zA-Z0-9_]*$) |
| column_logical_name | str |
yes | — | Logical name of the column to update (e.g., 'cr123_description'). Fetch the current definition first with dataverse_get_column. (min_len=1, pattern=^[a-zA-Z_][a-zA-Z0-9_]*$) |
| full_definition | dict |
yes | — | Complete attribute definition JSON obtained from dataverse_get_column. Apply your changes to this object before passing it here. The Dataverse metadata API requires a full PUT — partial updates are not supported. |
Returns {"updated": ..., "table_logical_name": ..., "column_logical_name": ...}. Errors return {"error": true, "message": "..."}.
Write · idempotent · category schema
Update a relationship's cascade behavior or configuration — the metadata API requires a full PUT.
First fetch the current definition with dataverse_get_relationship, change the fields you need, then pass the whole object as full_definition. Call dataverse_publish_customizations after updating relationships.
| 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 |
Unique name of an unmanaged solution to associate this metadata change with (e.g., 'MySolution'). When provided, Dataverse automatically adds the created or updated component to that solution. Leave unset to create components outside of any solution. (pattern=^[a-zA-Z_][a-zA-Z0-9_]*$) |
| metadata_id | str |
yes | — | MetadataId GUID of the relationship to update. Obtain via dataverse_get_relationship. (min_len=36) |
| full_definition | dict |
yes | — | Complete relationship definition JSON obtained from dataverse_get_relationship. Apply your changes before passing here. The Dataverse metadata API requires a full PUT. |
Returns {"updated": ..., "metadata_id": ...}. Errors return {"error": true, "message": "..."}.
Write · idempotent · category schema
Update a table's display name or description via a full PUT replacement.
The tool fetches the current definition and applies your changes before PUTting it back. Call dataverse_publish_customizations afterward. 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 |
Unique name of an unmanaged solution to associate this metadata change with (e.g., 'MySolution'). When provided, Dataverse automatically adds the created or updated component to that solution. Leave unset to create components outside of any solution. (pattern=^[a-zA-Z_][a-zA-Z0-9_]*$) |
| table_logical_name | str |
yes | — | Logical name of the table to update (e.g., 'account', 'cr123_widget'). Use lowercase. (min_len=1, pattern=^[a-zA-Z_][a-zA-Z0-9_]*$) |
| display_name | str | None |
no | None |
New singular display name for the table. |
| description | str | None |
no | None |
New description for the table. |
Returns {"updated": ..., "table_logical_name": ...}. 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