Dynamics 365 MCP Server
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Dynamics 365 MCP Serverlist the top 10 open opportunities and their estimated revenue"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Dynamics 365 MCP Server
简体中文 | English
Connect AI assistants to Microsoft Dataverse / Dynamics 365 Customer Engagement through the Model Context Protocol (MCP).
Built with TypeScript and the Dataverse Web API, this server provides 84 tools for record queries and mutations, metadata, Web Resources, plugin registration, data modeling, diagnostics and auditing, solutions, and classic Ribbon buttons. It connects to MCP clients over stdio and includes a local Web debugger.
Current status: local builds and 910 regression tests pass. 65/84 tools called; 20 specified write/readback paths passed and 2 publication requests were accepted (UI effects unverified). 19 tools remain uncalled. All objects created for this test were cleaned up; no pre-existing business object was modified. Full acceptance remains incomplete due to platform and capability limits; see the per-tool coverage matrix. Capabilities depend on the CRM version, customization support and identity permissions. Finance & Operations and Business Central are outside this scope.
Feature checklist · Architecture and request flow · Quick start · Authentication · Examples · Writes and deployment · Tool catalog · Testing and validation
Feature checklist
The following capabilities are implemented in code and grouped by usage scenario. Implementation and passing local tests do not establish acceptance in a real CRM environment.
Area | Tools | Capabilities |
Environment and metadata | 8 | User and organization context, environment capabilities, tables, fields, choices, navigation relationships, and cache clearing |
Queries and paging | 3 | OData, FetchXML, state filtering, paging, and query continuation |
Records and transactions | 9 | CRUD, alternate-key upsert, associations, batches, and native transactions |
Web Resources | 4 | Search, create, update, and independently publish resources such as scripts |
Plugin registration | 11 | Assembly inspection and compatible updates, step registration and updates, and Pre/Post Images |
Diagnostics, security, and audit | 9 | Plugin traces, failed jobs, principals and roles, effective access, and audit evidence |
Data model and UI definitions | 20 | Tables, columns, relationships, alternate keys, choices, form/view structure, and publication |
Actions and Functions | 2 | Discover native operation signatures from current CSDL, validate parameters, and invoke operations |
Solutions | 12 | Components and dependencies, ZIP inspection, export and restricted import, job status, snapshots, and verification |
Classic Ribbon | 6 | Read definitions, edit local candidate packages, perform controlled import, publish separately, and read definitions back |
Discover tools through MCP tools/list and invoke them through tools/call. 84 is the number of tools; 910 is the number of local test cases. These are different measures. Live acceptance is tracked per tool. Preview, local-fixture, empty-result, and partial-read checks are not full functional acceptance; see the 84-tool matrix. See the tool reference for parameters and limitations.
Queries, records, and operational evidence
Feature | What you can do | Main boundary |
Environment inspection | Read current user/organization, server version, and visible capabilities | Metadata presence does not establish write permissions |
Metadata queries | Read tables, fields, requirement levels, primary keys, choice labels, and navigation relationships | Limited to metadata visible to the connecting identity |
OData / FetchXML queries | Filter, select, sort, apply state rules, retrieve formatted values, page, and resume results | Row/page limits apply; continuation state lives in the current process |
Record maintenance | Read by ID, create, update, delete, and upsert through an active alternate key | Preflight and applicable concurrency rules apply; writes are not automatically retried |
Record associations | Set/clear Lookups and add/remove collection relationships | Disassociation does not delete related records; collection changes require explicit acceptance of concurrency limits |
Batches and transactions | Run independent operations in chunks or submit one native transactional change set | Independent batches do not roll back earlier operations; preflight reads occur outside the transaction |
Plugin failure diagnostics | Read diagnostic settings, traces, and failed system jobs; link step evidence | Read-only analysis, without automatic repair or treating correlation as a proven cause |
Security and audit | Inspect users/teams/roles, effective record access, and native audit details | No privilege elevation or role changes; old/new audit values are withheld by default |
Development and customization
Feature | What you can do | Main boundary |
Web Resources | Search by name, create/update content, and publish separately | Save and publication phases are reported separately; content reads are opt-in |
Plugin assemblies | Query registration metadata, inspect local DLLs, and compatibly update existing assemblies | Inspected DLLs are not executed; new assembly registration is not provided |
Plugin steps | Discover messages/types/filters, and query, register, or update steps | Registration uses existing plugin types; secure configuration reads are off by default |
Plugin images | Query, register, update, and delete Pre/Post Images | Validates step applicability and field lists, with preview and concurrency checks |
Tables and columns | Read definitions, create tables/supported column types, and maintain labels and column settings | Native metadata operations and solution/publisher checks apply; not every column type is supported |
Relationships | Read/create 1:N, Lookup, and N:N relationships; maintain supported menus and cascade settings | Subject to target definitions, customizability, and preview fingerprints |
Alternate keys | Read/create keys and resubmit indexing for Failed keys | Submission does not establish that the index is ready |
Choices | Read local/global choices, create global Picklists, insert/update option labels, and publish separately | No arbitrary option deletion/renumbering; Boolean retains its 0/1 semantics |
Forms and views | Read saved/unpublished definitions and make supported field, library, event, column, and ordering edits | Structural XML editing, without a visual designer or arbitrary layout rewriting |
Actions and Functions | Discover current CSDL operations, bindings, overloads, and parameter types before invocation | Does not create or modify Custom API definitions; results follow native responses |
Solutions and classic Ribbon
Feature | What you can do | Main boundary |
Solutions and components | List solutions/members, inspect dependencies, and add existing components to unmanaged solutions | Does not create missing components or bypass platform dependency checks |
Local ZIP inspection | Read manifests, file information, and hashes; reject unsupported or damaged packages | No CRM required; does not extract and execute package contents |
Solution export | Export an ordinary unmanaged source as a managed or unmanaged ZIP | Writes a new local file without overwriting an existing file |
First solution import | Preview/submit a first ordinary unmanaged async import and read jobs/logs by ID | No general existing-solution update or managed/patch/upgrade import; no automatic publication |
Snapshots and verification | Capture visible membership and selected properties, compare offline, and check a target environment | Not a complete environment backup or proof of equivalent runtime behavior |
Ribbon definition reads | Read effective buttons, command/rule references, insertion locations, and packaged RibbonDiffXml | Classic Ribbon scope, without complete modern command designer coverage |
Local Ribbon editing | Add standalone custom JS buttons, update labels/order, hide/restore visibility, and create a candidate ZIP | Preserves other package contents; does not automatically import, publish, or execute JavaScript |
Controlled Ribbon deployment | Import a candidate into an existing ordinary unmanaged solution, publish the table separately, and read selected definitions back | Explicit whole-package/table acknowledgments and a same-process receipt; UI acceptance remains separate |
Related MCP server: Dataverse MCP Server
Architecture and request flow
Overall architecture
The MCP stdio entry and local HTTP debugger share tool definitions and routing. Offline tools go directly to local handlers. CRM tools initialize services on demand and access the configured organization through a shared Web API client.
flowchart TB
Client["AI assistant / MCP client"] -->|"stdio / JSON-RPC"| MCP["MCP SDK entry"]
Browser["Local browser"] -->|"127.0.0.1:3000 / HTTP"| Debug["Local debugger"]
MCP --> Router["Tool definitions and routing"]
Debug --> Router
Router --> Local["Offline tools"]
Router --> Services["CRM services and validation"]
Local --> Files["ZIP / snapshot / local cache operations"]
Local --> Reader[".NET DLL metadata reader"]
Services -.->|"Assembly inspection"| Reader
Services -.-> State["In-process cache and continuation state"]
Services --> Auth["Authentication and request policy"]
Auth -->|"Dataverse Web API"| CRM["Configured CRM organization"]Configuration, caches, continuation state, and Ribbon import receipts belong to the server process; they are not a persistent workflow across processes. The .NET reader is used only by the relevant assembly inspection/update paths; other CRM tools do not depend on it.
How a tool call completes
This diagram shows discovery and successful call paths. Configuration, input, or platform validation failures return early rather than continuing past the failed check.
sequenceDiagram
participant C as MCP client
participant M as MCP stdio entry
participant R as Tool routing and services
participant A as Configured CRM Web API
C->>M: tools/list
M-->>C: 84 tools and input Schemas
C->>M: tools/call(name, arguments)
M->>R: Dispatch with cancellation/progress context
alt Offline tool
R->>R: Inspect ZIP / compare snapshots / read DLL metadata
else CRM tool
R->>R: Initialize on demand and validate inputs and target
R->>A: Native request using configured authentication
A-->>R: Data, job IDs, status, or platform error
end
R-->>M: Result or sanitized error
M-->>C: MCP content / isError on failureQuick start
1. Prerequisites
Component | Requirement |
Node.js | package.json declares |
npm | Required for source installation, builds, and tests; package-lock.json is included |
.NET 10 Runtime | Required for local DLL inspection, assembly updates, and the full test suite. Other tools and assembly metadata queries do not require .NET |
.NET 10 SDK | Required to rebuild the assembly reader, run |
CRM connection | Required for CRM tools. Tool discovery, cache clearing, and some offline tools work without a connection |
DLL inspection uses a fixed .NET metadata reader and does not execute the inspected plugin DLL. The reader's .NET 10 requirement is separate from the target CRM plugin's framework requirements. If dotnet is not on PATH, set D365_DOTNET_PATH to its absolute executable path.
2. Clone and build
Replace YOUR_ACCOUNT/YOUR_REPOSITORY with the actual GitHub repository:
git clone https://github.com/YOUR_ACCOUNT/YOUR_REPOSITORY.git dynamics365-mcp-server
cd dynamics365-mcp-server
npm ci
npm run buildnpm run build checks TypeScript types and generates dist/index.cjs with its runtime dependencies bundled. It uses the existing assembly reader included in the repository. Run npm run build:release to rebuild the reader as well.
3. Connect an MCP client
Add the server to a client that supports stdio MCP. The following example applies to clients using the mcpServers configuration format. Use the equivalent setup in other clients.
{
"mcpServers": {
"dynamics365": {
"command": "node",
"args": ["D:/projects/dynamics365-mcp-server/dist/index.cjs"],
"env": {
"AUTH_TYPE": "online",
"ORG_URL": "https://your-org.crm.dynamics.com",
"TENANT_ID": "YOUR_TENANT_ID",
"CLIENT_ID": "YOUR_CLIENT_ID",
"CLIENT_SECRET": "YOUR_CLIENT_SECRET",
"API_VERSION": "v9.2"
}
}
}
}Set args to the absolute path of your build and replace the connection settings. Windows JSON paths can use /; backslashes must be escaped as \\. If the client cannot find node, use the absolute path to the Node executable in command.
Save the configuration and restart the MCP service in your client. Confirm that 84 tools are listed, then call get_current_user_context and get_environment_capabilities to inspect the identity and environment. Capability discovery does not establish that permissions or write operations have been validated.
CRM services initialize on demand: the server can start and list tools without connection settings, and validates them on the first CRM call. Restart the service after changing environment variables.
Run an existing build
If you already have a build package, extract it and run:
node /absolute/path/to/package/dist/index.cjsThe built bundle runs without installing node_modules. DLL inspection still requires the .NET Runtime. A stdio server waits for MCP protocol input and does not open a webpage; see the local debugger section below for a browser interface.
Authentication
Three authentication paths are implemented, all using the Dataverse Web API. AD/NTLM has completed an initial real CRM 9.1 read-only integration pass. Online and IFD have not yet been tested in real environments.
Online: OAuth 2.0 client credentials
Variable | Description |
|
|
| Organization root URL, such as |
| Tenant ID, domain, or a supported authority URL |
| Application client ID |
| Application client secret |
ENVIRONMENT_URL is accepted as an organization URL alias. If both it and ORG_URL are supplied, they must identify the same organization. Do not include /api/data/v9.2, credentials, a query string, or a fragment in the organization URL. The connecting identity needs the appropriate data, metadata, and customization permissions in the target environment.
On-premises: AD / NTLM
Use these settings in your MCP client's env:
{
"AUTH_TYPE": "op_ad",
"ORG_URL": "https://crm.example.com/YourOrg",
"AD_DOMAIN": "YOUR_DOMAIN",
"AD_USERNAME": "YOUR_USERNAME",
"AD_PASSWORD": "YOUR_PASSWORD",
"API_VERSION": "v9.1"
}AD_WORKSTATION is optional. Set API_VERSION to a Web API version available on your server.
On-premises: IFD / ADFS
{
"AUTH_TYPE": "op_ifd",
"ORG_URL": "https://your-org.example.com",
"IFD_ADFS_URL": "https://adfs.example.com",
"IFD_CLIENT_ID": "YOUR_ADFS_CLIENT_ID",
"IFD_USERNAME": "YOUR_USERNAME",
"IFD_PASSWORD": "YOUR_PASSWORD",
"API_VERSION": "v9.1"
}Optional settings include IFD_CLIENT_SECRET, IFD_RESOURCE, and IFD_TOKEN_PATH. The resource defaults to the organization URL, and the token path defaults to /adfs/oauth2/token. Only the password grant is currently implemented; interactive sign-in is not implemented.
Shared settings
Variable | Default | Description |
|
| For example, v9.1 or v9.2; no automatic version probing or switching |
|
| Cache lifetime in seconds, a non-negative integer; 0 disables TTL-based expiration |
| — | Compatibility alias for CACHE_TTL; CACHE_TTL takes precedence when both are set |
|
| Per-request HTTP timeout, 1–300000 ms |
|
| Maximum retries for transient GET failures, 0–5 |
|
| Maximum permitted retry wait, 0–300000 ms |
|
| Optional path to the .NET executable |
For local development, you can create a .env file in the project root with these variables. MCP clients can inject environment variables directly, without a .env file. All examples use placeholders. Do not commit real secrets, passwords, tokens, customer data, or solution packages containing sensitive content, or include them in Issues.
Examples
The following JSON objects are the params of tools/call requests. Your MCP client sends the actual calls.
Query records
{
"name": "search_records_by_odata",
"arguments": {
"collection_name": "accounts",
"select": "accountid,name",
"state_mode": "all",
"page_size": 100,
"max_records": 100,
"fetch_all": false
}
}collection_name uses the native EntitySetName, such as accounts. Metadata tools generally use a table's logical name, such as account. Query responses include value, effective query information in query, and pagination information in paging.
The default state_mode=legacy may add a statecode=0 filter when the table defines that value and there is no explicit root-level state condition. Zero does not mean “active” for every table. Use state_mode: "all" to avoid adding a state filter; this does not remove conditions already present in your query.
Resume results using the returned continuation, without repeating filter/XML/paging arguments. Continuation state lives in the current server process. Restart the query after a service restart, cache clear, or expiration.
Preview a record update
{
"name": "update_existing_record",
"arguments": {
"collection_name": "accounts",
"id": "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa",
"data": {
"name": "Updated account name"
},
"dry_run": true
}
}Replace the ID with an actual record ID. Review the target, changes, and blockers before executing according to that tool's requirements. Preview defaults and concurrency requirements vary by tool, as described below.
Inspect a local solution package without CRM settings
{
"name": "inspect_solution_package",
"arguments": {
"file_path": "D:/solutions/MySolution.zip"
}
}Paths refer to the machine running the MCP server. This tool inspects a ZIP subject to size and format limits, without extracting it into a target directory or executing its contents. compare_solution_snapshots, inspect_ribbon_solution, edit_ribbon_solution, and d365_plugin_assembly_inspect also support their respective local workflows. DLL inspection requires the .NET Runtime.
Writes, publication, and result interpretation
These tools can perform real writes. Not every tool defaults to a preview:
Tool area | Default behavior |
Record mutations, Web Resource creation/updates, plugin step registration/updates, and | Preserve immediate execution; explicitly pass |
Data model maintenance, plugin image/assembly updates, solution component additions, solution export/import, Ribbon editing, and controlled deployment | Provide a preview by default; consult the tool Schema and preview for execution parameters and required fingerprints |
Separate publication tools | Some execute immediately and others default to preview; do not assume they share creation/update defaults |
Saving and publishing are separate. Web Resource creation/updates can publish by default. Model, solution, and Ribbon tools define their own publication scope. A successful save does not establish that publication occurred.
A preview fingerprint is not a lock. Some operations require the preview's planHash or definitionHash as
expected_hash, and may require explicitallow_unprotected_write. A fingerprint cannot eliminate every platform concurrency window.Writes are not automatically retried. The application does not repeat writes after a timeout, 401, throttling, or a server error. An
outcome: "unknown"requires readback; it must not be treated as evidence that nothing happened.Batches and transactions differ. Successful operations in
execute_record_batchare not rolled back because a later operation fails.execute_record_transactionuses one native change set. Preflight reads occur outside that transaction.Asynchronous acceptance is not completion. Check native job status for imports and indexing. Matching definitions on readback does not establish successful client-side behavior.
From preview to execution
The following applies to CRM writes that support preview. It shows an explicit dry_run: true workflow and does not change the immediate-execution defaults above. Fingerprints, acknowledgments, and readback requirements depend on each tool's Schema and result.
flowchart TD
Preview["dry_run: true / read target and build preview"] --> Review["User reviews changes, fingerprints, and blockers"]
Review --> Check{"Execution arguments and revalidation pass?"}
Check -->|"No"| Replan["Stop; correct inputs or preview again"]
Check -->|"Yes"| Send["dry_run: false / submit one native write"]
Send --> Outcome{"Request outcome"}
Outcome -->|"Confirmed rejection"| Failed["Report confirmed failure"]
Outcome -->|"Timeout / unknown outcome"| Unknown["Read records or jobs; no automatic resubmission"]
Outcome -->|"Successful response"| Accepted["Retain phase evidence; read definitions or jobs as defined by tool"]Batches versus transactions
An independent batch (execute_record_batch) gives each operation its own change set. A transaction (execute_record_transaction) places multiple operations in one change set. Commit/rollback below refers to outcomes confirmed by the platform; interrupted transport or unknown results still require verification.
flowchart TB
subgraph Batch["Independent batch"]
direction TB
B1["Operation 1 succeeds"] --> B2["Operation 1 committed"]
B2 --> B3["Operation 2 fails"]
B3 --> B4["Operation 1 retained; continue or stop per policy"]
end
subgraph Transaction["One native transaction"]
direction TB
T1["Operation 1 + Operation 2 + Operation 3"] --> T2{"Platform execution result"}
T2 -->|"All succeed"| T3["Commit together"]
T2 -->|"Any confirmed rejection"| T4["Roll back this change set together"]
endFrom local Ribbon editing to controlled deployment
Classic Ribbon support is currently limited to supported custom button structures and ordinary unmanaged solution workflows. import_solution_async supports only the first ordinary unmanaged import. Existing unmanaged Ribbon solutions use the separate import_ribbon_solution workflow.
Ribbon import applies the entire solution package; publication applies to the entire table, potentially including other components or pending customizations. Execution requires separate acknowledgments through allow_full_solution_import / allow_full_table_publish. The import-to-publication workflow uses a receipt from the current server process. Do not reimport to recreate a receipt after a restart. Referenced JavaScript/image resources are not automatically published by the Ribbon publication request.
General managed/upgrade/patch import, automatic rollback, Custom API definition maintenance, and complete modern command designer management are outside the current implementation. Action/Function invocation depends on signatures discoverable in the current CSDL.
flowchart TD
Source["Export and inspect existing unmanaged solution"] --> Candidate["Preview button edits and create new candidate ZIP"]
Candidate --> Preflight["Replay edits and compare fresh target export baseline"]
Preflight --> Import["Confirm fingerprint and whole-package scope; submit one async import"]
Import --> Ready{"Retain IDs / same-process receipt; job and log confirm success?"}
Ready -->|"No / insufficient evidence"| Observe["Read-only job/log checks; do not reimport"]
Ready -->|"Yes"| PublishPlan["Preview publication separately; recheck baseline and receipt"]
PublishPlan --> Publish["Acknowledge whole-table scope and submit PublishXml"]
Publish --> Verify["Read selected definitions; validate UI/runtime separately"]Status checks in this diagram are caller-triggered, not automatic background polling. verify_ribbon_deployment independently performs read-only definition checks without repair or deployment replay. Matching definitions still do not establish UI/runtime acceptance.
Tool catalog
Environment and metadata (8)
get_environment_capabilitiesget_current_user_contextlist_all_entity_definitionsget_entity_metadata_summaryget_detailed_field_metadataget_field_picklist_optionsget_entity_navigation_linksclear_server_cache
Queries and paging (3)
search_records_by_odatapreview_fetchxml_queryquery_by_fetchxml
Records and transactions (9)
get_record_by_idcreate_new_recordupdate_existing_recorddelete_record_by_idupsert_record_by_keyassociate_recordsdisassociate_recordsexecute_record_batchexecute_record_transaction
Web Resources (4)
search_web_resources_by_namecreate_web_resource_and_publishupdate_web_resource_and_publishpublish_web_resource
Plugin registration (11)
d365_plugin_registration_metadatad365_plugin_steps_queryd365_plugin_step_registerd365_plugin_step_updated365_plugin_images_queryd365_plugin_image_registerd365_plugin_image_updated365_plugin_image_deleted365_plugin_assemblies_queryd365_plugin_assembly_inspectd365_plugin_assembly_update
Diagnostics, security, and audit (9)
get_diagnostic_settingsquery_plugin_trace_logsquery_failed_system_jobsdiagnose_plugin_failurequery_security_principalsget_principal_security_contextget_record_accessget_record_audit_historyget_audit_details
Data model and UI definitions (20)
get_model_definitioncreate_model_tablecreate_model_columnupdate_model_labelspublish_model_tableget_model_relationshipcreate_model_relationshipget_model_keycreate_model_keyupdate_model_column_settingsupdate_model_relationshipreactivate_model_keyget_model_choicescreate_model_choiceschange_model_choice_valuepublish_model_choiceslist_model_ui_componentsget_model_ui_componentedit_model_formedit_model_view
Actions and Functions (2)
get_api_operationcall_d365_api_action
Solutions (12)
list_solutionslist_solution_componentsget_solution_component_dependenciesadd_solution_componentinspect_solution_packageexport_solutionimport_solution_asyncget_solution_import_statusget_solution_snapshotcompare_solution_snapshotsverify_solution_deploymentget_solution_import_log
Classic Ribbon (6)
get_ribbon_definitioninspect_ribbon_solutionedit_ribbon_solutionimport_ribbon_solutionpublish_ribbon_solutionverify_ribbon_deployment
See the detailed tool reference for full parameters, compatibility aliases, format limits, and result interpretation. Implementations are in src/tools and src/tool_handler.ts.
Local debugger
Configure environment variables or a local .env, then run:
npm run debugOpen http://localhost:3000 in your browser. The debugger listens only on 127.0.0.1:3000 and lets you browse tools, enter arguments, and inspect results. It has the same local file access and CRM permissions as the MCP service, so calls from the interface can perform real writes.
The debugger checks Host/Origin, limits request bodies, and protects static file paths. Keep it local. The main MCP transport is stdio; this project does not provide a remote HTTP/SSE MCP server.
Testing and validation
Most recent full local test pass: 2026-10-29.
Check | Result |
Isolated installation and release build | Passed; 192 dependencies installed offline, .NET build with zero warnings/errors |
Full regression suite | 910 passed, zero failures/skips; 28 test files |
Tool contracts | All 84 input Schemas compiled; tool names are unique and test-file discovery matches the configured suite |
ZIP robustness | 256 deterministic truncated/mutated samples rejected as expected |
Real localhost HTTP | 10 checks passed, in addition to in-process handler regression tests |
Extracted stdio / CLI package | 14 startup checks passed on each of Node 24.18.0 and 24.22.1, without node_modules |
Loaded TypeScript source coverage | 98.71% lines, 90.61% branches, 97.21% functions |
Live CRM integration | CRM 9.1.7.5 / API v9.1 / AD/NTLM; 65/84 tools called; 20 write/readback paths passed; 2 publication requests accepted; all new objects cleaned |
Coverage measures 72 loaded TypeScript source files. It excludes unloaded source, the bundled subprocess, and .NET code. Startup checks on the two runtimes overlap with scenarios in the main suite and must not be added together as distinct functional tests.
The 910-test regression suite used offline fixtures and request substitutes. Separate live evidence covers records, transactions, Web Resources, new tables/columns, labels/settings, relationships, views, choices, keys and publication; see the per-tool results. Relationship clearing and CSDL remain unresolved. Key reactivation is blocked by native customization metadata. Form library editing passed; adding fields to the default non-uniform section is explicitly rejected. Other authentication modes, broader permissions/concurrency/failure cases, plugin execution and Ribbon UI acceptance remain pending. No online dependency vulnerability audit or production load test was performed.
To reproduce from the source directory:
npm ci
npm run build:release
npm test
npm run test:contractsRun node scripts/qa-debug-socket.mjs separately for real localhost HTTP checks; port 3000 must be available. Tests are in tests, with supplemental contract checks in scripts/qa-local.mjs.
Development and builds
Command | Purpose |
| Start the stdio service from source using tsx |
| Watch source changes and restart |
| Check TypeScript types |
| Type-check and build the Node bundle |
| Rebuild the assembly metadata reader using the .NET 10 SDK |
| Rebuild the reader, type-check, and build the bundle |
| Start dist/index.cjs |
| Run the full local regression suite |
| Run startup and stdio/CLI checks; build first |
| Check Schemas, test-file inclusion, and ZIP mutations |
| Start the local Web debugger |
| Automatically run the release build and generate a local npm tarball; requires the .NET 10 SDK |
Generating a local tarball does not publish it to npm. The runtime entry is dist/index.cjs and the CLI entry is bin/dynamics365-mcp-server.js. The CLI loads the service in the same Node process. stdout is reserved for MCP protocol traffic; runtime logs go to stderr.
src/
index.ts MCP stdio entry
tool_handler.ts Tool registration and routing
config.ts Configuration parsing and validation
errors.ts Structured errors and sensitive-data handling
tools/ Tool descriptions and input Schemas
services/ Web API, service logic, and local package handling
debug/ Local HTTP debugger and interface
bin/ CLI and assembly metadata reader
tools/assembly-inspector/ .NET reader source
scripts/ Build and supplemental validation scripts
tests/ Regression tests and offline fixtures
docs/ Detailed tool referenceTroubleshooting
Tools are listed, but calls return D365_CONFIG_INVALID? The server permits startup without configuration. Complete the settings identified in the error and restart. If you set both organization URL variables for Online, keep them consistent.
Authentication fails or a request returns 403? For D365_AUTH_FAILED, check identity configuration and connectivity. For 403, also verify target environment permissions. Tools do not bypass platform authorization, and retries cannot replace missing permissions.
dist/index.cjs is missing? After cloning, run npm ci and npm run build, then point your client at the absolute build path.
DLL inspection fails? Check the .NET 10 Runtime and set D365_DOTNET_PATH if needed. Assembly metadata queries alone do not start the reader.
A query returns D365_QUERY_CONTINUATION_EXPIRED? Continuation state is not persisted across processes. Restart the query after a service restart, cache clear, or expiration.
Can I resubmit a write after a timeout? First use the returned phase information, job ID, or target record to determine the outcome. Resubmission after an unknown outcome can duplicate changes.
Contributing
Use Issues for reproducible problems and Pull Requests for code or documentation improvements. Include reproduction steps, Node/.NET versions, authentication type, API version, and sanitized error codes. Do not include real credentials or customer data.
When changing a tool, update its Schema, implementation, regression tests, and documentation together. Run npm run build:release, npm test, and npm run test:contracts before submitting. For changes involving real platform behavior, describe the test environment, validation steps, and anything that remains unverified.
License
package.json currently declares MIT, but the source directory does not yet contain the LICENSE text. Before a public open-source release, add the license file and confirm the licensing notices for included code and third-party dependencies.
Available Tools
84 toolsadd_solution_componentADestructive
Default preview of adding one existing component to a visible ordinary unmanaged solution. Validates the actual object/type, current CSDL and complete visible membership/required-dependency baseline. Types: 1 Entity, 2 Attribute, 9 global Option Set, 10 Entity Relationship, 14 Entity Key, 26 Saved Query, 60 System Form, 61 Web Resource, 90–93 plugin types/assemblies/steps/images. Attribute/Key requires logical_name. Fixed AddRequiredComponents=false/DoNotIncludeSubcomponents=true; implicit parent shells may still be added. Execute with planHash plus explicit unprotected Action; reread membership and report observed deltas without claiming export completeness.
| Name | Required | Description | Default |
|---|---|---|---|
| dryRun | No | Default true; no add Action is sent. | |
| dry_run | No | Default true; no add Action is sent. | |
| componentId | No | Native object/metadata GUID, NOT the solutioncomponent membership row GUID. | |
| logicalName | No | ||
| component_id | No | Native object/metadata GUID, NOT the solutioncomponent membership row GUID. | |
| expectedHash | No | Current preview planHash, required to execute. | |
| logical_name | No | ||
| componentType | No | ||
| expected_hash | No | Current preview planHash, required to execute. | |
| component_type | No | ||
| solutionUniqueName | No | ||
| solution_unique_name | No | ||
| allowUnprotectedWrite | No | Explicitly accept the native Action concurrency window; no atomic solution/dependency lock is claimed. | |
| allow_unprotected_write | No | Explicitly accept the native Action concurrency window; no atomic solution/dependency lock is claimed. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, the description discloses that preview is default, that validation covers object/type, CSDL and membership/dependency baseline, that parent shells may still be added, and that execution requires an explicit unprotected Action. It adds substantial behavioral context, though it does not fully spell out permissions or irreversible effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but front-loaded and appropriately sized for a complex, destructive 14-parameter tool. Every sentence carries relevant information, though the single-paragraph format and heavy jargon reduce readability slightly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex mutation tool with no output schema, the description covers preview versus execute, validation scope, component types, conditional logical_name, fixed flags, implicit parent additions, and post-execution verification. It still leaves minor gaps around permissions, how planHash is obtained, and exact preview output.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description adds meaningful parameter context beyond the schema, especially the component type code mapping (1, 2, 9, 10, 14, 26, 60, 61, 90–93) and the conditional requirement that Attribute/Key requires logical_name. Schema coverage is 57%, and the description compensates for the missing enum and conditional-requirement details.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: adding one existing component to a visible ordinary unmanaged solution, with preview as the default mode. It is clear what the tool does, though it does not explicitly name sibling tools like list_solution_components as alternatives.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a clear usage protocol: preview by default, then execute with planHash plus an explicit unprotected Action, followed by rereading membership and reporting deltas. It does not explicitly state when not to use the tool or name alternative siblings, so it falls short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
associate_recordsADestructive
Associate records using a validated native navigation property. Single-valued lookup uses conditional PATCH; collection membership uses $ref and requires explicit allow_unprotected_write because parent ETags do not guarantee membership concurrency.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| dryRun | No | Compatibility alias for dry_run. Conflicting aliases are rejected. | |
| dry_run | No | Read-only preview of environment, target, changes and write blockers. Default false; sensitive fields are masked. | |
| ifMatch | No | Compatibility alias for if_match. Conflicting aliases are rejected. | |
| if_match | No | Specific ETag from a prior read/preview. Without it, reads the current record ETag when the table supports concurrency. | |
| relatedId | No | Compatibility alias for related_id. Conflicting aliases are rejected. | |
| related_id | No | ||
| collectionName | No | Compatibility alias for collection_name. Conflicting aliases are rejected. | |
| collection_name | No | Native EntitySetName, such as accounts. Validated against table metadata. | |
| navigationProperty | No | Compatibility alias for navigation_property. Conflicting aliases are rejected. | |
| navigation_property | No | Native navigation property, resolved from relationship metadata to the specified related table. | |
| allowUnprotectedWrite | No | Compatibility alias for allow_unprotected_write. Conflicting aliases are rejected. | |
| relatedCollectionName | No | Compatibility alias for related_collection_name. Conflicting aliases are rejected. | |
| allow_unprotected_write | No | Default false. Explicitly allow an unprotected write if table concurrency is unconfirmed, or for collection relationship membership. Does not bypass a supplied ETag conflict. | |
| related_collection_name | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=false; the description goes further by explaining the write mechanism per cardinality and why the collection path needs allow_unprotected_write (parent ETags don't guarantee membership concurrency). It omits that a single-valued association overwrites the prior lookup value, which is the main destructive consequence an agent should know.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, zero filler, and the core action is front-loaded before the mechanism detail. Dense technical vocabulary is used only where it carries information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive, non-idempotent mutation with 15 parameters and no output schema, the description covers the two execution paths, the required safety flag, and the concurrency rationale. Remaining gaps are return shape and overwrite semantics, which are moderate but not fatal given the annotations.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 80%, so the schema already documents collection_name, navigation_property, if_match, dry_run, and allow_unprotected_write, making 3 the baseline. The description adds real value by tying navigation_property cardinality to which write path and which flag are required, but adds nothing about the undocumented related_collection_name or the alias-conflict behavior.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Associate records') plus a constraint that scopes it to 'a validated native navigation property', which separates it from generic update tools like update_existing_record. It stops short of naming the obvious sibling disassociate_records or any alternative, so sibling differentiation is implied rather than explicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Clearly routes between the tool's two modes: single-valued lookup goes through a conditional PATCH, collection membership goes through $ref and requires allow_unprotected_write. It does not say when to prefer this over update_existing_record or disassociate_records, so there is context but no exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
call_d365_api_actionADestructive
Invoke a current CSDL-defined Action/Function after typed validation. Preserves legacy defaults: Action POST and immediate execution, returning native data directly. Supports single-entity or collection binding, explicit overload IDs, primitive/enum/structural collections and safe Function parameter aliases. Optional dry_run previews without invocation and withholds parameter values by default. Optional expected_hash checks preview planHash; return_details=true returns receipt/data. No Action replay or generic business readback.
| Name | Required | Description | Default |
|---|---|---|---|
| dryRun | No | Default false preserves immediate legacy invocation. True performs metadata reads/validation only. | |
| binding | No | ||
| dry_run | No | Default false preserves immediate legacy invocation. True performs metadata reads/validation only. | |
| actionName | No | Exact case-sensitive native operation/import name or qualified name, never a URL/path. | |
| isFunction | No | Invocation defaults false (Action); discovery omits this to inspect both kinds. | |
| parameters | No | Exact case-sensitive non-binding parameter names. Int64 and Decimal support exact strings; no navigation/deep-insert properties. | |
| action_name | No | Exact case-sensitive native operation/import name or qualified name, never a URL/path. | |
| is_function | No | Invocation defaults false (Action); discovery omits this to inspect both kinds. | |
| signatureId | No | Advertised get_api_operation signature ID; required to disambiguate matching overloads. | |
| expectedHash | No | Optional current preview planHash; detects changed metadata/target/arguments, not concurrent record changes. | |
| signature_id | No | Advertised get_api_operation signature ID; required to disambiguate matching overloads. | |
| expected_hash | No | Optional current preview planHash; detects changed metadata/target/arguments, not concurrent record changes. | |
| returnDetails | No | Default false returns native data directly; true wraps receipt, HTTP status and data. | |
| return_details | No | Default false returns native data directly; true wraps receipt, HTTP status and data. | |
| includeParameterValues | No | Explicit preview opt-in to show plaintext normalized values and Function URL; default false. | |
| include_parameter_values | No | Explicit preview opt-in to show plaintext normalized values and Function URL; default false. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructiveHint=true and idempotentHint=false; the description adds real context beyond them: immediate POST execution, dry_run doing metadata reads/validation only, expected_hash detecting changed metadata but not concurrent record changes, parameter values withheld unless explicitly opted in, and no Action replay. It does not cover permission requirements or failure behavior, keeping it below 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded in the first sentence and no sentence is pure filler, but the prose is dense, jargon-heavy, and fragmented ('Preserves legacy defaults: Action POST and immediate execution, returning native data directly'), which slows comprehension for an agent scanning options.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 16-parameter destructive tool with no output schema, the description covers execution model, preview/hash verification, return wrapping, binding modes, overload disambiguation, and alias safety. It is close to complete, lacking only error/failure semantics and permission prerequisites.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 94%, so the schema already documents nearly every parameter including the alias pairs. The description adds marginal value, notably that dry_run withholds parameter values by default and that overload IDs disambiguate matching signatures. Baseline 3 is appropriate since the schema carries the load.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: invokes a CSDL-defined Action/Function with typed validation. That is clearly distinct from data-CRUD siblings like create_new_record or execute_record_batch. It stops short of naming an alternative outright, relying on the schema's reference to get_api_operation for overload discovery.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Implied usage is recoverable: use this for CSDL-declared Actions/Functions, and use dry_run to preview instead of executing. But the description never states when to prefer this over siblings such as get_api_operation, execute_record_batch, or update_existing_record, and 'Preserves legacy defaults' is not actionable guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
change_model_choice_valueADestructive
Insert a numeric choice option or update existing option labels/description through native InsertOptionValue/UpdateOptionValue (MergeLabels=true). Unmanaged choices only. Explicitly address a global choice to change shared values. Default preview; execution needs current expected_hash and allow_unprotected_write=true. No delete, renumber, state/status mutation or automatic publish.
| Name | Required | Description | Default |
|---|---|---|---|
| label | No | ||
| value | No | ||
| dryRun | No | Default true performs reads/eligibility checks and returns a native request preview. Set false to execute. | |
| dry_run | No | Default true performs reads/eligibility checks and returns a native request preview. Set false to execute. | |
| operation | No | ||
| description | No | ||
| logicalName | No | ||
| expectedHash | No | ||
| logical_name | No | ||
| attributeName | No | ||
| expected_hash | No | ||
| attribute_name | No | ||
| globalChoiceName | No | ||
| global_choice_name | No | ||
| solutionUniqueName | No | Existing unmanaged solution; its publisher prefix is validated for new schemas. | |
| solution_unique_name | No | Existing unmanaged solution; its publisher prefix is validated for new schemas. | |
| allowUnprotectedWrite | No | ||
| allow_unprotected_write | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds substantial context beyond annotations: the default dry-run preview mode, the execution preconditions (current expected_hash and allow_unprotected_write=true), MergeLabels=true behavior for updates, and explicit non-capabilities including no delete, renumber, state/status mutation, or automatic publish. This covers the destructive/write profile in a way annotations alone do not.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Five compact sentences, front-loaded with what the tool does, followed by constraints and execution requirements. There is no filler; every clause carries operational meaning.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex mutation tool with no output schema, the description covers the critical safety story: preview by default, execution gating, unmanaged-only scope, global choice addressing, and explicit no-op exclusions. It could say more about how to obtain expected_hash and the full parameter combinatorics, but it is largely complete for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With only 22% schema description coverage across 18 parameters, the description partially compensates by clarifying operation modes, the role of expected_hash and allow_unprotected_write, and the need to use global_choice_name for shared choices. However, it does not explain the solution_unique_name requirement, the logical_name/attribute_name pairing for local choices, alias handling, or value bounds, leaving many parameters under-documented.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource: insert a numeric choice option or update option labels/description. It names the native operations (InsertOptionValue/UpdateOptionValue) and distinguishes scope via 'Unmanaged choices only', so an agent can tell it apart from create_model_choices or publish_model_choices.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear usage constraints: unmanaged choices only, explicitly address a global choice to change shared values, default preview, and execution requires expected_hash plus allow_unprotected_write=true. It also lists exclusions (no delete, renumber, state/status mutation, automatic publish). It stops short of naming sibling tools as explicit alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
clear_server_cacheA
Clear local cached metadata and authentication tokens and invalidate query continuations. Does not change CRM data.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden and does disclose what is discarded and that CRM data is untouched. However, it omits the consequences of clearing authentication tokens (forced re-authentication, possible follow-on call failures), whether the operation is reversible, and whether it affects other sessions or users.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, zero filler, and the highest-value information (what is cleared) is front-loaded. The scope disclaimer follows immediately rather than being buried.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter, no-output, unannotated utility the description covers what it does and what it leaves alone, but leaves meaningful gaps: no guidance on when to call it, no warning about the downstream effect of losing auth tokens, and no note on whether the clear is global or scoped to the caller.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so per the baseline a 4 applies; there is nothing for the description to disambiguate. No parameter claims are made that could conflict with the empty schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Uses a specific verb (clear) with two named resources (local cached metadata, authentication tokens) plus the effect on query continuations. The added 'Does not change CRM data' line separates it cleanly from the surrounding sibling tools, which all mutate or read CRM metadata and records.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description never says when to invoke this tool — no trigger conditions (e.g., after schema edits, stale metadata, auth failures) and no alternatives or exclusions. The only boundary offered is a negative statement about what it does not affect, which is scope, not usage guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
compare_solution_snapshotsARead-only
Compare two versioned snapshot objects locally without CRM settings. Verify canonical shape and integrity hashes; match portable names and selected properties/root scope, ignoring environment GUIDs and label transport fields. Report missing/extra/changed component references and property paths. Gaps/ambiguous keys/unknown scope make the comparison inconclusive, never a false pass. Option display order, unselected settings, full payload, managed layers, publication and runtime are outside this profile. Read-only; no authentication or environment switching.
| Name | Required | Description | Default |
|---|---|---|---|
| sourceSnapshot | No | The complete snapshot object from get_solution_snapshot, not the success wrapper. Versioned strict shape, <=2 MiB/200 memberships, canonical definitions and all hashes are checked. Hashes do not prove authenticity. | |
| targetSnapshot | No | The complete snapshot object from get_solution_snapshot, not the success wrapper. Versioned strict shape, <=2 MiB/200 memberships, canonical definitions and all hashes are checked. Hashes do not prove authenticity. | |
| expectedManaged | No | Explicit expected target managed state, e.g. true for a managed export of an unmanaged source. | |
| source_snapshot | No | The complete snapshot object from get_solution_snapshot, not the success wrapper. Versioned strict shape, <=2 MiB/200 memberships, canonical definitions and all hashes are checked. Hashes do not prove authenticity. | |
| target_snapshot | No | The complete snapshot object from get_solution_snapshot, not the success wrapper. Versioned strict shape, <=2 MiB/200 memberships, canonical definitions and all hashes are checked. Hashes do not prove authenticity. | |
| expected_managed | No | Explicit expected target managed state, e.g. true for a managed export of an unmanaged source. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantial behavior beyond the readOnlyHint annotation: local execution without CRM settings, no authentication or environment switching, hash/checking rules, ignored transport fields, and the rule that gaps or ambiguous scope produce an inconclusive result rather than a false pass. It also discloses what the profile does not cover.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded in the first sentence, and each subsequent sentence adds distinct value: comparison rules, reported differences, failure semantics, exclusions, and read-only execution. Despite the density, there is no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex nested-object comparison tool with no output schema, the description supplies the essential comparison semantics, integrity and scope rules, inconclusive-result behavior, and exclusions. It also sketches the return content by stating that missing, extra, and changed component references and property paths are reported.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3; the schema itself documents sourceSnapshot, targetSnapshot, and expectedManaged in detail. The description adds useful comparison semantics around portable names, ignored GUIDs, and root scope, but does not add per-parameter guidance beyond what the schema already provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource — comparing two versioned snapshot objects — and immediately scopes it as local, without CRM settings. The offline/no-auth/no-environment-switching framing distinguishes it from sibling tools such as get_solution_snapshot and deployment verification tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear usage context: local snapshot comparison, plus explicit exclusions for option display order, unselected settings, full payload, managed layers, publication, and runtime. It does not explicitly name an alternative tool or say when another sibling should be used instead, so it falls short of the top guideline score.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_model_choicesADestructive
Create a global Picklist choice with an existing unmanaged solution and publisher prefix. Default preview. Omit option value to request native publisher-based allocation; supplied numeric values and label sets must be unique. Verifies saved labels and allocated values; no automatic publication.
| Name | Required | Description | Default |
|---|---|---|---|
| dryRun | No | Default true performs reads/eligibility checks and returns a native request preview. Set false to execute. | |
| dry_run | No | Default true performs reads/eligibility checks and returns a native request preview. Set false to execute. | |
| options | No | ||
| schemaName | No | ||
| description | No | ||
| displayName | No | ||
| schema_name | No | ||
| display_name | No | ||
| solutionUniqueName | No | Existing unmanaged solution; its publisher prefix is validated for new schemas. | |
| solution_unique_name | No | Existing unmanaged solution; its publisher prefix is validated for new schemas. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, readOnlyHint=false and idempotentHint=false, so the safety profile is covered. The description adds genuinely useful context beyond that: writes default to a dry-run preview, the tool verifies persisted labels and allocated values after execution, and publication is a separate step. The dry-run default meaningfully tempers the destructive hint.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four tight sentences, front-loaded with the core action and prerequisites, with constraints following. A few telegraphic fragments ('Default preview.') are efficient rather than wasteful, though slight expansion would aid readability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 10-parameter mutation tool with no output schema, the description covers the preview/write split and post-write verification reasonably well. It does not clarify the alias parameter duplication (which makes 'required parameters: 0' confusing) or what the preview response contains, leaving gaps an agent must resolve by reading the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 40%, so the description has to compensate, and it partly does: it explains omitting 'value' to get native publisher-based allocation and that supplied values/labels must be unique. However it says nothing about the schema_name vs schemaName alias pairs, the label/description language-code structure, or the display_name shape, leaving the camel/snake duplication unexplained.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Create a global Picklist choice') plus prerequisites (existing unmanaged solution, publisher prefix), which distinguishes it from siblings like create_model_column, change_model_choice_value and publish_model_choices. It does not name an alternative explicitly, but the 'global' scope and 'no automatic publication' clause implicitly separate it from publish/update tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Guidance is present but mostly parameter-level: default preview behavior, when to omit an option value, and the note that publication does not happen automatically (implying a separate publish call). There is no explicit statement of when to choose this over get_model_choices or create_model_column, so usage must be inferred.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_model_columnBDestructive
Create native String, Memo, Integer, Decimal, Money, DateTime, Boolean, Picklist or MultiSelectPicklist column. Choice columns use local options or a validated global choice binding. Checks parent managed properties, publisher prefix and duplicate logical name. Default preview; save and publication remain separate.
| Name | Required | Description | Default |
|---|---|---|---|
| type | No | ||
| dryRun | No | Default true performs reads/eligibility checks and returns a native request preview. Set false to execute. | |
| format | No | ||
| dry_run | No | Default true performs reads/eligibility checks and returns a native request preview. Set false to execute. | |
| options | No | ||
| maxValue | No | ||
| minValue | No | ||
| maxLength | No | ||
| max_value | No | ||
| min_value | No | ||
| precision | No | ||
| trueLabel | No | ||
| falseLabel | No | ||
| max_length | No | ||
| schemaName | No | ||
| true_label | No | ||
| description | No | ||
| displayName | No | ||
| false_label | No | ||
| logicalName | No | ||
| schema_name | No | ||
| defaultValue | No | ||
| display_name | No | ||
| logical_name | No | ||
| default_value | No | ||
| requiredLevel | No | ||
| required_level | No | ||
| dateTimeBehavior | No | ||
| globalChoiceName | No | ||
| date_time_behavior | No | ||
| global_choice_name | No | ||
| solutionUniqueName | No | Existing unmanaged solution; its publisher prefix is validated for new schemas. | |
| solution_unique_name | No | Existing unmanaged solution; its publisher prefix is validated for new schemas. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructiveHint=true and non-idempotent, so the safety profile is covered. The description adds genuinely new context: creation is staged (preview by default, publication is a separate step) and it runs parent-managed-property, publisher-prefix, and duplicate-logical-name validation before acting. What's missing is any note on permissions or side effects of the validation failures.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four dense sentences with the type list front-loaded and the workflow caveat at the end. The type enumeration partially duplicates the schema enum, but the sentence is tightly packed with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 33-parameter, no-output-schema mutation tool, the description covers the critical workflow semantics (dry-run default, separate publication, validation checks) but leaves most type-specific parameters undocumented, so an agent would have to reverse-engineer the schema to fill in a valid call.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 33 parameters and only 12% schema description coverage, the schema documents almost nothing, and the description does not fill the gap. It mentions choice binding via local options or global_choice_name and type-specific validation, but max_length, precision, format, required_level, date_time_behavior, default_value, min/max values, and the label structures are left entirely unexplained.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (create) and resource (column) and enumerates the nine supported column types, which lets an agent distinguish it from create_model_table and create_model_choices without opening the schema. It stops short of naming a sibling explicitly, so it lands at 4 rather than 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The line 'Default preview; save and publication remain separate' implies the dry-run-first workflow, and the validation checks hint at preconditions, but there is no explicit statement of when to choose this over create_model_choices or create_model_table. Guidance is implied rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_model_keyADestructive
Create a native alternate-key definition on 1–16 columns with solution/publisher, type, field-security and duplicate checks. Default preview; server validates index size and existing uniqueness asynchronously. Pending/unknown is not Active. No record scan, index reactivation, save replay or implicit publication.
| Name | Required | Description | Default |
|---|---|---|---|
| dryRun | No | Default true performs reads/eligibility checks and returns a native request preview. Set false to execute. | |
| dry_run | No | Default true performs reads/eligibility checks and returns a native request preview. Set false to execute. | |
| schemaName | No | ||
| displayName | No | ||
| logicalName | No | ||
| schema_name | No | ||
| display_name | No | ||
| logical_name | No | ||
| keyAttributes | No | ||
| key_attributes | No | ||
| solutionUniqueName | No | Existing unmanaged solution; its publisher prefix is validated for new schemas. | |
| solution_unique_name | No | Existing unmanaged solution; its publisher prefix is validated for new schemas. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructiveHint=true and non-idempotency, but the description adds substantial context beyond them: a default preview/dry-run mode, asynchronous server-side validation of index size and existing uniqueness, and the state caveat that 'Pending/unknown is not Active'. It also draws explicit boundaries around side effects ('No record scan, index reactivation, save replay or implicit publication'), which is exactly what an agent needs before committing a destructive mutation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and column limit, and the following sentences are dense with distinct facts rather than repetition. The telegraphic fragment 'Pending/unknown is not Active' and the clipped negation list at the end cost some readability but still carry information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive, non-idempotent create tool with no output schema and only 33% schema coverage, the description does solid work on side-effect boundaries, async validation and preview semantics. The main gap is that it never clarifies the effectively-required parameter set (all five logical fields, in either casing) or what the preview payload actually contains.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 33%, so the description must compensate and it only partly does: '1–16 columns' maps to key_attributes' maxItems, 'solution/publisher' maps to solution_unique_name, and 'type, field-security and duplicate checks' gesture at validation behavior. It says nothing about the five logical parameters (logical_name, schema_name, display_name, key_attributes, solution_unique_name), their dual snake_case/camelCase aliasing, or which are effectively required.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Create a native alternate-key definition on 1–16 columns', which clearly separates it from create_model_column, create_model_relationship and create_model_table. The clause 'No ... index reactivation' implicitly distinguishes it from reactivate_model_key, but no sibling is named explicitly, so it stops short of the top score.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Default preview' and 'No ... save replay or implicit publication' imply the intended workflow (dry-run first, publish separately), which is useful context. However, it never states when to prefer this tool over reactivate_model_key or get_model_key, nor does it spell out prerequisites such as an existing unmanaged solution, so usage is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_model_relationshipBDestructive
Create native 1:N (with a new Lookup) or N:N relationship. Default preview runs metadata reads and read-only POST eligibility checks, then exposes cascade rules and native create body. Checks publisher, managed properties and duplicate names. No implicit publish, form editing or update of existing relationships.
| Name | Required | Description | Default |
|---|---|---|---|
| type | No | ||
| dryRun | No | Default true performs reads/eligibility checks and returns a native request preview. Set false to execute. | |
| lookup | No | ||
| cascade | No | ||
| dry_run | No | Default true performs reads/eligibility checks and returns a native request preview. Set false to execute. | |
| entity1 | No | ||
| entity2 | No | ||
| entity_1 | No | ||
| entity_2 | No | ||
| schemaName | No | ||
| schema_name | No | ||
| referencedEntity | No | ||
| referenced_entity | No | ||
| referencingEntity | No | ||
| referencing_entity | No | ||
| solutionUniqueName | No | Existing unmanaged solution; its publisher prefix is validated for new schemas. | |
| intersectEntityName | No | ||
| solution_unique_name | No | Existing unmanaged solution; its publisher prefix is validated for new schemas. | |
| intersect_entity_name | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and non-idempotent, and the description adds real value by describing the dry-run default, the eligibility checks run (publisher, managed properties, duplicate names) and the absence of implicit publish. However it never surfaces the destructive consequence the annotations warn about, so the agent still learns nothing about what execution actually mutates.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four short sentences with the primary action and the authoring/dry-run model front-loaded. Slightly dense with comma-separated check lists, but nothing is redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 19-parameter, nested-object mutation with no output schema, the description covers the preview semantics and the eligibility checks but leaves the majority of parameters and the shape of returned preview data unexplained. Adequate orientation, insufficient detail.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 19 parameters and only 21% schema description coverage, the description must carry the load, yet it only gestures at lookup creation and cascade rules. Key discriminators like entity_1/entity_2 versus referenced/referencing entities, intersect_entity_name, and how schema_name relates to solution_unique_name are left unexplained.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb and resource ('Create native 1:N ... or N:N relationship') and names the distinct shapes each type requires. It is clearly separable from the sibling get_model_relationship and update_model_relationship, though it never names them directly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explains that the default is a preview pass and that execution requires opting out, and the negative clause ('No ... update of existing relationships') routes the agent away from reusing this for edits. The exclusions are implied rather than tied to a named alternative tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_model_tableADestructive
Create an ordinary custom table with a primary text name column using native EntityDefinitions. Requires an existing unmanaged solution and matching publisher prefixes. Default preview; does not place fields on forms or request publication.
| Name | Required | Description | Default |
|---|---|---|---|
| dryRun | No | Default true performs reads/eligibility checks and returns a native request preview. Set false to execute. | |
| dry_run | No | Default true performs reads/eligibility checks and returns a native request preview. Set false to execute. | |
| schemaName | No | ||
| description | No | ||
| displayName | No | ||
| primaryName | No | ||
| schema_name | No | ||
| display_name | No | ||
| primary_name | No | ||
| ownershipType | No | ||
| ownership_type | No | ||
| solutionUniqueName | No | Existing unmanaged solution; its publisher prefix is validated for new schemas. | |
| solution_unique_name | No | Existing unmanaged solution; its publisher prefix is validated for new schemas. | |
| displayCollectionName | No | ||
| display_collection_name | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds real context beyond the annotations: creation defaults to a preview/dry run and the tool deliberately stops short of form placement and publication, so the agent knows the operation is staged. With destructiveHint=true and readOnlyHint=false already declared, the preview default is the key mitigating detail and it is disclosed. What is not covered is reversibility of a created table or failure modes.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three dense sentences with the creation intent first, prerequisites second, and side-effect exclusions last. No restatement of the name and no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive, 15-parameter creation tool with no output schema, the description covers the decisions an agent must get right: dry-run default, solution/publisher prerequisite, and what the tool intentionally omits. It stops short of describing the execute-mode response or ownership-type implications, but nothing critical to correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
At 27% schema description coverage across 15 parameters (many duplicated as snake/camel aliases), the description carries real weight but only explains a few: the primary text name column, the solution requirement, and publisher-prefix validation. Ownership type, description, display collection name, maxLength, and the language_code/text label structure are entirely left to the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Create an ordinary custom table with a primary text name column") and qualifies the table type ("ordinary"), which implicitly excludes other table kinds. It also names the underlying mechanism (native EntityDefinitions). It does not explicitly contrast itself with siblings such as create_model_column or create_model_relationship, leaving that to the resource noun.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Prerequisites are spelled out: an existing unmanaged solution and matching publisher prefixes. It also delineates scope by stating it does not place fields on forms or request publication, which implicitly routes the agent to publish/field tools afterwards. No explicit named alternatives, but the when/when-not conditions are clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_new_recordADestructive
Create a native record. Accepts returned entity/ID headers or a supplied primary key, reports confirmed save separately from ID availability. dry_run previews without writing.
| Name | Required | Description | Default |
|---|---|---|---|
| data | Yes | Native JSON attribute data. Related bindings must stay inside the configured organization API. Local JSON limit 10 MiB. | |
| dryRun | No | Compatibility alias for dry_run. Conflicting aliases are rejected. | |
| dry_run | No | Read-only preview of environment, target, changes and write blockers. Default false; sensitive fields are masked. | |
| collectionName | No | Compatibility alias for collection_name. Conflicting aliases are rejected. | |
| collection_name | No | Native EntitySetName, such as accounts. Validated against table metadata. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructive=true and idempotent=false, so the safety profile is covered. Beyond that, the description adds genuine context: accepts returned entity/ID headers or a supplied primary key, reports confirmed save separately from ID availability, and dry_run previews without writing — behavior an agent could not read from annotations alone.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the create action, then the ID-handling nuance, then the dry_run preview. Slightly telegraphic phrasing ('Accepts returned entity/ID headers') borders on ambiguity but nothing is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a write tool with no output schema, the description usefully pre-announces return behavior ('reports confirmed save separately from ID availability') and the dry_run escape hatch. It leaves required data/collection_name requirements to the schema, which is fair given 100% coverage, but a note on validation failure behavior would complete it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema itself documents data, dry_run, and the collection_name/collectionName alias pair thoroughly. The description only gestures at 'a supplied primary key' and dry_run and adds no syntax or constraint detail beyond what the schema already provides; baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('Create a native record') and the schema clarifies the target as a native entity set such as 'accounts'. It distinguishes reasonably well from model-metadata siblings (create_model_table, create_model_key) by working on records rather than schema, though it never explicitly contrasts with the closely named sibling upsert_record_by_key.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains what dry_run does, which implies when to preview, but it never states when to use this create vs. alternatives like upsert_record_by_key or execute_record_batch. The agent must infer create-vs-upsert semantics from the tool names alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_web_resource_and_publishADestructive
Create a Web Resource without overwriting an existing saved name. Defaults to scoped PublishXml after saving. publish=false saves only; dry_run=true previews without writing. A publication error preserves saved=true and the created ID; recover with publish_web_resource.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| dryRun | No | Compatibility alias for dry_run; conflicting aliases are rejected. | |
| content | No | Inline content, UTF-8 by default. Supply exactly one of content or file_path; empty content is allowed. | |
| dry_run | No | Read-only preview showing the environment, target, metadata changes and content hashes. Does not save or publish. | |
| publish | No | Default true preserves the old save-and-publish behavior. Set false to save without publishing. | |
| filePath | No | Compatibility alias for file_path; conflicting aliases are rejected. | |
| file_path | No | Absolute source-file path on the MCP server machine; read as bytes and Base64 encoded. Supply exactly one of file_path or content. Maximum 10 MiB. | |
| description | No | Optional description; an empty string clears it. | |
| displayName | No | Compatibility alias for display_name; conflicting aliases are rejected. | |
| display_name | No | ||
| contentEncoding | No | Compatibility alias for content_encoding; conflicting aliases are rejected. | |
| webResourceType | No | Compatibility alias for web_resource_type; conflicting aliases are rejected. | |
| content_encoding | No | Inline content encoding, default utf8. Base64 must be canonical. Not used with file_path. | |
| web_resource_type | No | 1 HTML, 2 CSS, 3 JS, 4 XML, 5 PNG, 6 JPG, 7 GIF, 8 XAP, 9 XSL, 10 ICO, 11 SVG, 12 RESX; platform/version support is validated on save. | |
| solutionUniqueName | No | Compatibility alias for solution_unique_name; conflicting aliases are rejected. | |
| solution_unique_name | No | Optional unmanaged solution unique name, sent in MSCRM.SolutionUniqueName when creating. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare a non-read-only, non-idempotent, destructive operation, while the description adds valuable behavior: no overwrite of an existing saved name, default publish after save, dry-run preview without writes, and preservation of saved=true and the created ID when publishing fails. It omits authorization requirements but adds substantial context beyond the structured annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four tight sentences front-load the purpose, then cover defaults, preview behavior, and error recovery. Every sentence adds useful information without repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 16-parameter create-and-publish tool with no output schema, the description covers critical state transitions and recovery behavior well. It does not describe the normal success response in detail, but that is a minor gap given the rich schema and annotations.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is high at 88%, so the schema already documents aliases, enums, file/content constraints, and type mappings. The description reinforces publish and dry_run behavior but does not add much parameter meaning beyond what the schema provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource (create a Web Resource) and adds the key scope constraint that it will not overwrite an existing saved name. This clearly distinguishes it from sibling update and publish tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explains the default publish behavior, how to save without publishing via publish=false, how to preview with dry_run=true, and how to recover from a publication error using publish_web_resource. It does not explicitly direct existing-resource updates to update_web_resource_and_publish, but the create-only scope is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
d365_plugin_assemblies_queryBRead-only
List native plugin assembly metadata with optional exact ID/name filters. Excludes content, credentials and configuration; bounded completeness is explicit. Does not invoke the .NET reader.
| Name | Required | Description | Default |
|---|---|---|---|
| top | No | ||
| name | No | ||
| assemblyId | No | ||
| assembly_id | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With readOnlyHint already declaring the safety profile, the description adds real value: it names what is deliberately excluded from results (content, credentials, configuration) and flags that completeness is bounded. That tells the agent results may be truncated, which annotations alone would not convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences with the core purpose front-loaded and no filler. The phrase 'bounded completeness is explicit' is slightly abstract/self-referential but still earns its place by flagging truncation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
A read-only list tool with no output schema, so the description needn't explain return values. It covers exclusions and bounded results but leaves the pagination/limit parameter and the alias duplication unexplained, which matters for a 4-param tool with zero schema documentation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must carry parameter meaning. It conveys that ID/name filters are exact-match, which is useful, but says nothing about the `top` limit, its 500 maximum, or the assemblyId/assembly_id alias pair — half the parameters remain opaque.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'List native plugin assembly metadata'. The clause 'Does not invoke the .NET reader' implicitly distinguishes it from the d365_plugin_assembly_inspect sibling, so an agent can tell which one to reach for, though the sibling is not named outright.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage context is only implied. The exclusion of content/credentials/configuration and the note about the .NET reader hint that this is for lightweight metadata listing rather than full inspection, but there is no explicit 'use X instead when you need Y' routing to d365_plugin_assembly_inspect.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
d365_plugin_assembly_inspectARead-only
Read actual DLL identity, target framework, public plugin contract types and reference metadata locally using a fixed .NET 10 metadata-reader process. No CRM settings required. Does not load/execute inspected code, verify its signature or resolve dependencies.
| Name | Required | Description | Default |
|---|---|---|---|
| filePath | No | Local regular managed DLL, at most 16 MiB. Never executed. | |
| file_path | No | Local regular managed DLL, at most 16 MiB. Never executed. | |
| contentBase64 | No | Canonical base64 managed DLL; exclusive with file_path. | |
| content_base64 | No | Canonical base64 managed DLL; exclusive with file_path. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint annotation, the description discloses that it uses a fixed .NET 10 metadata-reader process, does not require CRM settings, does not execute the inspected code, and does not verify signatures or resolve dependencies. This adds meaningful safety and limitation context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded: it states the core capability first, then the operating context, then the explicit non-goals. Every sentence contributes useful information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only local inspection tool without an output schema, the description covers what metadata is read and what is explicitly not done. It could be slightly more complete by routing users to the appropriate CRM/query sibling for registered assembly metadata.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents filePath/file_path and contentBase64/content_base64. The description does not add parameter-specific meaning beyond noting local use and no CRM settings, so baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: reading DLL identity, target framework, public plugin contract types, and reference metadata. It distinguishes itself from CRM-oriented siblings by saying it works locally and requires no CRM settings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It implies usage for local DLL inspection and gives exclusions such as no code execution, signature verification, or dependency resolution. However, it does not explicitly name when to use this over siblings like d365_plugin_assemblies_query or d365_plugin_registration_metadata.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
d365_plugin_assembly_updateADestructive
Default preview only. Compare actual DLL against a stored unmanaged database assembly and preserve all existing plugin type IDs/names. Permit same major/minor non-decreasing build/revision, same identity/framework/references and AnyCPU signed managed DLL only. Managed, packaged, workflow, added/removed/unresolved types and dependency changes are blocked. Execute with preview fingerprint and metadata-gated concurrency; verify stored bytes, identity and type IDs after saving. .NET 10 Runtime required. Never creates assemblies or retargets steps.
| Name | Required | Description | Default |
|---|---|---|---|
| dryRun | No | Default true; use false only with the same preview fingerprint. | |
| dry_run | No | Default true; use false only with the same preview fingerprint. | |
| ifMatch | No | Specific ETag; wildcard rejected. | |
| filePath | No | Local regular managed DLL, at most 16 MiB. Never executed. | |
| if_match | No | Specific ETag; wildcard rejected. | |
| file_path | No | Local regular managed DLL, at most 16 MiB. Never executed. | |
| assemblyId | No | ||
| assembly_id | No | ||
| contentBase64 | No | Canonical base64 managed DLL; exclusive with file_path. | |
| content_base64 | No | Canonical base64 managed DLL; exclusive with file_path. | |
| expectedFingerprint | No | ||
| expected_fingerprint | No | ||
| allowUnprotectedUpdate | No | Explicitly allow If-Match:* only when table concurrency is not confirmed; cannot bypass a supplied ETag. | |
| allow_unprotected_update | No | Explicitly allow If-Match:* only when table concurrency is not confirmed; cannot bypass a supplied ETag. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the destructive and non-idempotent annotations, the description discloses preview defaults, validation rules, blocked change categories, concurrency gating, post-save verification, and the .NET runtime requirement. This is unusually rich behavioral context for an update operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but largely free of filler, and most sentences carry essential constraints or safeguards. It is somewhat run-on and leads with 'Default preview only' rather than an explicit purpose statement, which slightly hurts readability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex, destructive update tool with no output schema, it covers the critical safety and validation model well, including preview, fingerprinting, concurrency, and verification. It still leaves gaps around permissions/auth expectations and the exact shape of the preview or save result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 71%, so the schema already documents many parameters. The description adds conceptual context around preview fingerprints and metadata-gated concurrency, but it does not meaningfully explain key parameters such as assembly_id or expectedFingerprint beyond what the schema and naming imply.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description makes clear that this is a controlled update of an existing plugin assembly from a DLL, with preview-first behavior and preservation of plugin type IDs. It distinguishes itself from creation and step-retargeting, but it never explicitly names the sibling tools or states 'update plugin assembly' as a crisp purpose sentence.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives strong usage context: preview by default, execute only with the preview fingerprint, and do not use it to create assemblies or retarget steps. It also lists blocked scenarios, but it stops short of explicitly routing the agent to alternative tools such as inspection or query tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
d365_plugin_image_deleteADestructive
Preview/delete an unmanaged customizable image by exact ID. Requires preview fingerprint, metadata-gated concurrency and a subsequent 404 to confirm deletion. Does not delete its parent step or retry a write.
| Name | Required | Description | Default |
|---|---|---|---|
| dryRun | No | Default true. Preview first, then use false with expected_fingerprint. | |
| dry_run | No | Default true. Preview first, then use false with expected_fingerprint. | |
| ifMatch | No | Specific image ETag; wildcard rejected. Defaults to the current ETag when concurrency is supported. | |
| imageId | No | ||
| if_match | No | Specific image ETag; wildcard rejected. Defaults to the current ETag when concurrency is supported. | |
| image_id | No | ||
| expectedFingerprint | No | Fingerprint from the same operation preview, required for actual writes. | |
| expected_fingerprint | No | Fingerprint from the same operation preview, required for actual writes. | |
| allowUnprotectedUpdate | No | Explicit opt-in to If-Match:* only when concurrency metadata is false/unknown and no specific ETag was supplied. | |
| allow_unprotected_update | No | Explicit opt-in to If-Match:* only when concurrency metadata is false/unknown and no specific ETag was supplied. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructive=true and idempotent=false, and the description goes well beyond them: it explains the preview-then-write fingerprint requirement, metadata-gated concurrency, the unusual 404-based confirmation semantics, and that a failed write is not retried. That is exactly the extra context a destructive, non-idempotent tool needs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three dense sentences with zero filler: identity and scope first, prerequisites second, boundaries third. Nothing is repeated from the schema and no sentence could be removed without losing a call-relevant fact.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive 10-parameter tool with no output schema, the description covers the critical behavior (preview gating, fingerprint, confirmation, scope limits). It leaves implicit where the fingerprint comes from (a dry-run of this same tool) and says nothing about what the preview returns, which is the one remaining gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 80% and the individual parameters (dry_run, if_match, expected_fingerprint, allow_unprotected_update) already carry their own descriptions, so the baseline is 3. The description reinforces the fingerprint and exact-ID constraints but adds no new detail about the concurrency opt-in or alias pairs.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (delete) and resource (an unmanaged customizable plugin image) qualified by 'by exact ID', which is precise enough to separate it from the sibling d365_plugin_image_register, d365_plugin_image_update and d365_plugin_images_query tools. The 'Preview/delete' framing also flags the dual dry-run/live mode up front.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear operational conditions: preview first, supply the fingerprint from that preview, and confirm deletion via a subsequent 404. It also draws an explicit boundary ('Does not delete its parent step or retry a write'), though it never names which sibling to use for parent-step removal or for a plain image lookup.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
d365_plugin_image_registerADestructive
Preview/register a native Pre/Post/Both image with explicit readable fields. Supports entity-specific Create, Update, Delete, Assign and SetState steps. Validates stage/message and overlapping aliases. Preview fingerprint required to write. No assembly upload or automatic publication.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | ||
| dryRun | No | Default true. Preview first, then use false with expected_fingerprint. | |
| stepId | No | ||
| dry_run | No | Default true. Preview first, then use false with expected_fingerprint. | |
| step_id | No | ||
| imageType | No | ||
| attributes | No | ||
| image_type | No | ||
| description | No | ||
| entityAlias | No | ||
| entity_alias | No | ||
| expectedFingerprint | No | Fingerprint from the same operation preview, required for actual writes. | |
| expected_fingerprint | No | Fingerprint from the same operation preview, required for actual writes. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare destructiveHint=true and readOnlyHint=false; the description adds meaningful context beyond them: the mandatory preview-fingerprint gate before a destructive write, validation of stage/message and overlapping aliases, and the dry-run-first intent. It stops short of describing irreversibility or result shape, but the safety path is clearly disclosed and consistent with the destructive annotation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Five short sentences, each carrying distinct information (capability, supported steps, validation, write gate, exclusions), with the core purpose front-loaded. A few phrases such as 'explicit readable fields' are slightly opaque but not wasteful.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive mutation tool with no output schema, the description covers the write gate, validation behavior, and scope exclusions adequately. It could say more about what a preview returns (the fingerprint object) and the meaning of the 13 parameters, but the operational essentials are present.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is low (31%) across 13 params, so the description must compensate. It does add conceptual meaning for image_type (Pre/Post/Both), attributes (explicit readable fields), entity_alias (entity-specific), and expected_fingerprint (required to write), but leaves name, description, step_id, and the alias duality unexplained.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb pair (Preview/register) and resource (native Pre/Post/Both image) plus the scope of supported steps (Create, Update, Delete, Assign, SetState). It is readily distinguishable from siblings like d365_plugin_image_update and d365_plugin_image_delete.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The two-phase workflow is explicit: preview first, then write requires a preview fingerprint. It also scopes out what it does NOT do (no assembly upload, no automatic publication). It does not explicitly say when to use this versus d365_plugin_image_update, leaving that to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
d365_plugin_images_queryBRead-only
List native images for an exact step without reading plugin configuration. Bounded results report completeness; does not follow continuation links.
| Name | Required | Description | Default |
|---|---|---|---|
| top | No | ||
| stepId | No | ||
| step_id | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so safety is covered, and the description contributes genuine beyond-schema behavior: results are bounded and self-report completeness, and continuation links are deliberately not followed. This tells the agent to check completeness rather than assume an exhaustive list — a meaningful operational caveat.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tightly packed sentences with the scope stated first and the behavioral caveats second. No filler, though the phrase "bounded results report completeness" is somewhat compressed and takes a second read.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only single-purpose query with no output schema, the description covers what it returns and how truncation behaves, which is the critical piece. It stops short of describing what a native image record contains or how the step identifier is obtained, leaving gaps an agent must fill from trial or siblings.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% across three parameters, so the description must carry the load and largely does not. It only hints that the step identifier is matched exactly; `top`, the stepId/step_id aliasing, the UUID format constraint, and the anyOf-one-of requirement are left entirely to the caller to infer from the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: "List native images for an exact step." The qualifier "without reading plugin configuration" distinguishes it from heavier inspection siblings like d365_plugin_assembly_inspect, though it never names an explicit alternative.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied rather than stated: you already know the step and want only its images, avoiding the cost of reading plugin configuration. There is no explicit when-not condition or named sibling to use instead (e.g. when the step id is unknown, use d365_plugin_steps_query).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
d365_plugin_image_updateADestructive
Preview/update an unmanaged customizable image. Omitted patch values are preserved. Checks fields, parent step and duplicate aliases, requires preview fingerprint and metadata-gated concurrency, then reads back saved fields.
| Name | Required | Description | Default |
|---|---|---|---|
| patch | No | ||
| dryRun | No | Default true. Preview first, then use false with expected_fingerprint. | |
| dry_run | No | Default true. Preview first, then use false with expected_fingerprint. | |
| ifMatch | No | Specific image ETag; wildcard rejected. Defaults to the current ETag when concurrency is supported. | |
| imageId | No | ||
| if_match | No | Specific image ETag; wildcard rejected. Defaults to the current ETag when concurrency is supported. | |
| image_id | No | ||
| expectedFingerprint | No | Fingerprint from the same operation preview, required for actual writes. | |
| expected_fingerprint | No | Fingerprint from the same operation preview, required for actual writes. | |
| allowUnprotectedUpdate | No | Explicit opt-in to If-Match:* only when concurrency metadata is false/unknown and no specific ETag was supplied. | |
| allow_unprotected_update | No | Explicit opt-in to If-Match:* only when concurrency metadata is false/unknown and no specific ETag was supplied. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructive=true and non-idempotent, and the description adds meaningful confirmation-side detail beyond them: omitted patch values are preserved (partial-semantics), validation runs against fields, parent step and duplicate aliases, and saved fields are read back. It doesn't spell out consequences of a bad update or permission requirements, but the added disclosure is well past the annotation baseline.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the verb and resource, with no redundant restatement of the title. The second sentence compresses four distinct behaviors into one clause chain, which is dense but still parseable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 11-parameter, nested-object mutation with no output schema, the description covers the preview-to-write flow, partial-patch semantics, the validation gates, the fingerprint requirement and the read-back return. Missing only sibling routing and explicit failure/concurrency edge cases.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Coverage is 73% and the schema already documents dryRun, ifMatch, expectedFingerprint and allowUnprotectedUpdate. The description still adds real semantics the schema lacks: patch is a partial patch whose omitted values are preserved, and a preview fingerprint is mandatory for the write path. It leaves the ifMatch/allowUnprotectedUpdate interplay to the schema, so not a 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ("Preview/update an unmanaged customizable image") and the tool name plus sibling naming convention (image_register, image_delete, image_update) makes the target obvious. It doesn't explicitly contrast itself with those siblings in the text, so it stops short of a 5, but the operation is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the workflow (preview first, then a fingerprint-gated real write) and names prerequisites for the write path. It never states when to choose this over d365_plugin_image_register or d365_plugin_image_delete, nor any exclusions, so usage is only implied rather than prescribed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
d365_plugin_registration_metadataARead-only
Discover native plugin types, assemblies, SDK messages and message filters. Bounded read-only listings report limits; metadata does not prove write permission. Does not upload assemblies.
| Name | Required | Description | Default |
|---|---|---|---|
| message | No | Exact SDK message name, for example Update. | |
| assemblyName | No | Compatibility alias for assembly_name. Conflicting aliases are rejected. | |
| assembly_name | No | Exact assembly name to disambiguate a plugin class. | |
| primaryEntity | No | Compatibility alias for primary_entity. Conflicting aliases are rejected. | |
| pluginTypeName | No | Compatibility alias for plugin_type_name. Conflicting aliases are rejected. | |
| primary_entity | No | Logical table name. Omit for a global message registration. | |
| plugin_type_name | No | Exact plugin class name, such as Company.Plugins.AccountUpdate. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint=true already covers the safety profile, yet the description still adds real value: it warns that listings are bounded and report limits (i.e. results may be truncated) and that metadata presence does not prove write permission. It also clarifies the tool never uploads assemblies, ruling out a mutation an agent might assume from a 'plugin registration' name.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the discovery scope, followed by the two key caveats. No filler and nothing buried.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only discovery tool with full schema coverage and no output schema, the description covers scope, truncation behavior and the write-permission caveat. What it omits is any sense of the shape of results (e.g. whether listings are grouped per message or assembly), which an agent would benefit from when interpreting output.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all seven parameters, including the alias semantics and the 'omit for global registration' note on primary_entity. The description's mention of SDK messages, assemblies and plugin types loosely maps to message/assembly_name/plugin_type_name but adds no syntax or constraint details beyond the schema, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Discover') and enumerates the concrete resources: plugin types, assemblies, SDK messages and message filters. It is clearly a read-only metadata listing tool, but it doesn't explicitly name the sibling it differs from (e.g. d365_plugin_assemblies_query or d365_plugin_assembly_inspect), so sibling differentiation is only implied by the 'does not upload' clause.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Bounded read-only listings report limits' and 'Does not upload assemblies' hint at when this tool is appropriate and when it isn't. However, no alternative tool is named and there is no explicit statement of when to prefer d365_plugin_assemblies_query or d365_plugin_steps_query over this one, leaving selection to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
d365_plugin_step_registerADestructive
Register a step for an existing native plugin type. Resolves message/entity filters, validates filtering fields and detects duplicate signatures. No write is automatically replayed. Optional secure configuration is allocated separately and bound in the step create; all phases report their IDs on failure. dry_run previews without writing.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | Yes | 0/Synchronous or 1/Asynchronous. Async requires PostOperation. | |
| name | No | ||
| rank | Yes | ||
| stage | Yes | 10/PreValidation, 20/PreOperation, 40/PostOperation. | |
| dryRun | No | Compatibility alias for dry_run. Conflicting aliases are rejected. | |
| dry_run | No | Read-only preview of the environment, resolved target and changes. Configuration values are withheld. Default false. | |
| message | Yes | Exact SDK message name, for example Update. | |
| pluginType | No | Compatibility alias for plugin_type. Conflicting aliases are rejected. | |
| description | No | ||
| plugin_type | No | ||
| primaryEntity | No | Compatibility alias for primary_entity. Conflicting aliases are rejected. | |
| conflictPolicy | No | Compatibility alias for conflict_policy. Conflicting aliases are rejected. | |
| primary_entity | No | Logical table name. Omit for a global message registration. | |
| conflict_policy | No | Default error. Multiple duplicates remain an error. update_existing preserves omitted optional fields/configuration. | |
| filteringAttributes | No | Compatibility alias for filtering_attributes. Conflicting aliases are rejected. | |
| impersonatingUserId | No | Compatibility alias for impersonating_user_id. Conflicting aliases are rejected. | |
| secureConfiguration | No | Compatibility alias for secure_configuration. Conflicting aliases are rejected. | |
| supportedDeployment | No | Compatibility alias for supported_deployment. Conflicting aliases are rejected. | |
| filtering_attributes | No | Entity-specific Update only. Deduplicated, lowercased, checked against metadata; primary key rejected. Empty array clears filtering. | |
| secure_configuration | No | Optional secret; never echoed by a write or preview. Uses a new secure configuration row. | |
| supported_deployment | No | Deployment: 0/ServerOnly, 1/OfflineOnly, 2/Both; availability depends on the target platform. | |
| impersonating_user_id | No | Run as this system user; null restores calling-user context. | |
| unsecureConfiguration | No | Compatibility alias for unsecure_configuration. Conflicting aliases are rejected. | |
| allowUnprotectedUpdate | No | Compatibility alias for allow_unprotected_update. Conflicting aliases are rejected. | |
| unsecure_configuration | No | Optional unsecure configuration; never echoed by a write or preview. | |
| allow_unprotected_update | No | Default false. Explicitly allow an update with If-Match:* if table metadata does not confirm optimistic concurrency. Does not bypass a supplied ETag conflict. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructiveHint=true and idempotentHint=false, so the description's job is limited to adding context, and it does: no automatic replay of the write, secure configuration is allocated as a separate row and bound during create, and all phases report IDs on failure. That partial-failure/ID-reporting detail is genuinely useful and not derivable from the schema or annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Five tight sentences, front-loaded with the core action before the validation, configuration, and preview details. No filler, though the secure-configuration sentence is dense enough that a shorter phrasing would read faster.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 26-parameter mutation tool with no output schema, the description covers the important unknowns: dry_run as a non-writing preview, partial-failure ID reporting, and secure configuration handling. It does not say what a successful call returns (e.g. step ID/shape), which is the main remaining gap given the absence of an output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 85% across 26 parameters, so the schema already carries the burden, including enums, aliases, and dry_run semantics. The description adds only the aggregate notion that message/entity filters are resolved and filtering fields validated, which explains behavior rather than individual parameters; specific parameter meaning is left to the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence gives a specific verb and resource ("Register a step for an existing native plugin type"), which separates it from the query/update siblings by implication. It never names d365_plugin_steps_query or d365_plugin_step_update explicitly, so the differentiation relies on the reader inferring register-vs-read-vs-modify.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by "Register a step for an existing native plugin type" plus the note that dry_run previews without writing, which tells an agent how to do a safe rehearsal. There is no explicit when-not guidance, no mention of the update/query siblings, and no statement of prerequisites such as needing the plugin type to already exist in the target environment.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
d365_plugin_steps_queryARead-only
Query native plugin steps with exact filters. Secure Configuration is excluded by default; explicit include_secure_configuration=true is required to read plaintext. All supplied filters, including step_id, are combined. Results are bounded by top.
| Name | Required | Description | Default |
|---|---|---|---|
| top | No | Maximum results; default 50. | |
| mode | No | 0/Synchronous or 1/Asynchronous. Async requires PostOperation. | |
| stage | No | 10/PreValidation, 20/PreOperation, 40/PostOperation. | |
| stepId | No | Compatibility alias for step_id. Conflicting aliases are rejected. | |
| enabled | No | ||
| message | No | Exact SDK message name, for example Update. | |
| step_id | No | ||
| assemblyName | No | Compatibility alias for assembly_name. Conflicting aliases are rejected. | |
| assembly_name | No | Exact assembly name to disambiguate a plugin class. | |
| primaryEntity | No | Compatibility alias for primary_entity. Conflicting aliases are rejected. | |
| pluginTypeName | No | Compatibility alias for plugin_type_name. Conflicting aliases are rejected. | |
| primary_entity | No | Logical table name. Omit for a global message registration. | |
| plugin_type_name | No | Exact plugin class name, such as Company.Plugins.AccountUpdate. | |
| includeSecureConfiguration | No | Compatibility alias for include_secure_configuration. Conflicting aliases are rejected. | |
| includeUnsecureConfiguration | No | Compatibility alias for include_unsecure_configuration. Conflicting aliases are rejected. | |
| include_secure_configuration | No | Explicit opt-in to read and return Secure Configuration plaintext. Default false, changed from the legacy package. | |
| include_unsecure_configuration | No | Include Unsecure Configuration in query results, default true (legacy behavior). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With readOnlyHint already declaring the safety profile, the description adds genuinely non-obvious behavior: Secure Configuration is suppressed by default and requires explicit opt-in plaintext read, all filters combine conjunctively, and output volume is capped by top. It does not cover permission requirements or what happens when no filters are supplied.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, each carrying distinct information: purpose first, then the security-relevant default, then filter/output semantics. No repetition of schema content and no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 17-parameter read tool with no output schema, the description covers the highest-risk behaviors (secure configuration exposure, conjunctive filtering, result bounding). It leaves the caller to infer the no-filter case and whether a zero-match or error is returned, which matters given only top bounds the result set.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 88%, so the schema already documents nearly every parameter including the alias mappings and enum values; the baseline is 3. The description contributes additional meaning about step_id combining with other filters and the secure-configuration default, but adds nothing about alias conflict handling, defaults, or the relationship between top and the absent filter set.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Query native plugin steps") plus the filtering model ("exact filters"), which is enough to separate it from mutation siblings like d365_plugin_step_register/update. It stops short of naming the nearest read alternatives (d365_plugin_assemblies_query, d365_plugin_registration_metadata), so the agent must infer which query tool to pick.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains the semantics of using the tool (filters are ANDed, secure config is opt-in, results capped) but never says when to choose it over the sibling query tools for assemblies, images, or registration metadata. Usage is implied by the noun "plugin steps" rather than explicitly routed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
d365_plugin_step_updateADestructive
Update one plugin step. Omitted fields/configuration are kept; configuration supports keep/set/clear. Uses table concurrency metadata and a specific ETag by default. Secure set creates a replacement row and binds it in the same PATCH as step changes; clear unbinds. Existing configuration rows are retained, never blindly deleted. Write/readback failures preserve phase evidence.
| Name | Required | Description | Default |
|---|---|---|---|
| patch | No | ||
| dryRun | No | Compatibility alias for dry_run. Conflicting aliases are rejected. | |
| stepId | No | Compatibility alias for step_id. Conflicting aliases are rejected. | |
| dry_run | No | Read-only preview of the environment, resolved target and changes. Configuration values are withheld. Default false. | |
| ifMatch | No | Compatibility alias for if_match. Conflicting aliases are rejected. | |
| step_id | No | ||
| if_match | No | Specific ETag, for example W/"123". If omitted, uses the current step ETag. Never accepts wildcard. | |
| secureConfiguration | No | Compatibility alias for secure_configuration. Conflicting aliases are rejected. | |
| secure_configuration | No | ||
| unsecureConfiguration | No | Compatibility alias for unsecure_configuration. Conflicting aliases are rejected. | |
| allowUnprotectedUpdate | No | Compatibility alias for allow_unprotected_update. Conflicting aliases are rejected. | |
| unsecure_configuration | No | ||
| allow_unprotected_update | No | Default false. Explicitly allow an update with If-Match:* if table metadata does not confirm optimistic concurrency. Does not bypass a supplied ETag conflict. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare destructiveHint=true but say nothing about concurrency or configuration handling; the description fills that gap with concrete behavior: table concurrency metadata plus a specific ETag by default, secure set creating a replacement row bound in the same PATCH, clear unbinding, and existing rows never blindly deleted. It stops short of stating required permissions or what a write/readback failure response looks like beyond "preserve phase evidence".
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Six short sentences, front-loaded with the one-line purpose, then progressively narrower behavioral facts (patch semantics, concurrency, secure configuration, failure evidence). No sentence restates the name or title and none is padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive, 13-parameter mutation with nested configuration objects and no output schema, the description covers the risky parts an agent must know: omit-keeps, ETag concurrency, replacement-row semantics, and failure evidence. It leaves auth/permission requirements and error signaling implicit, which is the main remaining gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 69%, so the schema already documents most parameters (if_match, dry_run, configuration actions). The description adds the non-obvious defaults — that omitting if_match uses the current step ETag and that table concurrency metadata drives the decision — plus the keep/set/clear model, but does not explain allow_unprotected_update or the alias pairs. Mid-coverage baseline of 3 fits.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource ("Update one plugin step"), which an agent can distinguish from d365_plugin_step_register, d365_plugin_steps_query, and d365_plugin_image_update in the sibling list. It never names an alternative explicitly, but the operation is unambiguous from the first four words.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description never states when to choose this tool over d365_plugin_step_register or the image-update sibling, nor does it mention prerequisites such as needing an existing step or how it relates to querying first. Patch semantics ("omitted fields are kept") describe how the call behaves, not when to make it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_record_by_idADestructive
Delete a native record with validated GUID and concurrency conditions. dry_run identifies the target without deleting. A specific supplied ETag is never downgraded.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| dryRun | No | Compatibility alias for dry_run. Conflicting aliases are rejected. | |
| dry_run | No | Read-only preview of environment, target, changes and write blockers. Default false; sensitive fields are masked. | |
| ifMatch | No | Compatibility alias for if_match. Conflicting aliases are rejected. | |
| if_match | No | Specific ETag from a prior read/preview. Without it, reads the current record ETag when the table supports concurrency. | |
| collectionName | No | Compatibility alias for collection_name. Conflicting aliases are rejected. | |
| collection_name | No | Native EntitySetName, such as accounts. Validated against table metadata. | |
| allowUnprotectedWrite | No | Compatibility alias for allow_unprotected_write. Conflicting aliases are rejected. | |
| allow_unprotected_write | No | Default false. Explicitly allow an unprotected write if table concurrency is unconfirmed, or for collection relationship membership. Does not bypass a supplied ETag conflict. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare destructiveHint=true and readOnlyHint=false. The description adds useful context about validated GUIDs, concurrency conditions, dry-run preview behavior, and ETag handling, though it does not mention required permissions or whether deletion is irreversible.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three compact sentences, front-loads the core delete action, and wastes no words while including key safety-relevant details.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the destructive annotations and rich schema, the description provides enough context to invoke the tool correctly, including dry-run and concurrency behavior. It could be slightly more complete by mentioning permission requirements or dependency/cascade effects, but those are not strictly required here.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 89%, so the schema already carries most parameter meaning. The description references GUID validation, dry_run, and ETag semantics, but it does not add much beyond the detailed schema descriptions for if_match, allow_unprotected_write, and alias parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific verb and resource: it deletes a native record, with validated GUID and concurrency conditions. This distinguishes it from sibling update/upsert/get record tools without requiring schema inspection.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explains that dry_run identifies the target without deleting, which implies preview usage, but it does not explicitly state when to choose this tool over alternatives such as update_existing_record, upsert_record_by_key, or get_record_by_id.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
diagnose_plugin_failureARead-only
Build a read-only evidence report from exception-filtered traces, failed jobs and current plugin steps, anchored by correlation, step or plugin type. Uses native IDs for links, reports missing/forbidden/limited sources and keeps root cause undetermined. Current step state is not historical configuration.
| Name | Required | Description | Default |
|---|---|---|---|
| top | No | Maximum visible rows, default 50. Reaching this bound is not a complete inventory. | |
| stepId | No | Compatibility alias for step_id; conflicting values are rejected. | |
| toTime | No | Compatibility alias for to_time; conflicting values are rejected. | |
| step_id | No | ||
| to_time | No | ISO timestamp with explicit timezone, inclusive. Default current UTC time. | |
| fromTime | No | Compatibility alias for from_time; conflicting values are rejected. | |
| maxPages | No | Compatibility alias for max_pages; conflicting values are rejected. | |
| from_time | No | ISO timestamp with explicit timezone, inclusive. Default 24 hours before to_time. | |
| max_pages | No | Maximum native pages, default 5. Bounded reads report incompleteness. | |
| includeText | No | Compatibility alias for include_text; conflicting values are rejected. | |
| include_text | No | Default false. Opt in to trace/exception/job message text, which can contain business data. Secure/unsecure configuration columns are never selected. | |
| maxTextChars | No | Compatibility alias for max_text_chars; conflicting values are rejected. | |
| correlationId | No | Compatibility alias for correlation_id; conflicting values are rejected. | |
| correlation_id | No | ||
| max_text_chars | No | Per-text preview limit, default 2000; truncation is explicit. | |
| pluginTypeName | No | Compatibility alias for plugin_type_name; conflicting values are rejected. | |
| plugin_type_name | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnly/non-destructive; the description adds substantial behavioral context beyond them: that missing, forbidden, and limited sources are reported, that root cause is deliberately left undetermined, that current step state is not historical config, that include_text opts into business data with secure columns never selected, and that bounded reads report incompleteness.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two dense sentences, front-loaded with the core action and source list, with caveats packed at the end. Efficient for a 17-parameter tool, though the warnings are terse to the point of being easy to skim past.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex, no-output-schema tool the description covers the sources, anchoring, safety, and limits well. It does not describe the resulting report's sections or how the sources are correlated, which would help an agent interpret results, but the essentials are present.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 82%, so most parameters are documented in the schema itself. The description adds the semantic of the anchoring keys (correlation, step, plugin type) but says nothing about top, max_pages, from_time/to_time defaults beyond what the schema already states; baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and deliverable ('build a read-only evidence report') and names the three data sources (exception-filtered traces, failed jobs, current plugin steps) plus the anchoring keys. It implicitly distinguishes itself from single-source siblings like query_plugin_trace_logs and query_failed_system_jobs by being a composite, though it never names them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The context ('anchored by correlation, step or plugin type') and the caveat 'Current step state is not historical configuration' imply a diagnostic/forensic use case, but there is no explicit when-to-use or when-to-prefer-sibling guidance despite many adjacent query tools. Usage must be inferred.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
disassociate_recordsADestructive
Remove a native association. A single lookup is cleared only if it currently points to the supplied target; collection membership uses DELETE on the specific $ref. No related record is deleted.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| dryRun | No | Compatibility alias for dry_run. Conflicting aliases are rejected. | |
| dry_run | No | Read-only preview of environment, target, changes and write blockers. Default false; sensitive fields are masked. | |
| ifMatch | No | Compatibility alias for if_match. Conflicting aliases are rejected. | |
| if_match | No | Specific ETag from a prior read/preview. Without it, reads the current record ETag when the table supports concurrency. | |
| relatedId | No | Compatibility alias for related_id. Conflicting aliases are rejected. | |
| related_id | No | ||
| collectionName | No | Compatibility alias for collection_name. Conflicting aliases are rejected. | |
| collection_name | No | Native EntitySetName, such as accounts. Validated against table metadata. | |
| navigationProperty | No | Compatibility alias for navigation_property. Conflicting aliases are rejected. | |
| navigation_property | No | Native navigation property, resolved from relationship metadata to the specified related table. | |
| allowUnprotectedWrite | No | Compatibility alias for allow_unprotected_write. Conflicting aliases are rejected. | |
| relatedCollectionName | No | Compatibility alias for related_collection_name. Conflicting aliases are rejected. | |
| allow_unprotected_write | No | Default false. Explicitly allow an unprotected write if table concurrency is unconfirmed, or for collection relationship membership. Does not bypass a supplied ETag conflict. | |
| related_collection_name | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With destructiveHint=true already declared, the description adds meaningful context: it is a conditional removal (matching target only), collection membership follows a different code path, and related records are not deleted. It does not disclose the dry_run/if_match workflow or what a partial/no-op result looks like, but the scope of destruction is well clarified.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the core action, then the two semantic modes, then the safety caveat. Nothing is padded, though it could be slightly tighter.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with 15 parameters, no output schema, and concurrency controls (dry_run, if_match, allow_unprotected_write), the description covers the association semantics well but omits the operational workflow (preview first, ETag handling) and idempotency behavior. Adequate, not complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 80% with detailed per-property descriptions (including alias handling, dry_run, if_match, allow_unprotected_write), so the schema carries the parameter burden. The description mentions no parameter names or formats, leaving the baseline of 3 appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Remove a native association'), which plainly contrasts with the sibling associate_records. It does not name the sibling explicitly, but the operation is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage conditions — a lookup is cleared only when it points at the supplied target, and collection membership goes through a $ref DELETE — but it never states when to prefer this tool versus associate_records or update_existing_record, nor any prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
edit_model_formADestructive
Structurally edit a Main form: append a scalar field using an explicit compatible existing control template, add a verified JavaScript library, or bind onload/onsave/onchange. No arbitrary XML, PCF/Lookup template copying or code execution. Default preview. Execute with current expected_hash; native ETag support is checked, otherwise explicit allow_unprotected_write is required. No automatic publication.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | ||
| dryRun | No | Default true performs reads/eligibility checks and returns a native request preview. Set false to execute. | |
| dry_run | No | Default true performs reads/eligibility checks and returns a native request preview. Set false to execute. | |
| ifMatch | No | ||
| if_match | No | ||
| operations | No | ||
| logicalName | No | ||
| expectedHash | No | ||
| logical_name | No | ||
| expected_hash | No | ||
| solutionUniqueName | No | Existing unmanaged solution; its publisher prefix is validated for new schemas. | |
| solution_unique_name | No | Existing unmanaged solution; its publisher prefix is validated for new schemas. | |
| allowUnprotectedWrite | No | ||
| allow_unprotected_write | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations (destructiveHint=true, non-idempotent, non-readonly) by disclosing the preview-by-default safety model, the optimistic concurrency gate via expected_hash, the ETag check with allow_unprotected_write fallback, and that publication is not automatic. It also states what is intentionally not supported, which prevents misuse.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Dense but front-loaded: purpose, allowed operations, exclusions, then safety/execution notes. Every sentence carries information, though a couple of clauses (ETag/allow_unprotected_write) are packed tightly and could be slightly clearer.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 14-parameter destructive mutation with no output schema, the description covers the critical decision points (preview vs execute, concurrency protection, no auto-publish) and the operation family. It stops short of describing per-operation payload requirements, but the schema's structure plus these safety notes are largely sufficient to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 29%, so the description must compensate. It does explain the key gating parameters (expected_hash, allow_unprotected_write, dryRun) and hints at template_control_id via 'compatible existing control template', but leaves many operation fields (section_id, attribute_name, control_id, label, pass_execution_context) undocumented. Partial compensation only.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Structurally edit a Main form') and then enumerates exactly the three operations supported: add_field, add_library, bind_event-style bindings. An agent can distinguish this from sibling tools like edit_model_view or edit_ribbon_solution without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear usage context: default is preview, execute requires expected_hash (or allow_unprotected_write), and lists exclusions (no arbitrary XML, no PCF/Lookup template copying, no code execution). It does not explicitly name alternative sibling tools for other form/editing needs, but the when-to-use conditions are clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
edit_model_viewADestructive
Structurally edit a public system view: add/remove root display columns, set widths or replace simple root-field ordering. Preserves filters, joins and FetchXML attributes needed by other dependencies. Rejects aggregate/distinct query rewrites. Default preview, fingerprint and metadata-gated ETag/fallback checks, saved readback, no automatic publish.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | ||
| dryRun | No | Default true performs reads/eligibility checks and returns a native request preview. Set false to execute. | |
| dry_run | No | Default true performs reads/eligibility checks and returns a native request preview. Set false to execute. | |
| ifMatch | No | ||
| if_match | No | ||
| operations | No | ||
| logicalName | No | ||
| expectedHash | No | ||
| logical_name | No | ||
| expected_hash | No | ||
| solutionUniqueName | No | Existing unmanaged solution; its publisher prefix is validated for new schemas. | |
| solution_unique_name | No | Existing unmanaged solution; its publisher prefix is validated for new schemas. | |
| allowUnprotectedWrite | No | ||
| allow_unprotected_write | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only say it is a destructive, non-idempotent write; the description adds substantial context beyond that: destructive-but-structural scope (filters/joins preserved), explicit rejection of aggregate/distinct rewrites, dry-run default preview, fingerprint plus metadata-gated ETag/fallback safety checks, saved readback verification, and that publishing is not automatic.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core purpose in the first clause, and every subsequent sentence adds a distinct constraint. The final sentence is a dense comma-spliced fragment ('Default preview, fingerprint and metadata-gated ETag/fallback checks, saved readback, no automatic publish') that is efficient but slightly telegraphic.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive, non-idempotent mutation with no output schema and 14 loosely documented parameters, the description covers safety gating, preview default, readback verification and the no-auto-publish consequence. It omits required permission/solution-prerequisite context and rollback behavior, leaving a modest gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With only 29% schema description coverage, the description compensates well by explaining the dryRun preview default, the fingerprint (expectedHash) and ETag (ifMatch) gating, and the four operation shapes in the operations array. It leaves allow_unprotected_write and the identifier/aliasing parameters unexplained, which holds it below a 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Structurally edit a public system view') and then enumerates the exact edit categories: add/remove root display columns, set widths, replace root-field ordering. This is clearly distinguishable from siblings like edit_model_form or update_model_column_settings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear scope boundaries — it preserves filters/joins/FetchXML attributes and rejects aggregate/distinct query rewrites, which tells the agent when this tool is inappropriate. It stops short of naming a specific alternative for those rejected rewrites, so it is clear context rather than full when/when-not/alternative guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
edit_ribbon_solutionA
Preview by default; edit only one entity classic RibbonDiffXml in an ordinary unmanaged local ZIP. Add standalone custom JS buttons with publisher-scoped IDs, explicit current-table insertion location, ordered parameters, multilingual labels and packaged JS/raster icons; update labels/sequence; hide/unhide via a dedicated contradictory client display rule on an unshared custom command. Preserve other languages/rules/handlers, all other archive payloads and outside-Ribbon XML semantics. Execute with current planHash to write an exclusive NEW ZIP; never overwrite input, import, publish or run code. Built-in replacements, arbitrary rules, handler updates, modern commands and deployment remain separate workflows.
| Name | Required | Description | Default |
|---|---|---|---|
| dryRun | No | Default true; preview writes no file. | |
| changes | No | ||
| dry_run | No | Default true; preview writes no file. | |
| filePath | No | Absolute local solution ZIP path; no network/device paths. | |
| file_path | No | Absolute local solution ZIP path; no network/device paths. | |
| outputPath | No | Absolute new .zip destination, required for preview and execution. | |
| logicalName | No | ||
| output_path | No | Absolute new .zip destination, required for preview and execution. | |
| expectedHash | No | ||
| logical_name | No | ||
| contentBase64 | No | Canonical base64 ZIP <=32 MiB. Supply exactly one input source. | |
| expected_hash | No | ||
| content_base64 | No | Canonical base64 ZIP <=32 MiB. Supply exactly one input source. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantial context beyond the annotations: dry-run defaults to preview with no file written, execution writes an exclusive NEW ZIP and never overwrites the input, and preservation guarantees for other languages/rules/handlers and other archive payloads are spelled out. Consistent with destructiveHint=false and readOnlyHint=false since the input archive is never mutated.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loading is good ('Preview by default') and every clause carries real content, but the body is three very long run-on sentences packed with comma-chained constraints. It is dense to the point that an agent must parse carefully to extract the operational rules.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 13 parameters, 62% schema coverage, no output schema and a mutation workflow, the description covers safety, idempotency/hash flow, preservation semantics and out-of-scope work well. It leaves a gap on what the preview/execute returns (presumably a planHash plus summary) and how the agent obtains that hash for the execute call.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Description explains the changes model at a semantic level (publisher-scoped IDs, explicit current-table insertion location, ordered parameters, multilingual labels, packaged JS/raster icons) that the schema's structural constraints do not convey, and it flags the planHash requirement. However it says 'planHash' while the schema field is expected_hash, a naming mismatch that could cause confusion, and dry_run/output path handling is only partially reinforced.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a precise verb+resource: editing classic RibbonDiffXml in an ordinary unmanaged local ZIP, including the specific sub-operations (add custom JS button, update labels/sequence, set visibility). It also explicitly distinguishes itself from siblings by naming what remains separate (built-in replacements, arbitrary rules, handler updates, modern commands, deployment), which separates it from inspect_ribbon_solution, import_ribbon_solution and publish_ribbon_solution.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear scope boundaries: 'Preview by default', 'never overwrite input, import, publish or run code', and lists workflows that remain separate. It stops short of telling the agent to call inspect_ribbon_solution first or to run preview then execute with the returned hash, so the sequencing is implied rather than prescribed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
execute_record_batchADestructive
Execute up to 100 validated record mutations in native $batch chunks. Each operation has its own change set, so a later failure does not roll back earlier operations. Preflights all operations before dispatch, reports per-item outcomes, stops after unknown results and respects request cancellation.
| Name | Required | Description | Default |
|---|---|---|---|
| dryRun | No | Compatibility alias for dry_run. Conflicting aliases are rejected. | |
| dry_run | No | Read-only preview of environment, target, changes and write blockers. Default false; sensitive fields are masked. | |
| chunkSize | No | Compatibility alias for chunk_size. Conflicting aliases are rejected. | |
| chunk_size | No | Default 25. Every chunk must fit the 10 MiB wire-body limit. | |
| operations | Yes | ||
| continueOnError | No | Compatibility alias for continue_on_error. Conflicting aliases are rejected. | |
| continue_on_error | No | Default false. Continue after known per-item rejection; unknown results always stop future chunks. Native support is not assumed when responses are incomplete. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations (readOnly=false, destructive=true) by disclosing the non-atomic change-set model, preflight validation before dispatch, per-item outcome reporting, the stop-on-unknown-results safety rule, and cancellation handling. These are exactly the behavioral traits an agent needs before committing destructive writes.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences, front-loaded with the verb, scope, and batching model; each subsequent clause carries a distinct behavioral fact with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive, multi-operation tool with no output schema, the description adequately covers execution model, failure semantics, and outcome reporting. The main gap is the absence of routing guidance versus execute_record_transaction, which an agent would still need to infer.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 86%, so aliases, dry_run, chunk_size, if_match, and operation variants are already documented in the schema. The description only reinforces the 100-item cap and chunking model, adding little syntax or format detail beyond structured fields.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Execute up to 100 validated record mutations in native $batch chunks') with a clear scope. The non-atomic, per-change-set semantics implicitly distinguish it from the transactional sibling, but no sibling is named explicitly, so it falls short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The behavior described (no rollback across operations, preflight, per-item outcomes) implies this is for multi-mutation batches where partial success is acceptable, but the description never states when to choose this over execute_record_transaction or when to avoid it. Usage is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
execute_record_transactionADestructive
Execute up to 100 validated mutations in ONE native $batch change set, without chunking or fallback to individual writes. Reports committed false for confirmed rejection and unknown for transport/server ambiguity. Preflight reads are outside the transaction; arbitrary HTTP and Content-ID dependencies are not accepted.
| Name | Required | Description | Default |
|---|---|---|---|
| dryRun | No | Compatibility alias for dry_run. Conflicting aliases are rejected. | |
| dry_run | No | Read-only preview of environment, target, changes and write blockers. Default false; sensitive fields are masked. | |
| operations | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare a destructive, non-idempotent mutation, and the description adds important behavior: committed=false for confirmed rejection and unknown for transport/server ambiguity, plus preflight scope and rejection of unsupported dependency patterns. It still does not fully explain atomicity/rollback semantics or authentication requirements.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with the core action and constraints. Each sentence adds a distinct behavioral or scope constraint, with no filler or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex destructive batch tool with no output schema, the description covers transactional scope, capacity, failure ambiguity, and unsupported patterns. Some details remain implicit, especially full result structure and whether all operations are atomic, but the schema carries most operation-level detail.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is moderate at 67%, with detailed field descriptions for dry_run, operation shapes, and aliases. The description adds the 100-operation cap and dependency rejection, but it does not explain dry_run or the specific operation types beyond what the schema already provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb, resource, and scope: executing up to 100 validated mutations in one native $batch change set. It distinguishes itself from chunking and individual writes, though it does not explicitly name the sibling tool execute_record_batch. The core purpose is clear and actionable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear constraints: up to 100 operations, one native batch, no chunking or fallback to individual writes, preflight reads outside the transaction, and no arbitrary HTTP or Content-ID dependencies. It does not explicitly name sibling alternatives such as execute_record_batch, so selection guidance is strong but not complete.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
export_solutionA
Preview by default. Native ExportSolution from a visible ordinary unmanaged source; choose managed output explicitly. Current CSDL and caller/environment identity are validated. Execute with planHash; writes an exclusive new local .zip, verifies identity/hash, never returns base64 or overwrites files. No publish. On failure the reserved path can be empty/partial; no automatic replay.
| Name | Required | Description | Default |
|---|---|---|---|
| dryRun | No | Default true. Execution requires a current preview planHash. | |
| dry_run | No | Default true. Execution requires a current preview planHash. | |
| managed | No | ||
| outputPath | No | Absolute local file path. ZIPs are read without extraction or execution. | |
| output_path | No | Absolute local file path. ZIPs are read without extraction or execution. | |
| expectedHash | No | ||
| expected_hash | No | ||
| solutionUniqueName | No | ||
| solution_unique_name | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With annotations only declaring it is not read-only and not idempotent, the description carries the real behavioral load: writes an exclusive new local .zip, never returns base64, never overwrites files, does not publish, and on failure the reserved path may be empty or partial with no automatic replay. That is exactly the failure-mode and side-effect detail an agent needs before invoking a write.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The default and safety constraints are front-loaded ('Preview by default') and every clause carries information, with no filler. It is telegraphic to the point that some sentences ('Native ExportSolution from a visible ordinary unmanaged source') require domain knowledge to parse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a no-output-schema, multi-mode write tool the description covers workflow, file-writing guarantees, publish behavior, and failure recovery, which is substantial. The unexplained planHash reference and the undocumented expectedHash parameter are the remaining holes.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 44% and the description adds meaning for two of the nine parameters: managed output must be chosen explicitly and execution requires a current preview planHash. However, planHash is referenced but does not exist in the schema (additionalProperties: false), and expectedHash — a 64-hex verification parameter — is never explained, leaving a real gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource — exporting a solution via Native ExportSolution into a local .zip — and distinguishes the preview vs. managed output modes. It does not name the closest siblings (inspect_solution_package, import_solution_async) so the boundary is inferred rather than stated, and the phrasing is compressed to the point of being cryptic in places.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Preview by default' plus 'Execute with planHash' communicates the two-phase preview-then-execute workflow, and 'choose managed output explicitly' tells the agent unmanaged is the default. No exclusion against alternative inspection/export siblings is given, so it falls short of a full when/when-not statement.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_api_operationARead-only
Read current service CSDL to inspect Action/Function overloads, exact parameter types/facets, binding and import names. Optional entity-set binding narrows signatures. Returns direct input type definitions; nested types are not expanded. Read-only metadata does not prove permissions/runtime support.
| Name | Required | Description | Default |
|---|---|---|---|
| binding | No | ||
| actionName | No | Exact case-sensitive native operation/import name or qualified name, never a URL/path. | |
| isFunction | No | Invocation defaults false (Action); discovery omits this to inspect both kinds. | |
| action_name | No | Exact case-sensitive native operation/import name or qualified name, never a URL/path. | |
| is_function | No | Invocation defaults false (Action); discovery omits this to inspect both kinds. | |
| signatureId | No | Advertised get_api_operation signature ID; required to disambiguate matching overloads. | |
| signature_id | No | Advertised get_api_operation signature ID; required to disambiguate matching overloads. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Consistent with readOnlyHint=true. Beyond the annotation, the description discloses return-shape limitations an agent would otherwise discover the hard way: only direct input type definitions are returned and nested types are not expanded, and the metadata does not guarantee permissions or runtime support. That is real behavioral context, not restated safety hints.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four short sentences, front-loaded with the pull operation and its scope, then limits, then the caveat — no filler. Slightly reduced by heavy jargon packing ('CSDL', 'facets') with no expansion, which costs an unfamiliar agent a re-read.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, and the description does shoulder that burden by describing what is returned (direct input type definitions) and what is truncated (nested types). With 7 parameters including alias pairs and a nested binding object, the description covers the main semantics; only overload-disambiguation guidance and how to act on the results are left implicit.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 86%, so the baseline is 3, but the description adds genuine meaning beyond the schema: it explains what the nested 'binding' object accomplishes (narrowing signatures by entity set) and frames is_function as the Action/Function selection. Only signature_id disambiguation is left to the schema text, which already covers it well.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: read the service CSDL to inspect Action/Function overloads, parameter types/facets, binding and import names. That scope is clearly narrower than the entity-metadata siblings (get_entity_metadata_summary, list_all_entity_definitions), but it never names the invocation counterpart call_d365_api_action, so the discovery-vs-invocation split has to be inferred.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Optional entity-set binding narrows signatures' hints at how to disambiguate, and the closing caveat ('read-only metadata does not prove permissions/runtime support') hints that verification requires an actual call. However, it never says explicitly when to use this instead of call_d365_api_action or the other metadata inspectors, so routing remains implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_audit_detailsBRead-only
Read native bound RetrieveAuditDetails and independent audit summary metadata. Attribute audit old/new values are opt-in and bounded; other detail types are named without fabricating unsupported fields. Detail and summary permissions are reported separately.
| Name | Required | Description | Default |
|---|---|---|---|
| auditId | No | Compatibility alias for audit_id; conflicting values are rejected. | |
| audit_id | No | ||
| maxTextChars | No | Compatibility alias for max_text_chars; conflicting values are rejected. | |
| includeValues | No | Compatibility alias for include_values; conflicting values are rejected. | |
| include_values | No | Default false. Native audit values are received but withheld from output. Explicit true projects bounded attribute old/new values with heuristic sensitive-field masking. | |
| max_text_chars | No | Per-text preview limit, default 2000; truncation is explicit. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish read-only/non-destructive, and the description adds real behavioral context on top: old/new values are withheld by default and only projected on explicit opt-in, projection is bounded and heuristically masked, and detail vs. summary permissions are reported separately. That is genuine disclosure beyond the structured fields, though the truncation/masking mechanics stay at a high level.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences with no filler, but the opening clause 'Read native bound RetrieveAuditDetails' is low-information jargon that pushes the actually useful content (opt-in bounded values, separate permission reporting) behind it. Front-loading is weak for an agent skimming definitions.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description should convey something about the return shape, yet 'other detail types are named without fabricating unsupported fields' and 'summary metadata' remain undefined. It covers the value-withholding behavior adequately but leaves an agent guessing what a response actually contains.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 83%, so the schema already explains include_values, max_text_chars, and the aliases; the description mostly restates the opt-in/bounded semantics in prose. It adds the useful note that unsupported fields are named rather than fabricated, but no parameter-level detail beyond what the schema provides, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The verb 'Read' and the resource ('audit details' plus 'audit summary metadata') are present, but the phrasing 'native bound RetrieveAuditDetails' is opaque API jargon rather than an agent-readable statement of what comes back. It never distinguishes itself from the sibling get_record_audit_history, so an agent must infer that this is per-audit-entry detail while the sibling is per-record history.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit when-to-use or when-not guidance, and no mention of get_record_audit_history as the alternative for listing a record's audit trail. The only implicit usage signal is 'opt-in' on attribute values, which tells the agent a flag exists but not when this tool is the right choice.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_current_user_contextB
Get information about the currently connected user and organization context.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral disclosure burden. 'Get' implies a read-only operation, but the description does not state permissions, side effects, response shape, or any other operational detail beyond the broad subject of retrieval.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single front-loaded sentence with no wasted words. However, its extreme brevity contributes to gaps in behavioral and contextual detail, so it is not a perfect 5.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter read tool, the description is minimally adequate: it says the tool returns information about the current user and organization context. But with no output schema and no annotations, it should say more about what information is returned or any relevant constraints.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so there are no parameter semantics to explain. The baseline for a no-parameter tool is 4, and the description does not introduce confusion about inputs.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a clear verb ('Get') and specific resource scope ('information about the currently connected user and organization context'). It is understandable without opening the schema, but it does not explicitly distinguish itself from nearby context/security tools such as get_principal_security_context.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description states what the tool retrieves but gives no explicit guidance on when to use it versus alternatives or when not to use it. Usage is only weakly implied by the phrase 'currently connected user and organization context'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_detailed_field_metadataC
Get full metadata details for a specific attribute (field) for deep analysis.
| Name | Required | Description | Default |
|---|---|---|---|
| entity_logical_name | Yes | Logical name of the entity | |
| attribute_logical_name | Yes | Logical name of the attribute |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden, yet it discloses almost nothing behavioral: it doesn't say whether the call is read-only (only implied by "Get"), what volume or shape of metadata comes back, or whether the attribute must exist. "Full metadata details" is the only behavioral signal, and it is undefined.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with the resource stated immediately; no repetition or padding. The trailing "for deep analysis" is the only soft phrase, but it does hint at the depth of the response.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
This is a simple two-parameter read tool, but with no output schema and no annotations the description should say at least roughly what "full metadata" includes (types, constraints, picklist data?) so the agent can decide between this and sibling metadata tools. As written it is adequate but leaves the return contents and the summary/detail trade-off unexplained.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with both required parameters (entity_logical_name, attribute_logical_name) documented in the schema itself, so baseline 3 applies. The description adds no extra semantics such as where logical names come from or case-sensitivity — it merely echoes "attribute (field)".
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description pairs a specific verb ("Get") with a specific resource ("full metadata details for a specific attribute/field"), and the word "full" implicitly contrasts with summary-level siblings. It never names those siblings (get_entity_metadata_summary, get_field_picklist_options) outright, so the differentiation is left implicit rather than explicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"For deep analysis" is the only usage cue and it is vague — it doesn't tell the agent when to prefer this over get_entity_metadata_summary or get_field_picklist_options, nor what prerequisites (e.g. logical names must already be known) apply. There is no explicit when-to-use or when-not-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_diagnostic_settingsARead-only
Read current organization trace/audit switches and optional table audit metadata. Reports forbidden/unavailable/unknown evidence separately; current switches do not prove historical settings or deleted logs. Does not enable logging or auditing.
| Name | Required | Description | Default |
|---|---|---|---|
| collectionName | No | Compatibility alias for collection_name; conflicting values are rejected. | |
| collection_name | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover the read-only profile, but the description adds real behavioral context: forbidden/unavailable/unknown states are reported separately, and current switch values are explicitly not proof of historical settings or deleted logs. Only the return/report shape is left implicit.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences, front-loaded with what is read, followed by the evidence caveats and the non-mutation disclaimer. Every sentence carries information; 'forbidden/unavailable/unknown' is slightly compressed but not wasteful.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description still conveys what the result looks like (switch state plus separately-reported evidence failures) and the critical interpretive caveat. The main gap is the undocumented collection_name parameter, which the description only obliquely covers.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 50% – collection_name has no description at all, while collectionName carries the alias note. The phrase 'optional table audit metadata' gestures at what the parameter targets, but the description doesn't explain the collection_name/collectionName alias or rejection of conflicting values, so it barely compensates for the gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: reading current organization trace/audit switches plus optional table audit metadata. It is distinguishable from the audit-history siblings (get_record_audit_history, get_audit_details) by subject matter, though it never names them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The negative framing ('Does not enable logging or auditing') plus the warning that current switches don't prove historical settings implies this is a pre-check, not an evidence-gathering step. It never explicitly says when to prefer get_record_audit_history or get_audit_details instead.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_entity_metadata_summaryB
Get a summary of entity metadata including primary key, name field, and business-relevant attributes. System-redundant fields are excluded.
| Name | Required | Description | Default |
|---|---|---|---|
| logical_name | Yes | Logical name of the entity (e.g., account, contact) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full load; it does disclose one useful behavioral trait, that system-redundant fields are excluded from the result. Beyond that it says nothing about return shape, size limits, or errors, and the read-only nature is only implied by the verb 'Get'.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two compact sentences, front-loaded with the action and immediately followed by what is included and what is excluded. No filler, though it could have spent those words on sibling differentiation instead.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Without an output schema the description must convey return contents, and it lists the main categories plus an exclusion rule, which is reasonably helpful. However, it leaves unclear how this differs from get_detailed_field_metadata or list_all_entity_definitions, which is the key ambiguity an agent faces when selecting among these metadata tools.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the single parameter already documents that it takes a logical entity name with examples. The description adds no syntax, casing, or format guidance beyond what the schema provides, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Get a summary of entity metadata') and names the contents it returns (primary key, name field, business-relevant attributes). It does not distinguish itself from the closely related sibling 'get_detailed_field_metadata' or 'get_model_definition', so it falls short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit when-to-use guidance, no mention of alternatives such as get_detailed_field_metadata for full field detail, and no stated preconditions. An agent must infer that this is the lightweight option versus the detailed metadata tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_environment_capabilitiesARead-only
Read WhoAmI, RetrieveVersion and table definitions to inspect the configured CRM environment. Reports metadata evidence separately from untested permissions and SDK support; does not change the connection or select another API version.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so the bar is lower, and the description still adds real value: it discloses that results are separated into metadata evidence versus untested permissions and SDK support, and that the connection and API version are left untouched. The only gap is that it does not describe the shape of the returned payload, and there is no output schema to fall back on.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, zero waste, front-loaded with the operation and its constituent reads, followed by the interpretive caveat and the side-effect exclusion. Every clause carries information the agent needs.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter read-only tool with no output schema, the definition covers what is read, how evidence should be weighted, and what side effects do not occur. The remaining gap is the return structure, which the agent must discover by calling, but that is a minor omission given the tool's simplicity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters and the schema is an empty object, so there is nothing for the description to disambiguate; the baseline of 4 applies. The description correctly avoids inventing parameter behavior.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('inspect') and resource ('the configured CRM environment') and names the concrete sub-reads (WhoAmI, RetrieveVersion, table definitions), so the agent knows exactly what it will get. It stops short of explicitly contrasting with overlapping siblings such as get_current_user_context or list_all_entity_definitions, so differentiation is implicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the framing ('inspect the configured CRM environment') and by the exclusions ('does not change the connection or select another API version'), which help the agent avoid expecting mutation. However, no sibling is named and no explicit when-to-use/when-not-to-use rule is given, leaving the agent to infer this is a diagnostic discovery call.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_field_picklist_optionsB
Get OptionSet (enum) definitions for a specific field within an entity. Supports both local and global OptionSets.
| Name | Required | Description | Default |
|---|---|---|---|
| logical_name | Yes | Logical name of the entity | |
| attribute_name | Yes | Logical name of the attribute (field) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the behavioral burden. The verb 'Get' signals a read-only retrieval operation, and the local/global OptionSet coverage is disclosed, but permissions, return format, and any rate or response-shape expectations are omitted.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two concise sentences with the main purpose front-loaded and no filler. Every sentence contributes useful scope information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-parameter read tool, the description adequately states the resource being retrieved. However, with no output schema and no annotations, it could give more detail about the returned OptionSet definition shape or how local and global cases differ.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already explains both parameters as logical names for the entity and attribute. The description does not add format or semantic detail beyond what the schema provides, making the baseline 3 appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: getting OptionSet enum definitions for a specific field within an entity. It also notes support for local and global OptionSets, which adds useful scope. However, it does not explicitly distinguish itself from nearby siblings such as get_model_choices or get_detailed_field_metadata.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the tool retrieves picklist options, but gives no explicit when-to-use guidance, prerequisites, or alternatives. The local/global OptionSet note is scope information rather than usage guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_model_choicesARead-only
Read bounded native global or local Boolean/Picklist/MultiSelectPicklist options with multilingual labels and a fingerprint. Explicit global_choice_name OR a table/column pair. Reports shared global references without silently retargeting a later write.
| Name | Required | Description | Default |
|---|---|---|---|
| logicalName | No | ||
| logical_name | No | ||
| attributeName | No | ||
| attribute_name | No | ||
| globalChoiceName | No | ||
| global_choice_name | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so safety is covered. The description adds real behavioral context beyond that: results are 'bounded', carry 'multilingual labels and a fingerprint', and 'report shared global references without silently retargeting a later write' – disclosing that shared globals are surfaced rather than mutated, which is non-obvious and useful.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three dense sentences, front-loaded with the operation and mode gating before behavioral caveats. No filler; each sentence carries distinct information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only tool with no output schema and covered safety annotations, the description supplies the mode selection, output characteristics (labels, fingerprint, shared-reference reporting), and mutation caution. It is nearly complete; only the sibling differentiation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must carry param meaning, and it does explain the oneOf gating: supply either global_choice_name or a table/column pair ('logical_name' + 'attribute_name'). It does not clarify that the six properties are three logical params with camelCase aliases, but the core selection logic is conveyed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Read') and a precise resource ('Boolean/Picklist/MultiSelectPicklist options') with scope qualifiers (global or local, native, bounded). However, it does not differentiate itself from the sibling 'get_field_picklist_options', which sounds like it retrieves the same thing, leaving the agent to infer the distinction from the schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Explicit global_choice_name OR a table/column pair' tells the agent the two valid invocation modes, which is real guidance on how to call it. But there is no statement of when to prefer this over 'get_field_picklist_options' or the create/change/publish choice tools, so alternative selection is left implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_model_definitionBRead-only
Retrieve a complete table or supported column definition and SHA-256 fingerprint using strong consistency. Supports nine basic/choice column types, including expanded choices. Publication state remains unknown; fingerprint is not a platform lock.
| Name | Required | Description | Default |
|---|---|---|---|
| logicalName | No | ||
| logical_name | No | ||
| attributeName | No | ||
| attribute_name | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint annotation already covers the safety profile, yet the description adds genuinely non-derivable behavior: strong consistency reads, a SHA-256 fingerprint return, and two important caveats that publication state is not reflected and the fingerprint is not a platform lock. That is meaningful context an agent could not get from structured fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences with the verb and resource front-loaded, followed by scope and caveats. No filler, though the phrasing ('nine basic/choice column types, including expanded choices') is dense jargon that costs more than it returns.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description does sketch the return (definition plus fingerprint) and flags two caveats, which is more than most. But for a four-parameter tool with zero schema coverage and a crowded sibling set, the missing parameter guidance and lack of alternative-routing leave real gaps for an agent to guess at.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% across four parameters, so the description must carry the load — and it largely does not. It implies that 'table or column' selection hinges on the column parameter, but never names logical_name vs attribute_name, never explains the duplicated camelCase/snake_case aliases, and never states what happens when attribute_name is omitted.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Retrieve a complete table or supported column definition and SHA-256 fingerprint.' The table-vs-column duality maps to the optional attribute_name, so an agent can infer scope. It does not differentiate itself from close siblings like get_detailed_field_metadata or get_entity_metadata_summary.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no statement of when to choose this over get_detailed_field_metadata, get_entity_metadata_summary, or get_model_relationship, nor any guidance on when to pass attribute_name versus omitting it. The only usage-adjacent content is a caveat ('Publication state remains unknown'), which is informational rather than directive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_model_keyBRead-only
Read one native alternate-key definition and Pending/InProgress/Active/Failed index state. Optional linked job projection excludes free-text messages/data. A saved key is usable for alternate-key operations only after its native index is Active; no automatic reactivation.
| Name | Required | Description | Default |
|---|---|---|---|
| includeJob | No | ||
| schemaName | No | ||
| include_job | No | ||
| logicalName | No | ||
| schema_name | No | ||
| logical_name | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, yet the description adds real value: the index lifecycle states, the fact that the linked job projection strips free-text messages/data, and the no-auto-reactivation constraint. These are behavioral facts not present in the structured fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two dense sentences with no filler, and the core action (read the definition and index state) is front-loaded before the caveats.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only tool with no output schema, the description partially covers what comes back (index state, filtered job projection) but leaves the required identity parameters and their aliasing unexplained, which matters given the anyOf/alias schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must carry the load, but it never names logical_name, schema_name, or include_job. It only obliquely gestures at the job-projection behavior ('excludes free-text messages/data') without tying it to the includeJob parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Read one native alternate-key definition and Pending/InProgress/Active/Failed index state.' That is clearly distinguishable from create_model_key and reactivate_model_key, though it never names those siblings explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied rather than stated: the note that a key is usable only after its native index is Active and that there is 'no automatic reactivation' hints that reactivate_model_key is the alternative, but the description never says when to call this versus that tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_model_relationshipBRead-only
Read a native relationship definition by schema name, cast to 1:N or N:N metadata. Does not infer publication or UI placement.
| Name | Required | Description | Default |
|---|---|---|---|
| schemaName | No | ||
| schema_name | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With readOnlyHint=true already covering the safety profile, the description adds a genuine scoping trait: it returns the raw native definition without inferring publication state or UI placement. It says nothing about behavior on a missing relationship, whether unpublished relationships are visible, or how the result shape differs between 1:N and N:N.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, front-loaded with the primary action and followed by the scope caveat — no filler. The phrase 'cast to 1:N or N:N metadata' is slightly cryptic about what casting entails, costing a point.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
This is a simple read with no output schema and readOnly annotations, so the bar is moderate, but the description leaves the return shape ambiguous ('cast to ... metadata') and doesn't say what happens when the schema name doesn't resolve. Adequate, with clear gaps for an agent deciding whether the output answers its question.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% and the schema exposes two mutually exclusive alias properties (schema_name/schemaName) with no required field, so the description carries the full burden. It only says 'by schema name', giving no help on the alias ambiguity, the identifier pattern, or which parameter form to pass.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Read a native relationship definition by schema name') and narrows scope to 1:N or N:N metadata, which distinguishes it from table-level tools like get_model_definition. It doesn't explicitly name create_model_relationship/update_model_relationship as the write counterparts, so the sibling differentiation is only partial.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Does not infer publication or UI placement' is a useful exclusion that steers agents away from expecting UI/publish context, but there is no positive guidance on when to prefer this over get_model_definition or the create/update relationship tools. Usage is implied from the verb and resource rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_model_ui_componentBRead-only
Read a native unpublished system form/view definition, structural inventory, SHA-256 preview fingerprint and native ETag when available. Publication state is not inferred.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | ||
| kind | No | ||
| logicalName | No | ||
| logical_name | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnlyHint=true, so the description's job is to add scope detail, and it does: it declares the read is limited to unpublished definitions and that publication state is not inferred (a meaningful caveat about result interpretation). It stops short of describing error behavior when the component is published-only or how the ETag should be used for concurrency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single dense sentence with the core purpose front-loaded and no filler. 'Publication state is not inferred' is slightly cryptic but carries real information, so nothing is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description usefully enumerates what comes back (definition, inventory, fingerprint, ETag) despite there being no output schema, but with four parameters at 0% coverage and a non-obvious alias/anyOf structure, the definition leaves the caller guessing how to construct a valid request.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% and the description never mentions id, logical_name/logicalName, or kind. The schema's enum and regex patterns give some self-evident structure, but the alias relationship (logicalName → logical_name) and the anyOf required-combinations are left entirely unexplained, so the description fails to compensate for the coverage gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Read') and a precise resource ('native unpublished system form/view definition'), plus the return artifacts (structural inventory, SHA-256 fingerprint, ETag). The 'unpublished' qualifier implicitly separates it from edit_model_form/edit_model_view and list_model_ui_components, though it never names those siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit when-to-use or when-not guidance and no named alternative (list_model_ui_components, edit_model_form, edit_model_view are all nearby). The only directional hint is 'unpublished', which the agent must infer means published definitions are out of scope.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_principal_security_contextARead-only
Read a user/team profile, direct roles and bounded visible team memberships/roles. Preserves partial/forbidden sources and business-unit role identities. Does not reconstruct all inherited/group/shared/field privileges; use get_record_access for native record rights.
| Name | Required | Description | Default |
|---|---|---|---|
| roleLimit | No | Compatibility alias for role_limit; conflicting values are rejected. | |
| teamLimit | No | Compatibility alias for team_limit; conflicting values are rejected. | |
| role_limit | No | Maximum role rows per direct/team source, default 50. | |
| team_limit | No | Maximum visible teams, default 10. | |
| principalId | No | Compatibility alias for principal_id; conflicting values are rejected. | |
| principal_id | No | ||
| principalType | No | Compatibility alias for principal_type; conflicting values are rejected. | |
| principal_type | No | Default systemuser. Without a systemuser ID, inspects the current authenticated user. | |
| includeTeamRoles | No | Compatibility alias for include_team_roles; conflicting values are rejected. | |
| include_team_roles | No | Read roles for visible user teams, default true. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish read-only and non-destructive behavior. The description adds useful behavioral context by noting that partial/forbidden sources and business-unit role identities are preserved, which tells the agent how incomplete security data is handled.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences with no filler. The main read scope is front-loaded, followed by behavioral caveats and the explicit boundary/alternative.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only security-context tool with no output schema, the description sufficiently covers what data is read and what caveats to expect, including preserved partial/forbidden sources. It could say more about the response structure, but the essential invocation context is present.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 90%, so the schema already documents nearly all parameters and defaults. The description does not add parameter-level meaning beyond what is in the schema, but a baseline 3 is appropriate when the schema carries the parameter documentation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: read a user/team profile, direct roles, and bounded visible team memberships/roles. It also explicitly distinguishes the scope from inherited/group/shared/field privileges and names get_record_access as the alternative for native record rights.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Clearly states an exclusion: it does not reconstruct inherited/group/shared/field privileges, and it directs the agent to get_record_access for native record rights. It does not explicitly say when to choose this tool over siblings like query_security_principals or get_current_user_context, but the intended context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_record_accessBRead-only
Use native bound RetrievePrincipalAccess for the specified principal and record. Returns effective record rights without inventing why they were granted or claiming field/business-rule access. Does not change permissions.
| Name | Required | Description | Default |
|---|---|---|---|
| recordId | No | Compatibility alias for record_id; conflicting values are rejected. | |
| record_id | No | ||
| principalId | No | Compatibility alias for principal_id; conflicting values are rejected. | |
| principal_id | No | ||
| principalType | No | Compatibility alias for principal_type; conflicting values are rejected. | |
| collectionName | No | Compatibility alias for collection_name; conflicting values are rejected. | |
| principal_type | No | Default current systemuser; team/organization require principal_id. | |
| collection_name | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so the description's main value is its scope disclaimer: it returns effective record rights without 'inventing why they were granted' and without claiming field-level or business-rule access. That is meaningful behavioral context an agent needs to interpret results correctly. It does not describe the shape of the returned rights or any pagination/permission requirements, keeping it below a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the operation and followed by scope constraints, with no filler. The 'native bound RetrievePrincipalAccess' phrasing is slightly jargon-heavy but still compact and purposeful.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description should explain what 'effective record rights' looks like in the response (e.g., an access-rights set), and it does not. It also does not clarify the effectively-required collection_name/record_id pair implied by the anyOf structure. It is adequate for a simple read tool but leaves return-shape and parameter-requirement gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
At 63% schema coverage, the schema itself documents the aliases, the principal_type enum, and the default to current systemuser. The description only gestures at 'the specified principal and record' and adds no detail on principal_type, collection_name, or the alias/conflict behavior, so it neither compensates for the gaps nor adds value over the structured fields. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb+resource: retrieve effective record rights for a given principal and record. It is clearly a read access-check tool, distinguishable from siblings like get_principal_security_context or get_record_audit_history. It stops short of explicitly naming those alternatives, so it does not reach the top of the scale.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The only usage direction is 'Use native bound RetrievePrincipalAccess for the specified principal and record,' which restates the operation rather than telling the agent when to pick this over get_principal_security_context or get_record_audit_history. There are no exclusions or prerequisites (e.g., which principal types are valid without a principal_id) beyond what the schema already shows.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_record_audit_historyARead-only
Read one native RetrieveRecordChangeHistory page. Default withholds attribute values. Preserves MoreRecords/cookie and current audit-setting evidence; no actor/time/ID is invented if native AuditRecord is absent. Empty history does not prove logs were deleted or auditing was disabled.
| Name | Required | Description | Default |
|---|---|---|---|
| pageSize | No | Compatibility alias for page_size; conflicting values are rejected. | |
| recordId | No | Compatibility alias for record_id; conflicting values are rejected. | |
| page_size | No | Native audit detail count, default 20. | |
| record_id | No | ||
| pageNumber | No | Compatibility alias for page_number; conflicting values are rejected. | |
| page_number | No | Default 1; later pages require the previous native paging_cookie. | |
| maxTextChars | No | Compatibility alias for max_text_chars; conflicting values are rejected. | |
| pagingCookie | No | Compatibility alias for paging_cookie; conflicting values are rejected. | |
| includeValues | No | Compatibility alias for include_values; conflicting values are rejected. | |
| paging_cookie | No | Native cookie from this same target/page size; maximum 16 KiB UTF-8. No cookie is invented. | |
| collectionName | No | Compatibility alias for collection_name; conflicting values are rejected. | |
| include_values | No | Default false. Native audit values are received but withheld from output. Explicit true projects bounded attribute old/new values with heuristic sensitive-field masking. | |
| max_text_chars | No | Per-text preview limit, default 2000; truncation is explicit. | |
| collection_name | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the readOnly/destructive annotations: it discloses that attribute values are withheld by default, that MoreRecords and the paging cookie are preserved, that no actor/time/ID is fabricated when the native AuditRecord is missing, and that empty history is not evidence of deleted logs. These are real interpretation caveats an agent cannot get from structured fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four tight sentences with the operation front-loaded and no filler. It is dense with domain jargon ('native RetrieveRecordChangeHistory', 'AuditRecord') that costs some readability, but every clause carries information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 14 parameters, no output schema, and annotations covering only safety, the description does the necessary work: it explains paging continuity via cookie, the value-withholding default, and how to interpret absent or empty results. It stops short of describing the returned audit record shape (which fields appear when AuditRecord exists), a minor residual gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 86%, so the schema already documents include_values, page_size, page_number, paging_cookie and the alias fields. The description reinforces the value-withholding default and cookie preservation but adds no syntax, format, or conflict-resolution detail beyond what the schema states. Baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Read one native RetrieveRecordChangeHistory page,' which pins down both the operation and its single-page scope. An agent can distinguish this from the sibling get_audit_details, though the description never names that alternative explicitly, leaving the differentiation implicit rather than stated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Default withholds attribute values' implies the agent must opt in via include_values when values are needed, and 'one page' implies iterative paging. But there is no explicit statement of when to prefer this over get_audit_details or other audit siblings, and no prerequisites are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_record_by_idC
Retrieve detailed information for a single record by its GUID.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The GUID of the record | |
| select | No | Comma-separated list of attributes to retrieve | |
| collectionName | No | Compatibility alias for collection_name; conflicting values are rejected. | |
| collection_name | No | Logical collection name |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations at all, the description carries the full behavioral burden and discloses almost nothing: it does not say the call is read-only (only implied by "Retrieve"), what happens when the GUID is not found, what permissions are required, or how the `select` projection changes the result.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with zero filler; nothing is redundant. It is arguably too terse, but that shortfall is better captured under completeness than conciseness.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
This is the only tool for fetching a record by id in the sibling set, and the description omits the non-obvious requirement that a collection name (or its alias) must also be supplied per the anyOf constraint. With no output schema and no annotations, an agent cannot tell what "detailed information" contains or what a miss looks like.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so `id`, `select`, `collection_name`, and the `collectionName` alias are all documented in the schema itself. The description only echoes the GUID idea and adds no extra semantics, which is the baseline 3 case when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ("Retrieve") and resource ("detailed information for a single record") and names the lookup key (GUID). It does not differentiate itself from siblings like search_records_by_odata or query_by_fetchxml, so an agent must infer that this is the single-record-by-id path.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this instead of search_records_by_odata, query_by_fetchxml, or get_record_access. No prerequisites or conditions (e.g., must already know the GUID and collection) are stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_ribbon_definitionCRead-only
Read native effective classic entity Ribbon through current CSDL-validated RetrieveEntityRibbon, with typed enum/alias encoding. Validate/decompress the bounded ZIP RibbonXml.xml part without extraction/execution. Summarize buttons, commands, rule references and candidate insertion locations; full XML is opt-in. Does not evaluate user visibility/security, execute JavaScript, edit merged definitions or support modern commanding.
| Name | Required | Description | Default |
|---|---|---|---|
| top | No | ||
| includeXml | No | ||
| include_xml | No | ||
| logicalName | No | ||
| logical_name | No | ||
| locationFilter | No | ||
| location_filter | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint annotation, the description discloses significant behavior: it validates and decompresses a bounded ZIP part without extraction or execution, returns a summary by default with full XML opt-in, and explicitly excludes security evaluation, JavaScript execution, merged-definition editing, and modern commanding. This is strong behavioral context for a read-only inspection tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core action and covers behavior efficiently in a few sentences. It is dense with jargon and could be organized more clearly, but it contains little outright waste.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex 7-parameter read tool with no output schema or parameter descriptions, the description explains output summary behavior and safety limits but omits essential parameter guidance and sibling routing. It is not complete enough for an agent to invoke it correctly without inspecting the schema in detail.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, with 7 parameters including logical_name/logicalName, top, includeXml/include_xml, and locationFilter/location_filter. The description only indirectly hints at includeXml via 'full XML is opt-in' and does not explain logicalName, top, location filtering, or alias behavior, so it fails to compensate for the missing schema documentation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: read the native effective classic entity Ribbon via RetrieveEntityRibbon, and it summarizes the output. It distinguishes scope from modern commanding and editing tools, though it does not directly differentiate from sibling inspect_ribbon_solution.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives scope exclusions such as not evaluating security, not executing JavaScript, not editing merged definitions, and no modern commanding support. However, it does not state when to use this rather than inspect_ribbon_solution or edit_ribbon_solution, nor does it name alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_solution_component_dependenciesBRead-only
Invoke native RetrieveRequiredComponents, RetrieveDependentComponents or RetrieveDependenciesForDelete after current CSDL validation. Default direction required. Returns projected dependency edges and explicit bounded completeness. Does not compute transitive closure, authorize deletion or prove deployment readiness.
| Name | Required | Description | Default |
|---|---|---|---|
| top | No | Maximum returned rows, default 500; completeness is explicit. | |
| maxPages | No | Maximum native pages, default 5. | |
| direction | No | ||
| max_pages | No | Maximum native pages, default 5. | |
| componentId | No | Native object/metadata GUID, NOT the solutioncomponent membership row GUID. | |
| component_id | No | Native object/metadata GUID, NOT the solutioncomponent membership row GUID. | |
| componentType | No | ||
| component_type | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint already covers safety, so the description earns credit for adding real behavior: results are a projected edge set with explicitly bounded completeness, and the tool explicitly does NOT compute transitive closure, authorize deletion, or prove deployment readiness. That negative scope is the most valuable content in the definition and prevents the agent from over-trusting the output.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
About fifty words with no filler sentences, but the ordering is inverted: the least useful sentence (which native APIs get invoked) occupies the front-loaded position, while the actual purpose and the "Default direction required" cue are buried. Dense internal jargon also raises parse cost.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With eight properties, no required fields, no output schema and no title, the description should carry more weight than it does: it never explains what a "projected edge" record contains, what the default-bounded completeness flag looks like, or how the duplicate alias parameters interact. The exclusions and bounded-completeness note help, but a caller still cannot predict the response payload.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 63%, with `direction` and both `component_type` variants carrying no description at all; the description only supplies "Default direction required," which adds marginal meaning to the direction enum. It says nothing about valid component type values or how the component_id/componentId alias pair should be chosen, so the coverage gap is partly left unfilled.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description eventually conveys the resource (dependency edges of a solution component) and lists the three direction modes, but the lead sentence defines the tool by the native APIs it wraps (RetrieveRequiredComponents, RetrieveDependentComponents, RetrieveDependenciesForDelete) rather than by what it does in plain terms. No sibling is named or contrasted (e.g. list_solution_components, verify_solution_deployment), so differentiation is left to inference.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"after current CSDL validation" implies a prerequisite and "Default direction required" hints at how to pick a direction, while the closing sentence gives genuine exclusions (no transitive closure, no delete authorization, no readiness proof). However, no alternative tool is ever named, so the agent gets boundaries without routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_solution_import_logARead-only
Explicitly read a native solution importjob data XML by GUID and return bounded result summaries. <=2 MiB XML; no DTD/entities/namespaces or execution. Counts include manifest/section results, not unique components; failures/warnings prioritized. Raw XML is never returned. Error text is opt-in and bounded with best-effort credential redaction. Logs do not prove async completion or deployment; missing/forbidden/unsupported data is distinct from success. Uses importjobs, not record-data importlogs.
| Name | Required | Description | Default |
|---|---|---|---|
| top | No | Returned result limit, default 50. Complete bounded XML counts are retained. | |
| importJobId | No | ||
| includeText | No | Default false. True can expose sensitive business text even after best-effort credential redaction. | |
| include_text | No | Default false. True can expose sensitive business text even after best-effort credential redaction. | |
| maxTextChars | No | Per message limit, default 2048. | |
| import_job_id | No | ||
| max_text_chars | No | Per message limit, default 2048. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnly annotation, it discloses important behavior: 2 MiB XML bounds, no DTD/entities/namespaces/execution, raw XML is never returned, failures and warnings are prioritized, error text is opt-in and redacted, and missing/forbidden/unsupported data is distinct from success.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but front-loaded: it starts with what the tool does, then adds limits, return semantics, redaction behavior, and caveats. Every sentence contributes useful selection or safety context without filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Although there is no output schema, the description covers the important return semantics: bounded summaries, manifest/section counts rather than unique components, prioritized failures/warnings, no raw XML, and optional bounded error text. It also explains the success distinctions an agent needs before calling this complex read-only tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 71%, and the description adds meaningful semantics beyond it: the job is identified by GUID, result summaries are bounded, and error text is opt-in and bounded with redaction. It still leaves some parameter details, such as top default and max text limits, to the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
It states a specific verb and resource: read a native solution importjob data XML by GUID and return bounded result summaries. It also separates itself from status/deployment checks by noting that logs do not prove async completion or deployment, and from record-data importlogs by naming the importjobs source.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context and exclusions, especially that this should not be treated as proof of async completion or deployment success. However, it does not explicitly name the alternative sibling tools to use for status or verification, leaving that routing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_solution_import_statusARead-only
Read native asyncoperation and/or importjob by explicit receipt IDs once, without polling or resubmission. Separates terminal async state, progress, unavailable/hidden/forbidden evidence and solution identity readback. Caller-supplied IDs are independent observations, not an independently verified relation. Progress=100/identity match is not deployment/runtime proof. No raw job/log/configuration text returned.
| Name | Required | Description | Default |
|---|---|---|---|
| importJobId | No | ||
| import_job_id | No | ||
| asyncOperationId | No | ||
| async_operation_id | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only give readOnlyHint=true, but the description adds substantial context beyond that: no polling or resubmission, separation of terminal async state from progress and from unavailable/hidden/forbidden evidence, identity readback, and an explicit caution that progress=100 or identity match is not deployment/runtime proof. It also states that no raw job/log/configuration text is returned, which is valuable behavioral disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The read operation and its key caveats are front-loaded in the first sentence, and the remaining sentences each add distinct value (evidence separation, ID-relation caution, proof disclaimer, no raw text). It is dense with jargon but earns its length.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description must describe returns, and it does so reasonably: terminal async state, progress, evidence categories, identity readback, and the absence of raw job/log/configuration text. The main remaining gap is parameter usage guidance for the four ID variants, but the behavioral coverage is otherwise strong for a read-only status tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must carry param meaning, and it does so only partially: it refers to 'explicit receipt IDs' and distinguishes async operation IDs from import job IDs conceptually. However, it does not explain alias pairs (importJobId vs import_job_id) or when to supply which ID type, so the semantics remain partly inferred from the schema's anyOf and x-alias-for hints.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: read native asyncoperation and/or importjob by explicit receipt IDs. It also bounds the scope ('once, without polling or resubmission') and names the evidence categories returned, which clearly separates it from siblings like import_solution_async and get_solution_import_log.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description establishes the usage condition well: call it once with caller-supplied receipt IDs rather than polling or resubmitting. It also warns that caller-supplied IDs are independent observations, not a verified relation, which clarifies interpretation. It stops short of explicitly naming alternatives such as get_solution_import_log or verify_solution_deployment.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_solution_snapshotARead-only
Capture the configured environment and current-caller explicit visible membership with selected properties. Profiles: 1 table, 9 global Picklist, 10 relationship, 61 Web Resource, 91 non-package database assembly. Binary content is hashed, never returned/executed. Normalize labels/option values and retain IDs only as evidence. Unsupported/forbidden/partial/unstable inventory is explicit. No nested expansion, atomic snapshot, publication, full schema/dependency/runtime proof. Pass or save the returned snapshot JSON to compare separately configured environments.
| Name | Required | Description | Default |
|---|---|---|---|
| top | No | Maximum memberships, default 100. A truncated inventory is inconclusive. | |
| maxPages | No | Maximum native pages, default 5. | |
| max_pages | No | Maximum native pages, default 5. | |
| solutionUniqueName | No | ||
| solution_unique_name | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantial behavioral detail beyond readOnlyHint=true: binary content is hashed and never returned or executed, labels and option values are normalized, unsupported/partial inventory is surfaced explicitly, and nested expansion, atomicity, publication, and full schema/dependency/runtime proofs are excluded.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded and the dense clauses mostly earn their place by conveying scope, safety, or limitations. Structure is paragraph form and somewhat jargon-heavy, but there is little obvious filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Without an output schema, the description says the return is snapshot JSON but does not explain its structure or key fields. It covers behavioral limitations well, but leaves the required solution identifier and parameter usage largely to the schema, limiting completeness for a complex snapshot tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description never mentions solution_unique_name, solutionUniqueName, top, maxPages, or max_pages. With only 60% schema description coverage and two required alternative name parameters lacking schema descriptions, the description does not compensate for the parameter documentation gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Capture') and resource ('snapshot') and defines the captured scope via visible membership, selected properties, and component profiles. It does not explicitly name compare_solution_snapshots, but the comparison workflow makes the general role clear.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Implies usage by saying to pass or save the returned snapshot JSON for later comparison and lists capability limits that suggest unsuitable cases. However, it never explicitly says when to use this instead of siblings such as list_solution_components, export_solution, or inspect_solution_package.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
import_ribbon_solutionADestructive
Preview first, then submit one native async import into an EXISTING ordinary unmanaged solution for reviewed classic Ribbon edits. Replay the structured edits and require exact candidate bytes; match organization/caller/table/publisher/version/complete visible membership and a fresh target export payload baseline. This is a WHOLE-SOLUTION import, including other unchanged components. Execute with current planHash, allow_unprotected_write and allow_full_solution_import. No upgrade/managed/override/automatic publish. Unknown acceptance retains client importJobId and is never replayed. Accepted responses yield a same-server-process provenance receipt for separate publication; receipt loss/restart is not permission to reimport.
| Name | Required | Description | Default |
|---|---|---|---|
| dryRun | No | Default true. Read-only ExportSolution POST can occur during preflight; import/publish is not sent. | |
| changes | No | ||
| dry_run | No | Default true. Read-only ExportSolution POST can occur during preflight; import/publish is not sent. | |
| logicalName | No | ||
| expectedHash | No | ||
| logical_name | No | ||
| expected_hash | No | ||
| sourceFilePath | No | Absolute original unmanaged source ZIP path. | |
| source_file_path | No | Absolute original unmanaged source ZIP path. | |
| candidateFilePath | No | Absolute candidate ZIP path produced from this source and the same structured edits on this server version. | |
| candidate_file_path | No | Absolute candidate ZIP path produced from this source and the same structured edits on this server version. | |
| allowUnprotectedWrite | No | Explicitly accept the remaining platform concurrency window; no atomic package/table/pending-customization lock. | |
| allowFullSolutionImport | No | Explicitly acknowledge that native import applies the entire existing unmanaged package, not just Ribbon. | |
| allow_unprotected_write | No | Explicitly accept the remaining platform concurrency window; no atomic package/table/pending-customization lock. | |
| allow_full_solution_import | No | Explicitly acknowledge that native import applies the entire existing unmanaged package, not just Ribbon. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the destructive/non-idempotent annotations, the description discloses that this is a whole-solution import affecting unchanged components, requires exact candidate bytes and a fresh baseline, and that unknown acceptance retains the importJobId and is never replayed. It also explains the provenance receipt and the boundary between import and separate publication.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The preview-first process is front-loaded and every sentence carries operational constraints with no filler. However, it is a dense run-on paragraph with heavy jargon and all-caps emphasis, which makes it harder to parse than necessary.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex destructive async import with no output schema, the description covers scope, preflight, required acknowledgments, unknown-acceptance handling, and receipt/provenance behavior. It could still be more complete by explicitly pointing to import-status polling or verification siblings and by reconciling planHash with expected_hash.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 67%, so the baseline is 3. The description adds meaning for allow_unprotected_write, allow_full_solution_import, structured edits, and candidate bytes, but it says to execute with a 'current planHash' while the schema exposes expected_hash, and it leaves source/candidate/logical_name semantics largely to the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
It states a specific action: submit one native async whole-solution import into an existing ordinary unmanaged solution for reviewed classic Ribbon edits. It also separates import from later publication, distinguishing it from publish_ribbon_solution. It does not explicitly name sibling tools such as import_solution_async or edit_ribbon_solution, so it stops short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear process guidance: preview first, then execute with the current plan hash and the two explicit acknowledgment flags. It also lists exclusions (no upgrade/managed/override/automatic publish) and says receipt loss or restart is not permission to reimport. It lacks direct comparison with sibling alternatives such as import_solution_async or publish_ribbon_solution.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
import_solution_asyncADestructive
Preview first import of an ordinary unmanaged ZIP into the configured environment. Execute with planHash and allow_unprotected_write=true. Same solution-name updates, managed/patch/upgrade imports are blocked. First import can change shared unmanaged components. Fixed overwrite overlay/workflow activation/dependency skip/holding/upgrade flags false; no environment overrides or separate publish. Submits once using ImportSolutionAsync; accepted is not completed. Unknown outcomes retain a client-assigned importJobId for manual status checks.
| Name | Required | Description | Default |
|---|---|---|---|
| dryRun | No | Default true. Execution requires a current preview planHash. | |
| dry_run | No | Default true. Execution requires a current preview planHash. | |
| filePath | No | Absolute local file path. ZIPs are read without extraction or execution. | |
| file_path | No | Absolute local file path. ZIPs are read without extraction or execution. | |
| expectedHash | No | ||
| contentBase64 | No | Canonical base64; ZIP bytes at most 32 MiB. Supply exactly one input source. | |
| expected_hash | No | ||
| content_base64 | No | Canonical base64; ZIP bytes at most 32 MiB. Supply exactly one input source. | |
| allowUnprotectedWrite | No | Explicitly accept the native import concurrency window and shared unmanaged component changes. | |
| allow_unprotected_write | No | Explicitly accept the native import concurrency window and shared unmanaged component changes. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds substantial behavioral context beyond the annotations: first import can change shared unmanaged components, fixed flags are forced false, there are no environment overrides or separate publish, submission is asynchronous, and accepted does not mean completed. These details are highly relevant for a destructive, non-idempotent operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but front-loaded around the preview/execute distinction and immediately covers major side effects and constraints. The forced-flag sentence is somewhat compressed, but overall there is little filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex destructive async import with no output schema, it explains side effects, async submission, and the meaning of acceptance. The main completeness gap is the inconsistent planHash reference, which leaves execution guidance partially unresolved.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 80%, so most parameters are documented in the schema. But the description references planHash, which is not in the input schema at all, and it does not clarify the expectedHash parameter, creating confusion about how execution is actually authorized.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies the operation: previewing and then executing a first import of an ordinary unmanaged ZIP into the configured environment. It distinguishes this import path from managed, patch, and upgrade imports, though it does not explicitly contrast it with sibling import or solution-inspection tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives useful execution conditions such as using allow_unprotected_write=true and the fact that managed/patch/upgrade imports are blocked. However, it also instructs execution with a planHash that is not present in the input schema, and it does not point to get_solution_import_status or another sibling for follow-up status checks.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
inspect_ribbon_solutionBRead-only
Inspect one entity classic RibbonDiffXml from a local solution ZIP without CRM configuration. Returns package identity and bounded button/command summaries, optional selected diff XML. Native merged definitions and solution diffs are different representations; a package is not target/runtime evidence.
| Name | Required | Description | Default |
|---|---|---|---|
| top | No | ||
| filePath | No | Absolute local solution ZIP path; no network/device paths. | |
| file_path | No | Absolute local solution ZIP path; no network/device paths. | |
| includeXml | No | ||
| include_xml | No | ||
| logicalName | No | ||
| logical_name | No | ||
| contentBase64 | No | Canonical base64 ZIP <=32 MiB. Supply exactly one input source. | |
| content_base64 | No | Canonical base64 ZIP <=32 MiB. Supply exactly one input source. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint=true; the description adds real value beyond that by disclosing the return shape (package identity plus bounded button/command summaries, optional selected diff XML) and by flagging that native merged definitions differ from solution diffs and that a package is not target/runtime evidence. This is meaningful behavioral context, though it does not address permissions or failure modes for malformed ZIPs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with the verb and resource, then return shape, then the representational caveat. Dense domain jargon ('RibbonDiffXml', 'target/runtime evidence') but no filler sentences.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema the description usefully sketches the return payload and its limits, and the package-vs-runtime caveat is a strong completeness signal. But for a 9-parameter tool with 44% schema coverage and an anyOf/oneOf input contract, the description leaves key calling details undocumented.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 44% across 9 parameters, so the description must compensate and largely does not. It hints at include_xml ('optional selected diff XML') and top ('bounded ... summaries'), but logical_name, the exactly-one-source constraint, and the alias behavior are left entirely to the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('inspect') and a precise resource ('one entity classic RibbonDiffXml from a local solution ZIP'), scoped to an offline package. The 'without CRM configuration' clause implicitly separates it from live-CRM ribbon tools, though it never names a sibling explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The 'local solution ZIP without CRM configuration' framing implies the use case (offline inspection) and the closing caveat warns that a package is not runtime evidence, steering agents away from treating output as deployment truth. However, no sibling is named and there is no explicit when-not-to-use statement pointing to get_ribbon_definition or inspect_solution_package.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
inspect_solution_packageARead-only
Inspect a local solution ZIP or base64 without CRM configuration. Bounds ZIP headers, paths, inflated sizes and every payload CRC; reads only solution.xml identity, publisher and declaration counts. No extraction/execution. Does not prove authenticity, safe code, dependencies, contents or deployability.
| Name | Required | Description | Default |
|---|---|---|---|
| filePath | No | Absolute local file path. ZIPs are read without extraction or execution. | |
| file_path | No | Absolute local file path. ZIPs are read without extraction or execution. | |
| contentBase64 | No | Canonical base64; ZIP bytes at most 32 MiB. Supply exactly one input source. | |
| content_base64 | No | Canonical base64; ZIP bytes at most 32 MiB. Supply exactly one input source. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint=true, but the description adds substantial context beyond that: it defines the safety envelope (headers, paths, inflated sizes and CRC bounds), confirms no extraction or execution, and lists explicit non-guarantees (authenticity, safe code, dependencies, contents, deployability). This is exactly the sort of limitation disclosure an agent needs before trusting results.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences, front-loaded with what it does, then the validation bounds, then the non-guarantees. Every clause carries information; nothing is padded or repeated from the name.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, yet the description specifies the returned scope (identity, publisher, declaration counts) and explicitly bounds what is *not* verified. For a 4-param, no-output-schema read tool, an agent has everything needed to call it and interpret results accordingly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the parameter descriptions already cover absolute paths, the 32 MiB base64 ceiling, and the exactly-one-input-source rule. The description only references the two input modes generically ('ZIP or base64') and adds no format or constraint detail beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('inspect a local solution ZIP or base64') plus a scope qualifier ('without CRM configuration') that separates it from CRM-bound siblings like list_solutions or get_solution_snapshot. It also enumerates exactly what is read (solution.xml identity, publisher, declaration counts), so the agent knows this is a static package inspection, not a deployment or query tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'without CRM configuration' clearly signals the use case (offline/local package triage) and implicitly excludes CRM-connected siblings, and the bounds-and-CRC language tells the agent this is for validated metadata extraction. It does not explicitly name an alternative tool or state when *not* to pick this one, so it falls just short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_all_entity_definitionsB
List basic definitions (logical name, display name, etc.) for all entities in the system.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations at all, the description carries the full disclosure burden and says nothing about side effects, permissions, or result volume. It gives no warning that this may return a large unpaginated dump of every entity in the environment, nor any indication of whether the data is cached or freshly read.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One front-loaded sentence with no preamble or filler, and the scope ('all entities') appears before the field list. The trailing 'etc.' is the only soft spot, adding vagueness without adding detail.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter read tool this is close to sufficient, but with no annotations and no output schema the description should still tell the agent the shape and scale of the response and how to follow up for richer metadata. As written the agent knows what it lists but not what it will get back.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is nothing for the description to disambiguate and the baseline of 4 applies. The description's mention of returned fields is a small bonus rather than required parameter information.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description pairs a specific verb ('List') with a specific resource ('basic definitions... for all entities') and enumerates the returned fields (logical name, display name), so an agent knows exactly what it gets. It does not, however, distinguish itself from overlapping siblings such as get_entity_metadata_summary or get_model_definition.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit when-to-use, no when-not-to-use, and no mention of the many sibling tools that surface entity metadata. The only hint is the word 'all' plus 'basic', which implicitly signals bulk shallow enumeration versus a detailed metadata call, but the agent must infer that itself.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_model_ui_componentsBRead-only
List bounded native saved/unpublished system forms or views for one table. Returns IDs and types, with explicit list limits; no XML or automatic published-version fallback.
| Name | Required | Description | Default |
|---|---|---|---|
| top | No | ||
| kind | No | ||
| logicalName | No | ||
| nameKeyword | No | ||
| logical_name | No | ||
| name_keyword | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With readOnlyHint already declaring the safe-read profile, the description still adds real behavioral context: results are bounded by explicit list limits, only IDs and types come back, and unpublished versions are not automatically substituted for published ones. That last point is a non-obvious semantic an agent could easily get wrong, though the actual default limit value is never stated.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two compact sentences with no filler, and the identity of the resource is front-loaded. Minor density cost from stacked qualifiers ('bounded native saved/unpublished system'), which slightly obscures what is actually being listed.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, so the description reasonably states the return shape (IDs and types), and the readOnly annotation covers safety. For a 6-parameter tool at 0% schema coverage it is still thin: the name_keyword filter, alias behavior, and the default for top are all left for the agent to guess.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must carry the parameter burden and mostly does not. It gestures at logical_name ('one table'), kind ('forms or views'), and top ('explicit list limits'), but name_keyword has no documented meaning in either place, the logicalName/nameKeyword alias pairs are never explained, and no default or accepted range for top is given.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: list saved/unpublished system forms or views for one table, returning IDs and types. It implicitly separates itself from the singular get_model_ui_component and the mutating edit_model_form/edit_model_view, though it never names them. The phrase 'bounded native saved/unpublished system forms' is dense enough that an agent may need a second read.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The clause 'no XML or automatic published-version fallback' implies the right contexts (you want IDs, not full definitions; you specifically want unpublished drafts), which hints that get_model_ui_component is the XML alternative. However there is no explicit 'use this when / use X instead' routing and no stated prerequisites for the table.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_solution_componentsARead-only
List visible solutioncomponent membership rows for an exact solution; objectid/type, membership row ID and root inclusion behavior are separate. Optional filters combine with the solution. No code/XML/configuration is read; completeness does not prove export payload contents.
| Name | Required | Description | Default |
|---|---|---|---|
| top | No | Maximum returned rows, default 500; completeness is explicit. | |
| maxPages | No | Maximum native pages, default 5. | |
| max_pages | No | Maximum native pages, default 5. | |
| componentId | No | Native object/metadata GUID, NOT the solutioncomponent membership row GUID. | |
| component_id | No | Native object/metadata GUID, NOT the solutioncomponent membership row GUID. | |
| componentType | No | ||
| component_type | No | ||
| solutionUniqueName | No | ||
| solution_unique_name | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint=true; the description adds real behavioral context beyond that — results are limited to *visible* rows, no code/XML/configuration is read, and row completeness is not evidence of export payload contents. It does not mention pagination/defaults or permission requirements, keeping it out of 5 territory.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences, front-loaded with the core action and followed by constraints. Dense to the point of being elliptical ('root inclusion behavior are separate'), but nothing is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema and nine schema properties mean the description should carry more weight than it does: it never explains the returned row shape beyond naming objectid/type and row ID, does not note that at least one solution-name form is required, and does not clarify the maxPages/alias behavior. Adequate for a read-only list tool, but with gaps an agent would hit.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 56%, with top, maxPages and componentId documented but componentType and the solution name parameters undocumented. The description partially compensates by warning that objectid, membership row ID and root inclusion are separate concepts (reinforcing the schema's 'NOT the membership row GUID' note) and that filters combine with the solution, but it never mentions the anyOf requirement for a solution name or the alias pairs.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource with scope: list *visible solutioncomponent membership rows* for an *exact* solution. That clearly separates it from add_solution_component, get_solution_component_dependencies and list_solutions. The trailing clause about objectid/type, membership row ID and root inclusion behavior is cryptic rather than clarifying, so it stops short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Optional filters combine with the solution' and the caveat that completeness does not prove export payload contents imply when the tool is useful (inventory before export), but no sibling is named and no explicit when-not guidance is given. Usage must be inferred from the sibling list.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_solutionsBRead-only
List native solution identity/state with optional exact unique-name/ID/managed filters. Bounded paging stays in the current query scope. Visible rows are not deployment validation.
| Name | Required | Description | Default |
|---|---|---|---|
| top | No | Maximum returned rows, default 500; completeness is explicit. | |
| maxPages | No | Maximum native pages, default 5. | |
| max_pages | No | Maximum native pages, default 5. | |
| is_managed | No | ||
| solutionId | No | ||
| solution_id | No | ||
| solutionUniqueName | No | ||
| solution_unique_name | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint=true already covers the safety profile, so the description earns credit for adding real caveats: bounded paging stays inside the current query scope, and returned rows are not proof of deployment. It still says nothing about result ordering, completeness signalling, or what a bounded page omits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three front-loaded sentences with no filler; the filtering capability comes before the caveats. The phrasing 'native solution identity/state' is compressed to the point of being slightly opaque, which keeps it short of a 5.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 8 parameters, 0 required, and no output schema, the description covers scope and caveats but not what fields rows carry or how paging limits interact with 'top'. Enough to call it, not enough to interpret results confidently.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 38%, so the description must compensate. It groups the three filter families (unique name, ID, managed) but adds no syntax beyond what the schema patterns already say, and it leaves top/maxPages semantics to the schema-only descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'List native solution identity/state'. That distinguishes it from siblings that inspect, verify, export, or import solutions. It doesn't explicitly name those siblings, but the scope is unambiguous enough to select correctly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'with optional exact unique-name/ID/managed filters' tells the agent which filters select a narrower query, and 'Visible rows are not deployment validation' implies verification should go to verify_solution_deployment. However, no alternative tool is named and no explicit when-not-to-use condition is given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
preview_fetchxml_queryB
Preview the first result using the same FetchXML state/filter logic as query_by_fetchxml. Returns effective query and paging information without claiming the sample is a full result set.
| Name | Required | Description | Default |
|---|---|---|---|
| fetch_xml | Yes | The FetchXML string to preview | |
| state_mode | No | legacy preserves valid implicit statecode=0 filtering; all adds no state filter; values uses state_values validated against this table. | |
| state_values | No | Explicit numeric state values; requires state_mode=values. | |
| formatted_values | No | Include formatted labels and display values returned by CRM. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It does disclose one useful trait — that the sample is not a full result set and that it returns effective query and paging info — but it never confirms read-only behavior, whether the query executes against the org, or any cost/permission implications. For a tool with zero annotation coverage this leaves significant behavioral gaps.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences with no filler, and the core behavior is front-loaded. The second sentence's caveat about the sample not being a full result set earns its place, though the phrasing is slightly indirect.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description sketches the return payload ('effective query and paging information'), which compensates somewhat for the missing output schema, and the schema fully covers inputs. However, it omits when to use the tool versus the full query and any safety/read-only framing, leaving the agent to infer the calling context for a four-parameter query tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all four parameters (including the state_mode enum and state_values) are already documented in the schema. The description references the 'state/filter logic' but adds no syntax, defaults, or interaction detail beyond what the schema supplies, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Preview') and resource ('the first result' of a FetchXML query), and it names the sibling query_by_fetchxml to anchor what it shares logic with. An agent can tell it apart from the full query tool, though the distinction is implied by 'first result' rather than stated directly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: 'Preview' suggests trying a query before running the full one, but the description never says explicitly when to choose this over query_by_fetchxml or what the trade-off is. There are no exclusions or prerequisites stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
publish_model_choicesADestructive
Publish one entire shared global choice by native PublishXml; includes other pending changes to this global choice. Default preview. Local choices use the separate whole-table publish_model_table tool. Publication never replays a save and does not verify UI behavior.
| Name | Required | Description | Default |
|---|---|---|---|
| dryRun | No | Default true performs reads/eligibility checks and returns a native request preview. Set false to execute. | |
| dry_run | No | Default true performs reads/eligibility checks and returns a native request preview. Set false to execute. | |
| globalChoiceName | No | ||
| global_choice_name | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (destructive, non-idempotent), the description discloses real behavior: publishing bundles other pending changes to this global choice, it does not replay a save, and it does not verify UI behavior. These are non-obvious side effects and limits. It stops short of describing the response or the eligibility checks performed during preview.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose and scope come first, followed by sibling routing and behavioral caveats; each sentence carries content. Some jargon ("native PublishXml", "never replays a save") costs clarity without adding much, but there is no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive mutation with no output schema, the description covers preview defaults, bundled side effects, and sibling routing, which is solid. It omits prerequisites (publisher/solution context, permissions) and gives no hint of what a preview or publish returns, leaving the agent to discover that empirically.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The two dryRun/dry_run parameters are already fully described in the schema, and the only description statement about them ("Default preview") merely repeats that. The choice-name parameters have no schema description at all, and the split into global_choice_name/globalChoiceName aliases plus the anyOf required pattern is never explained, so the description does not compensate for the 50% coverage gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ("Publish one entire shared global choice") and scopes it to the global-choice case, explicitly distinguishing it from the sibling publish_model_table that handles local choices. An agent can tell the two publish tools apart without inspecting either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It names the alternative tool and the condition that routes to it (local choices -> publish_model_table), and notes that the default is preview, so an agent knows execution requires an explicit change. It doesn't spell out the typical trigger (e.g., publish after create/update of choices), leaving some inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
publish_model_tableADestructive
PublishXml for one entire table, including OTHER pending fields, forms, views and ribbon customizations. Default preview exposes scope; publication is separate from save. No automatic save replay on publication failure.
| Name | Required | Description | Default |
|---|---|---|---|
| dryRun | No | Default true performs reads/eligibility checks and returns a native request preview. Set false to execute. | |
| dry_run | No | Default true performs reads/eligibility checks and returns a native request preview. Set false to execute. | |
| logicalName | No | ||
| logical_name | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark this as destructive and non-idempotent, but the description adds genuinely non-obvious behavior: publication sweeps in OTHER pending customizations beyond the named table, and there is "no automatic save replay on publication failure." Those two facts are exactly the kind of blast-radius and failure-mode detail an agent cannot infer from the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences, front-loaded with the operation and its scope surprise, with no filler. Slightly telegraphic phrasing ("PublishXml", "save replay") assumes platform familiarity but costs no words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive, non-idempotent mutation with no output schema, the description covers scope expansion, preview-first flow, and failure behavior. Missing are prerequisites (permissions/solution context) and whether publication is reversible, which would matter before an agent commits with dryRun=false.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 50% and the dryRun/dry_run preview semantics are already documented in the schema; the description only reinforces the default-preview behavior instead of extending it. The logical_name/logicalName pair, including why two aliases exist and how they interact, is unexplained in both places.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("PublishXml for one entire table") and immediately defines the blast radius ("including OTHER pending fields, forms, views and ribbon customizations"). It implicitly separates this from the narrower publish siblings (publish_model_choices, publish_ribbon_solution) but never names them, so a reader must infer the routing.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a usable workflow cue: default preview exposes scope, and "publication is separate from save" tells the agent to persist changes first. It stops short of explicitly naming alternatives or stating when NOT to publish a whole table versus narrower publish tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
publish_ribbon_solutionBDestructive
Separate preview/publish after a same-process authenticated import receipt, matching native succeeded import job and successful bounded manifest log. Check current target/exportable non-Ribbon baseline, CSDL and effective Ribbon before native PublishXml. Execute with planHash, allow_unprotected_write and allow_full_table_publish. Publishes the ENTIRE table, including unrelated pending fields/forms/views; pending contents are not locked/read completely. Referenced JS/images are NOT published by this request; use separate Web Resource publication. Compare changed button definitions after acceptance without running code or claiming UI/security/runtime success. Preserve published=true on readback failure; no reimport or automatic republish.
| Name | Required | Description | Default |
|---|---|---|---|
| dryRun | No | Default true. Read-only ExportSolution POST can occur during preflight; import/publish is not sent. | |
| changes | No | ||
| dry_run | No | Default true. Read-only ExportSolution POST can occur during preflight; import/publish is not sent. | |
| logicalName | No | ||
| expectedHash | No | ||
| logical_name | No | ||
| expected_hash | No | ||
| importReceipt | No | Unchanged importReceipt from import_ribbon_solution in this server process. Cannot survive process restart; do not reimport to regenerate. | |
| import_receipt | No | Unchanged importReceipt from import_ribbon_solution in this server process. Cannot survive process restart; do not reimport to regenerate. | |
| sourceFilePath | No | Absolute original unmanaged source ZIP path. | |
| source_file_path | No | Absolute original unmanaged source ZIP path. | |
| candidateFilePath | No | Absolute candidate ZIP path produced from this source and the same structured edits on this server version. | |
| candidate_file_path | No | Absolute candidate ZIP path produced from this source and the same structured edits on this server version. | |
| allowFullTablePublish | No | Explicitly accept publication of all other pending table customizations. | |
| allowUnprotectedWrite | No | Explicitly accept the remaining platform concurrency window; no atomic package/table/pending-customization lock. | |
| allow_unprotected_write | No | Explicitly accept the remaining platform concurrency window; no atomic package/table/pending-customization lock. | |
| allow_full_table_publish | No | Explicitly accept publication of all other pending table customizations. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
This is the description's strongest dimension and is fully consistent with destructiveHint=true. It discloses blast radius ("publishes the ENTIRE table, including unrelated pending fields/forms/views"), concurrency risk ("pending contents are not locked/read completely", "no atomic package/table/pending-customization lock"), scope exclusions (JS/images require separate publication), and failure semantics ("Preserve published=true on readback failure; no reimport or automatic republish") – behavior the annotations alone cannot convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The critical fact – whole-table publish – appears only in the fourth sentence, after two dense, jargon-heavy clauses about manifests, CSDL, and PublishXml. Sentences are run-on and mix routine description with post-publication verification guidance, so the agent must decode rather than scan.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 17-parameter, non-idempotent destructive tool with no output schema, the description covers blast radius and failure handling well but says nothing about return values or what the agent should do with them (the sibling verify_ribbon_deployment / get_solution_import_status are never mentioned as follow-ups). The "compare changed button definitions after acceptance" line partly compensates but stays abstract.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
At 71% schema coverage the schema already documents dryRun, the file paths, import_receipt, and the two opt-in flags. The description restates allow_unprotected_write and allow_full_table_publish without adding meaning beyond their schema descriptions, and it references "planHash," a parameter that does not exist in the schema (the schema has expected_hash) – a small but real source of confusion.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The verb+resource is buried but recoverable: "Publishes the ENTIRE table" plus the tool name make clear this publishes Ribbon customizations after an import. However, the opening sentence ("Separate preview/publish after a same-process authenticated import receipt, matching native succeeded import job and successful bounded manifest log") is nearly unparseable, and nothing distinguishes it from siblings like publish_model_table or verify_ribbon_deployment.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It implies sequencing (preflight baseline checks before native PublishXml; dryRun defaults true) and names one explicit alternative: "Referenced JS/images are NOT published by this request; use separate Web Resource publication" – i.e., publish_web_resource. But there is no crisp when-to-use/when-not statement, and the import-receipt prerequisite only appears in the schema, not the description.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
publish_web_resourceADestructive
Publish a single saved Web Resource with native PublishXml, without saving/re-uploading content. Use for save-only workflows or recovery after a publish failure. Publishes the latest saved version at execution time.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| dryRun | No | Compatibility alias for dry_run; conflicting aliases are rejected. | |
| dry_run | No | Preview environment and the single-resource publication scope without executing PublishXml. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, readOnlyHint=false, and idempotentHint=false, so the safety bar is lower. The description adds real context beyond that — publishing reflects the 'latest saved version at execution time', which is a meaningful timing guarantee — but it never states what the destructive aspect means in practice (that live consumers see this immediately, and a prior published state is superseded). That is the single most important behavior for a destructive tool and it is left implicit.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences, front-loaded with the verb and resource, then the mechanism, then the usage cases. No filler. Slightly dense packing of the 'without saving/re-uploading' qualifier into the first sentence costs it the top mark.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description should indicate what the agent gets back (success/failure signal, published version info) and it does not. It also omits the dry_run preview path, which is the natural safety valve for a destructive operation. Adequate for purpose and timing, incomplete for a destructive, non-idempotent tool with no return-value documentation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 67%: dry_run and the dryRun alias are documented in the schema itself, and only 'id' is undocumented (pattern and required are stated). The description adds nothing about any parameter — it does not even mention the dry_run preview option, which is the one thing an agent should know before invoking a destructive publish. Baseline 3 is appropriate given partial schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Publish a single saved Web Resource'), names the underlying operation ('native PublishXml'), and explicitly carves out what it does NOT do ('without saving/re-uploading content'). That negative clause is what separates it from create_web_resource_and_publish and update_web_resource_and_publish in the sibling list.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives two concrete use cases: 'save-only workflows' and 'recovery after a publish failure.' It does not name a sibling alternative explicitly, but the 'without saving/re-uploading content' clause implicitly routes the agent away from the combined create/update-and-publish tools. Clear context, no explicit exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
query_by_fetchxmlA
Execute FetchXML with explicit state policy and bounded native cookie/simple paging. Defaults to one page. Returns value, effective query, completeness and continuation; use fetch_all for multiple pages.
| Name | Required | Description | Default |
|---|---|---|---|
| fetch_all | No | Follow server paging up to max_records/max_pages. Default false returns one page. | |
| fetch_xml | No | The FetchXML string to execute | |
| max_pages | No | Maximum server pages read per call, default 10, when fetch_all=true. | |
| page_size | No | Requested server page size, default 500. Cannot be combined with top. FetchXML count is preserved unless the same value is supplied. | |
| state_mode | No | legacy preserves valid implicit statecode=0 filtering; all adds no state filter; values uses state_values validated against this table. | |
| max_records | No | Maximum records returned in this call, default 5000. Remaining records can be resumed with continuation. | |
| continuation | No | Opaque cursor from a previous result; valid for five minutes in this server connection. Resumes saved query and buffered records. | |
| state_values | No | Explicit numeric state values; requires state_mode=values. | |
| formatted_values | No | Include formatted labels and display values returned by CRM. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It does disclose useful behaviour: one page by default, bounded native cookie/simple paging, and the shape of the return value (value, effective query, completeness, continuation). It omits permission requirements, failure modes, and what happens when the query is rejected — reasonable but not rich for a query execution tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two dense sentences with zero filler: behaviour first, return shape second, sibling/alternative routing third. Everything is front-loaded and each clause carries information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With nine parameters and no output schema, the description compensates by naming what is returned (value, effective query, completeness, continuation). That is enough for an agent to call it correctly, though the interplay between fetch_all, max_records and continuation could be spelled out more explicitly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so every parameter (including state_mode's enum semantics and continuation's five-minute lifetime) is already documented in the schema. The description's only added parameter meaning is confirming the default single-page behaviour. Baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (execute FetchXML) plus the two defining characteristics: explicit state policy and bounded native paging. An agent knows exactly what the tool does, though the description does not distinguish itself from the sibling preview_fetchxml_query or search_records_by_odata.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Defaults to one page' and 'use fetch_all for multiple pages' give implied usage context, but fetch_all is a parameter of this same tool, not an alternative tool. There is no guidance on when to reach for this versus preview_fetchxml_query (to validate syntax) or search_records_by_odata (simpler filtering), both of which are plausible siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
query_failed_system_jobsARead-only
Read native failed system jobs (statuscode 31) using completion-time bounds and optional correlation/owning step IDs. Excludes job data/configuration and message text by default. Does not retry, cancel or change jobs.
| Name | Required | Description | Default |
|---|---|---|---|
| top | No | Maximum visible rows, default 50. Reaching this bound is not a complete inventory. | |
| stepId | No | Compatibility alias for step_id; conflicting values are rejected. | |
| toTime | No | Compatibility alias for to_time; conflicting values are rejected. | |
| step_id | No | ||
| to_time | No | ISO timestamp with explicit timezone, inclusive. Default current UTC time. | |
| fromTime | No | Compatibility alias for from_time; conflicting values are rejected. | |
| maxPages | No | Compatibility alias for max_pages; conflicting values are rejected. | |
| from_time | No | ISO timestamp with explicit timezone, inclusive. Default 24 hours before to_time. | |
| max_pages | No | Maximum native pages, default 5. Bounded reads report incompleteness. | |
| includeText | No | Compatibility alias for include_text; conflicting values are rejected. | |
| include_text | No | Default false. Opt in to trace/exception/job message text, which can contain business data. Secure/unsecure configuration columns are never selected. | |
| maxTextChars | No | Compatibility alias for max_text_chars; conflicting values are rejected. | |
| correlationId | No | Compatibility alias for correlation_id; conflicting values are rejected. | |
| correlation_id | No | ||
| max_text_chars | No | Per-text preview limit, default 2000; truncation is explicit. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, and the description reinforces rather than contradicts that ('Does not retry, cancel or change jobs'). It adds real behavioral context beyond the annotations: sensitive payloads (job data, configuration, message text) are excluded by default and only surfaced on opt-in. It does not mention that bounded reads can return partial/incomplete results, which is only visible in the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, no filler, and the operative content (what is read, what is excluded, what it will not do) is front-loaded. Every clause carries distinct information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 15-parameter, all-optional read tool with 87% schema coverage and no output schema, the description covers purpose, default privacy posture, and non-mutating behavior adequately. Gaps remain around pagination/incompleteness semantics and what a returned row contains (no output schema to lean on), but nothing an agent needs to invoke it safely is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 87% schema description coverage the schema does the heavy lifting, and the description only lightly maps its filters ('completion-time bounds and optional correlation/owning step IDs'), which does clarify that step_id is the owning step rather than the failing one. It says nothing about the extensive camelCase alias duplicates, the default 24-hour window, top vs. max_pages pagination interaction, or the include_text/max_text_chars coupling — all left entirely to the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('Read native failed system jobs (statuscode 31)') and pins the precise domain definition of failure via the statuscode constant, which is genuinely useful. It is clear about scope (completion-time bounds, correlation/owning step IDs), but it never names a sibling it competes with (e.g. query_plugin_trace_logs, diagnose_plugin_failure), so it stops short of full sibling differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'using completion-time bounds' implies when the tool fits (post-hoc failure triage over a time window), and 'Does not retry, cancel or change jobs' rules out remediation use. However, there is no explicit 'use this instead of X when Y' routing among the many diagnostic siblings, nor any statement of prerequisites such as which time window to pick or what to do when the read is incomplete.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
query_plugin_trace_logsARead-only
Read bounded native plugin trace rows by time, correlation ID, step and exact plugin type. Default excludes message/exception text; configuration and secureconfiguration are always excluded. Empty results do not prove no execution, disabled logging or log deletion.
| Name | Required | Description | Default |
|---|---|---|---|
| top | No | Maximum visible rows, default 50. Reaching this bound is not a complete inventory. | |
| stepId | No | Compatibility alias for step_id; conflicting values are rejected. | |
| toTime | No | Compatibility alias for to_time; conflicting values are rejected. | |
| step_id | No | ||
| to_time | No | ISO timestamp with explicit timezone, inclusive. Default current UTC time. | |
| fromTime | No | Compatibility alias for from_time; conflicting values are rejected. | |
| maxPages | No | Compatibility alias for max_pages; conflicting values are rejected. | |
| from_time | No | ISO timestamp with explicit timezone, inclusive. Default 24 hours before to_time. | |
| max_pages | No | Maximum native pages, default 5. Bounded reads report incompleteness. | |
| includeText | No | Compatibility alias for include_text; conflicting values are rejected. | |
| include_text | No | Default false. Opt in to trace/exception/job message text, which can contain business data. Secure/unsecure configuration columns are never selected. | |
| maxTextChars | No | Compatibility alias for max_text_chars; conflicting values are rejected. | |
| correlationId | No | Compatibility alias for correlation_id; conflicting values are rejected. | |
| correlation_id | No | ||
| exceptionsOnly | No | Compatibility alias for exceptions_only; conflicting values are rejected. | |
| max_text_chars | No | Per-text preview limit, default 2000; truncation is explicit. | |
| pluginTypeName | No | Compatibility alias for plugin_type_name; conflicting values are rejected. | |
| exceptions_only | No | Only rows with nonempty native exceptiondetails; default false. | |
| plugin_type_name | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantial behavior beyond the read-only annotations: bounded reads, default exclusion of message/exception text, permanent exclusion of configuration and secureconfiguration, and an important interpretation caveat for empty results. These details materially affect how an agent should use and trust the output.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tightly packed sentences, front-loaded with the core operation and filter scope. Each sentence adds useful information: scope, default data exclusions, and result-interpretation caveat.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 19-parameter read tool with no output schema, the description covers the key semantics: what is read, how it is bounded, what text is excluded by default, and what empty results do not prove. It could say more about pagination/truncation behavior, but the schema already documents those parameters.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is high at 84%, so most parameter meaning is already carried by the schema. The description reinforces the main filters and text-exclusion default, but it does not add much parameter-level detail beyond what structured fields provide.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Read') and resource ('native plugin trace rows') with the supported filter dimensions. It clearly distinguishes this from adjacent plugin diagnostics by emphasizing trace-row retrieval and bounded native reads.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear context for when the tool applies: reading trace rows by time, correlation ID, step, and exact plugin type. It does not explicitly name sibling alternatives such as diagnose_plugin_failure, but it provides enough operational context to select it for trace-log inspection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
query_security_principalsARead-only
Read bounded visible users, teams or roles with optional ID/name/business-unit filters. Disabled users are included unless enabled is explicit. Catalog entries do not imply effective record permissions.
| Name | Required | Description | Default |
|---|---|---|---|
| top | No | Maximum visible rows, default 50. Reaching this bound is not a complete inventory. | |
| enabled | No | Only systemuser: explicit enabled/disabled filter. | |
| maxPages | No | Compatibility alias for max_pages; conflicting values are rejected. | |
| max_pages | No | Maximum native pages, default 5. Bounded reads report incompleteness. | |
| nameKeyword | No | Compatibility alias for name_keyword; conflicting values are rejected. | |
| principalId | No | Compatibility alias for principal_id; conflicting values are rejected. | |
| name_keyword | No | ||
| principal_id | No | ||
| principalType | No | Compatibility alias for principal_type; conflicting values are rejected. | |
| businessUnitId | No | Compatibility alias for business_unit_id; conflicting values are rejected. | |
| principal_type | No | Default systemuser. | |
| business_unit_id | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only and non-destructive nature. The description adds real context beyond them: reads are bounded, disabled users are included unless 'enabled' is explicit, and results are catalog visibility rather than effective permissions. Missing are details on what 'bounded' yields when limits are hit.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences, zero filler, scope stated first and caveats front-loaded after. Each sentence carries distinct, useful information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 12-param read tool with annotations covering safety and no output schema, the description conveys scope, bounding, default-inclusion behavior, and the catalog-vs-effective distinction. Only pagination/completeness reporting nuance is left entirely to the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
At 75% schema coverage the schema already documents top, enabled, max pages, and alias behavior. The description only adds a generic summary of the filter axes ('optional ID/name/business-unit filters') without clarifying the bare name_keyword/principal_id params, so it lands at the baseline for high-coverage schemas.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Read) and resource (visible users, teams, roles) plus the filter axes (ID/name/business-unit). The closing note that catalog entries do not imply effective permissions implicitly separates it from the security-context siblings, though it never names them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The line 'Catalog entries do not imply effective record permissions' is a genuine routing hint distinguishing this inventory query from get_record_access/get_principal_security_context. It stops short of explicitly naming those alternatives or stating exclusion conditions, so it is not a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
reactivate_model_keyADestructive
Preview/submit the native ReactivateEntityKey Action only for an existing unmanaged Failed key index after its cause has been corrected. Uses actual key LogicalName, preserves key columns and never recreates/deletes the key. Requires planHash and explicit unprotected Action. Acceptance is separate from a new job link and Active state; performs one metadata readback, never polls/replays the submission. Inspect later with get_model_key.
| Name | Required | Description | Default |
|---|---|---|---|
| dryRun | No | Default true performs reads/eligibility checks and returns a native request preview. Set false to execute. | |
| dry_run | No | Default true performs reads/eligibility checks and returns a native request preview. Set false to execute. | |
| schemaName | No | ||
| logicalName | No | ||
| schema_name | No | ||
| expectedHash | No | Current preview planHash (binds target, patch and environment), required for execution. | |
| logical_name | No | ||
| expected_hash | No | Current preview planHash (binds target, patch and environment), required for execution. | |
| solutionUniqueName | No | Existing unmanaged solution; its publisher prefix is validated for new schemas. | |
| solution_unique_name | No | Existing unmanaged solution; its publisher prefix is validated for new schemas. | |
| allowUnprotectedWrite | No | Explicitly permit the native PUT/Action without atomic concurrency protection. A preview fingerprint is still required. | |
| allow_unprotected_write | No | Explicitly permit the native PUT/Action without atomic concurrency protection. A preview fingerprint is still required. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantial behavior beyond the annotations: hash-bound preview/execute flow, mandatory explicit unprotected Action, exactly one metadata readback, and no polling or replay of the submission. The one gap is that it never explains why the action is flagged destructiveHint=true when it claims nothing is recreated or deleted, leaving a mild tension an agent must resolve on its own.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, both dense with relevant constraints, and the scope restriction is front-loaded before the mechanics. It is packed to the point of near-opacity ('native ReactivateEntityKey Action', 'preview fingerprint'), but no sentence is filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with no output schema and 12 params (6 distinct with aliases), the description covers the preview/execute split, safety gates, what is verified, and how to check later. It does not describe what the preview payload contains or what failure responses look like, which would help an agent recovering from a rejected submission.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Explains the semantics of the two non-obvious inputs – planHash (binds target, patch and environment, required to execute) and the explicit unprotected Action toggle – which goes beyond the schema's own wording. It says nothing about the solution parameter, which the schema still requires via its allOf, and 67% coverage leaves some inputs undocumented in both places.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (preview/submit), a specific resource (the native ReactivateEntityKey Action on an existing unmanaged Failed key index), and constrains scope to a repaired failure condition. It also distinguishes itself from create/delete key flows ('never recreates/deletes the key') and points to get_model_key for later inspection, so an agent can separate it from siblings without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit precondition (unmanaged, Failed status, cause already corrected) and an explicit exclusion (do not use it to make or remove keys). It also names the correct follow-up tool (get_model_key) and explains that acceptance differs from a new job link / Active state, so the agent knows how to interpret a non-obvious outcome.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_records_by_odataA
Query records using OData with explicit state policy, stable ordering and bounded server-driven paging. Defaults to one page and legacy statecode=0 where valid; all adds no implicit state filter. Returns completeness and continuation.
| Name | Required | Description | Default |
|---|---|---|---|
| top | No | Native query limit, independent of per-call max_records. Cannot be combined with page_size. | |
| expand | No | OData navigation expansion. Nested child collections are not independently auto-paged. | |
| filter | No | OData filter expression | |
| select | No | Comma-separated list of attributes to retrieve | |
| orderby | No | Comma-separated property paths with optional asc/desc. Primary key is appended as a tie-breaker where available. | |
| fetch_all | No | Follow server paging up to max_records/max_pages. Default false returns one page. | |
| max_pages | No | Maximum server pages read per call, default 10, when fetch_all=true. | |
| page_size | No | Requested server page size, default 500. Cannot be combined with top. FetchXML count is preserved unless the same value is supplied. | |
| state_mode | No | legacy preserves valid implicit statecode=0 filtering; all adds no state filter; values uses state_values validated against this table. | |
| max_records | No | Maximum records returned in this call, default 5000. Remaining records can be resumed with continuation. | |
| continuation | No | Opaque cursor from a previous result; valid for five minutes in this server connection. Resumes saved query and buffered records. | |
| state_values | No | Explicit numeric state values; requires state_mode=values. | |
| collection_name | Yes | EntitySetName (Web API collection name), e.g. accounts; use table metadata rather than guessing a plural name. | |
| formatted_values | No | Include formatted labels and display values returned by CRM. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral burden and discloses non-obvious defaults: one page by default, legacy statecode=0 filtering where valid, no implicit state filter for all, stable ordering, bounded paging, and returned completeness/continuation. It does not explicitly state read-only safety, permission requirements, or rate limits, though the query verb strongly implies a read operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences, front-loaded with the tool’s purpose, and dense with relevant behavioral defaults. It avoids repeating schema parameter descriptions and each clause contributes useful context.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 14-parameter query tool with no annotations and no output schema, the description covers key state and paging behavior and mentions return completeness/continuation. However, it leaves gaps around explicit read-only safety, permissions, error behavior, and fuller return-shape context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so baseline is 3. The description adds useful semantic context beyond the schema by explaining the state policy distinction between legacy and all, and by summarizing the one-page default and continuation behavior.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: querying records using OData, with scope around state policy, stable ordering, and bounded paging. It implicitly distinguishes itself from FetchXML-based siblings by naming OData, but it does not explicitly compare itself to any sibling tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The OData phrasing implies when this tool is appropriate, but there is no explicit guidance on when to choose it over query_by_fetchxml, preview_fetchxml_query, or get_record_by_id. It also lacks stated exclusions or alternative-selection rules.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_web_resources_by_nameARead-only
Find Web Resources by a substring of name, with bounded OData results. Defaults to published definitions; include_unpublished=true reads the latest saved definitions. Content is excluded by default. Supports the legacy camelCase parameters.
| Name | Required | Description | Default |
|---|---|---|---|
| top | No | ||
| nameKeyword | No | Compatibility alias for name_keyword; conflicting aliases are rejected. | |
| name_keyword | No | ||
| includeContent | No | Compatibility alias for include_content; conflicting aliases are rejected. | |
| include_content | No | Return Base64 source content only when explicitly requested. | |
| includeUnpublished | No | Compatibility alias for include_unpublished; conflicting aliases are rejected. | |
| include_unpublished | No | Read latest saved definitions, including unpublished resources, using RetrieveUnpublishedMultiple. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint annotation already establishes safety, and the description adds useful behavior beyond it: bounded OData results, published-by-default semantics, unpublished retrieval behavior, content exclusion, and legacy camelCase support. It does not describe return shape or pagination details, but with annotations covering safety this is solid.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is four compact sentences, front-loads the core purpose, and each sentence adds operational information. There is no redundant restatement of the tool name or schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only search tool with annotations and no output schema, the description covers the key defaults and flag semantics an agent needs to invoke it correctly. It could say more about returned fields, but it is sufficiently complete for selection and invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 71%, and the description meaningfully supplements it by explaining the substring-name search, bounded results, include_unpublished semantics, content exclusion by default, and legacy camelCase aliases. The schema handles top-level bounds and alias conflict behavior.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: "Find Web Resources by a substring of name." It also clarifies the bounded OData nature of the search, which distinguishes it from the create/update/publish web-resource siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear usage context: default behavior reads published definitions, include_unpublished=true reads latest saved definitions, and content is excluded by default. It does not explicitly name alternatives or exclusions, but the routing is clear for this search tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_existing_recordADestructive
Update a native record with row-version protection where supported. Defaults to a fresh ETag; unsupported concurrency stops writes unless unprotected operation is explicit. Does not upsert a missing GUID.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| data | Yes | Native JSON attribute data. Related bindings must stay inside the configured organization API. Local JSON limit 10 MiB. | |
| dryRun | No | Compatibility alias for dry_run. Conflicting aliases are rejected. | |
| dry_run | No | Read-only preview of environment, target, changes and write blockers. Default false; sensitive fields are masked. | |
| ifMatch | No | Compatibility alias for if_match. Conflicting aliases are rejected. | |
| if_match | No | Specific ETag from a prior read/preview. Without it, reads the current record ETag when the table supports concurrency. | |
| collectionName | No | Compatibility alias for collection_name. Conflicting aliases are rejected. | |
| collection_name | No | Native EntitySetName, such as accounts. Validated against table metadata. | |
| allowUnprotectedWrite | No | Compatibility alias for allow_unprotected_write. Conflicting aliases are rejected. | |
| allow_unprotected_write | No | Default false. Explicitly allow an unprotected write if table concurrency is unconfirmed, or for collection relationship membership. Does not bypass a supplied ETag conflict. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes beyond the annotations by disclosing the ETag default (reads current record ETag when the table supports concurrency), the fail-closed behavior on unsupported concurrency, and the no-upsert boundary. Given destructiveHint=true and idempotentHint=false are already declared, the remaining gap is only what a successful response returns.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences, no filler, with the concurrency guarantee front-loaded. Slightly dense jargon ('fresh ETag', 'native record') costs a little immediate readability, but nothing is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 10-parameter mutation tool with no output schema, the description covers the safety-critical behavior that matters before invoking: concurrency protection, fail-closed default, and non-upsert semantics, while the schema carries parameter detail.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 90%, so if_match, allow_unprotected_write, and dry_run are already documented in the schema; the description only restates the ETag default and the unprotected-write escape hatch in prose. With near-complete schema coverage, a baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Update a native record') plus the concurrency scope ('row-version protection where supported'), and explicitly disclaims upsert behavior, which cleanly separates it from sibling upsert_record_by_key and create_new_record.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Conveys implicit conditions – writes stop on unsupported concurrency unless allow_unprotected_write is explicit, and a missing GUID will not be created – but never states when to prefer this over siblings like upsert_record_by_key or delete_record_by_id, nor recommends a dry_run first.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_model_column_settingsADestructive
Default preview of existing ordinary unmanaged custom column settings; nine supported base types. Allows length/range/precision expansion, requirement level, auditing/search managed values, Boolean/existing Picklist defaults and DateTime display format. Preserves full definition, labels, choices and date behavior. Rejects narrowing, primary/derived/calculated/rollup/autonumber columns and type/schema changes. Execute with preview planHash as expected_hash plus allow_unprotected_write=true; full native PUT then readback, no automatic publication.
| Name | Required | Description | Default |
|---|---|---|---|
| patch | No | ||
| dryRun | No | Default true performs reads/eligibility checks and returns a native request preview. Set false to execute. | |
| dry_run | No | Default true performs reads/eligibility checks and returns a native request preview. Set false to execute. | |
| logicalName | No | ||
| expectedHash | No | Current preview planHash (binds target, patch and environment), required for execution. | |
| logical_name | No | ||
| attributeName | No | ||
| expected_hash | No | Current preview planHash (binds target, patch and environment), required for execution. | |
| attribute_name | No | ||
| solutionUniqueName | No | Existing unmanaged solution; its publisher prefix is validated for new schemas. | |
| solution_unique_name | No | Existing unmanaged solution; its publisher prefix is validated for new schemas. | |
| allowUnprotectedWrite | No | Explicitly permit the native PUT/Action without atomic concurrency protection. A preview fingerprint is still required. | |
| allow_unprotected_write | No | Explicitly permit the native PUT/Action without atomic concurrency protection. A preview fingerprint is still required. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already flag destructive=true and non-idempotent behavior, and the description adds substantial context: execution is gated by a preview hash, requires allow_unprotected_write, performs a native PUT then readback, and does not publish automatically. It stops short of detailing permissions or failure modes, so it is strong but not exhaustive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but mostly ordered: preview/scope, allowed changes, preservation/rejections, then execution protocol. The opening phrase is compressed and less direct than an explicit 'updates...' statement, creating a minor readability cost.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex 13-parameter mutation with a nested patch and no output schema, it covers eligibility, allowed changes, execution gating, readback, and publication behavior. It could be stronger by describing the preview response shape, but the core decision information is present.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 62% schema description coverage, the description compensates well by summarizing patch semantics: expansion of length/range/precision, requirement level, audit/search flags, defaults, and DateTime format. It also explains expected_hash and allow_unprotected_write, but leaves the alias pairs and naming parameters to the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific operation on existing ordinary unmanaged custom column settings and scopes it to nine base types while excluding special column categories. The qualifiers 'existing' and 'ordinary unmanaged' help distinguish it from create_model_column and broader schema-change tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It clearly states that the default is preview and that execution requires the preview planHash as expected_hash plus allow_unprotected_write=true. It also lists rejected categories such as primary, derived, calculated, rollup, autonumber, and type/schema changes, though it does not name an alternative tool for unsupported cases.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_model_labelsADestructive
Update table/column labels by native full-definition PUT with MSCRM.MergeLabels=true. Preserves other retrieved properties, including choice definitions. Does not update option values: use change_model_choice_value. Execution requires current expected_hash and allow_unprotected_write=true; a concurrency race remains. Default preview.
| Name | Required | Description | Default |
|---|---|---|---|
| dryRun | No | Default true performs reads/eligibility checks and returns a native request preview. Set false to execute. | |
| dry_run | No | Default true performs reads/eligibility checks and returns a native request preview. Set false to execute. | |
| description | No | ||
| displayName | No | ||
| logicalName | No | ||
| display_name | No | ||
| expectedHash | No | ||
| logical_name | No | ||
| attributeName | No | ||
| expected_hash | No | ||
| attribute_name | No | ||
| solutionUniqueName | No | Existing unmanaged solution; its publisher prefix is validated for new schemas. | |
| solution_unique_name | No | Existing unmanaged solution; its publisher prefix is validated for new schemas. | |
| allowUnprotectedWrite | No | ||
| displayCollectionName | No | ||
| allow_unprotected_write | No | ||
| display_collection_name | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the destructive/non-idempotent annotations by disclosing the PUT-with-MergeLabels write strategy, that other retrieved properties (including choice definitions) are preserved, the required hash guard and unprotected-write opt-in, the residual concurrency race, and the preview-by-default behavior. This is exactly the operational context an agent needs before a destructive mutation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Five short sentences, each carrying distinct information: mechanism, preservation semantics, exclusion, preconditions, and default mode. Front-loaded with the operation, zero filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive 17-parameter mutation with no output schema, the description covers safety, prerequisites, default preview, and the sibling alternative. The remaining gap is which label fields to populate and how table vs column targeting works, which an agent must infer from the schema alone.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 17 parameters at 24% schema description coverage, the description carries real weight: it explains that expected_hash must be current and allow_unprotected_write must be true to execute, and that preview is the default. However, it never explains the label payload parameters (display_name, description, display_collection_name), the logical_name vs attribute_name target selection, or the alias pairs, leaving most of the surface undocumented.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Update table/column labels') and names the underlying mechanism (native full-definition PUT with MSCRM.MergeLabels=true), which makes the scope concrete. It explicitly rules out option-value updates, though it does not distinguish itself from the nearby update_model_column_settings sibling.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear when-not ('Does not update option values: use change_model_choice_value') plus hard execution preconditions (current expected_hash and allow_unprotected_write=true). It also flags that the default is preview, so an agent knows the first call is non-destructive. It stops short of stating when to prefer this over update_model_column_settings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_model_relationshipADestructive
Preview/update an existing unmanaged custom 1:N menu/cascade or N:N per-side menus by full native PUT with language merging. Preserves table/column/intersect identity and omitted settings. Menu must be confirmed customizable. Cascade changes can affect future related-record deletion, ownership and access; native cross-relationship rules remain platform-validated. Requires planHash and explicit unprotected write; saves and reads back separately from publication.
| Name | Required | Description | Default |
|---|---|---|---|
| patch | No | ||
| dryRun | No | Default true performs reads/eligibility checks and returns a native request preview. Set false to execute. | |
| dry_run | No | Default true performs reads/eligibility checks and returns a native request preview. Set false to execute. | |
| schemaName | No | ||
| schema_name | No | ||
| expectedHash | No | Current preview planHash (binds target, patch and environment), required for execution. | |
| expected_hash | No | Current preview planHash (binds target, patch and environment), required for execution. | |
| solutionUniqueName | No | Existing unmanaged solution; its publisher prefix is validated for new schemas. | |
| solution_unique_name | No | Existing unmanaged solution; its publisher prefix is validated for new schemas. | |
| allowUnprotectedWrite | No | Explicitly permit the native PUT/Action without atomic concurrency protection. A preview fingerprint is still required. | |
| allow_unprotected_write | No | Explicitly permit the native PUT/Action without atomic concurrency protection. A preview fingerprint is still required. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only flag destructive/not-idempotent; the description goes well beyond by disclosing that table/column/intersect identity and omitted settings are preserved, that cascade changes affect future deletion, ownership and access, that native cross-relationship rules stay platform-validated, that a planHash plus explicit unprotected write are required, and that saving is separate from publication. These are exactly the operational facts an agent needs before invoking a destructive mutation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The whole definition is a single dense paragraph where every clause carries distinct information (scope, preservation, risk, gating, publication). It is front-loaded with the verb+resource, though heavy jargon like 'per-side menus' and 'full native PUT' makes it slower to parse than a short bulleted structure would.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex 11-parameter nested mutation with no output schema, the description covers the risk profile, the preview/execute contract, prerequisites and the fact that saving is distinct from publication. What remains thin is the return of the preview step and the eligibility-check details, both partially covered in schema field descriptions.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 73%, and the description fills key gaps: it names planHash (expectedHash) as required for execution, the explicit unprotected-write flag (allowUnprotectedWrite), language merging for the label arrays, and per-side menus (entity_1_menu/entity_2_menu) for N:N. It does not explain the alias duplication or the patch/omit semantics in depth, but adds clear value beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Preview/update an existing unmanaged custom 1:N menu/cascade or N:N per-side menus' via 'full native PUT with language merging'. The 'existing' and 'unmanaged custom' qualifiers implicitly separate it from create_model_relationship, but no sibling is named explicitly, so an agent must infer the boundary.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied rather than stated: 'Preview/update' plus the schema default dryRun=true and 'Menu must be confirmed customizable' sketch a preview-then-execute workflow with a prerequisite gate. However, the description never says when to pick this over create_model_relationship or get_model_relationship, and gives no explicit exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_web_resource_and_publishADestructive
Update an existing Web Resource by GUID and optionally publish it. Uses If-Match:* to prevent accidental upsert; pass if_match for optimistic concurrency. dry_run reads the latest saved/unpublished definition and returns hashes and ETag. Does not rename or change the resource type.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| dryRun | No | Compatibility alias for dry_run; conflicting aliases are rejected. | |
| content | No | Inline content, UTF-8 by default. Supply exactly one of content or file_path; empty content is allowed. | |
| dry_run | No | Read-only preview showing the environment, target, metadata changes and content hashes. Does not save or publish. | |
| ifMatch | No | Compatibility alias for if_match; conflicting aliases are rejected. | |
| publish | No | Default true preserves the old save-and-publish behavior. Set false to save without publishing. | |
| filePath | No | Compatibility alias for file_path; conflicting aliases are rejected. | |
| if_match | No | A specific ETag from a previous read/preview, such as W/"123". HTTP 412 is a conflict and is never retried. | |
| file_path | No | Absolute source-file path on the MCP server machine; read as bytes and Base64 encoded. Supply exactly one of file_path or content. Maximum 10 MiB. | |
| description | No | Optional description; an empty string clears it. | |
| displayName | No | Compatibility alias for display_name; conflicting aliases are rejected. | |
| display_name | No | ||
| contentEncoding | No | Compatibility alias for content_encoding; conflicting aliases are rejected. | |
| content_encoding | No | Inline content encoding, default utf8. Base64 must be canonical. Not used with file_path. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds real context beyond the annotations: the tool defaults to If-Match:* to prevent accidental upsert, dry_run performs a read-only preview of the latest saved/unpublished definition, and publish defaults to true. This meaningfully complements destructiveHint=true and idempotentHint=false by explaining the mutation's guardrail, though it doesn't say what happens to fields omitted from the request.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four tight sentences with the core action front-loaded, followed by concurrency, preview, and scope-limit notes. No filler, though the dry_run sentence reads slightly clipped compared to the rest.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 14-parameter mutation with no output schema and risky annotations, the description covers the essential decision points: concurrency, preview mode, publish default, and scope limits. It omits what the response contains and how a conflict surfaces beyond the 412 note in the schema, but that is a minor gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 86%, so the schema already documents aliases, content vs file_path exclusivity, encoding and ETag conflict handling. The description reinforces if_match and dry_run but adds no syntax or format detail beyond the structured fields — baseline 3 is appropriate when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Update an existing Web Resource by GUID and optionally publish it") plus an explicit scope boundary ("Does not rename or change the resource type"). It implicitly separates itself from create_web_resource_and_publish and publish_web_resource via "existing," but never names those siblings, so an agent must infer the routing.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives implied guidance: pass if_match for optimistic concurrency, use dry_run to preview, publish defaults to true. But it never states when to choose publish_web_resource (publish-only) or create_web_resource_and_publish (new resource) instead, which is the main ambiguity for an agent given three near-identical siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
upsert_record_by_keyBDestructive
Use one active native alternate key with conditional PATCH. Validates key metadata/types and never silently changes key values. Races return errors; writes are never automatically repeated.
| Name | Required | Description | Default |
|---|---|---|---|
| data | Yes | Native JSON attribute data. Related bindings must stay inside the configured organization API. Local JSON limit 10 MiB. | |
| mode | No | Default upsert. Uses native conditional PATCH: create-only if absent, guarded update if present. No automatic retry on races. | |
| dryRun | No | Compatibility alias for dry_run. Conflicting aliases are rejected. | |
| dry_run | No | Read-only preview of environment, target, changes and write blockers. Default false; sensitive fields are masked. | |
| ifMatch | No | Compatibility alias for if_match. Conflicting aliases are rejected. | |
| if_match | No | Specific ETag from a prior read/preview. Without it, reads the current record ETag when the table supports concurrency. | |
| alternateKey | No | Compatibility alias for alternate_key. Conflicting aliases are rejected. | |
| alternate_key | No | Exact values for one declared active alternate key. Native metadata determines string/integer/choice/decimal/UTC datetime/lookup encoding. No null values. | |
| collectionName | No | Compatibility alias for collection_name. Conflicting aliases are rejected. | |
| collection_name | No | Native EntitySetName, such as accounts. Validated against table metadata. | |
| allowUnprotectedWrite | No | Compatibility alias for allow_unprotected_write. Conflicting aliases are rejected. | |
| allow_unprotected_write | No | Default false. Explicitly allow an unprotected write if table concurrency is unconfirmed, or for collection relationship membership. Does not bypass a supplied ETag conflict. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=false, and the description reinforces this by stating races return errors and writes are never automatically repeated, plus that key values are never silently changed and key metadata/types are validated. This adds real behavioral context beyond the annotations without contradicting them. It stops short of stating auth/privilege requirements.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences with no wasted words, and the key constraint about using one active alternate key is front-loaded. However, the compression makes the opening phrase cryptic rather than clear, trading readability for brevity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 12-parameter mutation tool with a nested data object and no output schema, the description covers key behavioral rules (validation, races, no retry) but says nothing about the response shape or what a successful upsert returns. It is adequate but leaves the agent guessing about outcomes.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so parameters like mode, dry_run, if_match, and alternate_key are already well documented in the schema. The description adds only light framing (single active alternate key, conditional PATCH) rather than meaning beyond the schema, which fits the baseline 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description says 'Use one active native alternate key with conditional PATCH' and mentions writes, but never states the core action plainly (create-or-update a record identified by an alternate key). It relies on the tool name to convey purpose and only implies that it mutates data. The mechanism (conditional PATCH) is stated, but the resource/operation pairing is left implicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is a constraint ('Use one active native alternate key') but no guidance on when to choose this over siblings like create_new_record, update_existing_record, or execute_record_transaction. No prerequisites or exclusions are offered, leaving the agent to infer selection from the name alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
verify_ribbon_deploymentARead-only
Read-only recovery/inspection: replay local source/changes, validate the candidate, resolve the current configured target and compare changed button attributes, command/action/parameter structure, labels and local display rules against native effective classic Ribbon. Missing/ambiguous/expanded evidence remains inconclusive or different. No receipt or reimport required; no publish/retry/repair, code execution or claim that the package was imported/published or the button works for a user.
| Name | Required | Description | Default |
|---|---|---|---|
| changes | No | ||
| logicalName | No | ||
| logical_name | No | ||
| sourceFilePath | No | Absolute original unmanaged source ZIP path. | |
| source_file_path | No | Absolute original unmanaged source ZIP path. | |
| candidateFilePath | No | Absolute candidate ZIP path produced from this source and the same structured edits on this server version. | |
| candidate_file_path | No | Absolute candidate ZIP path produced from this source and the same structured edits on this server version. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint annotation already covers the safety profile, but the description adds meaningful behavioral context: no publish/retry/repair, no code execution, no receipt/reimport requirement, and no claim that the package was imported/published or that the button works for a user. It also discloses that missing, ambiguous, or expanded evidence yields inconclusive or different results.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded, but the description is a very dense, jargon-heavy sentence followed by cryptic phrases such as 'Missing/ambiguous/expanded evidence remains inconclusive or different.' The content is relevant, yet readability and scanability suffer.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex 7-parameter verification tool with no output schema, the description provides strong caveats and behavioral limits but omits the return semantics and parameter-level guidance for changes and logical_name. The safety annotations cover only the read-only aspect.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 57%, with source and candidate paths already described in the schema. The description references source/changes and candidate conceptually, but it does not explain logical_name, the changes structure, or the parameter aliases, so it adds only marginal meaning beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
It states a specific read-only verification/resource scope: replay source/changes, validate a candidate, and compare changed Ribbon button attributes against the native effective classic Ribbon. The purpose is understandable, but it relies on dense domain jargon and does not explicitly distinguish itself from siblings such as inspect_ribbon_solution or verify_solution_deployment.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives some when-to-use and when-not-to-use signals, notably read-only recovery/inspection, no receipt/reimport required, and no publish/retry/repair. However, it does not name alternatives or state explicit conditions for choosing this tool over inspect_ribbon_solution, verify_solution_deployment, or get_ribbon_definition.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
verify_solution_deploymentARead-only
Read-only selected-scope verification of the configured target against an expected snapshot. Returns a live snapshot comparison and, for explicit receipt IDs, independent native job/import-log evidence with text withheld. No full deployment/publication/runtime/causal package-job linkage is asserted, and job success never overwrites known component differences. Does not import, publish, repair, poll or replay.
| Name | Required | Description | Default |
|---|---|---|---|
| top | No | Maximum memberships, default 100. A truncated inventory is inconclusive. | |
| maxPages | No | Maximum native pages, default 5. | |
| max_pages | No | Maximum native pages, default 5. | |
| importJobId | No | ||
| import_job_id | No | ||
| expectedManaged | No | ||
| asyncOperationId | No | ||
| expectedSnapshot | No | The complete snapshot object from get_solution_snapshot, not the success wrapper. Versioned strict shape, <=2 MiB/200 memberships, canonical definitions and all hashes are checked. Hashes do not prove authenticity. | |
| expected_managed | No | ||
| expected_snapshot | No | The complete snapshot object from get_solution_snapshot, not the success wrapper. Versioned strict shape, <=2 MiB/200 memberships, canonical definitions and all hashes are checked. Hashes do not prove authenticity. | |
| async_operation_id | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint annotation, the description discloses the return shape (live snapshot comparison plus native job/import-log evidence with text withheld) and important caveats: no causal package-job linkage is asserted, and job success never overwrites known component differences. This is meaningful behavioral context not available in structured fields, though the dense phrasing and missing output format detail keep it from a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded and no sentence is pure filler, but the middle prose is heavily jargon-laden ('selected-scope', 'native job/import-log evidence', 'causal package-job linkage') and hard to parse on first read. It is appropriately sized for a complex tool, but clarity suffers for the density.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 11-parameter tool with no output schema and nested objects, the description does substantial work explaining what is and is not asserted and what evidence is returned. Gaps remain around several parameters and the exact return structure, but the behavioral scope is well covered.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 45%, so the description must compensate. It adds meaning for expected_snapshot ('against an expected snapshot') and the receipt-ID parameters ('for explicit receipt IDs'), but says nothing about top, maxPages, expectedManaged, or the alias duplication present in the schema. Partial compensation warrants a middle score.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Read-only selected-scope verification of the configured target against an expected snapshot.' This clearly distinguishes it from import/publish siblings, reinforced by 'Does not import, publish, repair, poll or replay.' 'Selected-scope' is somewhat opaque jargon, but the core purpose is unmistakable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description defines boundaries via negation ('Does not import, publish, repair, poll or replay') and hints when receipt IDs matter ('for explicit receipt IDs'), which implies usage. However, it never explicitly routes to siblings like compare_solution_snapshots, get_solution_snapshot, or get_solution_import_status, leaving the when-to-prefer-this decision to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
84 tool updates
v1.0.0- First observed
add_solution_component - First observed
associate_records - First observed
call_d365_api_action - First observed
change_model_choice_value - First observed
clear_server_cache - First observed
compare_solution_snapshots - First observed
create_model_choices - First observed
create_model_column - First observed
create_model_key - First observed
create_model_relationship - First observed
create_model_table - First observed
create_new_record - First observed
create_web_resource_and_publish - First observed
d365_plugin_assemblies_query - First observed
d365_plugin_assembly_inspect - First observed
d365_plugin_assembly_update - First observed
d365_plugin_image_delete - First observed
d365_plugin_image_register - First observed
d365_plugin_image_update - First observed
d365_plugin_images_query - First observed
d365_plugin_registration_metadata - First observed
d365_plugin_step_register - First observed
d365_plugin_step_update - First observed
d365_plugin_steps_query - First observed
delete_record_by_id - First observed
diagnose_plugin_failure - First observed
disassociate_records - First observed
edit_model_form - First observed
edit_model_view - First observed
edit_ribbon_solution - First observed
execute_record_batch - First observed
execute_record_transaction - First observed
export_solution - First observed
get_api_operation - First observed
get_audit_details - First observed
get_current_user_context - First observed
get_detailed_field_metadata - First observed
get_diagnostic_settings - First observed
get_entity_metadata_summary - First observed
get_entity_navigation_links - First observed
get_environment_capabilities - First observed
get_field_picklist_options - First observed
get_model_choices - First observed
get_model_definition - First observed
get_model_key - First observed
get_model_relationship - First observed
get_model_ui_component - First observed
get_principal_security_context - First observed
get_record_access - First observed
get_record_audit_history - First observed
get_record_by_id - First observed
get_ribbon_definition - First observed
get_solution_component_dependencies - First observed
get_solution_import_log - First observed
get_solution_import_status - First observed
get_solution_snapshot - First observed
import_ribbon_solution - First observed
import_solution_async - First observed
inspect_ribbon_solution - First observed
inspect_solution_package - First observed
list_all_entity_definitions - First observed
list_model_ui_components - First observed
list_solution_components - First observed
list_solutions - First observed
preview_fetchxml_query - First observed
publish_model_choices - First observed
publish_model_table - First observed
publish_ribbon_solution - First observed
publish_web_resource - First observed
query_by_fetchxml - First observed
query_failed_system_jobs - First observed
query_plugin_trace_logs - First observed
query_security_principals - First observed
reactivate_model_key - First observed
search_records_by_odata - First observed
search_web_resources_by_name - First observed
update_existing_record - First observed
update_model_column_settings - First observed
update_model_labels - First observed
update_model_relationship - First observed
update_web_resource_and_publish - First observed
upsert_record_by_key - First observed
verify_ribbon_deployment - First observed
verify_solution_deployment
TDQS
Scored across 84 tools
The set covers many distinct Dynamics 365 subdomains, but several tools overlap in purpose, especially metadata readers (get_model_definition, get_entity_metadata_summary, get_detailed_field_metadata, list_all_entity_definitions), choice readers (get_field_picklist_options, get_model_choices), and relationship readers (get_model_relationship, get_entity_navigation_links). The very detailed descriptions help disambiguate most cases, but with 84 tools there is still meaningful selection risk.
Most names are snake_case verb_noun, but the d365_plugin_* family uses noun_verb forms such as d365_plugin_assembly_inspect and d365_plugin_steps_query, while other areas use create_model_*, get_model_*, and generic record verbs. The conventions are mixed but generally readable.
84 tools is far beyond the 50+ threshold for an extreme mismatch, even for a large enterprise platform like Dynamics 365. The surface should be consolidated or split into smaller purpose-specific servers to reduce cognitive load.
The server covers records, metadata, solutions, ribbon, plugins, web resources, audit, security, diagnostics, and querying, but lifecycle coverage is uneven. Notable gaps include no create_solution, no remove_solution_component, no delete_web_resource, no delete_plugin_step, and no delete operations for model tables, columns, relationships, or keys.
Maintenance
Related MCP Connectors
A comprehensive Model Context Protocol (MCP) server that enables AI assistants to interact with yo…
The Cortex MCP server provides read-only access to real-time engineering context from the Cortex developer portal, allowing AI coding assistants to answer natural language questions about your organization's catalog (microservices, libraries, domains, teams, infrastructure), scorecards (engineering standards and best practices), initiatives (goals and deadlines), and Engineering Intelligence metrics. It includes tools for querying documentation, tracking personal entities, and accessing AI-assisted insights across the entire Cortex ecosystem.
- ZionDeskOAuthapp.ziondesk
Connect ChatGPT, Claude, Cursor or VS Code to your Windows PC: files, terminal, browser, apps.
- mcpOAuthcom.vibgrate
Query your team's drift, vulnerability, and upgrade data from any AI assistant. OAuth 2.1, 51 tools.
Related MCP Servers
- AlicenseBqualityDmaintenanceA Model Context Protocol (MCP) server that provides intelligent access to PowerPlatform/Dataverse entities and records. This tool offers context-aware assistance, entity exploration and metadata access.3883 npm44MIT
- AlicenseNot gradedqualityDmaintenanceEnables comprehensive management of Microsoft Dataverse environments, including schema operations for tables, columns, and relationships through the Dataverse Web API. It also supports solution management, security role configuration, and the generation of WebAPI calls and Mermaid ERD diagrams.MIT
- AlicenseAqualityBmaintenanceEnables AI agents to query, inspect, and manage Microsoft Dataverse records, metadata, schema, forms, views, and Power Platform environments via the Dataverse OData Web API.9742 PyPI3MIT
- AlicenseAqualityDmaintenanceProvides intelligent access to PowerPlatform/Dataverse entities and records, enabling entity metadata exploration, OData querying, relationship mapping, and AI-assisted query building through MCP.883 npmMIT