dataverse-mcp 3.2.0__tar.gz → 3.3.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (50) hide show
  1. {dataverse_mcp-3.2.0/src/dataverse_mcp.egg-info → dataverse_mcp-3.3.0}/PKG-INFO +23 -4
  2. {dataverse_mcp-3.2.0 → dataverse_mcp-3.3.0}/README.md +22 -3
  3. {dataverse_mcp-3.2.0 → dataverse_mcp-3.3.0}/pyproject.toml +1 -1
  4. {dataverse_mcp-3.2.0 → dataverse_mcp-3.3.0}/src/dataverse_mcp/_app.py +1 -0
  5. {dataverse_mcp-3.2.0 → dataverse_mcp-3.3.0}/src/dataverse_mcp/models.py +526 -4
  6. {dataverse_mcp-3.2.0 → dataverse_mcp-3.3.0}/src/dataverse_mcp/server.py +1 -0
  7. dataverse_mcp-3.3.0/src/dataverse_mcp/tools/custom_apis.py +883 -0
  8. {dataverse_mcp-3.2.0 → dataverse_mcp-3.3.0}/src/dataverse_mcp/tools/metadata.py +50 -2
  9. {dataverse_mcp-3.2.0 → dataverse_mcp-3.3.0/src/dataverse_mcp.egg-info}/PKG-INFO +23 -4
  10. {dataverse_mcp-3.2.0 → dataverse_mcp-3.3.0}/src/dataverse_mcp.egg-info/SOURCES.txt +1 -0
  11. {dataverse_mcp-3.2.0 → dataverse_mcp-3.3.0}/tests/test_tool_categories.py +80 -7
  12. {dataverse_mcp-3.2.0 → dataverse_mcp-3.3.0}/LICENSE +0 -0
  13. {dataverse_mcp-3.2.0 → dataverse_mcp-3.3.0}/setup.cfg +0 -0
  14. {dataverse_mcp-3.2.0 → dataverse_mcp-3.3.0}/src/dataverse_mcp/__init__.py +0 -0
  15. {dataverse_mcp-3.2.0 → dataverse_mcp-3.3.0}/src/dataverse_mcp/batch.py +0 -0
  16. {dataverse_mcp-3.2.0 → dataverse_mcp-3.3.0}/src/dataverse_mcp/client.py +0 -0
  17. {dataverse_mcp-3.2.0 → dataverse_mcp-3.3.0}/src/dataverse_mcp/tools/__init__.py +0 -0
  18. {dataverse_mcp-3.2.0 → dataverse_mcp-3.3.0}/src/dataverse_mcp/tools/apps.py +0 -0
  19. {dataverse_mcp-3.2.0 → dataverse_mcp-3.3.0}/src/dataverse_mcp/tools/connection_references.py +0 -0
  20. {dataverse_mcp-3.2.0 → dataverse_mcp-3.3.0}/src/dataverse_mcp/tools/environment_variable_values.py +0 -0
  21. {dataverse_mcp-3.2.0 → dataverse_mcp-3.3.0}/src/dataverse_mcp/tools/environment_variables.py +0 -0
  22. {dataverse_mcp-3.2.0 → dataverse_mcp-3.3.0}/src/dataverse_mcp/tools/environments.py +0 -0
  23. {dataverse_mcp-3.2.0 → dataverse_mcp-3.3.0}/src/dataverse_mcp/tools/forms.py +0 -0
  24. {dataverse_mcp-3.2.0 → dataverse_mcp-3.3.0}/src/dataverse_mcp/tools/jobs.py +0 -0
  25. {dataverse_mcp-3.2.0 → dataverse_mcp-3.3.0}/src/dataverse_mcp/tools/plugin_registration.py +0 -0
  26. {dataverse_mcp-3.2.0 → dataverse_mcp-3.3.0}/src/dataverse_mcp/tools/plugins.py +0 -0
  27. {dataverse_mcp-3.2.0 → dataverse_mcp-3.3.0}/src/dataverse_mcp/tools/security.py +0 -0
  28. {dataverse_mcp-3.2.0 → dataverse_mcp-3.3.0}/src/dataverse_mcp/tools/solutions.py +0 -0
  29. {dataverse_mcp-3.2.0 → dataverse_mcp-3.3.0}/src/dataverse_mcp/tools/tables.py +0 -0
  30. {dataverse_mcp-3.2.0 → dataverse_mcp-3.3.0}/src/dataverse_mcp/tools/views.py +0 -0
  31. {dataverse_mcp-3.2.0 → dataverse_mcp-3.3.0}/src/dataverse_mcp/tools/web_resources.py +0 -0
  32. {dataverse_mcp-3.2.0 → dataverse_mcp-3.3.0}/src/dataverse_mcp.egg-info/dependency_links.txt +0 -0
  33. {dataverse_mcp-3.2.0 → dataverse_mcp-3.3.0}/src/dataverse_mcp.egg-info/entry_points.txt +0 -0
  34. {dataverse_mcp-3.2.0 → dataverse_mcp-3.3.0}/src/dataverse_mcp.egg-info/requires.txt +0 -0
  35. {dataverse_mcp-3.2.0 → dataverse_mcp-3.3.0}/src/dataverse_mcp.egg-info/top_level.txt +0 -0
  36. {dataverse_mcp-3.2.0 → dataverse_mcp-3.3.0}/tests/test_auth_errors.py +0 -0
  37. {dataverse_mcp-3.2.0 → dataverse_mcp-3.3.0}/tests/test_batch.py +0 -0
  38. {dataverse_mcp-3.2.0 → dataverse_mcp-3.3.0}/tests/test_fetchxml.py +0 -0
  39. {dataverse_mcp-3.2.0 → dataverse_mcp-3.3.0}/tests/test_jobs.py +0 -0
  40. {dataverse_mcp-3.2.0 → dataverse_mcp-3.3.0}/tests/test_list_paging.py +0 -0
  41. {dataverse_mcp-3.2.0 → dataverse_mcp-3.3.0}/tests/test_odata_utils.py +0 -0
  42. {dataverse_mcp-3.2.0 → dataverse_mcp-3.3.0}/tests/test_plugin_registration.py +0 -0
  43. {dataverse_mcp-3.2.0 → dataverse_mcp-3.3.0}/tests/test_published_flag.py +0 -0
  44. {dataverse_mcp-3.2.0 → dataverse_mcp-3.3.0}/tests/test_record_crud.py +0 -0
  45. {dataverse_mcp-3.2.0 → dataverse_mcp-3.3.0}/tests/test_request_with_retry.py +0 -0
  46. {dataverse_mcp-3.2.0 → dataverse_mcp-3.3.0}/tests/test_solution_import_export.py +0 -0
  47. {dataverse_mcp-3.2.0 → dataverse_mcp-3.3.0}/tests/test_token_cache.py +0 -0
  48. {dataverse_mcp-3.2.0 → dataverse_mcp-3.3.0}/tests/test_url_allowlist.py +0 -0
  49. {dataverse_mcp-3.2.0 → dataverse_mcp-3.3.0}/tests/test_web_resources.py +0 -0
  50. {dataverse_mcp-3.2.0 → dataverse_mcp-3.3.0}/tests/test_xml_dos.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dataverse-mcp
3
- Version: 3.2.0
3
+ Version: 3.3.0
4
4
  Summary: An MCP server for interacting with Microsoft Dataverse environments during development
5
5
  Author: Ryan James
6
6
  License-Expression: MIT
@@ -32,7 +32,7 @@ Dynamic: license-file
32
32
  [![Python](https://img.shields.io/pypi/pyversions/dataverse-mcp)](https://pypi.org/project/dataverse-mcp/)
33
33
  [![License: MIT](https://img.shields.io/github/license/ryanmichaeljames/dataverse-mcp)](LICENSE)
34
34
 
35
- An [MCP](https://modelcontextprotocol.io/) server that gives AI agents structured access to Microsoft Dataverse — query records, inspect metadata, manage schema, manage model-driven app forms, views, and apps, administer security roles, teams, and users, manage plug-in trace logging, and explore Power Platform environments.
35
+ An [MCP](https://modelcontextprotocol.io/) server that gives AI agents structured access to Microsoft Dataverse — query records, inspect metadata, manage schema, manage model-driven app forms, views, and apps, administer security roles, teams, and users, manage plug-in trace logging, manage custom APIs, and explore Power Platform environments.
36
36
 
37
37
  Built with [FastMCP](https://github.com/modelcontextprotocol/python-sdk), `httpx`, and the Dataverse OData v4.0 Web API. Communicates over **stdio** and works with Claude, GitHub Copilot, and any MCP-compatible client.
38
38
 
@@ -372,7 +372,7 @@ A single server instance can target any Dataverse org — pass `dataverse_url` o
372
372
 
373
373
  ## Tools
374
374
 
375
- **157 tools** grouped by domain below. Every tool returns JSON and requires `dataverse_url` on each call.
375
+ **170 tools** grouped by domain below. Every tool returns JSON and requires `dataverse_url` on each call.
376
376
 
377
377
  The **Gate** column shows when a tool is registered:
378
378
 
@@ -403,6 +403,7 @@ Use `DATAVERSE_TOOLS` to register only the tool categories your agent needs. Thi
403
403
  | `security` | 12 | Security roles, teams, users, business units |
404
404
  | `jobs` | 3 | Async operation (system job) monitoring and cancellation |
405
405
  | `webresources` | 5 | Web resource (JS/HTML/CSS/image) CRUD — gated, not always-on |
406
+ | `customapis` | 13 | Custom API, request parameter, and response property management |
406
407
 
407
408
  `core` is **always** registered even when not listed. When `DATAVERSE_TOOLS` is unset or empty, all categories register (current default behaviour). Category gating composes with `DATAVERSE_ALLOW_WRITE` and `DATAVERSE_ALLOW_DELETE`: a tool registers only when its category is enabled AND its write/delete flag (if any) is set.
408
409
 
@@ -478,7 +479,7 @@ Use `DATAVERSE_TOOLS` to register only the tool categories your agent needs. Thi
478
479
  | `dataverse_get_column` | default | Get full metadata for one column, including type-specific properties |
479
480
  | `dataverse_create_table` | write | Create a custom table (ownership type, primary name attribute) |
480
481
  | `dataverse_update_table` | write | Update a table's display name or description |
481
- | `dataverse_create_column` | write | Add a typed column to a table |
482
+ | `dataverse_create_column` | write | Add a typed column to a table (supports Memo, Boolean with custom labels, and Picklist/MultiSelectPicklist bound to a global choice) |
482
483
  | `dataverse_update_column` | write | Replace a column via full PUT (fetch with `dataverse_get_column` first) |
483
484
  | `dataverse_publish_customizations` | write | Publish schema changes via `PublishXml` (targeted) or `PublishAllXml` |
484
485
  | `dataverse_delete_table` | delete | Permanently delete a custom table and all its data |
@@ -658,6 +659,24 @@ Use `DATAVERSE_TOOLS` to register only the tool categories your agent needs. Thi
658
659
  | `dataverse_list_plugin_trace_logs` | default | List trace logs with filters (class, message, entity, operation, errors-only, time window) |
659
660
  | `dataverse_set_plugin_trace_log_setting` | write | Set org-wide trace log verbosity (`off`, `exception`, `all`) |
660
661
 
662
+ ### Custom APIs
663
+
664
+ | Tool | Gate | Description |
665
+ |------|------|-------------|
666
+ | `dataverse_list_custom_apis` | default | List custom APIs, optional filter and pagination |
667
+ | `dataverse_get_custom_api` | default | Get one custom API by GUID, including its request parameters and response properties |
668
+ | `dataverse_create_custom_api` | write | Create a custom API (unbound, entity-bound, or entity collection-bound) |
669
+ | `dataverse_update_custom_api` | write | Update mutable fields of a custom API (display name, description, visibility, allowed step types) |
670
+ | `dataverse_delete_custom_api` | delete | Permanently delete a custom API and its child parameters and properties |
671
+ | `dataverse_list_custom_api_request_parameters` | default | List request parameters for a custom API |
672
+ | `dataverse_create_custom_api_request_parameter` | write | Add a typed request parameter to a custom API |
673
+ | `dataverse_update_custom_api_request_parameter` | write | Update mutable fields of a request parameter |
674
+ | `dataverse_delete_custom_api_request_parameter` | delete | Delete a request parameter |
675
+ | `dataverse_list_custom_api_response_properties` | default | List response properties for a custom API |
676
+ | `dataverse_create_custom_api_response_property` | write | Add a typed response property to a custom API |
677
+ | `dataverse_update_custom_api_response_property` | write | Update mutable fields of a response property |
678
+ | `dataverse_delete_custom_api_response_property` | delete | Delete a response property |
679
+
661
680
  ---
662
681
 
663
682
  ## Development
@@ -4,7 +4,7 @@
4
4
  [![Python](https://img.shields.io/pypi/pyversions/dataverse-mcp)](https://pypi.org/project/dataverse-mcp/)
5
5
  [![License: MIT](https://img.shields.io/github/license/ryanmichaeljames/dataverse-mcp)](LICENSE)
6
6
 
7
- An [MCP](https://modelcontextprotocol.io/) server that gives AI agents structured access to Microsoft Dataverse — query records, inspect metadata, manage schema, manage model-driven app forms, views, and apps, administer security roles, teams, and users, manage plug-in trace logging, and explore Power Platform environments.
7
+ An [MCP](https://modelcontextprotocol.io/) server that gives AI agents structured access to Microsoft Dataverse — query records, inspect metadata, manage schema, manage model-driven app forms, views, and apps, administer security roles, teams, and users, manage plug-in trace logging, manage custom APIs, and explore Power Platform environments.
8
8
 
9
9
  Built with [FastMCP](https://github.com/modelcontextprotocol/python-sdk), `httpx`, and the Dataverse OData v4.0 Web API. Communicates over **stdio** and works with Claude, GitHub Copilot, and any MCP-compatible client.
10
10
 
@@ -344,7 +344,7 @@ A single server instance can target any Dataverse org — pass `dataverse_url` o
344
344
 
345
345
  ## Tools
346
346
 
347
- **157 tools** grouped by domain below. Every tool returns JSON and requires `dataverse_url` on each call.
347
+ **170 tools** grouped by domain below. Every tool returns JSON and requires `dataverse_url` on each call.
348
348
 
349
349
  The **Gate** column shows when a tool is registered:
350
350
 
@@ -375,6 +375,7 @@ Use `DATAVERSE_TOOLS` to register only the tool categories your agent needs. Thi
375
375
  | `security` | 12 | Security roles, teams, users, business units |
376
376
  | `jobs` | 3 | Async operation (system job) monitoring and cancellation |
377
377
  | `webresources` | 5 | Web resource (JS/HTML/CSS/image) CRUD — gated, not always-on |
378
+ | `customapis` | 13 | Custom API, request parameter, and response property management |
378
379
 
379
380
  `core` is **always** registered even when not listed. When `DATAVERSE_TOOLS` is unset or empty, all categories register (current default behaviour). Category gating composes with `DATAVERSE_ALLOW_WRITE` and `DATAVERSE_ALLOW_DELETE`: a tool registers only when its category is enabled AND its write/delete flag (if any) is set.
380
381
 
@@ -450,7 +451,7 @@ Use `DATAVERSE_TOOLS` to register only the tool categories your agent needs. Thi
450
451
  | `dataverse_get_column` | default | Get full metadata for one column, including type-specific properties |
451
452
  | `dataverse_create_table` | write | Create a custom table (ownership type, primary name attribute) |
452
453
  | `dataverse_update_table` | write | Update a table's display name or description |
453
- | `dataverse_create_column` | write | Add a typed column to a table |
454
+ | `dataverse_create_column` | write | Add a typed column to a table (supports Memo, Boolean with custom labels, and Picklist/MultiSelectPicklist bound to a global choice) |
454
455
  | `dataverse_update_column` | write | Replace a column via full PUT (fetch with `dataverse_get_column` first) |
455
456
  | `dataverse_publish_customizations` | write | Publish schema changes via `PublishXml` (targeted) or `PublishAllXml` |
456
457
  | `dataverse_delete_table` | delete | Permanently delete a custom table and all its data |
@@ -630,6 +631,24 @@ Use `DATAVERSE_TOOLS` to register only the tool categories your agent needs. Thi
630
631
  | `dataverse_list_plugin_trace_logs` | default | List trace logs with filters (class, message, entity, operation, errors-only, time window) |
631
632
  | `dataverse_set_plugin_trace_log_setting` | write | Set org-wide trace log verbosity (`off`, `exception`, `all`) |
632
633
 
634
+ ### Custom APIs
635
+
636
+ | Tool | Gate | Description |
637
+ |------|------|-------------|
638
+ | `dataverse_list_custom_apis` | default | List custom APIs, optional filter and pagination |
639
+ | `dataverse_get_custom_api` | default | Get one custom API by GUID, including its request parameters and response properties |
640
+ | `dataverse_create_custom_api` | write | Create a custom API (unbound, entity-bound, or entity collection-bound) |
641
+ | `dataverse_update_custom_api` | write | Update mutable fields of a custom API (display name, description, visibility, allowed step types) |
642
+ | `dataverse_delete_custom_api` | delete | Permanently delete a custom API and its child parameters and properties |
643
+ | `dataverse_list_custom_api_request_parameters` | default | List request parameters for a custom API |
644
+ | `dataverse_create_custom_api_request_parameter` | write | Add a typed request parameter to a custom API |
645
+ | `dataverse_update_custom_api_request_parameter` | write | Update mutable fields of a request parameter |
646
+ | `dataverse_delete_custom_api_request_parameter` | delete | Delete a request parameter |
647
+ | `dataverse_list_custom_api_response_properties` | default | List response properties for a custom API |
648
+ | `dataverse_create_custom_api_response_property` | write | Add a typed response property to a custom API |
649
+ | `dataverse_update_custom_api_response_property` | write | Update mutable fields of a response property |
650
+ | `dataverse_delete_custom_api_response_property` | delete | Delete a response property |
651
+
633
652
  ---
634
653
 
635
654
  ## Development
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "dataverse-mcp"
3
- version = "3.2.0"
3
+ version = "3.3.0"
4
4
  description = "An MCP server for interacting with Microsoft Dataverse environments during development"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.10"
@@ -32,6 +32,7 @@ _ALLOW_DELETE = os.environ.get("DATAVERSE_ALLOW_DELETE", "").lower() == "true"
32
32
  _KNOWN_CATEGORIES = frozenset({
33
33
  "core", "schema", "solutions", "flows", "forms", "views", "apps",
34
34
  "connections", "variables", "plugins", "security", "jobs", "webresources",
35
+ "customapis",
35
36
  })
36
37
 
37
38
  _raw_tools_env = os.environ.get("DATAVERSE_TOOLS", "").strip()