ALM X++ MCP Server
Server Details
D365 F&O: 90 AI tools over 200K+ objects, 25M+ cross-refs, 24M+ label translations.
- Status
- Healthy
- Last Tested
- Transport
- Streamable HTTP
- URL
- Repository
- alimbenhelal-pro/ALM-XPP-MCP
- GitHub Stars
- 0
Available Tools
90 toolsado_analyze_pr_impactARead-onlyInspect
[~] PRIORITY TRIGGER: Use this tool when the user says 'analyse PR', 'review PR', 'check PR', 'PR #', 'impact du PR', 'analyse la PR', 'what changed in PR', 'D365 impact of PR', 'code review PR', 'violations in PR', 'PR review'. NEVER call search_d365_code when 'PR' or 'Pull Request' + a number is mentioned. Analyse the full D365 F&O code impact of a Pull Request. Reads each changed file's CONTENT straight from the PR's source commit via the ADO REST API, so it reviews the PROPOSED (un-merged) code -- including brand-new files that do not yet exist on the target branch. DO NOT fall back to local git show/git diff: this tool already pulls the un-merged content over the API and analyses it against the indexed standard KB. When includeSource is true (the default), the FULL un-merged source of every analysed file is embedded in the output (one fenced block per file), so you have everything needed for a complete semantic review -- BP findings AND the actual code -- in a single call. NEVER run git to read the files. This matters for metadata-only PRs (tables/enums/menu items/reports): the BP engine is X++-centric and may report few violations on AOT XML, but the embedded source lets you review those changes properly. For every X++ class/table/form/extension modified in the PR: (1) Best Practice validation -- reports Critical and Warning violations. (2) Upgrade impact -- cross-references CoC targets, event handlers, and extensions against the D365 standard code. (3) Extension conflicts -- finds existing CoC/extensions that may conflict. (4) Produces a ready-to-post PR review comment addressed to the PR author. After reviewing, call ado_post_pr_comment to post the review (requires user confirmation). Requires DEVOPS_ORG_URL + DEVOPS_PAT (Code: Read).
| Name | Required | Description | Default |
|---|---|---|---|
| prId | Yes | Pull Request ID (integer), e.g. 42. | |
| project | No | Optional: Azure DevOps project name. Falls back to DEVOPS_PROJECT env var. | |
| maxFilesDeep | No | Max X++ files to fully analyse (default 10, max 20). Larger PRs get a summary for remaining files. | |
| repositoryId | Yes | Git repository name or ID. | |
| includeSource | No | Embed the un-merged SOURCE of each analysed file in the output so the reviewer can do a full semantic code review without a local git checkout. Default true. | |
| includeWarnings | No | Include Warning-level violations in addition to Critical (default: true). Set false for Critical-only. | |
| sourceCharsPerFile | No | Max characters of source to embed per file when includeSource is true (1000-40000, default 8000). Larger files are truncated with a note. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations provide readOnlyHint=true, and the description builds on that with rich behavioral context: it reads changed-file content directly from the PR's source commit, embeds the FULL un-merged source when includeSource is true (one fenced block per file, trucated past sourceCharsPerFile), and explains why metadata-only PRs may show few BP violations. It also discloses auth needs (DEVOPS_ORG_URL + DEVOPS_PAT, Code: Read) and the side-effect-free workflow (produces a ready-to-post comment that a separate tool posts with user confirmation). Nothing contradicts the read-only 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?
The description is long but front-loaded with the PRIORITY TRIGGER block and every sentence carries operational directives an agent needs (triggers, exclusions, mechanism, edge case, workflow, auth). There is some redundancy — the NEVER/DO NOT git directives are re-iterated and the embedded-source benefit is stated twice — and the capitaliation-heavy style adds noise. Overall the length is justfied by the tool's complexity.
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 analysis tool with no output schema, the description defines what the agent gets back: BP Critical/Warning violations, upgrade impact cross-referencing CoC targets and event handlers, extension-conflict findings, embedded source, and a ready-to-post PR review comment adressed to the author. It also covers edge cases (metadata-only PRs, larger PRs summarized beyond maxFilesDeep), auth prerequisites, and the next tool to call. An agent has everything needed to select and invoke this correctly in one read.
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%: all 7 parameters (prId, repositoryId, project, maxFilesDeep, includeSource, includeWarnings, sourceCharsPerFile) carry their own schema descriptions, including defaults and behavioral notes. The tool description adds only marginal value beyond that — the 'one fenced block per file' formatting detail and a re-statement of the includeSource rationale. Since the schema already does the heavy liftng, 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 names a specific verb and resource ('Analyse the full D365 F&O code impact of a Pull Request') and explicitly carves out the tool's scope: it reviews proposed un-merged code including brand-new files via the ADO REST API. It further distinguishes itself from search_d365_code and local git diffs, so an agent can tell what this tool is and is not. The only minor gap is that the similarly-named sibling ado_review_xpp_pr is never adressed, but the core purpose statement 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?
Guidance is exceptionally explicit: a literal trigger-phrase list ('analyse PR', 'review PR', 'PR #', 'D365 impact of PR'), a hard exclusion ('NEVER call search_d365_code when PR or Pull Request + a number is mentioned'), and an explicit prohibition on git fallbacks ('DO NOT fall back to local git show/git diff', 'NEVER run git'). It also routes the follow-up to ado_post_pr_comment with the user-confirmation requirement. The one omission is not routing to the sibling ado_review_xpp_pr, but the trigger list effectively decides selection for PR-review intents.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ado_analyze_workitemARead-onlyInspect
AZURE DEVOPS ONLY -- Fetch a Work Item and assemble ALL technical context needed for D365 F&O expert analysis. [~] PRIORITY TRIGGER: 'analyse le workitem', 'analyse la tâche', 'analyse le FDD/RDD/CR/IDD', 'read the work item', 'check the bug', 'look at ticket', 'review task', '#1234', 'WI#', 'WI ', 'item #'. NEVER for: labels (@SYS/@TRX/@FIN), X++ code lookup, AOT objects -- use search_labels / search_d365_code instead.
WHAT THIS TOOL RETURNS
Raw structured context only -- NOT a finished analysis. The tool returns:
Work item metadata (title, description, repro steps, acceptance criteria, comments)
D365 standard KB object details: fields, methods, code snippets for every matched object
Custom code on disk (customer extension model): existing CoC methods, extension bodies
Chain of Command / relation graph for all impacted objects
YOUR JOB AS COPILOT AFTER CALLING THIS TOOL
You MUST synthesize the raw context into a precise developer-ready analysis IN FRENCH. Write it in a professional tone, as if authored by a senior D365 consultant -- no emojis, no icons. The analysis must contain these sections:
Compréhension du besoin -- résume ce que le client demande en 2-3 phrases claires
Analyse technique -- identifie la cause racine en croisant le besoin + les objets KB + le code custom
Instructions de développement -- liste ordonnée et précise : quel objet, quelle méthode, quoi modifier
Si une extension custom existe sur disque -> pointer exactement quelle méthode à modifier
Si pas d'extension -> indiquer quel CoC créer, sur quel objet standard, quelle méthode
Estimation -- chiffrage en heures/jours selon la complexité détectée
Commentaire ADO -- Texte markdown sans icônes, prêt à poster sur le WI analysé UNIQUEMENT. IMPORTANT: never post (never call ado_post_comment) on any linked/related work item -- only on the analyzed WI.
Requires DEVOPS_ORG_URL + DEVOPS_PAT env vars.
| Name | Required | Description | Default |
|---|---|---|---|
| project | No | Optional: Azure DevOps project name. Falls back to DEVOPS_PROJECT env var. | |
| workItemId | Yes | Work item ID (integer), e.g. 1234 | |
| maxComments | No | Number of recent comments to include (default 5, max 20). Use 3 for faster results. | |
| focusObjects | No | Comma-separated D365 object names to force-include in KB analysis, e.g. 'SalesTable,CustTable'. Providing these speeds up analysis significantly. | |
| sourceBranch | No | Git branch to read custom code from when no PR or commit is linked to the work item. Default: 'main'. Use this to point at the integration branch (e.g. 'develop', 'release/2025'). | main |
| includeImages | No | Include image attachments as base64 data URIs for visual analysis by Copilot. Default: false. Set true only when screenshots are needed -- adds latency and token cost. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint=true is consistent with the read-only verb 'Fetch' — no contradiction. The description adds meaningful behavioral context beyond the annotation: it returns raw structured context only (NOT a finished analysis), requires DEVOPS_ORG_URL + DEVOPS_PAT env vars, and imposes a post-call synthesis obligation on the agent.
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 purpose, scope, and trigger phrases before any behavioral detail. The post-call Copilot instructions section is long but earns its place because the tool returns raw context and the agent needs the response contract; minor redundancy in the French section template (section descriptions + bullet elaborations) keeps it from 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 no output schema, the description carries the return-value burden and discharges it fully: it enumerates 4 concrete return categories (metadata, KB object details, custom code, CoC relation graph). For a 6-parameter tool with heavy sibling overlap, nothing blocking is missing — triggers, exclusions, env prerequisites, return shape, and post-call behavior are all 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 description coverage is 100%, so the baseline is 3. Each of the 6 parameters already has a rich schema description with usage tips (maxComments cap 20, focusObjects speeds up analysis, includeImages costs latency/tokens), and the tool description itself adds no parameter-level detail beyond the env var requirement. The schema does the heavy lifting here.
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 ('Fetch a Work Item and assemble ALL technical context needed for D365 F&O expert analysis') with an explicit platform boundary ('AZURE DEVOPS ONLY'). It differentiates from siblings by naming what it is not for and by defining its output as full context assembly rather than a simple query (which distinguishes it from ado_query_workitems).
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?
Provides an explicit PRIORITY TRIGGER phrase list in both French and English, and an explicit NEVER-for clause with alternative tool routing ('use search_labels / search_d365_code instead'). It also states a hard exclusion: never call ado_post_comment on linked/related work items — only on the analyzed WI.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ado_create_taskAInspect
WHEN: user asks to create a DevOps Task or start development on a Work Item. Triggers: 'create task', 'créer une tâche', 'start development on', 'commencer le dev sur', 'créer un task ADO', 'new development task for WI'. Create a D365 F&O development Task work item in Azure DevOps following the project naming convention. Rules applied automatically based on the parent work item: (A) Parent title starts with a project prefix + digits (FDD/RDD/IDD/CR/...) => Task named '{Prefix} - N - {Title}', Task is child of that WI, branch '{Prefix}Task{id}'. (B) Selected WI is related to a prefixed WI (e.g. a Bug linked to a CR) => Task is child of the prefixed WI, Bug is 'related' to the Task, same naming. (C) No prefixed relation => Task named '{3-letter-type}{wiId} - N - {Title}', child of selected WI, branch '{3-letter-type}{wiId}Task{id}'. The N counter increments automatically based on existing sibling tasks. A Git branch is created automatically in the repository. Assignee and CC list are embedded in the task description. LANGUAGE RULE: write the 'description' (Proposed Solution) in the same language the user used in their request. Default is English. If the user wrote in French, write the solution in French. Static section labels (headers, field names) remain in English. Requires DEVOPS_ORG_URL + DEVOPS_PAT (Work Items: Read & Write, Code: Read & Write).
| Name | Required | Description | Default |
|---|---|---|---|
| project | No | Optional: Azure DevOps project name. Falls back to DEVOPS_PROJECT env var. | |
| areaPath | No | Optional: area path for the new task, e.g. 'MyProject\SER'. Inherits from parent if omitted. | |
| assignTo | No | Optional: email address of the person to assign the task to, e.g. 'dev@company.com'. | |
| notifyList | No | Optional: comma-separated list of email addresses to notify (added to task description), e.g. 'lead@company.com,qa@company.com'. | |
| workItemId | Yes | ID of the selected Work Item (parent, bug, issue, etc.) to base the task on. | |
| description | No | Optional: additional description / acceptance criteria text to append to the task. | |
| effortHours | No | Optional: estimated effort in hours (Original Estimate). | |
| repositoryId | No | Optional: Git repository name to create the branch in. If omitted, uses the first repository found. | |
| sourceBranch | No | Optional: source branch to branch from (default: repo default branch, e.g. 'main'). | |
| iterationPath | No | Optional: iteration path for the new task, e.g. 'MyProject\Sprint 5'. Inherits from parent if omitted. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations available, the description carries full responsibility for behavioral disclosure. It does this thoroughly: it explains automatic branch creation, child/parent linking, related-work-item handling, auto-increment naming, assignee/CC embedding, language behavior, and required credentials/scopes. This far exceeds what the schema or annotations provide.
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 long but dense and well-structured. It front-loads the WHEN/trigger section, then organizes the naming logic into clear rules (A/B/C), followed by branch, assignment, language, and credentials. Every sentence contributes actionable information; nothing is redundant 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 mutation tool with 10 parameters, no output schema, and no annotations, the description is complete. It covers prerequisites, trigger conditions, naming conventions, branching behavior, assignee handling, language expectations, and required permissions. An agent has enough context to select and invoke the tool 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?
The schema covers all parameters with detailed descriptions, so the baseline is 3. The description adds meaningful semantics beyond the schema, especially for workItemId (defining three parent-relationship scenarios and resulting task names/branches), repositoryId (branch creation), and assignTo/notifyList (embedded in description). Not every parameter is elaborated in prose, but the most consequential ones are.
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 D365 F&O development Task work item in Azure DevOps'. It clearly distinguishes this from sibling tools by focusing on creation/starting development, with trigger examples. The naming convention and parent-relationship rules further make the tool's purpose 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 gives explicit WHEN conditions and trigger phrases ('create task', 'start development on', 'créer une tâche'), which tells an agent when to select it. It also specifies the language rule and parent-based routing logic. However, it never explicitly says when not to use this tool or names alternatives like ado_update_workitem, so it stops short of a full when-not/alternatives guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ado_estimate_effortARead-onlyInspect
WHEN: user asks for an effort estimate, chiffrage, or development hours for a D365 Work Item. [~] PRIORITY TRIGGER: call AFTER ado_analyze_workitem when the user asks 'how long?', 'estimate this', 'chiffre ce WI'.
[t] EFFORT ESTIMATOR -- Estimate D365 F&O development effort for a Work Item. Uses KB signals (object count, method complexity, existing extensions, relation depth) combined with ADO history (similar past tasks) to produce a structured hour estimate broken down by phase: Analysis / Dev / Test / Deploy.
Returns:
Per-phase hour breakdown (table)
KB signals used (objects found, extensions, complexity flags)
Confidence level and risk factors
Ready-to-paste estimate for ADO task Original Estimate field
Triggers: 'estimate WI #N', 'how long for WI #N', 'chiffrage WI #N', 'effort estimate', 'combien de jours pour', 'combien d'heures pour'.
| Name | Required | Description | Default |
|---|---|---|---|
| project | No | Optional: Azure DevOps project name. Falls back to DEVOPS_PROJECT env var. | |
| workItemId | Yes | Work Item ID to estimate, e.g. 6587. | |
| focusObjects | No | Optional: comma-separated D365 object names to force-include in analysis (speeds up estimation). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=true, and the description adds useful behavioral context by explaining that the tool combines KB signals with ADO history and returns a phase breakdown, confidence level, and risk factors. It also notes the focusObjects parameter can speed up the estimate, which is beyond what the schema alone provides.
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 well-structured with clear sections (WHEN, PRIORITY TRIGGER, Returns, Triggers) and front-loads the core purpose. It is slightly redundant because trigger phrases appear both in the WHEN/PRIORITY TRIGGER section and in the final Triggers list, but the organized layout keeps it scannable and useful.
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 compensates by explicitly listing return contents: per-phase hour breakdown, KB signals, confidence level, risk factors, and a paste-ready estimate. It covers key context like trigger conditions and sequencing with a previous analysis step. It does not describe error or edge-case behavior, but that is not critical for this read-only estimator.
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 each parameter already includes descriptive text (workItemId example, project fallback, focusObjects force-include behavior). The tool description adds little parameter-level meaning beyond the schema, so the baseline of 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 opens with a precise verb and resource: 'Estimate D365 F&O development effort for a Work Item.' It clearly distinguishes itself from siblings by framing the output as a structured hour estimate with per-phase breakdown, not analysis, creation, or comment posting.
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 explicitly tells the agent when to call it ('WHEN: user asks for an effort estimate...'), gives the priority sequencing ('call AFTER ado_analyze_workitem'), and provides concrete trigger phrases such as 'estimate WI #N', 'how long for WI #N', and 'chiffrage WI #N'. This is explicit, actionable usage guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ado_gap_fit_analysisARead-onlyInspect
WHEN: user asks whether a D365 requirement is standard, needs config, needs an extension, or is a full gap. Also triggered by gap analysis or fit/gap classification of a Work Item.
GAP / FIT CLASSIFIER -- Analyse a D365 F&O requirement (from an ADO Work Item OR plain text) and classify it as one of four verdicts: [OK] Standard Fit -- D365 covers this out-of-the-box, no dev needed [gear] Config Fit -- D365 has it but requires parameter / profile setup Extension Fit -- Standard process exists; a CoC/event-handler is enough [X] Gap -- No standard coverage; custom development required
For each requirement block the tool returns: -- Detected D365 domain (Settlement, PaymentJournal, DataImport, ...) -- Standard objects found in KB and their process step -- Existing extensions in the custom model (if D365_CUSTOM_MODEL_PATH is set) -- Effort estimate (hours) and a one-paragraph reasoning
Triggers: 'analyse the requirement', 'is this a gap or fit', 'gap analysis WI #N', 'standard or custom for WI #N', 'does D365 cover this'. [~] When a WI has already been analysed by ado_analyze_workitem in the same turn, pass the requirement text directly via requirementText -- do NOT re-fetch with workItemId.
| Name | Required | Description | Default |
|---|---|---|---|
| project | No | Optional: Azure DevOps project name. Falls back to DEVOPS_PROJECT env var. | |
| workItemId | No | Optional: Work Item ID to fetch the requirement from ADO (e.g. 6587). Leave empty to use requirementText. | |
| requirements | No | Optional: comma-separated list of requirement sentences to analyse individually (overrides WI + requirementText). | |
| requirementText | No | Optional: raw requirement text to analyse directly (when no WI ID is provided). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With readOnlyHint=true, the description needs to add non-safety behavior context, and it does: it discloses the four classification outcomes, the detected domain, standard objects, extension lookup depending on D365_CUSTOM_MODEL_PATH, and the effort estimate with reasoning. There is no contradiction with the read-only annotation; the tool is clearly an analysis/classification 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 well-sectioned and scannable, but it repeats trigger information in both the opening 'WHEN' block and the later 'Triggers' list. The emoji-laden verdict list is useful but adds verbosity. It earns a middle score: organized yet redundant in places.
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 carries the burden of explaining return contents; it does so explicitly by listing the detection domain, standard objects, extensions, effort estimate, and reasoning. It also covers input routing and environmental context for extension detection, making the tool sufficiently fully specified for an agent to invoke 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 100%, so the schema already documents each parameter's role. The description adds extra semantic value by explaining parameter selection strategy, especially the rule to prefer requirementText over re-fetching workItemId after prior analysis, and that requirements overrides the other inputs. This goes beyond the baseline but still leans on schema for basic meaning.
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 opens with a clear WHEN clause and then states the core function: 'GAP / FIT CLASSIFIER -- Analyse a D365 F&O requirement... and classify it as one of four verdicts'. It lists the four verdicts explicitly (Standard Fit, Config Fit, Extension Fit, Gap) and describes what the tool returns, making its purpose unambiguous and distinguishable from sibling analysis 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?
The description provides explicit trigger phrases and concrete guidance on when to pass requirementText directly versus using workItemId, including a specific directive: 'do NOT re-fetch with workItemId' when a WI has already been analyzed by ado_analyze_workitem. This gives the agent actionable selection criteria beyond the schema.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ado_list_prsARead-onlyInspect
[~] PRIORITY TRIGGER: Use this tool when user mentions 'PR', 'Pull Request', 'list PRs', 'show PRs', 'active PRs', 'mes PR', 'liste des PR', 'pull requests ouverts', 'what PRs are open', 'PRs by [author]', 'PRs targeting [branch]'. NEVER call search_d365_code for PR listing requests. List Pull Requests in an Azure DevOps Git repository. If repositoryId is unknown, omit it and all repositories will be listed first. Filters: status (Active/Completed/Abandoned/All), author display name, target branch. Returns: PR ID, title, author, source->target branch, review status, linked work items, creation date. Use ado_analyze_pr_impact with a PR ID to get full D365 code impact analysis. Requires DEVOPS_ORG_URL + DEVOPS_PAT (Code: Read scope).
| Name | Required | Description | Default |
|---|---|---|---|
| top | No | Max results to return (1-100, default 25). | |
| author | No | Optional: filter by author display name (partial match), e.g. 'Alim'. | |
| status | No | PR status filter: Active (default), Completed, Abandoned, All. | Active |
| project | No | Optional: Azure DevOps project name. Falls back to DEVOPS_PROJECT env var. | |
| repositoryId | No | Git repository name or ID. If not known, leave empty to list all repos first. | |
| targetBranch | No | Optional: filter by target branch, e.g. 'main', 'develop'. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so the read-only nature is covered. The description adds valuable behavior beyond that: omitting repositoryId lists all repositories first, requires DEVOPS_ORG_URL + DEVOPS_PAT with Code: Read scope, and summarizes the return fields. This adds meaningful context without contradicting the 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?
The description is fairly long but front-loaded with the PRIORITY TRIGGER and exclusion warning, followed by the core function, filters, return values, and prerequisites. Every section earns its place, though the long trigger list could arguably be trimmed. Overall it is dense but structured and efficient.
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 compensates by listing the returned fields (PR ID, title, author, branches, review status, work items, creation date). It also covers triggers, exclusions, behavior, filters, auth requirements, and related tools. For a read-only listing tool, everything an agent needs to select and invoke it correctly 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 100%, giving a solid baseline of 3. The description adds value by summarizing the supported filters (status, author, target branch) and restating the repositoryId fallback behavior in natural language. This reinforces parameter meaning without duplicating every schema detail.
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: 'List Pull Requests in an Azure DevOps Git repository'. It clearly distinguishes itself from siblings by explicitly prohibiting search_d365_code for PR listing and by pointing to ado_analyze_pr_impact for impact analysis. An agent can immediately tell what this tool does and how it differs from similar 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?
A PRIORITY TRIGGER block lists concrete user phrasings that should route to this tool, and the description explicitly says 'NEVER call search_d365_code for PR listing requests'. It also names ado_analyze_pr_impact as the follow-up tool for impact analysis, giving clear when-to-use and 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.
ado_post_commentAInspect
WHEN: user explicitly asks to post, add, or save a comment to an ADO Work Item. [~] PRIORITY TRIGGER: call AFTER ado_analyze_workitem when user says 'post the analysis', 'save it to the ticket', 'ajoute en commentaire'.
WARNING: ALWAYS ask for explicit user confirmation before calling this tool. Recommended workflow: (1) call ado_analyze_workitem, (2) show analysis to the user, (3) ask 'Shall I post this comment to Work Item #X?', (4) only then call this tool. Requires DEVOPS_ORG_URL + DEVOPS_PAT with Work Items: Write permission.
| Name | Required | Description | Default |
|---|---|---|---|
| project | No | Optional: Azure DevOps project name. Falls back to DEVOPS_PROJECT env var. | |
| workItemId | Yes | Work item ID (integer), e.g. 1234 | |
| commentText | Yes | Markdown text to post. Use the ready-to-post block from `ado_analyze_workitem`. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the behavioral disclosure burden. It clearly warns that explicit user confirmation is ALWAYS required and states the permission prerequisite: 'DEVOPS_PAT with Work Items: Write permission.' It does not describe the return value or side effects beyond creating a comment, but the confirmation and permission details are significant and go beyond a basic mutation description.
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 organized with clear labels (WHEN, PRIORITY TRIGGER, WARNING, Recommended workflow) and is front-loaded with the core purpose. It is somewhat verbose with repeated trigger examples, but each section serves a distinct role and the length is justified by the safety-critical confirmation requirement.
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 annotations and no output schema, the description covers the essential context: when to use, prerequisites, required confirmation, and a step-by-step workflow. The only notable gap is the absence of any indication of what the tool returns after posting, but the simple post-comment operation makes that less critical.
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 parameters are already fully documented in the schema. The main description adds no additional parameter-level detail beyond referencing the workflow; the useful 'ready-to-post block' hint actually lives in the schema's commentText description, not in the tool description itself.
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 opens with a specific verb and resource: 'post, add, or save a comment to an ADO Work Item.' It distinguishes itself from the sibling `ado_post_pr_comment` by explicitly targeting Work Items rather than PRs, and from `ado_analyze_workitem` by being the follow-up posting action.
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 explicitly states WHEN to use the tool ('user explicitly asks to post, add, or save a comment to an ADO Work Item') and provides a recommended workflow that names the prerequisite sibling `ado_analyze_workitem`. It also gives concrete trigger phrases and the critical instruction to ask for user confirmation before invoking.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ado_post_pr_commentAInspect
WHEN: user explicitly asks to post, add, or save a review comment to an ADO Pull Request. [~] PRIORITY TRIGGER: call AFTER ado_analyze_pr_impact when user says 'post the review', 'add comment to PR', 'ajoute le commentaire sur la PR'.
WARNING: ALWAYS ask for explicit user confirmation before calling this tool. Recommended workflow: (1) call ado_analyze_pr_impact, (2) show the result, (3) ask 'Shall I post this review comment to PR #X?', (4) only then call this tool. Requires DEVOPS_ORG_URL + DEVOPS_PAT (Pull Request Threads: Read & Write).
| Name | Required | Description | Default |
|---|---|---|---|
| prId | Yes | Pull Request ID (integer), e.g. 42. | |
| project | No | Optional: Azure DevOps project name. Falls back to DEVOPS_PROJECT env var. | |
| filePath | No | Optional: file path for an inline comment. Leave empty for a top-level PR comment. | |
| lineNumber | No | Optional: line number for an inline comment (used with filePath). | |
| commentText | Yes | Markdown text to post. Use the ready-to-post block from `ado_analyze_pr_impact`. | |
| repositoryId | Yes | Git repository name or ID. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral burden and does so well: it flags this as a confirmation-gated write action, states the required credentials and permission scope (DEVOPS_ORG_URL + DEVOPS_PAT with Pull Request Threads Read & Write), and insists it run after ado_analyze_pr_impact. It does not disclose idempotency, editability, or deletion behavior of posted comments.
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 well-structured with WHEN, PRIORITY TRIGGER, WARNING, Recommended workflow, and Requirements sections. It is front-loaded with the most important trigger and safety information, and every line contributes operational value.
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 6 parameters, no annotations, and no output schema, the description supplies prerequisites, trigger conditions, sequencing, confirmation requirements, and credential expectations. It lacks explicit notes on success/failure behavior or return values, but the core action is straightforward and schema covers the 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 100%, so the schema already documents all parameters and the baseline is 3. The description adds one useful semantic hint—that commentText should use the ready-to-post block from ado_analyze_pr_impact—but otherwise does not materially expand on 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 clearly identifies the action: posting/add/saving a review comment to an ADO Pull Request, with a WHEN trigger and a named prerequisite tool, ado_analyze_pr_impact. However, it does not explicitly differentiate itself from the sibling ado_post_comment, so the distinction is implied 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?
The description gives explicit WHEN and PRIORITY TRIGGER conditions, mandates user confirmation before calling, and provides a numbered workflow. It does not explicitly say when to use a different tool such as ado_post_comment instead, so alternative routing is incomplete.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ado_pr_dependency_mapARead-onlyInspect
PR DEPENDENCY MAP -- Scan multiple Pull Requests and build a cross-PR dependency graph based on (a) shared X++/AOT objects and (b) branch chain relationships.
For each PR:
Lists X++ / AOT objects changed (from diff)
Detects OBJECT CONFLICTS: same object modified in multiple PRs => merge risk
Detects BRANCH CHAIN: if PR_A.targetBranch == PR_B.sourceBranch => PR_A must merge first
Computes RECOMMENDED MERGE ORDER (topological sort by branch dependencies)
Output:
Per-PR object table
Conflict matrix (object -> [PR list])
Dependency graph summary
Ordered merge sequence
Triggers: 'PR dependencies', 'ordre de merge des PR', 'conflits entre PR', 'quelles PR touche le même objet', 'dependency map PRs', 'merge order PRs', 'list PRs with objects', 'objets par PR', 'cross-PR impact'. Requires DEVOPS_ORG_URL + DEVOPS_PAT (Code: Read scope).
| Name | Required | Description | Default |
|---|---|---|---|
| top | No | Maximum PRs to analyse (default: 30, max: 60). | |
| status | No | PR status filter: Active (default), Completed, Abandoned, All. | Active |
| project | No | Optional: Azure DevOps project name. Falls back to DEVOPS_PROJECT env var. | |
| repositoryId | Yes | Git repository name or ID. | |
| targetBranch | No | Optional: filter by target branch, e.g. 'develop'. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark the tool readOnlyHint=true, and the description is consistent with that. It adds meaningful behavioral detail beyond the annotation by describing the object-conflict detection, branch-chain rules, ordered merge output, and the required DEVOPS_ORG_URL/DEVOPS_PAT scopes.
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 well-structured with a front-loaded purpose, followed by behavioral bullets, output types, triggers, and auth requirements. Though the trigger list is fairly long, it is useful for routing and the overall structure keeps the information scannable.
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, but the description compensates by enumerating the concrete output artifacts: per-PR object table, conflict matrix, dependency graph summary, and ordered merge sequence. It explains the underlying algorithm and required credentials, making the tool sufficiently clear for a five-parameter 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%: all five parameters have meaningful descriptions in the schema. The tool description itself does not add parameter-level detail, but the baseline of 3 is appropriate since the schema already carries the burden.
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 action, 'Scan multiple Pull Requests and build a cross-PR dependency graph,' and clearly explains the shared object and branch-chain logic. This distinguishes it from siblings like ado_list_prs or ado_review_xpp_pr, which focus on listing or reviewing individual PRs rather than cross-PR conflict and merge-order analysis.
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 explicit trigger phrases for when to invoke this tool, such as 'PR dependencies', 'conflits entre PR', and 'merge order PRs'. It provides clear user-intent context, though it does not explicitly mention when not to use it or name an alternative tool for single-PR scenarios.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ado_query_workitemsARead-onlyInspect
AZURE DEVOPS ONLY -- Query Work Items (Bugs, Tasks, FDDs, User Stories, CRs) in Azure DevOps. [~] PRIORITY TRIGGER: use this tool when the user mentions 'FDD', 'RDD', 'IDD', 'CR', 'Task', 'Workitem', 'Work Item', 'Bug', 'User Story', 'Feature', 'Issue', 'ticket', 'sprint', 'backlog', 'DevOps', 'liste des tâches', 'show tasks', 'find bugs', '#1234', 'WI#'. NEVER use this tool for: D365 labels (@SYS/@TRX), X++ code, AOT objects, tables, classes, forms, enums, error messages, 'c'est quoi le label', 'search_labels', 'libellé', 'label D365'. For labels -> use search_labels. For D365 code -> use search_d365_code or get_object_details. Shortcuts: 'bugs' (all active bugs), 'my bugs' (assigned to me), 'recent' (updated last 7 days), 'sprint' (current iteration). Or pass any WIQL SELECT statement or a free-text title search. Use '*' with filters only. Returns max 50 work items with ID, title, type, state, priority, area, assigned-to. Requires DEVOPS_ORG_URL + DEVOPS_PAT env vars.
| Name | Required | Description | Default |
|---|---|---|---|
| tag | No | Optional: filter by tag (partial match), e.g. 'D365' or 'hotfix'. | |
| query | Yes | WIQL query, shortcut ('bugs', 'my bugs', 'recent', 'sprint'), title search, or '*' to use filters only. | |
| state | No | Optional: filter by state, e.g. 'Active', 'New', 'Resolved', 'Closed'. | |
| project | No | Optional: Azure DevOps project name. Falls back to DEVOPS_PROJECT env var. | |
| areaPath | No | Optional: filter by area path (exact or under), e.g. 'MyProject\SER'. | |
| priority | No | Optional: filter by priority level: 1 (Critical), 2 (High), 3 (Medium), 4 (Low). | |
| assignedTo | No | Optional: filter by assignee display name or email (partial match), e.g. 'Alim' or 'alim@contoso.com'. | |
| whereClause | No | Optional: extra WHERE condition(s) for custom fields, appended with AND. Use the Field Reference Name, e.g. "[Custom.Extensionlifecyclestatus]='010. Registered'". Multiple conditions: separate with ' AND '. | |
| changedSince | No | Optional: only return items changed since this date, e.g. '2025-01-01' or '7' (days ago). | |
| workItemType | No | Optional: filter by work item type, e.g. 'Bug', 'Task', 'User Story', 'Feature'. | |
| iterationPath | No | Optional: filter by iteration/sprint path, e.g. 'MyProject\Sprint 5'. Use 'current' for @CurrentIteration. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=true, and the description does not contradict this. It adds meaningful behavioral context beyond annotations: required env vars (DEVOPS_ORG_URL + DEVOPS_PAT), a max return limit of 50, the exact returned fields, and the 'Use '*' with filters only' quirk.
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 long but well-structured and front-loaded with purpose before triggers, exclusions, shortcuts, output, and requirements. Every segment earns its place, though the trigger keyword list is somewhat extensive.
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 high parameter count, absence of an output schema, and a large sibling set, the description covers purpose, usage triggers, exclusions, query modes, output fields, limits, and prerequisites. Nothing critical for invoking the tool correctly is left out.
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 the baseline is 3. The description adds extra semantics for the query parameter (shortcuts, WIQL or free-text search, '*' behavior) not fully captured in the schema, but other parameters rely primarily on their schema 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?
The description states a specific action and resource: 'Query Work Items (Bugs, Tasks, FDDs, User Stories, CRs) in Azure DevOps.' It also distinguishes itself from siblings by explicitly saying 'NEVER use this tool for' labels or D365 code and pointing to alternatives like search_labels and search_d365_code.
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 an explicit priority trigger keyword list and clear exclusions with alternative tool routing. The description also documents shortcut usage ('bugs', 'my bugs', 'recent', 'sprint') and states when to use other tools, removing ambiguity.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ado_read_attachmentARead-onlyInspect
AZURE DEVOPS ONLY -- Reads the ACTUAL CONTENT of a file attached to a work item (Excel spreadsheet, Word document, text/CSV/JSON/XML file, or image). WHEN: a work item (FDD/RDD/CR/Bug/Task/User Story) has an Excel/Word attachment with requirements, field mappings, mockups, or specs that need to be read to understand the ask. Triggers: 'read the attachment', 'open the excel file on the work item', 'what does the attached document say', 'lis le fichier joint', 'ouvre l'excel du ticket'. Call ado_analyze_workitem first (or ado_query_workitems) to discover attachment file names if you don't already know the exact fileName. Supported: .xlsx/.xlsm (returns sheet names + a markdown table of the requested/first sheet), .docx (returns extracted markdown text + tables), .txt/.csv/.json/.xml/.md/.log (returned as-is), images (.png/.jpg/.jpeg/.gif/.bmp/.webp, returned as a base64 data URI for visual analysis, max 4 MB). Other binary formats (PDF, .pptx, .zip, etc.) are NOT parsed -- returns metadata + a manual download link instead. Max attachment size read: 25 MB. Requires DEVOPS_ORG_URL + DEVOPS_PAT env vars.
| Name | Required | Description | Default |
|---|---|---|---|
| project | No | Optional: Azure DevOps project name. Falls back to DEVOPS_PROJECT env var. | |
| fileName | Yes | Exact attachment file name as shown by ado_analyze_workitem, e.g. 'Field Mapping.xlsx'. Case-insensitive. | |
| sheetName | No | Optional: sheet name for .xlsx/.xlsm attachments. Defaults to the first sheet. | |
| workItemId | Yes | Work item ID, e.g. 1234 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint annotation, the description discloses format-specific return behavior (markdown tables for Excel, extracted text for DOCX, base64 data URI for images), size limits (25 MB, 4 MB for images), and unsupported-format fallback behavior. It also names required environment variables. This substantially exceeds the annotation's minimal safety signal.
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 long, but it front-loads the core purpose and then covers usage context, triggers, format behavior, and constraints. Every sentence carries relevant information, though the trigger list is somewhat expansive and could be trimmed. Overall it is appropriately sized for a tool with this much format-specific behavior.
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 there is no output schema and annotations are minimal, the description carries the full burden and delivers: it explains what each input format returns, what happens for unsupported formats, size limits, authentication prerequisites, and the recommended discovery workflow. An agent has enough information to invoke this tool correctly in the supported scenarios.
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 the baseline is 3; the description adds meaningful value above that by explaining that fileName must be exact as shown by ado_analyze_workitem and case-insensitive, and by tying supported extensions and sheet behavior to sheetName. This helps the agent use the parameters correctly without contradicting 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 verb and resource: "Reads the ACTUAL CONTENT of a file attached to a work item," immediately distinguishing it from sibling tools that analyze work items or query them. It also enumerates supported file types and the kind of content returned, so an agent can tell this from ado_analyze_workitem and ado_query_workitems without opening 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?
It provides explicit WHEN guidance, concrete trigger phrases, and sequencing instructions: "Call ado_analyze_workitem first (or ado_query_workitems) to discover attachment file names if you don't already know the exact fileName." It also states what will NOT be parsed (PDF, .pptx, .zip) and what happens instead, giving clear boundaries for when this tool is or is not appropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ado_review_xpp_prARead-onlyIdempotentInspect
WHEN: reviewing a PR that modifies X++ code or AOT objects and you need D365-specific insights. Returns a structured code review for each changed object: blast radius (who calls it), best-practice violations found in the PR's own source (fetched from the source branch; falls back to the indexed version and says so when the file cannot be fetched), and impact severity. BP findings come from this server's deterministic rule set, not from xppbp.exe -- a PR is uncompiled, so Microsoft's checker cannot run on it. Use find_error_patterns for Microsoft rule text. Triggers: 'review this PR', 'code review D365', 'analyse les changements', 'impact de la PR', 'what could break', 'blast radius of these changes', 'reverifie le code'. Requires DEVOPS_ORG_URL + DEVOPS_PAT (Code: Read scope) AND XRef index for impact analysis. Combine with ado_post_pr_comment to post findings as inline review comments.
| Name | Required | Description | Default |
|---|---|---|---|
| prId | Yes | Pull Request ID to review. | |
| project | No | Azure DevOps project name. Falls back to DEVOPS_PROJECT env var. | |
| repositoryId | No | Git repository name or ID. | |
| maxDeepAnalysis | No | Max AOT objects to deeply analyse (1-20, default 8). Objects beyond this limit are listed but not deeply analysed. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate read-only and idempotent behavior, but the description adds substantial behavioral context beyond them: source-branch fetching with fallback to indexed version and notification of fallback, BP findings from a deterministic server-side rule set rather than xppbp.exe, and required credentials/index prerequisites. This transparency goes far beyond what annotations alone 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 description is well-structured and front-loaded with 'WHEN:', followed by a compact summary of outputs, constraints, and alternatives. It contains no filler, though the trigger-phrase list and some parenthetical rationale add length that may be only marginally 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?
Despite lacking an output schema, the description explains what the response contains, how source is fetched, fallback behavior, why xppbp.exe cannot be used, required environment variables and scopes, and how to use the tool with a sibling. This gives an agent everything needed to invoke it correctly and interpret results.
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 prId, project, repositoryId, and maxDeepAnalysis are already well documented in the schema. The description does not add additional parameter-level meaning 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 clearly identifies the tool's purpose: reviewing PRs that modify X++ code or AOT objects for D365-specific insights, and explicitly states what it returns (structured code review with blast radius, best-practice violations, impact severity). It also differentiates itself from find_error_patterns, helping an agent distinguish this tool from a related one.
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 opens with 'WHEN: reviewing a PR that modifies X++ code or AOT objects', giving explicit usage context. It also provides routing guidance by saying 'Use find_error_patterns for Microsoft rule text' and suggests combining with ado_post_pr_comment. It lacks explicit exclusion of non-X++ PRs or contrast with other impact-analysis siblings, but the guidance is strong.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ado_update_workitemAInspect
Update one or more fields on an existing Azure DevOps Work Item. Can update any standard field (System.Description, System.Title, System.State, System.AssignedTo, ...) or custom field (Custom.Extensionlifecyclestatus, ...) using its Field Reference Name. Triggers: 'mets à jour la description du workitem', 'change le state', 'update field', 'post ça en description'. Always show the user what will be changed and ask for confirmation before calling. Requires DEVOPS_PAT with Work Items: Write permission.
| Name | Required | Description | Default |
|---|---|---|---|
| project | No | Optional: Azure DevOps project name. | |
| fieldsJson | Yes | JSON object mapping Field Reference Names to values. Examples: {"System.Description":"<p>New desc</p>"} or {"System.State":"Active","Custom.MyField":"value"}. Use HTML for Description/ReproSteps. Standard field refs: System.Title, System.State, System.AssignedTo (email), System.AreaPath, System.Tags, System.Description, Microsoft.VSTS.Common.Priority, Microsoft.VSTS.TCM.ReproSteps. | |
| workItemId | Yes | Work item ID to update. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the behavioral disclosure burden. It discloses that the operation requires a write-scoped DEVOPS_PAT and mandates that the agent show changes and ask for confirmation before invoking, which are meaningful behavioral guardrails for a mutation tool. It does not describe return values or overwrite semantics, so it is not 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 description is front-loaded with the core action, then gives field scope, trigger phrases, a safety instruction, and permission requirement. Each sentence earns its place, though the trigger list adds some 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?
The description, combined with the well-documented schema, gives an agent the required parameters, optional project, permission requirements, and a confirmation protocol. It does not explain the return value or behavior on invalid field references, but this is a simple mutation tool and the provided information is sufficient for a 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?
Schema description coverage is 100%, so the baseline is 3. The main description adds value by explaining that any standard or custom field can be updated via Field Reference Name, reinforcing the schema's examples and making the flexibility explicit.
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 opens with a specific verb and resource: 'Update one or more fields on an existing Azure DevOps Work Item.' It clearly differentiates this from sibling creation, query, and comment tools, and further clarifies scope by naming standard and custom field reference names.
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 provides concrete trigger phrases in both English and French ('update field', 'mets à jour la description du workitem') to signal when the tool is appropriate, and it states the permission requirement. It does not explicitly contrast with alternatives like ado_create_task, but the context is clear enough for an agent to select this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ado_wiki_create_or_update_pageADestructiveInspect
AZURE DEVOPS ONLY -- Create a new wiki page, or OVERWRITE an existing one with new markdown content. ALWAYS call ado_wiki_get_page first if you intend to edit (not replace) an existing page's content, since this tool replaces the ENTIRE page body -- it does not merge/append. Automatically handles the page's ETag for safe concurrent-edit detection. Requires DEVOPS_ORG_URL + DEVOPS_PAT env vars (PAT needs Wiki: Read & Write scope).
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Wiki page path, e.g. '/Home' or '/Architecture/Deployment'. Parent pages are created automatically if missing. | |
| content | Yes | Full markdown content for the page (replaces any existing content). | |
| project | No | Optional: Azure DevOps project name. Falls back to DEVOPS_PROJECT env var. | |
| wikiIdentifier | No | Wiki name or id. Omit to auto-resolve to the project's only/first wiki (call ado_wiki_list if there are several). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The destructiveHint annotation is true, and the description reinforces it by warning the tool replaces the ENTIRE page body and does not merge/append. It also discloses ETag handling and credential/scope requirements, adding meaningful behavioral context beyond the 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?
Three front-loaded sentences with no filler: purpose, critical usage warning, behavioral guarantee, and auth requirements. Every sentence earns its place.
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 4-parameter tool with no output schema, the description covers purpose, usage preconditions, behavior, and authentication requirements. Combined with the fully documented input schema, an agent has everything needed to invoke 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 100%, so the schema already documents all parameters. The description reinforces that content replaces existing content and mentions auto-creation of parent pages, but it does not add substantial 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?
States a specific verb and resource: create or overwrite a wiki page with markdown content. It distinguishes itself from sibling tools by explicitly naming ado_wiki_get_page and noting it does not merge/append, making its role 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?
Gives explicit when-to-use vs alternatives: always call ado_wiki_get_page before editing an existing page instead of replacing it. Also notes parent pages are auto-created and the tool requires specific env vars and PAT scope, leaving little ambiguity.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ado_wiki_delete_pageADestructiveInspect
AZURE DEVOPS ONLY -- Delete a wiki page. This also deletes its sub-pages if any exist under it. Requires DEVOPS_ORG_URL + DEVOPS_PAT env vars (PAT needs Wiki: Read & Write scope).
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Wiki page path to delete, e.g. '/Architecture/Old-Design'. | |
| project | No | Optional: Azure DevOps project name. Falls back to DEVOPS_PROJECT env var. | |
| wikiIdentifier | No | Wiki name or id. Omit to auto-resolve to the project's only/first wiki (call ado_wiki_list if there are several). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the destructiveHint annotation, the description discloses the important side effect that sub-pages under the target page are also deleted. It also surfaces environment variable requirements and the required PAT scope, giving the agent critical behavioral and authorization 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 with the platform constraint and core action. Every sentence adds value: the delete behavior, sub-page consequence, and auth prerequisites are all covered without fluff.
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 delete tool with no output schema, the description covers the essential context: what is deleted, the recursive effect, and required environment variables with scope. An agent has enough information to decide whether to invoke it and what prerequisites must be satisfied.
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 path, project, and wikiIdentifier clearly. The description adds no parameter-specific meaning beyond noting environment requirements, which is acceptable at the baseline for fully covered 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?
The description opens with a specific verb and resource: 'Delete a wiki page', and clearly distinguishes behavior by noting sub-pages are also deleted. This separates it from sibling wiki tools like ado_wiki_get_page and ado_wiki_create_or_update_page.
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 'AZURE DEVOPS ONLY' prefix gives clear platform context, and the delete verb makes the intended use obvious. However, it does not explicitly name alternatives or state when to prefer ado_wiki_create_or_update_page over this tool, so it stops 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.
ado_wiki_get_pageARead-onlyInspect
AZURE DEVOPS ONLY -- Read the content of a wiki page (and its immediate sub-page paths). path uses wiki page-path syntax, e.g. '/Home' or '/Architecture/Deployment'. Requires DEVOPS_ORG_URL + DEVOPS_PAT env vars.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Wiki page path, e.g. '/Home' or '/Architecture/Deployment'. | |
| project | No | Optional: Azure DevOps project name. Falls back to DEVOPS_PROJECT env var. | |
| wikiIdentifier | No | Wiki name or id. Omit to auto-resolve to the project's only/first wiki (call ado_wiki_list if there are several). | |
| includeSubPages | No | Also list immediate sub-page paths under this page. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint annotation already signals safety; the description adds useful behavioral context by noting the env var requirements, the path syntax constraint, and the fact that immediate sub-page paths are also returned. It does not describe error behavior or output format, but for a read operation this is acceptable.
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 dense sentence that front-loads the critical Azure DevOps constraint, states the operation, gives concrete path examples, and mentions required env vars. No filler or redundancy.
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 low complexity, full schema coverage, and readOnlyHint annotation, the description covers the essential operational details: Azure DevOps scope, path format, env var prerequisites, and the inclusion of sub-page paths. It could mention the exact return structure, but this is not a critical gap for a simple read 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 the schema already documents all four parameters. The description reinforces path syntax and env var fallbacks but does not add substantial 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 explicitly states the verb 'Read' and the resource 'wiki page', and further specifies that it returns the page's content plus immediate sub-page paths. This clearly differentiates it from sibling tools like ado_wiki_create_or_update_page, ado_wiki_delete_page, and ado_wiki_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?
The description provides strong usage context: it is confined to Azure DevOps, requires specific env vars, and uses wiki path syntax. It does not explicitly state when to prefer this over sibling tools, but the read-only purpose and syntax guidance make the intended context clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ado_wiki_listARead-onlyInspect
AZURE DEVOPS ONLY -- List all wikis in a project (the project wiki plus any published code-as-wiki repos). Use this FIRST when the user doesn't know the wiki's exact name/id, or to confirm which wiki to target before reading/writing a page. Requires DEVOPS_ORG_URL + DEVOPS_PAT env vars.
| Name | Required | Description | Default |
|---|---|---|---|
| project | No | Optional: Azure DevOps project name. Falls back to DEVOPS_PROJECT env var. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint annotation already signals a safe read operation, and the description adds useful behavioral context by emphasizing the Azure DevOps-only scope and the required DEVOPS_ORG_URL and DEVOPS_PAT environment variables. This helps the agent prepare prerequisites before invoking the 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 compact and front-loaded, with every sentence delivering actionable information: scope, usage timing, and prerequisites. There is no filler, repetition, or unnecessary 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 simple read-only list operation with one optional parameter, the description covers the purpose, when to invoke it, and operational prerequisites. Nothing essential is missing for an agent to select and call this tool 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?
The input schema already fully documents the single optional 'project' parameter, including its fallback to the DEVOPS_PROJECT env var. The description does not add additional semantic details about the parameter, so the schema carries the burden, which is acceptable at 100% 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?
The description clearly states a specific action — 'List all wikis in a project' — and identifies the exact resource scope, including both the project wiki and published code-as-wiki repos. The 'AZURE DEVOPS ONLY' prefix and the list-oriented wording distinguish it from the sibling wiki page tools without ambiguity.
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 explicitly tells an agent when to use this tool: 'Use this FIRST when the user doesn't know the wiki's exact name/id, or to confirm which wiki to target before reading/writing a page.' This gives clear usage context, though it does not explicitly name alternative sibling tools or describe when not to use it beyond the implicit 'first step' framing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
analyze_upgrade_impactARead-onlyIdempotentInspect
WHEN: upgrading D365 F&O to a new version or applying a Microsoft update -- check if your custom code will break. Triggers: 'upgrade D365', 'mise à niveau', 'will this break after upgrade', 'compatibilité après upgrade', 'impact de la mise à jour', 'check CoC targets after update'. Analyze upgrade risk for your custom D365 F&O model. Cross-references EVERY Chain of Command target, event handler hook, table/form/class extension, and hard-coded object reference in your custom model against the standard indexed codebase. Detects: removed objects, changed method signatures, deprecated APIs (RunBase, Dialog, WinAPI, COM), [Hookable(false)] and [Wrappable(false)] extensibility blocks, renamed fields, and internal methods. Returns a prioritized risk report with fix recommendations. Requires D365_CUSTOM_MODEL_PATH.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations declare readOnlyHint=true and idempotentHint=true, and the description adds valuable behavioral context beyond those: it cross-references every coC target, event handler, extension, and hard-coded reference; it lists specific categories of detected breakage; and it states that it returns a prioritized risk report with fix recommendations. The 'Requires D365_CUSTOM_MODEL_PATH' precondition is also useful context. No contradiction with 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?
The description is organized front-to-back with WHEN, trigger examples, analysis scope, detection categories, output, and prerequisite. It is long but every clause earns its place; the density is high and the structure makes scanning easy.
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 analysis tool with no input schema and no output schema, the description is remarkably complete: it covers when to use it, what it inspects, what it detects, what it returns, and what it requires. Nothing essential for an agent to decide whether to invoke it 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?
The input schema is empty (0 parameters), so the baseline is 4. The description adds the meaningful prerequisite 'Requires D365_CUSTOM_MODEL_PATH,' which supplements the empty schema, though it does not clarify how the path is supplied (param, environment, or context). Still, with no parameters to document, this dimension is well handled.
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 the specific verb and resource: 'Analyze upgrade risk for your custom D365 F&O model.' It also distinguishes the tool by tying it to upgrade/update scenarios and by enumerating the types of custom-code constructs it checks (CoC targets, event handlers, extensions, hard-coded references). The 'WHEN' framing plus trigger examples make the purpose 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 explicitly says when to use the tool: 'upgrading D365 F&O to a new version or applying a Microsoft update,' and provides concrete trigger phrases in English and French. It lacks explicit exclusions or named sibling alternatives, so it stops short of full when-not/however guidance, but the usage context is very clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
appinsights_clear_connectionAInspect
Removes the Application Insights connection cached for the current session by appinsights_set_connection.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full behavioral burden. It clearly discloses the state-changing behavior (removing a cached connection), the session scope, and the tool that created the connection. It does not mention edge cases like calling it with no active connection, but this is a minor gap for such a simple 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 a single, well-structured sentence with no filler. It front-loads the core action and immediately names the prerequisite tool, making it easy for an agent to parse quickly.
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-schema tool, the description fully explains what the tool does, what resource it affects, and the session scope. Nothing essential is missing for an agent to select and invoke 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?
The tool has zero parameters and schema coverage is 100%, so there is nothing for the description to add. Per the baseline for zero-parameter tools, a score of 4 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 uses a specific verb ('Removes') and a clear resource ('Application Insights connection cached for the current session'), while explicitly referencing the complementary tool that creates the connection. This cleanly distinguishes it from sibling tools like appinsights_set_connection and appinsights_query.
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 conveys clear usage context: it is used to remove a session-scoped connection that was established by appinsights_set_connection. It does not explicitly state when not to use it or list alternatives, but for a zero-parameter lifecycle tool the context is sufficient.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
appinsights_diagnose_slownessAInspect
WHEN: user wants to understand/deduce why a D365 F&O environment feels slow, using the real Application Insights telemetry the environment already emits -- no trace file upload needed. Runs a set of canned KQL queries and assembles one combined report:
X++ exception hotspots (exceptions table) -- top types/messages by count.
Hot custom telemetry events (customEvents table) -- top event names by frequency, plus a duration breakdown for events that carry an ElapsedMilliseconds custom property (covers ALMMonitoring-instrumented FDDs, and any out-of-box signal using the same convention).
Slow web requests/dependencies (requests/dependencies tables) -- only rendered if the workspace actually has data there (uncommon for FnO's own AOS tier, but present for Commerce/Portal/custom web extensions sharing the same App Insights resource). Requires the connection to be configured first via appinsights_set_connection (or server env vars).
Triggers: 'déduire et comprendre les lenteurs', 'why is my environment slow', 'diagnose slowness from App Insights', 'analyse la lenteur avec App Insights', 'performance issue live environment', 'slow environment telemetry'.
| Name | Required | Description | Default |
|---|---|---|---|
| top | No | Max rows per section (1-50). Default 15. | |
| lookbackHours | No | How far back to analyze, in hours (1-720). Default 24. | |
| minDurationMs | No | Minimum average duration (ms) for a custom event to be flagged as 'slow'. Default 2000. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the behavioral disclosure burden and does it reasonably well. It explains that the tool runs canned KQL queries, assembles a combined report, conditionally renders sections based on data availability, and requires a configured connection. It does not address potential runtime cost or error behavior, but for a diagnostic read tool the disclosed behavior is sufficient.
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 longer than average but well structured: it front-loads the WHEN scenario, then lists the report contents in an easy-to-scan numbered format, and ends with trigger phrases. The trigger list is somewhat redundant with the opening WHEN, but it helps with invocation matching and does not feel like 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 tool with no output schema, the description compensates by detailing the three sections the report will contain and their conditional rendering. It also states the required connection prerequisite and the parameters are fully documented in the schema. The only small gap is the lack of explicit behavior when no connection has been configured, but the prerequisite is already stated.
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 input schema covers all three parameters with descriptions, defaults, and valid ranges, so the description does not need to add much. The report description slightly reinforces the role of minDurationMs and top, but overall the parameters are already fully documented in 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 opens with a clear WHEN statement and defines the tool as diagnosing why a D365 F&O environment is slow using existing Application Insights telemetry, with no trace upload. It enumerates exactly what the combined report contains, making its purpose concrete and distinguishable from generic App Insights query 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?
The description explicitly states when to use it: when the user wants to understand slowness from App Insights telemetry. It also names the prerequisite of configuring the connection via appinsights_set_connection or server env vars. However, it does not explicitly contrast itself with sibling tools like appinsights_query or detect_performance_issues, leaving alternatives implicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
appinsights_queryAInspect
Run a raw KQL (Kusto) query against the D365FO environment's Application Insights / Log Analytics workspace (read-only -- the query language has no mutation operators). Requires the connection to be configured first via appinsights_set_connection (or server env vars). Use the standard App Insights schema: requests, dependencies, exceptions, traces, customEvents, pageViews, performanceCounters. Prefer appinsights_diagnose_slowness for a ready-made "why is it slow" report -- use this tool for anything more specific/custom.
Triggers: 'run this KQL', 'query app insights', 'requête KQL', 'log analytics query', 'custom App Insights query for my environment'.
| Name | Required | Description | Default |
|---|---|---|---|
| kql | Yes | KQL query text, e.g. "exceptions | where timestamp > ago(1h) | take 20". Do NOT include an explicit 'ago()'/time-range filter for the primary time column -- use the lookbackHours parameter instead (applied as the query time range). | |
| maxRows | No | Max rows to return (1-500). Default 100. | |
| lookbackHours | No | How far back to query, in hours (1-720). Default 24. |
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 clearly discloses that the operation is read-only, notes the prerequisite connection setup, and names the standard App Insights tables/schema. It does not describe output formatting or error behavior, but the safety profile and operational context are well covered for a query 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 purpose and read-only behavior, followed by prerequisites, alternatives, and trigger examples. It is efficient overall, though the trigger phrase list is somewhat redundant for an agent that can infer intent from the main description; still, it does not introduce meaningful bloat.
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 tool's complexity, the description covers purpose, read-only guarantee, required setup, targeted schema, parameter behavior, and the alternative sibling. The main gap is that no output shape or error behavior is described, but since there is no output schema and the tool returns arbitrary KQL query results, this is a minor omission.
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 input schema already documents all three parameters with 100% coverage, including defaults and range constraints, so the description need not repeat them. The main description adds domain context about the standard App Insights schema but does not add significant parameter-level semantics beyond what the schema provides, matching the baseline for high 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?
The description states a specific verb and resource: run a raw KQL query against the D365FO environment's Application Insights / Log Analytics workspace. It also names the sibling alternative appinsights_diagnose_slowness and distinguishes this tool as the custom/specific query path, so an agent can tell them apart without opening 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?
It explicitly states the prerequisite that a connection must be configured via appinsights_set_connection or server env vars, and it gives a clear when-to-use versus when-not-to-use rule: prefer appinsights_diagnose_slowness for ready-made slowness reports, use this tool for more specific/custom queries. Trigger phrases are also provided, making selection unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
appinsights_set_connectionAInspect
Securely register the D365 F&O environment's Application Insights / Log Analytics connection for the CURRENT session. The client secret is encrypted in memory (AES-256-GCM), never written to disk and never echoed back. Once set, appinsights_query and appinsights_diagnose_slowness use it automatically until it expires or you call appinsights_clear_connection.
HOW TO GET THE VALUES: workspaceId -- the Log Analytics WORKSPACE ID (GUID, not the App Insights app id) behind the Application Insights resource the environment is linked to (D365FO: System administration > Monitoring and Telemetry parameters > Application Insights Registry tab shows the connection string; the workspace id is on that Log Analytics workspace resource's Overview blade in the Azure Portal). tenantId/clientId/clientSecret -- an Entra ID app registration granted the 'Log Analytics Reader' (or 'Monitoring Reader') role on that workspace resource (Azure Portal > workspace > Access control (IAM) > Add role assignment). Read-only -- no write access is ever needed or used.
In a locked server deployment (APPINSIGHTS_LOCK_SERVER_CONFIG=true) this tool is disabled and the server's own environment credentials are used instead.
| Name | Required | Description | Default |
|---|---|---|---|
| clientId | Yes | App registration (client) id (GUID), granted Log Analytics Reader on the workspace. | |
| tenantId | Yes | Entra (Azure AD) tenant id (GUID). | |
| ttlMinutes | No | Minutes the connection stays cached for this session (1-480). Default 60. | |
| workspaceId | Yes | Log Analytics workspace ID (GUID) behind the linked Application Insights resource. | |
| clientSecret | Yes | App registration client secret. Encrypted in memory; never logged or persisted. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are present, so the description carries the full burden. It discloses memory encryption (AES-256-GCM), no disk writes/echoing, session lifetime, automatic consumption by later tools, and the locked-server disable condition. It explicitly states read-only authorization is sufficient and no write access is used.
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 longer than average, but the length is earned: it front-loads the core purpose and security guarantees, then organizes credential acquisition in a clearly headed section. No redundant sentences; the locked-server caveat is a necessary edge case.
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 state-setting tool with no output schema and no annotations, this description covers prerequisites, side effects, lifetime, security, and disabled behavior. It does not detail the success response, but for a registration call that is low-risk and the remaining guidance is sufficient for an agent to invoke 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 covers 100% of parameters, so baseline is 3. The description adds substantial meaning: workspaceId is a GUID not the App Insights app id, with a D365FO UI path; tenant/clientId/clientSecret require an Entra ID app registration with Log Analytics Reader/Monitoring Reader role and no write access. This goes well beyond the schema property 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 action ('Securely register ... connection for the CURRENT session'), names the resource (D365 F&O environment Application Insights/Log Analytics connection), and differentiates from siblings by explaining that appinsights_query and appinsights_diagnose_slowness will consume it and appinsights_clear_connection will clear it.
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?
Provides explicit usage context: session-scoped, automatically used by appinsights_query and appinsights_diagnose_slowness, cleared by appinsights_clear_connection or expiry. Also gives a clear exclusion: in locked server deployment with APPINSIGHTS_LOCK_SERVER_CONFIG=true the tool is disabled and server credentials are used instead. It also tells the user how to obtain each credential, which is a form of usage guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
batch_searchARead-onlyInspect
WHEN: you need context on multiple D365 objects or concepts simultaneously -- runs all queries in parallel. Use INSTEAD of multiple sequential search_d365_code calls -- each line becomes one parallel search. Maximum 6 queries per call. Results are equivalent to search_d365_code but returned together. When batch_search returns results, all matching objects are FULLY loaded (all chunks). Do NOT follow up with get_object_details on the same objects -- the complete source is already included.
Triggers: 'find all of these', 'look up multiple', 'cherche plusieurs', 'SalesTable AND VendTable', 'several objects at once', 'lookup X and Y and Z', 'plusieurs objets en même temps', 'context on all of these'.
| Name | Required | Description | Default |
|---|---|---|---|
| topK | No | Results per query (default: 5, max: 15) | |
| queries | Yes | Newline-separated search queries (max 6). Example: "SalesTable\nVendTable\nvendor invoice posting" | |
| topObjects | No | Full-chunk objects per query (default: 3, max: 8) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint=true, but the description adds important behavioral context: queries run in parallel, each line becomes one search, results are fully loaded with all chunks, and no follow-up detail fetch is needed. This goes well beyond the annotation and prevents redundant agent actions.
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 key WHEN/INSTEAD message, followed by capacity limits, behavioral equivalence, and a clear anti-pattern. The trigger list is somewhat long but earns its place by helping the agent recognize when to choose this tool.
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 multi-query search tool with no output schema, the description sufficiently covers when to use it, how queries map to searches, limits, result equivalence, and post-call behavior. An agent has everything needed to invoke it correctly and avoid unnecessary follow-up calls.
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 schema already covers all parameters with descriptions, so the baseline is 3. The description adds meaning by clarifying that each newline-separated query becomes a parallel search, enforcing the max 6 behavior, and explaining that topObjects controls full-chunk loading per query.
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 purpose: run multiple D365 object/concept searches in parallel. It explicitly says results are equivalent to search_d365_code but returned together, distinguishing it from the closest sibling without ambiguity.
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?
Provides explicit when-to-use guidance, tells the agent to use it INSTEAD of multiple sequential search_d365_code calls, sets a maximum of 6 queries per call, and even lists concrete trigger phrases. It also warns not to follow up with get_object_details because objects are fully loaded.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
compare_objectsARead-onlyIdempotentInspect
Compare two D365 F&O objects side-by-side (fields, methods, signatures). Handy when investigating differences between standard and a customisation, or between two similar tables.
| Name | Required | Description | Default |
|---|---|---|---|
| objectNameA | Yes | First object name, e.g. 'SalesTable' | |
| objectNameB | Yes | Second object name, e.g. 'PurchTable' |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and idempotentHint=true, covering the safety profile. The description adds meaning about what is compared (fields, methods, signatures) but does not disclose the return shape, pagination, or behavior on missing objects. Given the annotations, this is a reasonable but not rich level of behavioral 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?
Two sentences with no filler. The core action and scope are front-loaded, and the use cases add useful context without redundancy.
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-only tool, the description clearly communicates purpose, scope, and typical use cases. The lack of an output schema and explicit return-value description is a minor gap, but the overall context is adequate for effective tool 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?
The input schema provides 100% coverage of both parameters with descriptive examples ('SalesTable', 'PurchTable'). The description adds no parameter-specific information, so the baseline score of 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 ('Compare'), a concrete resource ('two D365 F&O objects'), and the exact dimensions being compared ('fields, methods, signatures'). This clearly distinguishes it from sibling tools like diff_model_versions, which compares versions, and get_object_details, which retrieves object details.
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 explicitly gives two clear use cases: investigating differences between standard and customisation, or between two similar tables. It does not name alternative tools or exclusions, but the context is sufficient for an agent to decide when to invoke it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_aot_objectARead-onlyInspect
Generate a complete, ready-to-deploy D365 F&O AOT XML scaffold for any object type.
Returns the XML + the correct file path inside the model -- the calling client (VS Extension,
Cursor, Copilot Chat) is responsible for writing the result to disk. This tool is fully
read-only on the server: it never writes to the filesystem, never mutates external state,
and is safe to expose from the cloud MCP.
When the knowledge base is available the scaffold is auto-enriched with real metadata
(existing field EDTs, related-table validation, auto-detected grid fields, etc.).
Supported aotType values ----------------------------------------------
AxTable . AxClass . AxForm . AxEnum
AxEdt . AxView . AxQuery . AxDataEntityView
AxMenuItemDisplay . AxMenuItemAction . AxMenuItemOutput
AxSecurityPrivilege . AxSecurityDuty . AxSecurityRole . AxSecurityPolicy
AxReport . AxFormExtension . AxTableExtension . AxClassExtension
AxEnumExtension . AxEdtExtension . AxQueryExtension . AxWorkflow
Common options (all types) --------------------------------------------
label - human-readable label shown in the UI
developerDoc - developer documentation string (tables/classes)
AxTable --------------------------------------------------------------------------
tableGroup - Main | WorksheetHeader | WorksheetLine | Transaction | Parameter | Group
cacheLookup - None | Found | FoundAndEmpty | NotInTTS | EntireTable
fields - csv "Name:Type[:EDT[:Label[:mandatory]]]"
Types: String Int Int64 Real Date DateTime Enum Container Guid indexes - csv "IndexName:field1+field2[:unique|:alternatekey]" relations - csv "RelName:RelatedTable:Field:RelatedField" titleField1/2 - field names for the lookup title createdBy / modifiedBy - true | false (default true) generateFind / generateExist / generateValidateWrite / generateInitValue - true | false
AxClass -------------------------------------------------------------------------- extends - base class name implements - csv of interfaces abstract / final - true | false pattern - SysOperation | RunBase | Service | EventHandler | none (default) methods - csv of additional method names to stub
AxForm ----------------------------------------------------------------------------
dataSourceTable - primary data-source table name
pattern - SimpleList | DetailsTransaction | DetailsMaster | ListPage | Dialog
gridFields - csv of field names for the grid (auto-detected from KB if omitted)
detailFields - csv of field names for the detail group
methods - csv of form method names to stub
AxEnum ----------------------------------------------------------------------------
style - Ordinary | ComboBox | Radio | CheckBox
values - csv "Name[:Label[:intValue]]" e.g. "Draft:Draft:0,Posted:Posted:1"
AxEdt -----------------------------------------------------------------------------
extends - base EDT (e.g. Name, Description, Amount)
stringSize - integer enumType - base enum for enum EDTs referenceTable - table that provides the lookup
AxView ----------------------------------------------------------------------------
dataSources - csv "Table[:Alias]"
fields - csv "DataSource.Field[:Alias]"
AxQuery -------------------------------------------------------------------------
dataSources - csv "Table[:Alias[:JoinMode]]"
AxDataEntityView -----------------------------------------------------------
primaryTable - root table
joinTables - csv of additional tables publicEntityName - OData collection name (pluralised entity name) isPublic - true | false (default true) fields - csv "Table.Field[:PublicName]" (auto-detected from KB if omitted)
AxMenuItemDisplay / Action / Output ------------------------------------------
objectName - target form / class / report name
runOn - Server | Client | Called from (default Server)
helpText - tooltip string
AxSecurityPrivilege -----------------------------------------------------------
entryPoints - csv "MenuItemName[:ObjectType[:Grant]]"
ObjectType: MenuItemDisplay | MenuItemAction | MenuItemOutput
Grant: NoAccess | Read | Update | Create | Delete
AxSecurityDuty --------------------------------------------------------------------- privileges - csv of privilege names to include
AxSecurityRole ---------------------------------------------------------------------- duties - csv of duty names privileges - csv of privilege names (direct assignment -- avoid if possible)
AxReport -------------------------------------------------------------------------
query- AxQuery name driving the dataset dataSourceTable - alternative: direct table name (if no query)
AxFormExtension -----------------------------------------------------------------
baseForm - name of the standard form to extend
fields - csv "ControlName[:EDT]"AxTableExtension --------------------------------------------------------------------- baseTable - name of the standard table to extend fields - csv "Name:Type[:EDT[:Label[:mandatory]]]" indexes - csv "IndexName:field1+field2[:unique|:alternatekey]"
AxClassExtension (Chain of Command) ------------------------------------------- baseClass - name of the standard class/table/form to wrap baseType - class | table | form (default class) methods - csv of method names to wrap with CoC
AxEnumExtension ---------------------------------------------------------------
baseEnum - name of the standard enum to extend
values - csv "Name[:Label[:intValue]]" IMPORTANT: start from value 10 or higher
to avoid conflicts with standard values (D365 extension contract)
AxEdtExtension ----------------------------------------------------------------
baseEdt - name of the standard EDT to extend
stringSize - new StringSize (must be <= base EDT limit; omit to inherit)
label - override label for this extension
AxQueryExtension --------------------------------------------------------------
baseQuery - name of the standard query to extend
dataSources - csv "Table[:Alias[:JoinMode]]" (add extra data sources)
ranges - csv "DataSource.Field:value" (add filter ranges)
AxSecurityPolicy (Row Level Security) ----------------------------------------
constrainedTable - primary table this policy restricts
query - AxQuery name that defines the allowed rows
operation - Select | Update | Create | Delete | Insert (default Select)
enabled - true | false (default true)
AxWorkflow ---------------------------------------------------------------------
category - category name (links to a module/table)
documentTable - table the workflow operates on
documentMenuItem - menu item that opens the record| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Object name -- must start with the ISV prefix, e.g. 'ALMMyTable', 'ABCSalesService'. | |
| aotType | Yes | AOT type, e.g. 'AxTable', 'AxClass', 'AxForm', 'AxEnum', 'AxEdt', 'AxSecurityPrivilege', etc. | |
| options | No | Key-value options dict. Provide only the keys relevant to your aotType. Example for AxTable: { "label": "My Table", "tableGroup": "Main", "fields": "MyId:String:MyIdEdt:My ID:mandatory,Description:String::Description", "indexes": "MyIdIdx:MyId:alternatekey", "relations": "CustTable:CustTable:CustAccount:AccountNum", "titleField1": "MyId", "generateFind": "true", "generateExist": "true", "generateValidateWrite": "true" } |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint annotation, the description explicitly states 'fully read-only on the server: it never writes to the filesystem, never mutates external state, and is safe to expose from the cloud MCP.' This goes beyond the annotation by explaining side effects, caller responsibility for writing to disk, and the returned artifact. No contradiction exists between the annotations and prose.
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 long, but this is justified by the polymorphic nature of the tool with 20+ supported aotTypes. It front-loads the core result and read-only guarantee, then organizes options in clear type-specific sections. The structure lets an agent find exactly the relevant option block without unneeded prose.
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 tool's complexity, the description covers what an agent needs to invoke it correctly: supported aotTypes, per-type option syntax, defaults, constraints, and return shape ('XML + the correct file path'). The output schema is absent, but the description supplies the essential output contract. No critical invocation requirement appears 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 100%, and the description adds substantial semantics: exhaustive aotType-specific options, CSV syntax, defaults, enum values, constraints (e.g., extension values starting at 10), and examples. The description explains the meaning of option keys far beyond the schema's generic 'Key-value options dict'.
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 opens with a specific verb and resource: 'Generate a complete, ready-to-deploy D365 F&O AOT XML scaffold for any object type.' It clearly states what the tool does and distinguishes it from the broad sibling set through the unique 'AOT XML scaffold' scope. It also clarifies the boundary with 'the calling client is responsible for writing the result to disk.'
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 intended usage is clear: when an agent needs a ready-to-deploy D365 F&O AOT scaffold for a supported aotType. The description does not explicitly name alternatives or formulate when-not-to-use conditions, but the highly specific purpose makes the usage context obvious. A fully explicit routing to sibling tools would be needed for a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
d365fo_clear_connectionAInspect
Removes the D365 F&O connection cached for the current session by d365fo_set_connection.
| 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 behavioral burden and adequately discloses that the operation removes cached connection state and that the effect is session-scoped. It also implies mutative behavior without hiding side effects, though it could note that a new connection must be set afterward.
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 sentence that front-loads the action and resource, then adds the essential scoping detail. Every word contributes meaning without 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 zero-parameter, no-output-schema clearing operation, the description is complete. It identifies what is removed, the scope of removal, and the origin of the cached connection, which is all needed to invoke 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?
The tool has zero parameters, so the description has no parameter burden. Baseline 4 is appropriate because the description correctly focuses on what the action does rather than on nonexistent 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?
States a specific verb ('Removes'), the precise resource ('D365 F&O connection cached for the current session'), and ties it explicitly to its counterpart d365fo_set_connection. This clearly distinguishes it from generic clear/set tools like appinsights_clear_connection.
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?
Makes the usage context clear by specifying that it clears the connection previously cached by d365fo_set_connection for the current session. It does not provide explicit when-to-use vs alternatives, but the counterpart reference and session scoping give enough guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
d365fo_set_connectionAInspect
Securely register the D365 F&O connection (URL + Entra app-registration credentials) for the CURRENT session. The client secret is encrypted in memory (AES-256-GCM), never written to disk and never echoed back. Once set, all odata_* and dmf_* tools use it automatically until it expires or you call d365fo_clear_connection.
Use this instead of resending the secret on every call. In a locked server deployment (D365FO_LOCK_SERVER_CONFIG=true) this tool is disabled and the server's own environment credentials are used instead.
| Name | Required | Description | Default |
|---|---|---|---|
| baseUrl | Yes | F&O environment base URL, e.g. https://yourenv.cloudax.dynamics.com (https only). | |
| clientId | Yes | App registration (client) id (GUID). | |
| tenantId | Yes | Entra (Azure AD) tenant id (GUID). | |
| ttlMinutes | No | Minutes the connection stays cached for this session (1-480). Default 60. | |
| clientSecret | Yes | App registration client secret. Encrypted in memory; never logged or persisted. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so thoroughly: in-memory AES-256-GCM encryption, no disk persistence, no echoing, session-scoped caching, expiry behavior, and the disabled locked-server path. This is far beyond a minimal mutation warning and gives the agent accurate behavioral expectations.
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 paragraphs with front-loaded purpose, followed by security behavior and the deployment exception. Every sentence adds information; no filler, no restating of schema defaults.
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?
Invocation-critical context is complete: what the tool does, how long the connection lasts, what consumes it, and when it is unavailable. The only minor gap is the lack of any description of the response/error behavior, but since no output schema exists and this is a simple setter, the missing piece is not severely damaging.
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 every parameter. The description adds useful grouping context ('URL + Entra app-registration credentials') and security emphasis for clientSecret, but it does not need to detail each parameter further. 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 action ('Securely register the D365 F&O connection') with a clear resource (URL + Entra app-registration credentials) and scope (CURRENT session). It also distinguishes itself from d365fo_clear_connection and implicitly from appinsights_set_connection by naming the D365 F&O context and the odata_*/dmf_* consumers.
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?
Explicitly says when to use it ('Use this instead of resending the secret on every call'), defines the automatic consumption by odata_* and dmf_* tools, and states a clear when-not case with D365FO_LOCK_SERVER_CONFIG=true. This gives an agent concrete conditions for selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
detect_performance_issuesARead-onlyIdempotentInspect
Profile an X++ object for N+1 queries, queries in loops, missing field lists, row-by-row inserts/updates, missing firstOnly. Returns compact issue table with line + fix. Only call when performance is explicitly the concern — for general quality use validate_best_practices. [!] Auto-fixing requires D365_CUSTOM_MODEL_PATH (custom code only).
| Name | Required | Description | Default |
|---|---|---|---|
| methodName | No | Optional: specific method to analyze. Analyzes all methods if not provided. | |
| objectName | Yes | Object name to analyze, e.g. 'SalesTable', 'CustInvoiceJour' |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint and idempotentHint annotations already cover the safety profile; the description adds the analysis scope, the compact issue-table output with line and fix, and an environment prerequisite for auto-fixing. The auto-fixing note is slightly ambiguous, but because the tool is framed as profiling and returning results, it does not contradict the read-only 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?
Four short sentences each carry load: the analysis scope, the output shape, the routing rule, and the environment dependency. The most important verb-resource information is front-loaded, and 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 read-only analysis tool with a 100%-covered schema, the description supplies everything needed to call it appropriately: what it checks, what it returns, when to prefer it, and a critical operand for auto-fixing. There is no output schema, but the return format is described well enough.
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 input schema already documents both parameters with 100% coverage, including the optional methodName default and an objectName example. The description adds no parameter-level detail beyond what the schema provides, so the baseline of 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 names a specific verb ('Profile') and a specific resource ('X++ object'), and enumerates the exact issue classes it detects: N+1 queries, queries in loops, missing field lists, row-by-row inserts/updates, and missing firstOnly. It also differentiates itself from validate_best_practices by positioning itself as performance-specific, so an agent can select it confidently.
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 states an explicit trigger ('Only call when performance is explicitly the concern') and an explicit exclusion ('for general quality use validate_best_practices'), naming the alternative tool. This is exactly the when/when-not guidance that lets an agent route correctly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
diff_model_versionsARead-onlyInspect
Compare two D365 F&O KB snapshots to produce a changelog (added/removed/modified objects). Use action 'save_baseline' once, then 'compare' between two snapshots.
| Name | Required | Description | Default |
|---|---|---|---|
| path1 | Yes | For 'compare': path to baseline cache file. For 'compare_caches': path to first cache. For 'save_baseline': output path for the baseline file. | |
| action | Yes | Action: 'compare' (current vs baseline), 'compare_caches' (two cache files), or 'save_baseline' (save current state) | |
| filterModel | No | Optional: filter to a specific model name | |
| path2OrLabel | No | Optional: For 'compare_caches': path to second cache file. For 'compare'/'save_baseline': label for the baseline. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, and the description is consistent with that. It adds behavioral context beyond the annotation: the tool is stateful in that save_baseline persists a baseline state, and the output is a changelog of three change types. No contradiction with the read-only hint since saving a local cache file does not mutate the observed system.
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 with no filler: the first front-loads purpose and output type, the second conveys the required call sequence. Every clause earns its place.
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 tool with three distinct actions and no output schema, the description covers the primary workflow and main use case, while the schema fully documents the remaining 'compare_caches' action and filterModel parameter. Minor gaps remain (no guidance on when compare_caches is preferable, no changelog format details), but the rich schema compensates.
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 each parameter description already explains its per-action meaning (e.g., path1 as baseline cache, output path, or first cache). The description adds only sequencing value (save baseline before comparing), not new parameter semantics, so the baseline of 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 ('Compare'), a precise resource ('two D365 F&O KB snapshots'), and a concrete outcome ('changelog with added/removed/modified objects'). This is specific enough to distinguish from the closest sibling 'compare_objects', which operates on objects rather than KB snapshots.
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, actionable workflow: 'Use action save_baseline once, then compare between two snapshots.' This tells the agent the required call sequence, though it does not explicitly name alternatives or state when NOT to use this tool (e.g., versus compare_objects or compare_caches).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
dmfAInspect
Consolidated Data Management Framework tool — one entry point for all 5 DMF operations,
selected via action. Each action forwards to the exact same implementation as its
dedicated tool (dmf_import_file / dmf_create_data_project / dmf_apply_entity_filter /
dmf_export_package / dmf_get_job_status) — identical behavior and validation, just one
tool schema instead of five. The dedicated tools remain available unchanged.
action="import" (= dmf_import_file): entityName, legalEntity, filePath OR csvContent, definitionGroupId?, execute?, overwrite?, pollTimeoutSeconds? action="create_project" (= dmf_create_data_project): projectName, entities, sourceName, operationType? ('Export' default or 'Import') action="apply_filter" (= dmf_apply_entity_filter): projectName, entityRowName, aotEntityName, fieldName, filterValue action="export" (= dmf_export_package): definitionGroupId, legalEntity, packageName?, reExecute?, pollTimeoutSeconds? action="status" (= dmf_get_job_status): executionId
| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes | import | create_project | apply_filter | export | status | |
| execute | No | import: execute after staging. Default true. | |
| entities | No | create_project: comma-separated DMF entity names. | |
| filePath | No | import: path to a .csv file on disk (or use csvContent). | |
| fieldName | No | apply_filter: field to filter on, e.g. 'VendorAccountNumber'. | |
| overwrite | No | import: overwrite existing project definition. Default true. | |
| reExecute | No | export: re-execute the project. Default true. | |
| csvContent | No | import: inline CSV content (or use filePath). | |
| entityName | No | import: target DMF entity name, e.g. 'Customers V3'. | |
| sourceName | No | create_project: existing DMF source data format name. | |
| executionId | No | status: the executionId returned by an import or export action. | |
| filterValue | No | apply_filter: value or wildcard to match. | |
| legalEntity | No | import/export: legal entity / company id, e.g. 'USMF'. | |
| packageName | No | export: optional package name. | |
| projectName | No | create_project/apply_filter: DMF project name. | |
| aotEntityName | No | apply_filter: AOT entity name, e.g. 'VendVendorV2Entity'. | |
| entityRowName | No | apply_filter: entity row label, e.g. 'Vendors V2'. | |
| operationType | No | create_project: 'Export' (default) or 'Import'. | |
| definitionGroupId | No | import/export: definitionGroupId (DMF project id). | |
| pollTimeoutSeconds | No | import/export: max seconds to poll for completion. Default 300. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only provide `readOnlyHint: false`, so the description carries most of the burden. It usefully discloses that each action forwards to the exact same implementation and validation as the corresponding dedicated tool. However, it does not directly describe side effects like overwriting projects, return payloads, error behavior, or polling semantics beyond naming `pollTimeoutSeconds`.
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 each action is described in a compact, scannable line. The length is justified by the dispatcher design with 5 operations and 20 parameters, and 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?
Action selection and parameter mapping are well covered, which is the core invocation need. However, with no output schema, the description should more directly state what each action returns, such as execution IDs or status payloads; it largely relies on the assertion that behavior is identical to the dedicated 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 coverage is 100%, so the baseline is 3; the description adds real value by grouping the 20 flat parameters by action and marking optional ones with `?`. It also makes the `filePath OR csvContent` alternative explicit, which is not obvious from the schema alone.
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 immediately states it is a consolidated entry point for all 5 DMF operations, maps each `action` value to a named dedicated tool, and lists the exact parameter sets per action. This is specific about verb, resource, and scope, and cleanly distinguishes it from the five `dmf_*` sibling 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 says the tool is the 'one entry point' for all five DMF operations and notes that dedicated tools remain available unchanged, which tells an agent how this tool relates to its alternatives. It does not explicitly state when to prefer the consolidated tool over a dedicated one, but the claim of identical behavior makes the choice low-risk.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
dmf_apply_entity_filterAIdempotentInspect
Apply a single-field value filter to ONE entity row of an existing DMF project, so the export only contains the matching records. The kernel builds the packed query (custom 'GenerateQueryData' action), the container envelope is stripped on the QueryRun.pack() signature, and the inner blob is PATCHed onto DataManagementDefinitionGroupDetails.QueryData (the exact format the standard table DMFDefinitionGroupEntity stores). Works for ANY entity and ANY field, but only a single field = single value per call (call once per entity row). Wildcards are passed through (e.g. value '1001*'). NOTE: filtering a parent (e.g. 'Vendors V2' on VendorAccountNumber) does NOT auto-filter child rows -- apply the same filter to related rows (e.g. 'Vendor bank accounts', 'Vendor postal addresses') for a single-record export. Requires the custom 'GenerateQueryData' action in the environment.
| Name | Required | Description | Default |
|---|---|---|---|
| fieldName | Yes | Entity field to filter on, e.g. 'VendorAccountNumber'. | |
| filterValue | Yes | Value or wildcard to match, e.g. '1001' or '1001*'. | |
| projectName | Yes | Existing DMF project (definitionGroupId) in FO. | |
| aotEntityName | Yes | AOT entity name the kernel resolves, e.g. 'VendVendorV2Entity'. | |
| entityRowName | Yes | Entity row label as shown on the project line, e.g. 'Vendors V2'. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations establish idempotency and non-destructiveness, and the description goes well beyond them: it discloses the internal kernel mechanics (QueryRun.ack, stripped container envelope, PATCH onto QueryData), wildcard pass-through, the parent/child filtering gotcha, and an environment prerequisite. This gives an agent accurate expectations for side-effects and dependencies.
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 opening sentence captures the primary purpose, and every subsequent sentence contributes a non-obvious constraint, caveat, or prerequisite. Despite its technical depth, there is no filler or redundancy.
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 covers the action, target, constraints, environment requirement, and the most important limitation (parent filtering does not cascade to child rows). For a mutation tool with no output schema, an agent has enough to invoke it correctly and anticipate its effect.
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 input schema already documents every parameter with examples, so the baseline is 3. The description adds semantic constraints beyond the schema: one field per call, one value per field, call once per entity row, and that the filter applies to an existing DMF project. This enriches rather than merely repeats the structured definitions.
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 states an explicit verb and resource: 'Apply a single-field value filter to ONE entity row of an existing DMF project'. It also specifies the scope ('single field = single value per call') and the effect on exports, which clearly differentiates this tool from DMF export or query-generation 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?
The description specifies clear conditions: it works for ANY entity/field, requires an existing DMF project, must be called once per entity row, and requires the custom 'GenerateQueryData' action. It also warns about child rows not being auto-filtered. It does not explicitly name alternative tools or say when not to use it, so it stops 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.
dmf_create_data_projectAIdempotentInspect
Create (or extend) a DMF data project -- EXPORT or IMPORT -- entirely through standard public OData entities, with NO X++ customization required. It POSTs the header to DataManagementDefinitionGroups and one row per entity to DataManagementDefinitionGroupDetails with AutoGenerateMapping=Yes, so FO generates each entity's source<->staging mapping automatically. Idempotent: an existing project is reused and entities already present are skipped. For EXPORT, the project can then be run with dmf_export_package. Provide an EXISTING DMF 'source data format' name for sourceName (e.g. a comma-delimited format).
| Name | Required | Description | Default |
|---|---|---|---|
| entities | Yes | Comma-separated DMF entity names, e.g. 'Customers V3,Released products V2'. | |
| sourceName | Yes | Existing DMF source data format name that defines the file format. | |
| projectName | Yes | Name of the data project (definitionGroupId) to create or extend. | |
| operationType | No | Operation type: 'Export' (default) or 'Import'. | Export |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the idempotentHint and destructiveHint annotations, the description discloses concrete implementation behavior: it POSTs to DataManagementDefinitionGroups and DataManagementDefinitionGroupDetails, sets AutoGenerateMapping=Yes, reuses existing projects, and skips already-present entities. No contradiction with annotations exists.
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, each earning its place: purpose, mechanism, idempotency, and next-step guidance. The key purpose is front-loaded and there is no filler or redundant restatement of the tool 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?
The tool has only four simple parameters and no output schema, and the description fully explains the create/extend behavior, idempotency, and next step for EXPORT. The only notable gap is that the import execution path (via dmf_import_file) is not explicitly mentioned, but the core call is 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 description coverage is 100%, so the baseline is 3. The description adds value by requiring sourceName to be an EXISTING DMF source data format and giving a concrete comma-delimited example. It also reinforces that entities are comma-separated, going slightly 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?
The description uses a specific verb-resource pair ('Create (or extend) a DMF data project') and clearly scopes the tool to EXPORT or IMPORT. It distinguishes this configuration tool from execution siblings like dmf_export_package and dmf_import_file by stating that it builds the project through OData entities rather than running it.
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 usage context: it explains the OData/no-X++ approach, states idempotency behavior, and explicitly routes the EXPORT project to dmf_export_package for execution. It does not explicitly mention when not to use it or name the import execution counterpart (dmf_import_file), so it stops 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.
dmf_export_packageAInspect
Trigger a bulk export through the Data Management package REST API and return the download URL when complete. NOTE: the DMF EXPORT project (definitionGroupId) must already exist in FO with its entities + mapping configured -- create it with dmf_create_data_project if needed. For ad-hoc exports without a project, use odata_export_entity instead.
| Name | Required | Description | Default |
|---|---|---|---|
| reExecute | No | Re-execute the project (true) or reuse last staging (false). Default true. | |
| legalEntity | Yes | Legal entity / company id to export from, e.g. 'USMF'. | |
| packageName | No | Optional package name. Default derived from the project id. | |
| definitionGroupId | Yes | Existing DMF export project (definitionGroupId) in FO. | |
| pollTimeoutSeconds | No | Max seconds to poll for completion. Default 300. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the behavioral burden. It discloses that the tool triggers an export, waits for completion, and then returns a download URL, which communicates the asynchronous/polling nature. It does not discuss side effects like staging reuse or failure behavior, but the main operational behavior is clear.
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 with the primary action, then adds a prerequisite note and a clear alternative. Every sentence earns its place, and there is no redundant repetition of schema 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?
The description gives the core output (download URL), the prerequisite project setup, and the routing alternative, which is strong for a 5-parameter tool with no output schema. It could additionally note failure/timeout outcomes, but the parameter schema already covers pollTimeoutSeconds, so the overall picture is sufficiently 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 description coverage is 100%, so all five parameters are already documented with meaningful descriptions. The tool description adds high-level context about definitionGroupId being an existing DMF project, but does not need to repeat parameter details because the schema already handles them.
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 the tool triggers a bulk export via the Data Management package REST API and returns a download URL when complete. It distinguishes itself from related tools by emphasizing the project-based export path and explicitly naming odata_export_entity as the alternative for ad-hoc exports.
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 explicit when-to-use guidance: use this when a DMF export project already exists. It also says to create the project with dmf_create_data_project if needed, and to use odata_export_entity for ad-hoc exports without a project. This leaves little ambiguity about tool selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
dmf_get_job_statusAInspect
Poll the status of a DMF import/export execution by its executionId (e.g. NotRun, Executing, Succeeded, PartiallySucceeded, Failed). For a completed export, also returns the download URL.
| Name | Required | Description | Default |
|---|---|---|---|
| executionId | Yes | The executionId returned by dmf_import_file or dmf_export_package. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral disclosure burden. It clearly conveys a non-mutating polling operation, enumerates the possible status values, and discloses extra return behavior for completed exports (download URL). It does not explicitly state 'read-only' or describe failure handling, but 'Poll the status' sufficiently implies the safety profile.
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 no filler. The core action and the key identifier are front-loaded, followed by the useful status examples and the download URL detail. Every sentence earns its place.
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 single-parameter polling tool with no output schema, the description provides enough context: what to provide, what statuses to expect, and a special return case. It could arguably mention that the executionId must come from a prior DMF operation, but the schema already supplies that dependency, so the overall definition is complete enough.
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 only parameter, executionId, is already described as the ID returned by dmf_import_file or dmf_export_package. The description's mention of 'executionId' adds no new semantic detail beyond the schema, so the baseline score of 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 uses a specific verb ('Poll') and resource ('a DMF import/export execution'), and identifies the required identifier ('executionId'). It also includes concrete status examples and a distinctive note about the download URL, making it easy to distinguish from sibling DMF tools like dmf_import_file and dmf_export_package.
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 clearly implies the tool is for checking the outcome of a prior import/export operation, especially with the schema noting that executionId comes from dmf_import_file or dmf_export_package. It does not explicitly name alternatives or state 'use this instead of X', but the polling purpose is unambiguous enough for correct tool selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
dmf_import_fileADestructiveInspect
Bulk-import a CSV file into a D365 F&O entity through the Data Management package REST API. Builds the package (Manifest + header + CSV) in memory, uploads it to Azure blob, then calls ImportFromPackage which AUTO-CREATES the data project from the manifest. Runs in batch; the tool polls until completion and returns the final status plus an error-keys file URL when rows fail. Provide either filePath (a .csv on disk) or inline csvContent. Resolve the entity name from the KB (find_entity_for_table) -- do not invent it.
| Name | Required | Description | Default |
|---|---|---|---|
| execute | No | Execute the import after staging (true) or stage only (false). Default true. | |
| filePath | No | Path to a .csv file on disk. Provide this OR csvContent. | |
| overwrite | No | Overwrite an existing project definition with the same id. Default true. | |
| csvContent | No | Inline CSV content (header row + data). Provide this OR filePath. | |
| entityName | Yes | Target entity name as known to DMF (the entity, not the OData set), e.g. 'Customers V3'. | |
| legalEntity | Yes | Legal entity / company id to import into, e.g. 'USMF'. | |
| definitionGroupId | No | DMF definition group (data project) id. Default: auto-generated from entity + timestamp. | |
| pollTimeoutSeconds | No | Max seconds to poll for completion before returning the executionId. Default 300. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already carry destructiveHint and openWorldHint, so the bar is lower. The description adds valuable behavioral context: builds package in memory, uploads to Azure blob, calls ImportFromPackage, auto-creates the data project, polls to completion, and returns an error-keys file URL on failures. It does not contradict the annotations and supplies meaningful side-effect detail beyond what annotations express.
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 sentences, front-loads the core purpose, and each sentence earns its place by describing mechanism, execution behavior, or invocation guidance. There is no fluff or repetition beyond what is useful for a complex, side-effectful tool.
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 tool's complexity, the description covers the key invocation inputs, execution flow, polling, and failure reporting well. The main gaps are the lack of explicit treatment of the execute=false staging-only path and the absence of mention of connection prerequisites; however, annotations and schema mitigate most of these omissions, and the description is otherwise quite 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 100%, so the baseline is 3. The description adds genuine value by emphasizing the filePath/csvContent exclusivity and by instructing the agent to resolve entity names via find_entity_for_table rather than inventing them. This reduces the risk of incorrect entityName values beyond what the schema alone 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 opens with a specific verb and resource: 'Bulk-import a CSV file into a D365 F&O entity through the Data Management package REST API.' This clearly distinguishes the tool from siblings like dmf_export_package, dmf_transform_excel, and generate_data_entity. The auto-create and polling behavior further sharpen what this specific tool does.
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 conveys a clear batch-CSV-DMF use case and gives practical guidance such as 'Provide either filePath or csvContent' and 'Resolve the entity name from the KB... do not invent it.' However, it does not explicitly state when to prefer this tool over alternatives like odata_upsert_rows or dmf_create_data_project, nor does it name sibling exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
dmf_transform_excelAInspect
Transform a multi-sheet Excel (.xlsx) into DMF-ready rows using a data-driven JSON mapping -- equivalent to FO_TransformExcelForDMF. NO FO credentials required (offline transform). Provide the workbook via ONE of: sourceUrl (Blob/SharePoint SAS URL or Graph downloadUrl), filePath (local .xlsx) or fileContentBase64 (inline upload, small files only). The mappingJson spec supports: sourceSheet, targetSheet, columnMappings {source->target}, conditionalValues [{sourceColumn,matches[],values{}}], staticValues{}, deduplicateOn[] and autoGeneratedFields (array OR object keyed by sheet, e.g. {"Products V2":["PRODUCTNUMBER"]}) which are removed so FO generates them. Returns CSV (default, feed to dmf_import_file) or JSON (feed to odata_upsert_rows). Set listSheetsOnly=true to just inspect the workbook's sheet names.
| Name | Required | Description | Default |
|---|---|---|---|
| format | No | Output format: 'csv' (default) or 'json'. | csv |
| filePath | No | Local path to a .xlsx file. Provide one of sourceUrl/filePath/fileContentBase64. | |
| sheetName | No | Override the source sheet name. Empty = use mappingJson.sourceSheet, else the first sheet. | |
| sourceUrl | No | URL to the .xlsx (Blob/SharePoint SAS or Graph downloadUrl). Provide one of sourceUrl/filePath/fileContentBase64. | |
| outputPath | No | Optional file path to also write the full transformed result to. | |
| mappingJson | No | Mapping spec JSON (columnMappings, conditionalValues, staticValues, deduplicateOn, autoGeneratedFields, sourceSheet). Optional when listSheetsOnly=true. | |
| listSheetsOnly | No | If true, only list the workbook's sheet names (diagnostic). mappingJson not required. | |
| fileContentBase64 | No | Base64-encoded .xlsx content (inline upload, small files). Provide one of sourceUrl/filePath/fileContentBase64. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the disclosure burden and does so well: it notes no FO credentials are needed, base64 upload is only for small files, autoGeneratedFields are removed so FO regenerates them, and output is CSV or JSON with downstream consumers. It stops short of detailing side effects such as outputPath file writes or error behavior, but the core behavior is transparent.
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 text is dense but organized: main action, credential caveat, source alternatives, mapping spec summary, outputs, and diagnostic mode. Every sentence carries distinct information, and there is no filler or tautology.
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 8-parameter tool with no annotations and no output schema, the description covers all essential usage aspects: input source alternatives, mapping JSON structure, output formats and downstream routing, plus a diagnostic mode. An agent has enough to select and invoke 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 100%, but the description adds substantial meaning beyond it: the mappingJson supported keys and shapes, the sourceUrl variants, file size caveat, format-to-downstream-tool mapping, and listSheetsOnly diagnostic purpose are all explained. This deeply complements the parameter 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 opens with a specific verb-resource pair: 'Transform a multi-sheet Excel (.xlsx) into DMF-ready rows using a data-driven JSON mapping.' It also states it is the offline equivalent of FO_TransformExcelForDMF and explicitly routes output to dmf_import_file or odata_upsert_rows, which distinguishes it from sibling 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?
Clear context is given: use it to prepare Excel data offline before importing via dmf_import_file or upserting via odata_upsert_rows, and use listSheetsOnly for inspection. However, it never explicitly states when not to use it (e.g., when data is already DMF-ready) or compares it to a direct alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
explain_workflowARead-onlyInspect
WHEN: user asks how an approval workflow works, who approves a document, what states it goes through, or what happens on submission/rejection. NOT for technical workflow class details -- use get_object_details.
WORKFLOW EXPLAINER (Business Language) -- Explains a D365 approval workflow: who approves, what states exist, and what happens on approval or rejection. Output is plain business language -- no X++ or workflow engine jargon.
Triggers: 'explain the workflow for', 'how does the approval work', 'qui approuve', 'workflow states for', 'étapes du workflow', 'approval process for', 'circuit d'approbation', 'what happens when a user submits'.
| Name | Required | Description | Default |
|---|---|---|---|
| objectName | Yes | D365 object or workflow name, e.g. 'SalesTable', 'PurchTable', 'ALMDemandeAchatWorkflow' |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnlyHint=true. The description adds meaningful behavioral context beyond that: output is plain business language, no X++ or workflow engine jargon, and it covers approval/rejection outcomes. This helps set expectations for the response style.
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 well-structured with WHEN, NOT, and trigger sections, and the key scoping information is front-loaded. The trigger list is slightly redundant with the opening WHEN clause, but it adds concrete value for intent matching.
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-parameter tool with no output schema, the description provides everything an agent needs: when to use it, what it explains, the output language style, and the exclusion boundary. No critical context 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 100%, and the parameter description already provides examples like 'SalesTable' and 'ALMDemandeAchatWorkflow'. The tool description does not add new parameter-level meaning, but with full schema coverage the baseline of 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 pair: explains a D365 approval workflow, covering who approves, states, and outcomes. It clearly distinguishes itself from get_object_details by explicitly excluding technical workflow class details.
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?
Provides explicit WHEN conditions with concrete user-question examples, and an explicit NOT condition with the alternative tool to use (get_object_details). Trigger phrases, including multilingual examples, leave no ambiguity about when to invoke this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
federated_searchARead-onlyInspect
Fan-out search across multiple ALM XPP MCP server instances in parallel and merge results using Reciprocal Rank Fusion (RRF). Useful when D365 code is split across multiple organisations or knowledge bases (e.g. one per client, one standard KB). Peer servers are configured via D365_FEDERATION_PEERS env var (comma-separated list of base URLs, e.g. https://org2.almxpp.com). The local server is always included as the primary source.
| Name | Required | Description | Default |
|---|---|---|---|
| topK | No | Number of results to return per server (default 5) | |
| query | Yes | Natural language search query | |
| peerApiKeys | No | Optional MCP API keys for peer servers, comma-separated (same order as D365_FEDERATION_PEERS) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint annotation, the description reveals useful behavioral traits: parallel fan-out, RRF-based result merging, peer configuration via D365_FEDERATION_PEERS, and the local server always being the primary source. These details help the agent anticipate how the tool behaves and how it is configured.
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, each earning its place: the core action, the target use case, the peer configuration mechanism, and the local-server inclusion. It is front-loaded with the most important information and contains 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?
The description together with the fully-documented schema gives an agent enough to invoke the tool correctly: query is required, topK defaults to 5, peerApiKeys are optional, and peers come from an env var. It doesn't describe the exact output shape or RRF details, but those are not strictly required 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?
Schema description coverage is 100%, so the schema already documents all parameters (query, topK, peerApiKeys) including defaults and ordering semantics. The description adds little parameter-level detail beyond what the schema provides, so the 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 opens with a specific verb and resource: 'Fan-out search across multiple ALM XPP MCP server instances in parallel and merge results using Reciprocal Rank Fusion (RRF).' It clearly distinguishes this federated, multi-server tool from the many single-server search tools in the sibling list, such as search_d365_code or batch_search.
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 a clear use case: 'Useful when D365 code is split across multiple organisations or knowledge bases (e.g. one per client, one standard KB).' This gives the agent good context for when to invoke it, though it does not explicitly name alternatives or state when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_callersARead-onlyIdempotentInspect
Full cross-reference profile for a class or method: callers, callees, inheritance chain, interface implementations, overrides, attributes. Requires xref_index.json.gz (generated from DYNAMICSXREFDB via GenerateCache --xref-conn). Falls back to vector-search when XRef not loaded.
| Name | Required | Description | Default |
|---|---|---|---|
| depth | No | Depth of caller chain to trace upward (default: 2, max: 4) | |
| methodKey | Yes | Object or method key. Format: 'ClassName.methodName' for methods, 'ClassName' for class-level queries. | |
| categories | No | Categories to include: 'all' (default), or comma-separated subset: 'calls,inheritance,usage,interfaces,overrides,attributes' | all |
| maxResults | No | Maximum results per category (default: 20, max: 50) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and idempotentHint, so the safety profile is covered. The description adds valuable behavioral detail beyond that: it calls out the dependency on xref_index.json.gz, explains how that index is generated, and discloses the vector-search fallback behavior when the index is unavailable.
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: the first sentence states the core purpose and output categories, the second gives the prerequisite, and the third describes fallback behavior. Every sentence earns its place and there is no redundant or filler content.
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 no output schema, the description still gives enough shape of what to expect by listing the major output categories and mentioning the fallback mechanism. It covers prerequisites and operational behavior, though it does not describe the exact return format or how depth/maxResults affect results beyond what the schema provides. This is a minor gap for a complex cross-reference 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 the schema already documents all four parameters clearly. The description adds no parameter-specific semantics beyond what the schema provides; it reinforces the category list but does not explain defaults, formats, or constraints 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?
The description states a clear verb and resource: it produces a full cross-reference profile for a class or method, enumerating callers, callees, inheritance, interfaces, overrides, and attributes. It distinguishes itself from the narrower tool name 'find_callers' by explaining the broader scope, though it does not explicitly name a sibling tool for comparison.
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 for cross-reference exploration and provides important context: it requires xref_index.json.gz and falls back to vector-search when the index is not loaded. However, it does not explicitly state when to choose this tool over similar siblings like find_references, find_change_impact, or find_related_objects, so the routing guidance is implied rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_change_impactARead-onlyIdempotentInspect
WHEN: about to modify an X++ object or method and need to understand what could break. Returns a blast-radius report: direct callers, transitive dependents (BFS up to 3 hops), custom model extensions, interface propagation, and severity classification (Critical/High/Medium/Low). Requires the XRef index (loaded from xref_index.json.gz). Triggers: 'what breaks if I change X', 'impact of modifying SalesLine', 'blast radius', 'refactoring risk', 'quel impact si je modifie', 'qu'est-ce qui dépend de'. Pass objectName='SalesLine' for table/class-level impact, or objectName='SalesLine.insert' for method-level impact. Combine with validate_best_practices / detect_performance_issues to get both impact AND current code quality before committing a change.
| Name | Required | Description | Default |
|---|---|---|---|
| maxDepth | No | Max BFS depth (1-5). Default 3. | |
| objectName | Yes | Object or method to analyse, e.g. 'SalesLine' or 'SalesLine.insert'. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnly and idempotent behavior. The description adds meaningful operational context: the XRef index prerequisite, BFS traversal up to 3 hops, and the categories of impact included. This goes beyond the annotations without contradicting them.
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 longer than average, but it is well-structured with a WHEN clause, output summary, requirement note, trigger phrases, examples, and workflow suggestion. The trigger phrase list is somewhat repetitive but serves a real routing purpose. Overall, each section earns its place.
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 tool with no output schema, the description conveys the return format well enough by listing the blast-radius components and severity levels. It also covers prerequisites, parameter usage, and a sensible combination with other tools. An agent has enough information to decide when and how to invoke 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 coverage is 100%, so the baseline is 3. The description adds value by clarifying the semantic difference between table/class-level objectName values and method-level values like 'SalesLine.insert', and by linking maxDepth to the BFS behavior. This is helpful but not extensive, given the schema already documents both 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 this tool computes change impact for X++ objects/methods and enumerates the concrete outputs: direct callers, transitive dependents, custom model extensions, interface propagation, and severity classification. This distinguishes it from generic search or reference tools like find_callers or find_references, even though those siblings are not named 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 WHEN clause is explicit ('about to modify an X++ object or method and need to understand what could break'), and the trigger phrases plus objectName examples provide strong contextual guidance. It does not explicitly say when not to use this tool versus closely related siblings, so it stops 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.
find_entity_for_tableARead-onlyIdempotentInspect
WHEN: developer needs to integrate via OData and wants to find the entity name for a given table. Also generates a new entity template when none exists and generateIfMissing=true. Triggers: 'which entity exposes', 'OData entity for', 'find entity for', 'quelle entité expose', 'DMF entity for', 'create data entity', 'expose via OData', 'generate entity', 'entité de données'. Find D365 F&O data entities that expose a given table for OData/DMF integrations. Answers: 'Which entity exposes SalesTable for OData?' Scans all indexed AxDataEntityView objects to find entities with matching data sources. Returns entity name, public entity name (for OData URL), IsPublic status, key fields, and all data sources. Essential for integration development. Set generateIfMissing=true to auto-generate an AxDataEntityView XML template when no public entity is found.
| Name | Required | Description | Default |
|---|---|---|---|
| tableName | Yes | Table name to find entities for, e.g. 'SalesTable', 'CustTable', 'VendInvoiceJour' | |
| maxResults | No | Maximum results (default: 15, max: 30) | |
| generateIfMissing | No | When true and no public entity is found, generates a new AxDataEntityView XML template for the table. Default: false. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint and idempotentHint; the description is consistent with these and adds the key behavioral trait annotations cannot express: invoking with generateIfMissing=true writes a new AxDataEntityView XML template, a side effect normally hidden by the readOnly profile. It also discloses the scan scope ('all indexed AxDataEntityView objects') and the exact returned fields. No contradiction, though it does not cover auth needs or error/reversibility of the generated template.
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?
Well-structured and front-loaded with the WHEN clause, followed by triggers, behavior, returns, and the conditional generation note. However, it repeats the generateIfMissing behavior twice, includes filler ('Essential for integration development'), and the trigger phrase list is longer than needed.
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's explicit list of return values (entity name, public entity name, IsPublic status, key fields, all data sources) is valuable and largely compensates. Combined with trigger phrases, scan scope, and the generation side effect, it is complete for the primary use case — the only notable gap is routing guidance to sibling 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% with substantive param documentation (defaults, max value, and the generateIfMissing behavior). The description mostly restates what the schema already says about generateIfMissing and the SalesTable example rather than adding new meaning, so the 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: 'Find D365 F&O data entities that expose a given table for OData/DMF integrations.' It further distinguishes itself from siblings by naming its exact return payload (public entity name for OData URL, IsPublic status, key fields, data sources) and its conditional generation behavior, which separates it from get_data_entity_info and generate_data_entity 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?
Leads with an explicit WHEN clause targeting OData integration developers who need an entity name for a given table, and provides both trigger phrases and a concrete example question ('Which entity exposes SalesTable for OData?'). It also states the condition for the generation path (no public entity found and generateIfMissing=true). However, it never names sibling alternatives or says when not to use this tool versus get_data_entity_info or generate_data_entity, so it stops short of full exclusion guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_error_patternsARead-onlyIdempotentInspect
WHEN: a user encounters an error message, infolog error, or runtime exception in D365. Also handles business-language error explanation when audienceType='business'. Triggers (developer): 'fix this error', 'what causes', 'exception thrown', 'infolog error', 'update conflict', 'outside tts', 'number sequence'. Triggers (business): 'what does this error mean', 'explain this error to me', 'user gets error X', 'que signifie cette erreur', 'message d'erreur', 'what should the user do when they see this error'. Find known D365 F&O error patterns matching an error message or symptoms description. Matches against a built-in database of common errors (transaction conflicts, security issues, number sequences, posting errors, batch problems, etc.), resolves D365 label IDs from error text (e.g. user sees 'Number sequence not set up' -> finds @SYS70535 -> finds the throwing code), and searches the indexed codebase. Returns root causes, step-by-step resolution, label matches, and source code locations. [] When the error text contains a D365 label ID (e.g. '@SYS12345'), call search_labels first to resolve the label text, then call this tool with the resolved text. [] Also explains a Microsoft best-practice moniker: pass 'BPErrorFieldCurrencyDateTableEmpty' (or a symptom like 'strong name') to get the rule text from Microsoft's own catalogue, read out of the indexed D365 build. That is the rule TEXT -- run_best_practices_check_scoped is what decides whether an object breaks it. Set audienceType='business' for a plain-language explanation targeted at end users instead of developers.
| Name | Required | Description | Default |
|---|---|---|---|
| audienceType | No | Audience type: 'developer' (default) for root-cause analysis, or 'business' for a plain-language explanation targeted at end users. | developer |
| errorOrSymptom | Yes | Error message text or symptom description, e.g. 'update conflict', 'number sequence not set up', 'cannot create record outside tts' |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark the tool as read-only and idempotent, and the description is fully consistent with that. It adds meaningful behavioral detail beyond annotations: the tool matches against a built-in error database, resolves D365 label IDs, searches the indexed codebase, and returns root causes, step-by-step resolution, label matches, and source locations. It also clarifies the distinct role of the best-practice moniker path.
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 long and dense, but nearly every section earns its place: triggers, label-resolution routing, best-practice rule distinction, and audience behavior are all actionable. The structure front-loads WHEN guidance and then proceeds through resolution behavior and edge cases. It is slightly verbose due to the extensive trigger lists, but this density is functionally useful for triggering and disambiguation.
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 two simple parameters, no output schema, and read-only annotations, the description covers what an agent needs: what input to supply, how to handle label IDs, how audienceType changes behavior, what the tool returns, and how it relates to sibling tools. Missing details such as exact output formatting are not necessary for correct invocation 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 coverage is 100%, so the schema already documents both parameters. The description adds value by giving concrete example values for errorOrSymptom ('update conflict', 'number sequence not set up') and by explaining audienceType='business' as plain-language explanation for end users rather than developer root-cause analysis. This enriches the schema without being redundant.
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 opens with a specific verb-resource pairing: 'Find known D365 F&O error patterns matching an error message or symptoms description.' It also names the matching mechanisms (built-in database, label resolution, codebase search) and explicitly differentiates from related tools like search_labels and run_best_practices_check_scoped. A developer trigger list further disambiguates when this tool, rather than a generic search tool, is appropriate.
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 explicit WHEN guidance for both developer and business audiences, including concrete trigger phrases. It also provides direct routing: if the error text contains a label ID, call search_labels first; for best-practice rule text, use this tool with the moniker, but use run_best_practices_check_scoped to decide whether an object violates it. This leaves little ambiguity about alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_event_handlersARead-onlyInspect
Find all event handlers that subscribe to events on a D365 table or class. Searches the knowledge base for [SubscribesTo(classStr(objectName), ...)] / [SubscribesTo(tableStr(objectName), ...)] attribute patterns. Use eventName to narrow results to a specific event (e.g. 'OnInserted'). WHEN: 'who handles X', 'what subscribes to Y', 'event handlers for Z', 'qui écoute l'événement', 'abonnés à l'événement', 'SubscribesTo', 'data events for'.
| Name | Required | Description | Default |
|---|---|---|---|
| eventName | No | Optional: filter to a specific event name, e.g. 'OnInserted', 'OnUpdated', 'OnDeleted', 'OnValidatingWrite'. | |
| objectName | Yes | Table or class name to find event handlers for, e.g. 'SalesTable', 'PurchTable'. | |
| handlerType | No | Optional: filter by handler type — 'DataEventHandler' or 'PrePostEventHandler'. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint annotation already signals a safe read operation, and the description adds meaningful behavioral detail: it searches the knowledge base for SubscribesTo attribute patterns rather than doing live code execution. It also explains eventName narrowing, though it does not disclose limitations such as potential misses for handlers not using the documented pattern.
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 concise and front-loaded with the core purpose, then details the search mechanism and usage triggers. The WHEN list is somewhat long but earns its place by providing actionable routing cues.
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 readOnly annotation, clear parameter schema, and explicit search-pattern explanation, the description is sufficient for selecting and invoking the tool. It does not describe the return format, but the absence of an output schema is partially mitigated by the clear 'find all event handlers' outcome implied in the first sentence.
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 the schema already documents all parameters. The description adds a little value by explicitly explaining that eventName narrows results and giving an example, but it does not add meaning for handlerType or objectName beyond the schema 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?
The description clearly states it finds event handlers subscribing to events on a D365 table or class, and specifies the searched attribute patterns. It is distinguishable from generic search tools, though it does not explicitly name or contrast 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 description provides explicit WHEN trigger phrases including natural-language intents and French equivalents, giving clear context for when the tool is appropriate. It does not explicitly state when not to use it or name alternatives, but the usage cues are strong enough for an agent to route correctly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_extensionsARead-onlyIdempotentInspect
Find all extension objects (AxClassExtension, AxTableExtension, AxFormExtension, AxEnumExtension), CoC classes ([ExtensionOf]), and event handlers for a base object. Also queries Azure DevOps Code Search in real-time for custom extensions not yet in the KB. ALWAYS call before creating a new extension — avoid parallel customizations.
| Name | Required | Description | Default |
|---|---|---|---|
| baseObjectName | Yes | The base object name, e.g. 'SalesTable', 'SalesFormLetter', 'VendTable' |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the tool read-only and idempotent. The description adds meaningful behavioral context by disclosing that it queries Azure DevOps Code Search in real-time for custom extensions not yet in the KB, which signals a live external lookup beyond a local cache.
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 convey the full scope, the real-time search behavior, and the critical usage rule without any filler. The most important directive is front-loaded and emphasized with 'ALWAYS.'
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 one parameter, the description covers purpose, data sources, scope, and usage context. It lacks an explicit description of the return format, but the absence of an output schema is partially mitigated by the clear 'find all...' phrasing.
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 schema already provides 100% coverage for the single baseObjectName parameter, including concrete examples. The description adds no additional parameter-level detail beyond referring to a 'base object,' so the schema carries the semantic weight.
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 has a specific verb and clear resource: it finds extension objects, CoC classes, and event handlers for a named base object. It is unambiguous about scope, though it does not explicitly differentiate itself from the sibling tool find_event_handlers, which overlaps with part of its functionality.
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 a strong, explicit usage directive: 'ALWAYS call before creating a new extension — avoid parallel customizations.' This tells the agent when to use the tool, but it does not mention alternatives or when not to use it, so it stops short of full guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_referencesARead-onlyIdempotentInspect
Full index scan for all usages of an object, method, field, or label ID. Use for impact analysis before changing or deleting an object. EXPENSIVE — O(1M+ chunks). Prefer find_callers when XRef index is loaded (O(1)). Label IDs: automatically searches both @SYS124480 and @SYS:124480 forms. NOT for extensions only — use find_extensions for CoC/event handlers.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | The object or method name to find references to, e.g. 'SalesTable', 'validateWrite' | |
| maxResults | No | Maximum referencing objects to return (default: 500, max: 2000) | |
| locationsPerObject | No | Maximum number of call sites (methods/fields) to display per referencing object (default: 6, max: 20). Increase to see more usage locations. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds important behavioral context beyond the readOnlyHint and idempotentHint annotations: the operation is EXPENSIVE and performs a full index scan over O(1M+ chunks). It also discloses automatic normalization of label ID forms (`@SYS124480` vs `@SYS:124480`), which is not visible in annotations or schema. No contradiction exists between the description and 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?
The description is dense but every sentence earns its place: purpose, use case, cost warning, alternative routing, label behavior, and an exclusion. The most critical facts are front-loaded, and there is 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 tool with no output schema, the description provides sufficient context to select and invoke it correctly: what it searches, why to use it, how expensive it is, when to prefer an alternative, and how label IDs are handled. The parameter schema fills in limits and defaults, leaving no critical 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?
The schema already covers all three parameters with detailed descriptions, so the baseline is 3. The description adds value by clarifying that the `name` parameter accepts not only object/method names but also fields and label IDs, and by explaining the dual label ID forms. This goes slightly beyond what the schema alone 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 and resource: a full index scan for all usages of an object, method, field, or label ID. It clearly distinguishes itself from sibling tools by naming find_callers and find_extensions as different alternatives. This leaves no ambiguity about what the tool does.
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 explicitly says when to use this tool (impact analysis before changing or deleting an object) and when not to use it (NOT for extensions only — use find_extensions). It also names the preferred alternative, find_callers, with the condition that the XRef index is loaded. This is excellent routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_relation_pathARead-onlyIdempotentInspect
WHEN: you need to know HOW two AOT objects are connected -- the chain of relations linking them. Triggers: 'how is X related to Y', 'comment X est lié à Y', 'path between', 'chemin entre', 'lien entre deux tables', 'connection between', 'is X reachable from Y'. Walks the pre-computed relation graph (FK, DeleteAction, DataSource, Extension, Security edges -- both directions) and returns the SHORTEST navigation path(s) as a chain of object names + edge kinds. Token-light: returns ONLY names and relation kinds, never full object source. O(1)-per-node BFS, no vector scan. Use get_relation_graph for the full neighbourhood of a single object; use this to traverse multiple hops between two known objects.
| Name | Required | Description | Default |
|---|---|---|---|
| source | Yes | Start object name, e.g. 'SalesTable' | |
| target | Yes | Destination object name, e.g. 'CustTable' | |
| maxDepth | No | Maximum hops to traverse (default: 4, max: 8). Higher = slower, more paths. | |
| maxPaths | No | Maximum number of distinct paths to return (default: 5, max: 20). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and idempotentHint=true, and the description is consistent with them (no contradiction). Beyond annotations, it discloses valuable behavioral traits: bidirectional edge traversal, shortest-path guarantee, the specific edge kinds included (FK, DeleteAction, DataSource, Extension, Security), token-light output that never returns full object source, and O(1)-per-node BFS cost. This materially helps an agent reason about cost and output size before invoking.
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?
Well front-loaded with the WHEN clause, and every sentence earns its place: triggers, mechanism, output format, token-light note, complexity, and sibling routing. It is slightly long due to the trigger-phrase list, but that list directly aids an agent's selection matching, so the length is justified.
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 properly conveys the return shape ('chain of object names + edge kinds'), and annotations cover the safety profile. It is missing edge-case behavior for what happens when no path exists within maxDepth or when source/target are identical or unreachable, but this is a minor gap against an otherwise rich definition.
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 fully documents source, target, maxDepth, and maxPaths with defaults and bounds. The description adds only loose context ('multiple hops', 'SHORTEST path'), not operational detail beyond the schema. 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+resource combination ('Walks the pre-computed relation graph... returns the SHORTEST navigation path(s)'), which is far more precise than the name alone. It explicitly differentiates from the sibling get_relation_graph: full neighbourhood of one object vs. multi-hop traversal between two known objects.
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?
Opens with a WHEN clause stating the exact condition ('you need to know HOW two AOT objects are connected') and gives concrete trigger phrases in two languages. It also names the alternative explicitly ('Use get_relation_graph for the full neighbourhood of a single object; use this to traverse multiple hops between two known objects'), leaving no selection ambiguity.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_similar_implementationsARead-onlyIdempotentInspect
Find D365 objects structurally similar to the one you supply (same kind, similar method set, similar field set). Useful when you need a working reference implementation to copy from.
| Name | Required | Description | Default |
|---|---|---|---|
| maxResults | No | Maximum results (default: 15, max: 30) | |
| objectName | Yes | Object name to find similar objects for, e.g. 'ALMERSftpConnectionTable', 'SalesTable' | |
| filterAotType | No | Optional: filter to a specific AOT type, e.g. 'AxTable', 'AxClass'. If not set, uses the same type as the source object. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and idempotentHint, so the safety profile is covered. The description adds behavioral context beyond that by explaining how similarity is determined (same kind, method set, field set), which shapes an agent's expectations about results. There is no contradiction between the description and 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?
Two sentences with no filler. The primary action and similarity criteria are front-loaded, and the use case is provided in a compact second sentence. Every clause earns its place.
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 read-only search tool with full schema coverage and safety annotations, the description is complete. It explains what the tool finds, how similarity is judged, and when to use it. No output schema is present, but the return semantics ('find objects') are clear enough for 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 description coverage is 100%, so the schema already documents objectName, maxResults, and filterAotType adequately. The description adds no parameter-specific semantics beyond referring to 'the one you supply,' so it does not need to compensate. 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 uses the specific verb 'Find' with a clear resource: D365 objects structurally similar to a supplied object. It further defines what 'structurally similar' means (same kind, similar method set, similar field set), which distinguishes it from siblings like compare_objects or find_related_objects. The utility statement about reference implementations makes the intended purpose 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 provides a clear usage trigger: 'Useful when you need a working reference implementation to copy from.' It conveys when to use the tool but does not explicitly name alternatives or state when not to use it. Most agents can infer the boundary against comparison/similarity tools, but the guidance is not fully explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fix_best_practice_violationsARead-onlyIdempotentInspect
WHEN: validate_best_practices returned violations and you want concrete X++ fix suggestions. Returns each BP violation with its built-in fix suggestion AND (when Ollama is available) an AI-generated X++ code patch using the source from the knowledge base. Triggers: 'fix best practice', 'corriger les violations', 'generate fix', 'patch BP'. Set generatePatches=true to call Ollama (ALMXPP_SUMMARIZE_MODEL) for code patches -- requires Ollama running at OLLAMA_HOST. Falls back to built-in fix suggestions if unavailable.
| Name | Required | Description | Default |
|---|---|---|---|
| objectName | Yes | Object or method to fix, e.g. 'SalesLine' or 'SalesLine.insert'. | |
| maxViolations | No | Max violations to process (1-20, default 10). | |
| generatePatches | No | Generate X++ code patches via Ollama (requires OLLAMA_HOST). Default false. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and idempotentHint=true, and the description reinforces this by saying the tool 'returns' suggestions and patches rather than applying changes. It openly discloses the external Ollama dependency, the required OLLAMA_HOST, the model name, and the fallback behavior when Ollama is unavailable.
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 with the primary use case. Trigger phrases add a bit of length but help with selection. It remains information-dense without being bloated.
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 moderate-complexity tool with annotations and full schema coverage, the description covers the key context: triggering condition, return content, Ollama dependency, and fallback. It does not detail the exact response structure, but the described output shape is probably sufficient without 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 coverage is 100%, so the schema documents all parameters. The description adds meaningful semantics beyond the schema, especially for generatePatches, by naming the model (ALMXPP_SUMMARIZE_MODEL), the Ollama requirement, and the fallback to built-in suggestions. Other parameters are adequately covered by 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 purpose: return BP violations with fix suggestions and AI-generated X++ patches. It explicitly frames the tool as a follow-up to validate_best_practices, which distinguishes it clearly from the closest sibling and from other fix/suggestion 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?
The description gives a clear precondition ('WHEN: validate_best_practices returned violations') and explains when Ollama should be used via generatePatches. It does not explicitly list when not to use the tool or name alternatives beyond validate_best_practices, but the context is strong.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
generate_data_entityARead-onlyInspect
WHEN: developer needs to CREATE a data entity (AxDataEntityView) AOT XML from a table for OData/DMF/data migration. Triggers: 'create data entity', 'generate entity', 'créer une data entity', 'exposer table via OData', 'DMF entity', 'entity for OData', 'entité de données', 'générer entity XML', 'AxDataEntityView pour', 'data entity from table'. Produces complete AxDataEntityView AOT XML with data sources, field mappings, entity key, IsPublic/PublicEntityName for OData, staging table template. Uses real field names and relations from the local custom model. ALWAYS call find_entity_for_table first to verify a standard entity doesn't already exist.
| Name | Required | Description | Default |
|---|---|---|---|
| fields | No | Optional: specific fields to include (comma-separated). All fields if not specified. | |
| isPublic | No | Whether the entity should be available via OData (default: true) | |
| tableName | Yes | Primary table name, e.g. 'SalesTable', 'CustTable' | |
| entityName | Yes | Desired entity name, e.g. 'ALMSalesOrderEntity' | |
| joinTables | No | Optional: additional tables to join (comma-separated), e.g. 'CustTable,InventDim' | |
| publicEntityName | No | Optional: OData collection name (e.g. 'SalesOrders'). Auto-generated if not provided. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With readOnlyHint=true already signaling no mutation, the description adds meaningful behavioral context by detailing what is produced: complete AxDataEntityView XML with data sources, field mappings, entity key, IsPublic/PublicEntityName, and staging table template. It also notes the use of real field names and relations from the local model.
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 WHEN trigger, then output details, then the critical prerequisite. The trigger phrase list is long but serves a useful routing purpose; overall, every sentence contributes information without meaningless 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 6-parameter tool with no output schema, the description covers the artifact produced, its contents, the source model, and the mandatory pre-check. It is sufficient for correct invocation, though it could add a note about what happens if a standard entity already exists.
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 input schema already documents all six parameters well. The description adds some context around IsPublic/PublicEntityName and field mappings, but it does not materially extend the schema's parameter-level explanations.
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 the tool generates AxDataEntityView AOT XML from a table for OData/DMF/data migration, with a specific resource and output type. It also differentiates this from siblings like get_data_entity_info and create_aot_object by naming the exact XML artifact and use case.
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 explicitly states WHEN to use it, provides concrete trigger phrases, and instructs 'ALWAYS call find_entity_for_table first to verify a standard entity doesn't already exist.' This gives clear routing and an explicit alternative/check before using the tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
generate_diagramARead-onlyIdempotentInspect
WHEN: generating a visual diagram of D365 table relationships or security chains. Triggers: 'generate diagram', 'diagramme', 'visualize', 'schéma', 'ER diagram', 'entity-relationship', 'relation diagram', 'security diagram', 'show connections'. Generate visual Mermaid diagrams from D365 F&O knowledge base data. Diagrams render directly in Copilot Chat, Cursor, Claude, and markdown viewers. Types: 'er' (entity-relationship diagram for a table and its relations), 'security' (security chain: Role->Duty->Privilege->EntryPoints -- use when you need a VISUAL Mermaid diagram; for the structured text chain with tables of duties/privileges/entry-points use trace_security_chain instead). Note: 'flow' (execution flowchart) is disabled -- static call trees are misleading in D365 due to CoC and event handlers.
| Name | Required | Description | Default |
|---|---|---|---|
| maxRelated | No | Optional: maximum related entities to show (default: 12, max: 20) | |
| methodName | No | Not used -- flow diagrams are disabled. | |
| objectName | Yes | Object name to diagram, e.g. 'SalesTable', 'SystemAdministrator' | |
| diagramType | Yes | Diagram type: 'er' (entity-relationship) or 'security' (security chain). 'flow' is disabled. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and idempotentHint=true, lowering the bar. The description adds useful behavior: diagrams render in Copilot Chat, Cursor, Claude, and markdown viewers, and it discloses that 'flow' is disabled because 'static call trees are misleading in D365 due to CoC and event handlers'. This context goes beyond the schema and annotations without contradicting them.
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 longer than average but tightly structured with labeled sections (WHEN, triggers, types, note). Every sentence earns its place, and the flow-disabled note prevents wasted calls. The trigger enumeration is somewhat verbose but directly serves the agent-routing purpose.
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 two-required-param diagram tool with readOnly/idempotent annotations, this is complete: it covers when to use, what it produces, where output renders, valid input values, the alternative sibling, and a disabled value. The absence of an output schema is compensated by explicitly stating the Mermaid output format.
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 the baseline is 3. The description adds meaning by expanding diagramType semantics — 'er' as 'entity-relationship diagram for a table and its relations' and 'security' as the Role->Duty->Privilege->EntryPoints chain — and by revealing that methodName is unused. This exceeds what the schema alone communicates.
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: 'Generate visual Mermaid diagrams from D365 F&O knowledge base data' for 'table relationships or security chains'. It explicitly distinguishes itself from the sibling `trace_security_chain`, so an agent can reliably separate it from nearby tools like `generate_security_report` or `get_relation_graph`.
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 'WHEN:' clause plus explicit trigger words ('generate diagram', 'diagramme', 'ER diagram') tell the agent exactly when to fire. It gives when-not guidance too: 'for the structured text chain with tables of duties/privileges/entry-points use `trace_security_chain` instead', and flags that 'flow' is disabled — no inference required.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
generate_fddARead-onlyInspect
WHEN: user asks to write or generate a Functional Design Document, FDD, functional spec, CdC, or cahier des charges. NOT for developer technical docs -- use get_object_details for that.
FUNCTIONAL DESIGN DOCUMENT GENERATOR -- Produces a structured FDD ready for review and sign-off.
Sections generated: Purpose, Business Context, Data Fields (with resolved labels), Business Rules, Related Objects, Security, and Open Questions.
Triggers: 'write FDD for', 'generate FDD', 'functional spec for', 'document this process', 'write functional design', 'rédiger le cahier des charges', 'CdC pour', 'fiche de conception'.
| Name | Required | Description | Default |
|---|---|---|---|
| context | No | Optional: additional business context, requirements, or audience note to include in the header | |
| language | No | Optional: output language ('en', 'fr', 'nl', 'de'). Default: en | en |
| objectName | Yes | D365 object or business process name, e.g. 'SalesTable', 'VendInvoiceInfoTable', 'ALMDemandeAchat' |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint annotation already covers the safety profile, and the description adds transparency about what the generated FDD includes (Purpose, Business Context, Data Fields with resolved labels, Business Rules, etc.). It also states the output is 'ready for review and sign-off,' which implies a structured, human-ready deliverable. No contradiction with the annotation; overall the description enriches behavioral understanding.
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 structured and front-loaded with WHEN, but it contains redundancy: the 'WHEN' paragraph and the 'Triggers' paragraph list overlapping examples. The all-caps 'FUNCTIONAL DESIGN DOCUMENT GENERATOR' acts as a title and adds some clutter. It's not overly long, but every sentence doesn't earn its place due to 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 relatively simple generator with 3 parameters and no output schema, the description covers the essential context: when to use it, what it produces, the sections included, and the alternative for technical docs. It doesn't describe the return format (e.g., markdown vs plain text), but that is a minor gap given the clear output description. Overall the tool is well contextualized.
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 three parameters adequately. The description adds minimal parameter-level meaning beyond the schema; it hints at 'resolved labels' as part of the generated document but doesn't explain how parameters affect output. Baseline 3 is appropriate because 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?
The description clearly states a specific action: generating a Functional Design Document, and lists the exact document types (FDD, functional spec, CdC, cahier des charges). It differentiates itself from get_object_details by warning that it is NOT for technical developer docs. The description also enumerates the sections generated, making the tool's purpose 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 provides explicit when-to-use guidance with trigger phrases, and an explicit exclusion: 'NOT for developer technical docs -- use get_object_details for that.' This directly routes the agent to the correct sibling tool when the request is technical rather than functional. The trigger list is highly actionable and covers multiple language variants.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
generate_queryARead-onlyIdempotentInspect
WHEN: developer needs correct X++ select or T-SQL for D365 tables with proper joins. Triggers: 'X++ select', 'generate a query', 'SQL for', 'join with', 'how to query', 'générer une requête', 'write a select statement', 'select from', 'X++ query for', 'requête X++', 'écrire une select'. Generate both X++ select statements and equivalent T-SQL queries for D365 F&O tables. Uses real field names, relations, and indexes from the knowledge base to produce correct joins. Supports: field selection, multi-table joins (auto-detects relations), WHERE filters, ORDER BY, TOP/firstonly, cross-company. Also accepts natural language descriptions like 'find all open sales orders for customer 1001 with CustTable join'. [!] For multi-table joins, call find_related_objects (or get_relation_graph if the relation index is loaded) FIRST to get the correct FK relations -- this tool will then produce accurate join conditions. [!] The generated X++ is a template -- adapt it to your custom code context before using in production. Returns side-by-side X++ and SQL with explanations.
| Name | Required | Description | Default |
|---|---|---|---|
| top | No | Optional: limit rows (1 = firstonly, N = top N) | |
| fields | No | Optional: specific fields to select (comma-separated). All fields if not specified. | |
| filters | No | Optional: WHERE filter expressions (comma-separated), e.g. 'CustAccount == 1001, SalesStatus == SalesStatus::Open' | |
| orderBy | No | Optional: field to ORDER BY | |
| tableName | Yes | Primary table name, e.g. 'SalesTable', 'CustTable' | |
| joinTables | No | Optional: tables to join (comma-separated), e.g. 'CustTable,SalesLine' | |
| description | No | Optional: natural language description of the query. If provided, fields/joins/filters are auto-detected. | |
| crossCompany | No | Whether to add crosscompany clause (default: false) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark the tool readOnly and idempotent, and the description adds substantial behavioral context beyond that: it 'uses real field names, relations, and indexes from the knowledge base', returns 'side-by-side X++ and SQL with explanations', and explicitly states the generated X++ is 'a template -- adapt it to your custom code context before using in production.' This goes well beyond the annotations and helps the agent set correct expectations.
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 longer than average, but the length is justified by trigger phrases, capability list, and critical usage caveats. It is front-loaded with the WHEN clause and important notes. It could be tightened slightly by trimming some redundant trigger examples, but every major section earns its place.
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 tool with 8 parameters, no output schema, and readOnly/idempotent annotations, the description covers what is needed to call it correctly: capabilities, parameter interactions via natural language, join dependency on find_related_objects, output format, and production-readiness caveat. Nothing critical 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 description coverage is 100%, so the input schema already documents all 8 parameters. The description summarizes capabilities such as 'multi-table joins (auto-detects relations)', 'WHERE filters', 'ORDER BY', 'TOP/firstonly', and 'cross-company', but it does not add deeper syntax or format details beyond the schema. 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?
Description states a specific verb and resource: generate 'X++ select statements and equivalent T-SQL queries for D365 F&O tables'. It clearly distinguishes from siblings like generate_xpp_template or generate_data_entity by focusing on query generation with real field names, relations, and indexes.
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?
Provides explicit WHEN triggers like 'X++ select', 'generate a query', 'SQL for', and 'join with', making it clear when this tool is intended. It also gives a mandatory precondition for multi-table joins: 'call find_related_objects (or get_relation_graph if the relation index is loaded) FIRST' — strong routing and sequencing guidance, plus a warning to adapt generated X++ before production use.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
generate_release_note_documentAInspect
WHEN: you have already called prepare_release_note_context and analyzed its 'objects' array yourself, producing a findings JSON array per the 'instructions' field it returned. This tool renders that findings array into a downloadable Word (.docx, detailed appendix) and PowerPoint (.pptx, executive summary) release note and returns their download URLs. Does NOT call any LLM itself -- the reasoning must already be done by you.
| Name | Required | Description | Default |
|---|---|---|---|
| v1 | Yes | Older D365FO version (same value passed to prepare_release_note_context). | |
| v2 | Yes | Newer D365FO version (same value passed to prepare_release_note_context). | |
| findingsJson | Yes | JSON array of your findings, one per object from prepare_release_note_context's 'objects' array. Schema: [{"aotType":"...","objectName":"...","changeType":"Added|Removed|Modified","riskLevel":"Critical|Warning|Info|None","whatChanged":"...","documentedInMsLearn":true|false,"msLearnReference":"...","undocumentedReason":"...","regressionRisk":"...","opportunity":"...","recommendation":"..."}] | |
| touchedAdded | Yes | touchedAdded count returned by prepare_release_note_context. | |
| touchedRemoved | Yes | touchedRemoved count returned by prepare_release_note_context. | |
| businessContext | No | Optional business/functional context (same value passed to prepare_release_note_context), included in the Word document. | |
| touchedModified | Yes | touchedModified count returned by prepare_release_note_context. | |
| customModelLabel | Yes | Custom model label(s) -- use the customModelLabel field returned by prepare_release_note_context. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint=false annotation, the description discloses that the tool performs no LLM reasoning, generates two document formats, and returns download URLs. This gives the agent a clear model of the tool's side-effect-free rendering behavior, though it does not elaborate on storage duration or access control for the generated files.
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 with the critical precondition, followed by the output format and the no-LLM behavior. Every sentence carries essential information 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 an 8-parameter tool with no output schema, the description covers the overall workflow, input provenance, output types, and the key constraint that reasoning must happen before invoking this tool. It could mention error cases or how to handle the returned URLs, but the clear pipeline context and full schema coverage make it sufficiently 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?
Schema description coverage is 100%, so the baseline is 3. The description reinforces that fields like v1, v2, customModelLabel, and counts should be echoed from prepare_release_note_context, but most parameter-level meaning is already in the schema. The findingsJson schema is documented in the input schema, so the description does not need to repeat it.
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 ('renders') and a clear resource (the findings array) into concrete outputs: Word .docx appendix and PowerPoint .pptx executive summary, returning download URLs. It is clearly distinguished from prepare_release_note_context, which produces the context rather than rendering the final documents.
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 explicitly states the precondition: call prepare_release_note_context first, analyze its objects array, and produce the findings JSON per the instructions field. It also warns that the tool does NOT call an LLM itself, so the agent knows not to delegate reasoning to this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
generate_security_reportARead-onlyInspect
Generate a security & licensing governance report for the indexed model(s). For each role, lists duties, privileges, entry points and the inferred user-license tier (Activity, Operations, Finance, etc.). Surfaces orphan duties/privileges that grant no real access.
| Name | Required | Description | Default |
|---|---|---|---|
| filterModel | No | Optional: restrict the report to a single model name (e.g. 'ApplicationSuite', 'ContosoCustom'). Empty = all indexed models. | |
| maxRolesDetail | No | Maximum number of roles to expand in detail (default 50, max 200). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint annotation already establishes that this is a safe read operation. The description adds non-obvious behavioral context by explaining that the report surfaces orphan duties/privileges that grant no real access and includes inferred license tiers. This goes beyond what the annotation alone provides, though it does not mention output format or performance implications.
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, no filler, with the main purpose front-loaded in the first sentence and useful specifics in the following two. Every sentence earns its place.
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 does a good job of explaining what the generated report contains. It covers model scoping, the per-role breakdown, license-tier inference, and orphan detection. It stops short of describing the exact output structure or delivery mechanism, but for an optional-parameter read-only report tool this is close to 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 description coverage is 100%, so both filterModel and maxRolesDetail are already well documented in the input schema. The description adds no additional parameter-level meaning, so the baseline score of 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 names a specific verb ('Generate'), a specific resource ('security & licensing governance report'), and the exact contents of the report: roles, duties, privileges, entry points, and inferred license tiers. This clearly distinguishes it from sibling security tools by emphasizing the governance-report angle and the orphan-duty detection.
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: use this when you need a governance report for indexed models. However, it does not explicitly say when to choose this over related siblings like get_security_coverage_for_object or trace_security_chain, and it offers no 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.
generate_unit_testARead-onlyInspect
WHEN: developer needs to write or scaffold unit tests for a custom D365 object. Triggers: 'generate tests', 'unit test', 'SysTest', 'write test for', 'scénarios de test', 'test this class'. Generate X++ SysTest unit test code for a CUSTOM D365 F&O object based on functional test scenarios. [!] Only meaningful on custom/extension code (D365_CUSTOM_MODEL_PATH). SysTest tests in D365 are highly context-specific -- a generic template rarely compiles without adaptation. REQUIRED: provide test scenarios in the 'testScenarios' parameter (supplied by the functional consultant). Each scenario becomes a concrete test method with arrange/act/assert. For tables: generates tests for find(), exist(), validateWrite(), initValue(). For classes: generates stubs for each public method listed in scenarios. Uses REAL field names and method signatures from the knowledge base.
| Name | Required | Description | Default |
|---|---|---|---|
| methodName | No | Optional: specific method to test. If not provided, generates tests for all testable methods. | |
| objectName | Yes | Object name to generate tests for, e.g. 'ALMERSftpConnectionTable', 'ALMMyClass' | |
| sampleValues | No | Optional: JSON object mapping field name to sample value used in each ARRANGE block, e.g. '{"AccountNum":"C0001","Amount":1500.50}'. Replaces the 'TODO: set up test data' placeholders with concrete assignments. | |
| testScenarios | No | Test scenarios provided by the functional consultant, e.g. 'Create a connection with valid SFTP host; Validate that empty host fails; Delete cleans up related records'. Separate scenarios with semicolons. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint annotation, the description discloses that generated templates 'rarely compiles without adaptation,' implying the output needs manual work. It also explains per-type behavior (find(), exist(), validateWrite(), initValue() for tables; stubs for public methods for classes) and states it uses 'REAL field names and method signatures from the knowledge base.' No contradiction with readOnlyHint since generating code without persisting is read-only.
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 well-structured: trigger phrases and the WHEN condition are front-loaded, and the [!], REQUIRED, and per-type notes are scannable. Every sentence contributes (triggers, scope, caveat, required input, behavior, knowledge-base sourcing). It is on the longer side, but that length is justified for a code-generation tool with this complexity.
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 tool with no output schema and minimal annotations, the description covers when to use it, prerequisites, required inputs, per-object-type behavior, and a quality caveat. Minor gaps remain: it doesn't state the delivery format of the generated code (returned in-chat vs. file creation) and the fourth parameter's semantics are left entirely to the schema. These are modest omissions against an otherwise thorough definition.
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 the baseline is 3. The description adds genuine value beyond the schema by elevating testScenarios to REQUIRED (overriding the schema's optional flag), clarifying that each scenario becomes a concrete test method with arrange/act/assert, and specifying which generated methods apply per object type. This is meaningful semantic enrichment rather than repetition.
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 verb and resource: 'Generate X++ SysTest unit test code for a CUSTOM D365 F&O object.' It also carves out a distinct scope by insisting on custom/extension code only, which separates it from sibling generators like generate_xpp_template, generate_xpp_form, and generate_data_entity. An agent can tell what this tool does and what it is not for.
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 explicit when-to-use context (WHEN: developer needs unit tests), concrete trigger phrases, and a hard constraint ('[!] Only meaningful on custom/extension code') that acts as a when-not on standard code. It misses explicit naming of an alternative sibling tool to route to, so it falls just short of full 5-level guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
generate_xpp_formARead-onlyInspect
Generate a complete, compilable AxForm AOT XML with the CORRECT control serialization () for the requested pattern. Patterns: SimpleList, DetailsMaster, DetailsTransaction, ListPage, Dialog, DropDialog, Workspace, Extension. After generation, call validate_form_pattern on the result before write_aot_object.
| Name | Required | Description | Default |
|---|---|---|---|
| fields | No | Comma-separated field names to include in the grid/header, e.g. 'AccountNum,Name,Status' | |
| formName | Yes | PascalCase form name, e.g. 'ALMCustomerForm' | |
| modelName | No | Model name for label prefix, e.g. 'ALMMyModel' | |
| fieldTypes | No | Optional: comma-separated control type per field (aligned 1:1 with fields). Values: String, Int, Real, Date, DateTime, Enum, CheckBox, Reference. If omitted, all fields default to AxFormStringControl (current behavior). | |
| formPattern | Yes | Form pattern: 'SimpleList', 'DetailsMaster', 'DetailsTransaction', 'ListPage', 'Dialog', 'DropDialog', 'Workspace', 'Extension' | |
| primaryTable | No | Primary/header table name, e.g. 'ALMCustomerTable' | |
| secondaryTable | No | Secondary/joined table name (DetailsTransaction: lines table; ListPage: InnerJoin lookup table), e.g. 'SalesTable' |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint=true already signals a safe, non-mutating operation, and the description adds that it produces compilable XML and should be followed by validation/write steps. It does not contradict annotations, but it also does not describe the exact return shape or failure behavior.
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 with no filler: the first states the purpose and accepted patterns, the second gives the required post-generation sequence. The critical constraints are front-loaded.
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 7-parameter tool with no output schema, the description gives the key workflow context (validate, then write) and the pattern domain. It could explicitly state the return type, but 'Generate...XML' and 'call validate_form_pattern on the result' make the output nature clear.
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 heavy lifting is already done by the input schema. The description does not add parameter-level meaning beyond listing patterns, which is acceptable; it neither restates nor contradicts 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 ('Generate'), a concrete resource ('complete, compilable AxForm AOT XML'), and the key technical detail of correct control serialization. This clearly distinguishes it from sibling generators like generate_data_entity, generate_query, and create_aot_object.
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 explicitly enumerates the supported form patterns, telling the agent when the tool applies. It also prescribes a follow-up workflow: validate_form_pattern before write_aot_object. It lacks explicit 'do not use when...' alternatives, but the pattern list and pipeline are clear enough.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
generate_xpp_templateARead-onlyInspect
WHEN: writing an extension or customization -- generates ready-to-use X++ code. Triggers: 'génère un CoC', 'crée une extension', 'generate extension', 'write a CoC class', 'event handler pour', 'template pour'. Uses REAL metadata from the KB (actual field names, method signatures). 'coc' = Chain of Command class, 'table_extension' = extend table with fields/methods, 'event_handler' = pre/post event handler, 'job' = runnable class, 'find_method' = find/exist pattern. ALWAYS call get_object_details first to verify the object exists.
| Name | Required | Description | Default |
|---|---|---|---|
| methodName | No | Optional: specific method name for CoC or event handler templates | |
| objectName | Yes | The base object, e.g. 'SalesTable', 'VendInvoiceJour' | |
| templateType | Yes | Template type: 'coc', 'table_extension', 'event_handler', 'job', 'find_method' |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations only provide readOnlyHint=true, and the description does not contradict that. The description adds useful behavioral context by disclosing the dependency on KB metadata ('REAL metadata from the KB') and the requirement to verify object existence first. It does not cover failure modes or return format, but the added context goes beyond 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?
The description is dense and front-loaded with 'WHEN', and nearly every clause earns its place by providing triggers, template definitions, or a prerequisite. The run-on structure with long lists slightly reduces readability, but it remains appropriately sized.
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 3-parameter tool with no output schema and many siblings, the description provides enough to understand when to invoke it, what inputs to pass, and what to do first (calling get_object_details). It omits the expected output shape and edge-case behavior, but covers the essential selection and invocation requirements.
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 the baseline is 3. The description adds meaning by defining each templateType value ('coc' = Chain of Command, etc.) and clarifying that methodName is for CoC or event handler templates. This extra semantic detail justifies a 4.
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 ('generates') and resource ('ready-to-use X++ code') for extensions/customizations. It also enumerates supported template types (coc, table_extension, event_handler, job, find_method), which clearly distinguishes it from sibling tools like generate_xpp_form or generate_query.
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 an explicit 'WHEN' clause, concrete trigger phrases, and a mandatory prerequisite to call get_object_details first. However, it does not explicitly name sibling tools as alternatives or state when not to use this tool, so it doesn't fully meet the 'when-not/alternatives' bar.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_data_entity_infoARead-onlyIdempotentInspect
WHEN: developer building an OData / DMF integration needs a quick rundown of a specific data entity: its public OData name, datasources, key fields, and IsPublic status. Triggers: 'data entity info', 'OData entity details', 'is X a public entity', 'entity datasources'. Cloud-safe: pure metadata read from the KB.
| Name | Required | Description | Default |
|---|---|---|---|
| entityName | Yes | Data entity name (AxDataEntityView), e.g. 'CustCustomerV3Entity', 'SalesOrderHeaderV2Entity'. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and idempotentHint. The description adds value by stating it is Cloud-safe and a pure metadata read from the KB, reinforcing the non-mutating nature and providing context about the data source.
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 with the key WHEN context, followed by useful trigger phrases and a safety note. Every element earns its place, and 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?
This is a simple read-only tool with one well-documented parameter and no output schema. The description explicitly lists what the tool returns, making it complete enough for an agent to select and invoke 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 coverage is 100% and the single parameter is already well-described with an example. The description adds no additional parameter-level detail, so the schema carries the burden and the baseline of 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 clearly states the tool retrieves metadata for a specific data entity: public OData name, datasources, key fields, and IsPublic status. It distinguishes itself from sibling tools by scoping to entity metadata lookups for OData/DMF integration contexts.
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 provides an explicit WHEN condition and trigger phrases, making it clear when an agent should use this tool. It does not explicitly name alternatives or when-not-to-use scenarios, but the context is sufficiently clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_object_contextARead-onlyIdempotentInspect
WHEN: you need a COMPLETE picture of a D365 object in ONE call. Returns in a single response: full structure (fields, method signatures, relation summary) AND all CoC extensions / event handlers -- equivalent to calling get_object_details THEN find_extensions. Use this INSTEAD of those two separate calls to reduce round-trips. Optionally includes best-practice violations (set includeValidation=true). Pass methodName to also include the full body of a specific method. Pass aotType to disambiguate when several AOT objects share the same name.
| Name | Required | Description | Default |
|---|---|---|---|
| aotType | No | Optional: AOT type to disambiguate, e.g. 'AxTable', 'AxClass', 'AxForm'. | |
| methodName | No | Optional: specific method name to include full body for. | |
| objectName | Yes | Exact object name, e.g. 'SalesTable', 'CustTable', 'VendInvoiceJour' | |
| includeValidation | No | Include best-practice violations (default false -- adds latency for large objects). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and idempotentHint, and the description adds meaningful behavior: it consolidates two operations into one response, includes best-practice violations only when requested, and warns that includeValidation adds latency for large objects. This goes beyond the structured metadata.
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 WHEN trigger and return summary, then routes to alternatives, then covers optional parameters. It is slightly long but every sentence contributes useful decision or invocation 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 no output schema, the description carries the burden of explaining what the tool returns, and it does: full structure, method signatures, relation summary, CoC extensions/event handlers, and optional validation data. It also covers all parameter behaviors, making the tool fully callable without external 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?
The input schema already describes all four parameters at 100% coverage, so the baseline is 3. The description adds extra value by explaining the effect of each parameter: methodName includes a full method body, aotType disambiguates same-named objects, and includeValidation adds best-practice checks with a latency tradeoff.
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?
Clearly states the tool returns a complete picture of a D365 object in one call, including structure and all CoC extensions/event handlers. It explicitly distinguishes itself from get_object_details and find_extensions, so an agent can tell exactly what this tool offers.
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?
Provides explicit WHEN guidance and names the alternatives: 'Use this INSTEAD of those two separate calls to reduce round-trips.' It also explains when to pass methodName, aotType, and includeValidation, which is actionable selection guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_object_detailsARead-onlyIdempotentInspect
WHEN: you know the EXACT object name. Triggers: user gives an exact name like 'SalesTable', 'CustTable', 'VendInvoiceJour', any PascalCase D365 object name. Get complete details: all fields, methods, relations, indexes, source code, and metadata. COST NOTE: this returns the FULL object and can be very large (100KB+ for big tables/forms like SalesLine). If you ONLY need relations / FK / DeleteActions / data sources / who-references, call get_relation_graph instead -- it is O(1) and roughly 6x lighter (no source code). Reserve get_object_details for when you genuinely need field details, method bodies, or source code. Also merges live disk source when a custom model path is configured (disk takes priority). Pass methodName to get the FULL body of a specific method -- without it, only signatures are returned. Calling twice -- first without methodName to get the full structure and method table, then again with a specific methodName for its full body -- is the CORRECT and INTENDED two-step pattern. Do NOT call a third time for the same object. DISAMBIGUATION: when a name exists as several AOT types (e.g. a Table AND a Form both named 'SalesLine'), this returns the PRIMARY type (Table/Class/Entity before the much heavier Form) and notes the others -- pass aotType (e.g. 'AxTable', 'AxForm', or shorthand 'table'/'form'/'class') to pick a specific one. This prevents dumping the heaviest object and truncating the rest. NOT for searching -- use search_d365_code when the name is uncertain. NOT for listing a model's objects -- use list_objects for that.
| Name | Required | Description | Default |
|---|---|---|---|
| aotType | No | Optional: AOT type to disambiguate when several objects share the name, e.g. 'AxTable', 'AxForm', 'AxClass' (shorthand 'table'/'form'/'class'/'enum'/'edt'/'view'/'entity' also accepted). When omitted and the name is ambiguous, the primary type (Table/Class/Entity before Form) is returned with a note listing the others. | |
| methodName | No | Optional: specific method name to return full body for, e.g. 'send', 'run', 'validate'. When provided, returns the complete method source instead of the signature table. | |
| objectName | Yes | The exact object name, e.g. 'SalesTable', 'VendInvoiceApprovalConfig', 'ALMAlternativeItemsTable' |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and idempotentHint, but the description goes far beyond by disclosing the potentially very large response (100KB+), the merged live disk source behavior with disk priority, the difference between signature-only and full method body output, and the primary-type selection behavior for ambiguous names. These are critical behavioral traits not visible in 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?
The description is dense but well-organized, front-loading the critical WHEN trigger and cost warning before parameter details. Every sentence contributes unique guidance—performance trade-offs, disambiguation behavior, alternatives, and prohibited uses—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?
Given the tool's complexity, the absence of an output schema, and the risk of huge responses, the description is remarkably complete. It covers triggers, exclusions, alternatives, parameter behavior, performance costs, ambiguity handling, and the intended multi-call workflow, leaving little for an agent 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?
Even though schema description coverage is 100%, the description adds significant meaning: methodName returns the full body rather than signatures and supports a two-step pattern; aotType disambiguates and accepts shorthand; objectName must be exact. This goes well beyond the schema's field descriptions and materially improves correct invocation.
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 clear verb and resource: 'Get complete details: all fields, methods, relations, indexes, source code, and metadata.' It also distinguishes itself from get_relation_graph, search_d365_code, and list_objects, making the tool's purpose unambiguous even among many 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?
The description explicitly states when to use the tool ('WHEN: you know the EXACT object name'), when not to use it ('NOT for searching', 'NOT for listing a model's objects'), and names the exact alternatives (get_relation_graph, search_d365_code, list_objects). It also gives the intended two-step usage pattern and warns against calling a third time.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_output_pageARead-onlyIdempotentInspect
Retrieve the NEXT page of a previously PAGINATED tool output. When a tool result is too large for a single response, it is split losslessly into ordered pages — the footer of each page gives you a token and the next page number. Call this tool with that token to read the continuation; nothing is dropped, so you can walk every page in order and reconstruct the full result. Pages are cached only briefly (the last few large results). If the token is unknown or expired, re-run the original tool to regenerate it.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | The page number to retrieve (the previous page footer tells you the next one). Defaults to 2. | |
| token | Yes | The pagination token from a paginated tool's footer, e.g. 'op_a1b2c3d4e5'. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and idempotentHint, and the description adds valuable behavioral context beyond that: pages are losslessly ordered, caching is brief, tokens can expire, and re-running the original tool regenerates the token. This gives the agent a clear mental model of underlying state and 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?
The description is front-loaded with the primary action, then explains the mechanism, cache behavior, and fallback in a compact sequence. Every sentence contributes necessary operating information; there is no filler or redundancy.
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 continuation tool, the description covers everything an agent needs: how to obtain the token, how to page through results, what happens if the token expires, and the recovery action. The absence of an output schema is acceptable because the expected output is the next page of the same paginated tool result, which the description implies sufficiently.
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%: both parameters already have descriptive text, including the token example 'op_a1b2c3d4e5' and the page default. The description reinforces this by referencing the footer-provided token, but it does not add significant new meaning beyond what the schema already provides, so a baseline score 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: 'Retrieve the NEXT page of a previously PAGINATED tool output.' It clearly distinguishes itself from the domain-specific sibling tools by framing itself as a meta-tool for paginated results, so an agent can instantly recognize its unique role.
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 clearly explains when to use the tool: when a tool result is too large and the page footer provides a token and next page number. It also gives a conditional alternative ('re-run the original tool') if the token is unknown or expired. It does not explicitly name sibling alternatives, but no siblings compete with this pagination function.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_relation_graphARead-onlyIdempotentInspect
WHEN: you need the COMPLETE bidirectional relation graph for an object in ONE call. Triggers: 'relations of', 'FK of', 'what tables link to', 'quelles tables liées à', 'avant de générer du code', 'before generating code', 'foreign keys', 'delete actions', 'who references', 'qui référence', 'graph de relations'. Returns ALL outgoing edges (FK relations, DeleteActions, DataSources, Extensions, Security...) AND all incoming back-references (forms, entities, CoC classes, privileges... that reference it). Backed by the pre-computed relation index -- O(1) lookup, no vector scan. Much faster and more complete than find_related_objects for known object names. ALWAYS call this before generating code that touches multiple objects or requires join logic. Use find_related_objects when the relation index is not yet built (fallback to vector scan).
| Name | Required | Description | Default |
|---|---|---|---|
| maxEdges | No | Maximum edges to show per direction (default: 200, max: 500) | |
| objectName | Yes | The exact object name, e.g. 'SalesTable', 'CustTable', 'SalesFormLetter' | |
| aotTypeFilter | No | Optional: filter edges by relation kind to reduce noise. Comma-separated. Examples: 'TableFK', 'DeleteAction', 'Extension', 'DataSource', 'Security'. Leave empty for all kinds. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark this as read-only and idempotent. The description adds meaningful behavioral context: it returns all outgoing and incoming edge types, is backed by a pre-computed index with O(1) lookup, and avoids vector scan. This goes beyond what annotations alone convey. It could mention pagination/limits behavior, but the coverage is strong.
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 and well-structured, front-loading the WHEN and trigger phrases. It includes multilingual trigger examples that add length but also practical value for an agent. Slightly longer than strictly necessary, yet every sentence contributes either usage guidance, output scope, performance context, or fallback routing.
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 tool's complexity, the full schema coverage, and read-only/idempotent annotations, the description is complete. It covers what the tool returns, why it is fast, when to prefer it, and when to use the fallback. The absence of an output schema is acceptable because the description explains the shape of results at a high level.
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 carries the documentation burden for all three parameters. The description does not add much parameter-level semantics beyond what the schema already provides, though it reinforces that objectName should be a known object name and that edge kinds can be filtered. 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 the tool's specific purpose: retrieving the COMPLETE bidirectional relation graph for an object in one call. It clearly distinguishes itself from find_related_objects by being faster and more complete for known object names, and lists concrete trigger phrases like 'relations of' and 'foreign keys'.
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 explicit when-to-use guidance, including trigger phrases and a strong directive to ALWAYS call this before generating code touching multiple objects. It also names the alternative (find_related_objects) and specifies the exact condition for using it: when the relation index is not yet built.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_security_coverage_for_objectARead-onlyIdempotentInspect
WHEN: developer/security architect needs to know WHICH ROLES can access a specific form, table, menu item or service operation. Triggers: 'who can access', 'which roles see', 'security coverage for', 'quels roles ont accès à', 'find roles with access'. Walks the security graph backwards (EntryPoint -> Privilege -> Duty -> Role) and returns all roles that grant any level of access (Read / Update / Create / Delete / Correct) on the given object. Read-only: scans the in-memory KB, never writes.
| Name | Required | Description | Default |
|---|---|---|---|
| maxRoles | No | Maximum roles to expand (default 30, max 100). | |
| minGrant | No | Optional: minimum grant level to include in results. Values: 'Read', 'Update', 'Create', 'Delete', 'Correct', 'Any'. Default: 'Any'. | Any |
| objectName | Yes | Object name to audit (form, table, menu item, service operation). Example: 'CustTable', 'SalesTableListPage', 'CustCustomerServiceMenu'. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and idempotentHint. The description reinforces these by stating 'Read-only: scans the in-memory KB, never writes' and adds useful behavioral detail about traversing the security graph and returning roles at any grant level. This goes beyond the annotations without contradicting them.
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 well-structured and front-loaded: it opens with WHEN, includes trigger examples, explains the mechanism, and ends with the safety guarantee. Every sentence contributes to intent matching or invocation knowledge, 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 read-only, in-memory lookup with fully documented parameters, the description provides the essential outcome (returned roles), scope (specific object types), and mechanism. It lacks an explicit return-format note, but since there is no output schema, a brief statement of the result shape would make it fully 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 100%, so the schema already documents objectName, maxRoles, and minGrant with descriptions and examples. The description adds contextual value by clarifying that the tool returns roles with 'any level of access (Read / Update / Create / Delete / Correct)', but it does not substantially extend the parameter semantics 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?
The description clearly states the tool's purpose: given a specific object (form, table, menu item, or service operation), it returns all roles that can access it. The verb 'get' plus the resource 'security coverage for object' is precise, and the backward graph traversal (EntryPoint -> Privilege -> Duty -> Role) concretely distinguishes it from sibling tools like trace_security_chain or generate_security_report.
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 provides WHEN guidance and explicit trigger phrases ('who can access', 'which roles see', 'find roles with access'), making the intended invocation clear. It does not name alternative tools or state when not to use this tool, so it falls just short of full exclusion-based guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
healthcheckARead-onlyInspect
WHEN: checking server status, loaded D365 version, or custom model path. Triggers: 'status', 'statut', 'is the server ready', 'how many chunks', 'index loaded'. Returns JSON with: status, indexed chunk count, loaded version, custom model path.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint annotation already establishes that this is a safe read operation. The description adds useful behavioral detail by stating that it returns a JSON payload with status, indexed chunk count, loaded version, and custom model path, and by listing trigger word examples. No contradiction with 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?
The description is compact and front-loaded with the WHEN condition, then trigger phrases, then the output summary. Every sentence contributes value and 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 no-parameter, read-only health check tool, the description covers when to call it, how to phrase the request, and what the response contains. The presence of an output schema further covers the return structure, so nothing critical 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?
The tool has zero parameters, so the baseline is 4. There is no parameter information needed, and the description appropriately focuses on the response rather than input semantics.
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 the tool checks server status, loaded D365 version, and custom model path, and it provides concrete trigger phrases. It does not explicitly contrast against sibling tools, so it lacks the final distinguishing nudge, but the purpose is specific and 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 WHEN clause and trigger examples ('status', 'statut', 'is the server ready') give an agent explicit conditions for invoking this tool. It does not explain when not to use it or name alternative tools, but the usage context is otherwise very clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_custom_model_objectsARead-onlyInspect
WHEN: developer wants to see what custom/extension objects exist in their model. Triggers: 'list my custom objects', 'what have we customized', 'show ISV objects', 'list custom model', 'what objects are in our model'. List all D365 F&O objects in the custom/extension model directory on disk. Reads the file system directly -- always reflects the latest uncommitted state. Pass customModelPath to specify a model directory; or set it once via the D365-Custom-Model-Path header in your .mcp.json (applies to all tool calls automatically).
| Name | Required | Description | Default |
|---|---|---|---|
| customModelPath | No | Optional: path to the custom model directory (e.g. 'C:\\AOTExport\\MyModel'). Overrides the header and server-configured path. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes beyond the readOnlyHint annotation by disclosing that it reads the file system directly and always reflects the latest uncommitted state. It also clarifies configuration via header, which is useful behavioral context not present in the 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?
The description is organized and front-loaded with the most important routing information ('WHEN' and triggers), followed by the core behavior and configuration details. Every sentence serves a clear purpose and there is minimal redundancy.
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 read-only listing tool with one optional parameter, the description covers what it lists, how it reads data, and how to configure the path. It does not define the return format, but no output schema exists and the expected result is reasonably inferable from the tool's purpose.
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 is simple, but the description adds valuable context: how the path can be set persistently via header and how the parameter overrides that configuration. This goes beyond the schema's bare parameter description.
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 with a specific verb ('List'), a concrete resource ('all D365 F&O objects in the custom/extension model directory on disk'), and a clear distinguishing scope ('custom/extension' vs general objects). The included trigger phrases reinforce intent understanding and differentiate it from generic sibling listing 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?
The 'WHEN' clause and trigger examples give explicit context for when an agent should select this tool. It does not mention alternatives or exclusions, but the scope is narrow enough that the usage context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_objectsARead-onlyIdempotentInspect
WHEN: you need ALL objects of a given type or in a given model. Triggers: 'list all tables in ALM', 'show all classes', 'quels objets dans le modèle', 'give me all forms'. Full index scan -- returns EVERY matching object, not just top search results. Use to discover what tables, classes, forms, enums, etc. exist in a specific model. When no filters are given and a custom model is configured, defaults to listing that model. NOT for a single object -- use get_object_details. NOT for natural language search -- use search_d365_code.
| Name | Required | Description | Default |
|---|---|---|---|
| aotType | No | Filter by AOT type: AxClass, AxTable, AxForm, AxView, AxEnum, AxEdt, AxDataEntityView, AxSecurityPrivilege, AxSecurityDuty, AxSecurityRole, AxQuery, AxReport, Documentation. Leave empty for all types. | |
| modelName | No | Filter: matches BOTH package/module name (partial) AND object name (substring). Examples: 'ALM' (package), 'Cust' (any object containing 'Cust'), 'SalesTable'. Leave empty for all. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish read-only and idempotent behavior. The description adds useful operational context: it performs a full index scan, returns every match rather than top results, and defaults to the configured custom model when no filters are provided.
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 well-structured with a clear WHEN/triggers/scope/not format and is front-loaded. Minor redundancy exists between 'need ALL objects' and the later 'Use to discover' sentence, but overall it is efficient and readable.
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 tool is simple with two optional parameters, and the description covers scope, defaults, behavior, and exclusions. It does not describe the exact structure of returned objects, but 'returns EVERY matching object' gives enough expectation for a discovery tool without 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 100%, so the schema already documents both parameters thoroughly. The description repeats the filter semantics but adds only the default-model behavior, which is useful but does not substantially extend parameter understanding.
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 the exact purpose: list ALL objects of a given type or model. It provides concrete trigger phrases and explicitly distinguishes itself from get_object_details and search_d365_code, so an agent can clearly identify when this tool is appropriate.
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 guidance is explicit: use when a full inventory of object types or model contents is needed, and NOT for single objects or natural language search. It names the sibling tools to use instead, leaving no ambiguity.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_release_note_inputsARead-onlyInspect
WHEN: ALWAYS call this FIRST, before prepare_release_note_context -- it discovers the exact D365FO version strings and custom model ids actually indexed on THIS server, which you cannot guess. Triggers: 'release note', 'compare D365 versions', 'upgrade impact for a client', 'what changed for this client', 'regression risk', 'note de version'. Returns every indexed version (exact 'version' string to use as v1/v2, e.g. 10.0.2527.109) and every ready-to-use custom model (exact 'id' to use as customModelIds, plus its name and optional clientGroup tag -- models sharing the same clientGroup belong to the same client and should usually ALL be passed together, e.g. the client's own extensions AND a separate ISV vendor model). IMPORTANT: this server holds the ACTUAL indexed code diff and the client's ACTUAL custom code -- generic Microsoft Learn / Azure Updates / documentation-search tools do NOT have this data and must NOT be used for D365 F&O release-note or upgrade-impact questions about a specific client; those tools only know public, generic release notes, not this client's real regression/opportunity picture.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotation only declares readOnlyHint=true; the description adds substantial behavioral context beyond that: the tool reads server-local indexed data, version strings are exact and cannot be guessed, and custom models carry a clientGroup tag whose grouping semantics dictate that related models should be passed together. The disclosure that this server holds the ACTUAL indexed code diff and client code is a meaningful behavioral trait that shapes how the agent should trust and sequence this call. Nothing contradicts the readOnly 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?
The description is long but structured with clear signposts: 'WHEN:', 'Triggers:', 'Returns', 'IMPORTANT:' — and the most critical directive (call FIRST) is front-loaded. Every clause carries new information: trigger phrases, return-value semantics, grouping rules, and tool-exclusion guidance. It earns its length, though the return-value section is a single dense, parenthetical-heavy sentence that could be broken up for 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 0-parameter, read-only discovery tool with no output schema, the description is complete. It covers when to call, what it returns, how to interpret and chain the returned values, and which alternatives to avoid. No essential decision-making information is missing for an agent to invoke it correctly and use its results.
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 zero parameters, the schema provides no semantic content, and the baseline is 4. The description goes beyond that baseline by explaining exactly how the returned values will be consumed as downstream parameters: the exact 'version' string feeds v1/v2, and the model 'id' feeds customModelIds. The concrete format example (10.0.2527.109) and the clientGroup grouping rule add real semantic value that an agent cannot infer from 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?
The description states a precise verb+resource+scope: it 'discovers the exact D365FO version strings and custom model ids actually indexed on THIS server.' It distinguishes itself from the sibling prepare_release_note_context by declaring it must be called FIRST, and from generic documentation-search tools by explaining they lack this server's data. There is no ambiguity about what this tool does.
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 guidance is explicit and unmissable: 'WHEN: ALWAYS call this FIRST, before prepare_release_note_context.' It provides concrete trigger phrases ('release note', 'compare D365 versions', 'upgrade impact for a client', 'regression risk') and explicit when-not guidance, naming generic Microsoft Learn / Azure Updates / documentation-search tools that must NOT be used. No inference is required from the agent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
map_business_processARead-onlyIdempotentInspect
WHEN: mapping the technical D365 objects behind a business process, or understanding which tables/forms implement a flow. Triggers: 'processus métier', 'Order-to-Cash', 'Procure-to-Pay', 'Record-to-Report', 'business process flow', 'qui est impliqué dans', 'map the process', 'flux du processus', 'quels objets dans le flux'. Map a D365 F&O business process to its complete object chain. For known processes (Order-to-Cash, Procure-to-Pay, Record-to-Report, Plan-to-Produce, Inventory-Management, Hire-to-Retire, Project-Accounting, Asset-Lifecycle): shows every step with forms, tables, classes, entities, reports, and security roles involved. For any other object name: traces all dependencies (tables, classes, forms, entities) from that entry point. Produces a Mermaid process flow diagram. Use 'list' to see all known process mappings. NOT for a single object's FK relations only -- use find_related_objects for that (faster and more precise).
| Name | Required | Description | Default |
|---|---|---|---|
| processName | Yes | Business process name (e.g. 'Order-to-Cash', 'Procure-to-Pay', 'sales', 'purchasing') or an object name to trace from. Use 'list' to see all known processes. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and idempotentHint=true, so the safety profile is covered. The description adds meaningful behavioral context: it explains the conditional behavior for known process names (complete chain with forms, tables, classes, entities, reports, security roles) versus arbitrary object names (dependency tracing), and that it generates a Mermaid diagram.
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 well-organized with WHEN, triggers, core behavior, and an explicit exclusion. It is longer than average, but the trigger list and examples earn their place by helping the agent recognize invocation contexts. Slight redundancy with schema examples keeps it from 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?
For a read-only mapping tool with one well-documented parameter and no output schema, this description covers everything needed: what it does, when to use it, what to pass, how to discover known processes, and what output format to expect. No critical information 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 description coverage is 100% for processName, so the baseline is 3. The description enriches this by listing known process examples (Order-to-Cash, Procure-to-Pay, etc.), explaining the fallback for object names, and the special 'list' value—adding meaning beyond the bare 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: 'Map a D365 F&O business process to its complete object chain' and clearly names the output (a Mermaid process flow diagram). It also distinguishes itself from find_related_objects, making its scope 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?
An explicit WHEN section lists concrete scenarios and trigger phrases ('processus métier', 'Order-to-Cash', 'map the process', etc.). It also says 'NOT for a single object's FK relations only' and directs the agent to use find_related_objects instead, plus instructs using 'list' to enumerate known processes.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
odata_export_entityAInspect
Export any D365 F&O data entity via OData (transactional, no DMF project required). Universal: works for ANY public entity. Supports $select, $filter, $orderby and follows server paging automatically. Returns CSV (default) or JSON. Use for live/ad-hoc exports and small-to-medium volumes. For very large bulk exports prefer dmf_export_package. Resolve the entity set name from the KB first (find_entity_for_table / get_data_entity_info) -- do not invent entity names.
| Name | Required | Description | Default |
|---|---|---|---|
| filter | No | Optional OData $filter expression. | |
| format | No | Output format: 'csv' (default) or 'json'. | csv |
| select | No | Optional $select (comma-separated fields). Empty = all fields. | |
| maxRows | No | Max rows to return (0/empty = no cap, follows all pages). Default 1000. | |
| orderBy | No | Optional $orderby expression. | |
| entitySet | Yes | OData public entity set name, e.g. 'CustomersV3', 'ReleasedProductsV2'. | |
| outputPath | No | Optional file path to also write the full result to (e.g. C:\temp\export.csv). | |
| crossCompany | No | Set true to query across all legal entities (adds cross-company=true). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are present, so the description carries the full burden, and it does so well. It discloses supported OData operators ($select, $filter, $orderby), automatic server paging, output formats (CSV/JSON), and that the export is transactional and does not require a DMF project. No contradictions with the schema or annotations exist.
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 with the core purpose, then packs scope, capabilities, formats, usage guidance, alternatives, and prerequisites into a few dense sentences. There is no filler or repetition, and every sentence earns its place.
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 tool with no output schema and no annotations, the description is complete enough for correct selection and invocation. It covers the use case, volume boundary, alternative, prerequisite lookup step, supported OData features, paging, and return formats. An agent has everything needed to call this tool 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 100%, so the baseline is 3, but the description adds meaningful param context beyond the schema: it confirms $select/$filter/$orderby support, automatic paging (relevant to maxRows), CSV/JSON output (relevant to format), and the requirement to resolve entitySet from the KB. It doesn't deeply document every parameter, but it adds real 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?
The description opens with a specific verb and resource: 'Export any D365 F&O data entity via OData'. It further clarifies universal scope ('works for ANY public entity') and distinguishes itself from DMF-based exports. An agent can immediately understand what this tool does and how it differs from 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?
Explicit usage guidance is provided: 'Use for live/ad-hoc exports and small-to-medium volumes', with the alternative 'dmf_export_package' named for very large bulk exports. It also instructs the agent to resolve the entity set name from the KB first using find_entity_for_table or get_data_entity_info, preventing invented entity names.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
odata_upsert_rowsADestructiveIdempotentInspect
Idempotent import of rows into any entity via OData: PATCH when the record exists (matched by keyFields), otherwise POST. Safe to re-run -- duplicates are updated, not re-created. Best for small-to-medium transactional loads (e.g. <= a few thousand rows). For bulk loads use dmf_import_file. Provide rows as a JSON array of objects; resolve key fields from the KB (get_data_entity_info) -- do not guess them.
| Name | Required | Description | Default |
|---|---|---|---|
| rowsJson | Yes | JSON array of row objects, e.g. [{"CustomerAccount":"C0001","Name":"Acme"}]. | |
| entitySet | Yes | OData public entity set name, e.g. 'CustomersV3'. | |
| keyFields | Yes | Comma-separated business key fields used to detect existing records, e.g. 'CustomerAccount' or 'dataAreaId,ItemNumber'. | |
| legalEntity | No | Optional legal entity (dataAreaId) injected into each row when absent. | |
| crossCompany | No | Set true to allow cross-company writes. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare idempotentHint and destructiveHint, but the description adds meaningful behavior: PATCH/POST mechanism, duplicate handling ('duplicates are updated, not re-created'), and re-run safety. It does not fully describe response/error behavior, but it enriches the annotation profile without contradicting it.
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, starting with the core verb and purpose. The sentences each carry distinct value: operation semantics, idempotency/re-run safety, usage boundary with alternative, and invocation guidance. No words are 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 5-parameter tool with no output schema, the description covers purpose, operation behavior, scale guidance, and the alternative tool. It omits return/response format and error-prevention details beyond the key-fields warning, so it is nearly complete but slightly short of fully self-sufficient.
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 description adds value by explaining how to supply rows ('JSON array of objects') and by warning the agent to resolve key fields from the knowledge base rather than guessing, which goes beyond the schema's basic field 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?
The description states a specific verb and resource: 'Idempotent import of rows into any entity via OData'. It further clarifies the exact operation semantics (PATCH when the record exists, otherwise POST), which unambiguously distinguishes it from read/export tools like odata_export_entity.
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 explicitly states when the tool is appropriate: 'small-to-medium transactional loads' and gives a size example. It also names the bulk-load alternative, dmf_import_file, and tells the agent to resolve key fields from get_data_entity_info rather than guessing them.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
plan_and_executeAInspect
CHAIN-OF-TOOLS PLANNER -- Execute a multi-step JSON plan in ONE call by chaining tools. Pass an EXPLICIT JSON array of steps (NL parsing disabled to prevent ambiguity). Maximum 5 steps per plan. The chain stops on any critical failure (ado_analyze_workitem, get_object_details).
Required Format (JSON array)
[{"tool":"get_object_details","args":{"objectName":"SalesTable"}},{"tool":"validate_best_practices","args":{"objectName":"SalesTable"}}]
When to use
You already know the exact sequence of 2-5 tool calls needed
The output of step N is independent of step N+1 (or matches the carried context: analysis_output)
You want SSE progress events between steps
When NOT to use
Single tool call (use the tool directly)
Plan depends on the user's intermediate decision (call tools one at a time)
More than 5 steps (split into separate calls)
Cost: $0 -- pure in-process execution.
| Name | Required | Description | Default |
|---|---|---|---|
| goal | Yes | Natural language goal OR a JSON array of explicit steps. Examples: 'analyse WI #6587 and create a task', 'check best practices for ALMMyClass'. | |
| project | No | Optional: Azure DevOps project name. Falls back to DEVOPS_PROJECT env var. | |
| assignTo | No | Optional: assignee email for task creation step, e.g. 'dev@company.com'. | |
| objectName | No | Optional: object name to use when goal references a D365 object (overrides name parsed from goal). | |
| workItemId | No | Optional: work item ID to use when goal references 'WI #N' (overrides ID parsed from goal text). | |
| description | No | Optional: additional description text to pass to task creation step. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses important behavior beyond the sparse annotations: NL parsing is disabled to avoid ambiguity, the plan must be an explicit JSON array, execution stops on critical failures, and execution is pure in-process with no cost. It does not explain final return format or partial-failure behavior for non-critical tools, but the disclosed behavior is substantial.
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 well-structured with headings, a concrete example, and succinct bullet lists. Every section serves a purpose, and the core usage constraint is front-loaded. Redundancy is minimal and acceptable.
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 orchestrator tool, the description covers invocation format, constraints, failure behavior, and cost. The main gap is that it does not describe what the aggregated response/result looks like, especially since there is no output schema. Overall it is still sufficiently complete for an agent to select and invoke 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 coverage is 100%, so parameters are already documented. The description adds valuable semantics for the key 'goal' parameter by providing a concrete JSON array example and clarifying that it can be either natural language or explicit steps. It also adds context about the carried 'analysis_output' between steps, which the schema alone does not convey.
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 tool as a chain-of-tools planner/executor that runs a multi-step JSON plan in one call. This distinguishes it from the sibling tools, which are individual domain operations rather than an orchestrator.
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 'When to use' and 'When NOT to use' sections state exactly when this tool is appropriate: 2-5 independent steps, known sequence, SSE progress desired. It also tells the agent to use single tools directly for one-off calls or when user decisions are needed, providing clear routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
prepare_release_note_contextARead-onlyInspect
WHEN: building an AI-assisted D365 F&O upgrade release note (regressions + opportunities) for a specific client, and you (the calling assistant) want to do the reasoning yourself instead of the server calling its own LLM. Call resolve_client_profile FIRST -- if it finds a profile, OMIT v1/v2/customModelIds here and they will be auto-filled from it. If no profile exists, call list_release_note_inputs to get real values and pass them explicitly -- never guess them. Triggers: 'release note', 'upgrade impact for this client', 'what breaks for a client between these versions', 'regression risk', 'note de version'. Diffs two indexed D365FO versions (v1=older, v2=newer) and cross-references EVERY changed standard object against ALL the given custom models (a client can have several -- their own extensions AND a separate ISV vendor model, in which case pass both ids comma-separated) -- returning ONLY the subset of changes actually touched by the client's code (capped at 60, Removed > Modified > Added priority), each with old/new content and which custom object references it. Returns a JSON payload with an 'instructions' field telling you the EXACT schema to produce -- analyze the 'objects' array yourself, then call generate_release_note_document with your findings JSON to get the downloadable Word/PowerPoint.
| Name | Required | Description | Default |
|---|---|---|---|
| v1 | No | Older/baseline D365FO version to compare FROM, e.g. "10.0.2527.109". Omit to auto-fill from the caller's resolved client profile (see resolve_client_profile). | |
| v2 | No | Newer D365FO version to compare TO, e.g. "10.0.2645.32". Omit to auto-fill from the caller's resolved client profile. | |
| customModelIds | No | Comma-separated custom model id(s) from the Admin > Custom Models tab. Omit to auto-fill from the caller's resolved client profile. Pass several when a client combines their own extensions with a separate ISV vendor model. | |
| businessContext | No | Optional free-text business/functional context about the client (modules used, key customizations, priorities) to sharpen the opportunity/regression assessment. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Far beyond the readOnlyHint annotation, it discloses the result cap (60), the priority ordering (Removed > Modified > Added), the filtering behavior (only objects touched by client code), the auto-fill behavior when params are omitted, the multi-model comma-separated handling, and the return shape (JSON payload with an 'instructions' field and 'objects' array). The agent knows what will come back and what to do with it.
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?
Every sentence earns its place and the description is properly front-loaded with WHEN, triggers, and sequencing before behavioral detail. It loses one point for being one dense unbroken paragraph — the content is warranted for this complex orchestration tool, but section breaks would improve scannability.
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 tool with 4 optional params, no output schema, and a multi-step workflow, the description is remarkably complete: it covers prerequisites (resolve_client_profile), fallback data source (list_release_note_inputs), guardrails ('never guess them'), output contract (instructions field + objects array), result limits and priority, and the exact follow-up call (generate_release_note_document). No critical information 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 100%, so the baseline is 3. The description adds value beyond the schema by encoding the decision rule: omit v1/v2/customModelIds when a client profile exists, pass explicit values from list_release_note_inputs when it doesn't. It also reinforces the multi-model scenario (own extensions plus a separate ISV vendor model) and explains that businessContext 'sharpens the opportunity/regression assessment.'
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 verb+resource: 'Diffs two indexed D365FO versions... cross-references EVERY changed standard object against ALL the given custom models... returning ONLY the subset of changes actually touched by the client's code.' It also states its niche — 'you want to do the reasoning yourself instead of the server calling its own LLM' — which clearly separates it from broader siblings like analyze_upgrade_impact, diff_model_versions, and compare_objects.
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 WHEN clause, concrete trigger phrases ('release note', 'regression risk', 'note de version'), and explicit sequencing: 'Call resolve_client_profile FIRST,' with conditional logic (omit params if a profile is found, otherwise 'call list_release_note_inputs to get real values and pass them explicitly -- never guess them'). It also names the downstream tool, generate_release_note_document, so the agent knows the full workflow.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
recommend_extension_strategyARead-onlyIdempotentInspect
WHEN: developer about to customise a standard D365 object asks 'should I use AxTableExtension, Chain of Command, EventHandler, or Delegate?'. Triggers: 'how to extend', 'best way to customise', 'extension strategy for', 'CoC ou event handler', 'comment etendre X'. Returns a ranked recommendation based on the target AOT type and the intent, with citations to the Microsoft Learn extensibility guide. Cloud-safe: pure KB lookup, no writes.
| Name | Required | Description | Default |
|---|---|---|---|
| intent | Yes | Plain-language goal of the customisation. Examples: 'add a status field', 'change validateWrite logic', 'react to record insert', 'replace the posting logic', 'override the find method', 'extend the enum'. | |
| objectName | Yes | Target standard D365 object name, e.g. 'SalesTable', 'CustTable', 'SalesLineType', 'PurchFormLetter_Confirmation'. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide readOnlyHint and idempotentHint; the description adds value by confirming 'Cloud-safe: pure KB lookup, no writes' in plain language and disclosing that results include ranked output with citations to Microsoft Learn. This enriches the behavioral profile beyond the boolean hints without contradicting them.
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 with the WHEN condition, followed by triggers, return behavior, and safety note. The trigger list is slightly verbose but earns its place by helping an agent recognize invocation intent from varied phrasings. 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 two-parameter, no-output-schema KB lookup, the description is nearly complete: it states inputs, output type (ranked recommendation with citations), and safety profile. The only minor gap is that it doesn't describe the shape of the ranking or how citations are presented, but given the tool's simplicity and the annotations, this is sufficient.
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%, with both parameters fully described and supplied with realistic examples. The description adds contextual mapping ('target AOT type' ↔ objectName, 'intent' ↔ intent), but since the schema already carries the semantic load, 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 names a specific verb and resource: it returns a ranked extension-strategy recommendation for D365 objects. It names the exact decision it resolves (AxTableExtension vs Chain of Command vs EventHandler vs Delegate) and clearly differentiates from siblings like find_extensions, which locates existing extensions rather than recommending a strategy.
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 WHEN condition is explicit and actionable: 'developer about to customise a standard D365 object asks...' plus concrete trigger phrases ('how to extend', 'best way to customise', 'CoC ou event handler'). It does not name sibling alternatives or state explicit non-use conditions, but the trigger guidance is specific enough that an agent can reliably select it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
resolve_client_profileARead-onlyInspect
WHEN: at the START of any release-note / upgrade-impact conversation -- call this BEFORE list_release_note_inputs to check whether a Client Profile already exists for the CURRENT caller's Azure DevOps org/project (auto-detected from DEVOPS_ORG_URL/DEVOPS_PROJECT MCP headers -- you don't pass anything). If found, it gives you the client's currentVersionTag, targetVersionTag, customModelIds (their own extensions AND any attached ISV/vendor models) and the latest diff snapshot in one call -- use those directly as v1/v2/customModelIds for prepare_release_note_context, no further discovery needed. If not found, fall back to list_release_note_inputs and/or save_client_profile.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint annotation, the description discloses the key behavioral traits: identity is auto-detected from MCP headers, zero arguments are required, the response carries specific profile fields, and no further discovery is needed when a profile exists. It also describes the not-found path, which is behavior not inferable 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?
The description is dense but every sentence earns its place: when to call, what it returns, how to consume the result, and what to do on a miss. The WHEN/If found/If not found structure front-loads the most important operational information and is easy to 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?
Although there is no output schema, the description names the returned fields and how they should be mapped into prepare_release_note_context (v1/v2/customModelIds), making the tool callable correctly without further API discovery. It also names the fallback path, so the agent knows what to do in both branches.
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 zero parameters, the schema already states there is nothing to pass, but the description adds the crucial semantic detail that lookup context comes from DEVOPS_ORG_URL/DEVOPS_PROJECT headers and explicitly tells the caller 'you don't pass anything'. This fully removes any guesswork about how inputs are supplied.
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 verb (check/resolve) and resource (Client Profile for the caller's Azure DevOps org/project) and explains exactly what it returns: currentVersionTag, targetVersionTag, customModelIds, and a diff snapshot. It clearly differentiates itself from siblings like list_release_note_inputs and save_client_profile by positioning it as the pre-flight lookup.
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 states an explicit WHEN ('at the START of any release-note / upgrade-impact conversation'), an explicit ordering constraint ('call this BEFORE list_release_note_inputs'), and an explicit fallback ('If not found, fall back to list_release_note_inputs and/or save_client_profile'). An agent is left with no ambiguity about when to choose this tool over alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
resolve_workspace_rootsARead-onlyIdempotentInspect
WHEN: you need to know which folder(s) are configured as the workspace/project root for the current caller. Reads D365-Custom-Model-Path and D365-Standard-Model-Path from the request headers or environment variables. Use before any tool that accepts a customModelPath/standardModelPath parameter.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and idempotentHint, so the description's job is lighter. It adds transparent context by stating that values are read from request headers or environment variables and names the exact variables involved. It does not describe fallback precedence or behavior when values are absent, so it is not a perfect 5, but it goes beyond the 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?
Three tight sentences with no fluff. The 'WHEN' use case is front-loaded, followed by the data source and the critical usage directive. Every sentence earns its place.
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 parameterless read-only resolver, the description is nearly complete: it states when to use it, where it reads from, and the intended follow-up usage. The only gap is the lack of an output schema means the exact return shape is not specified, but the description's mention of 'which folder(s) are configured' plus the two named environment variables gives sufficient 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?
The tool has zero parameters, so the baseline of 4 applies. The description still adds semantic value by explaining how this tool's output relates to customModelPath/standardModelPath parameters used by other tools, which helps the agent know why and how to use the result.
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 ('know which folder(s) are configured') tied to a clear resource ('workspace/project root for the current caller'). It also names the exact configuration sources (D365-Custom-Model-Path and D365-Standard-Model-Path), distinguishing this resolver tool from the many sibling tools that operate on models or paths.
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 opens with a 'WHEN' trigger and explicitly instructs the agent to use this tool before any tool that accepts a customModelPath/standardModelPath parameter. This gives an unambiguous usage rule and context, even though it does not enumerate exclusive alternatives because none are needed for a config-resolution tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
resync_devops_indexAInspect
WHEN: the user wants to force a full re-download and re-index of their Azure DevOps custom model. Triggers: 'resync', 'reindex', 'force sync', 'rebuild index', 'my model is stale', 'update index', 'mon index est vieux', 'rafraîchir l'index', 'relancer l'indexation'. Useful when the server's built-in PAT does not have access to the target DevOps organisation (e.g. a different Azure DevOps org or tenant). Pass a pat parameter to override the server PAT for this resync. The eviction + download runs in the background; returns status immediately. After calling, wait ~60 s then call healthcheck or any search tool to confirm the index is ready.
| Name | Required | Description | Default |
|---|---|---|---|
| pat | No | Optional: Personal Access Token with Code (Read) permission for the target Azure DevOps org. Provide this when the server's built-in PAT lacks access (e.g. a different tenant, cross-org). Leave blank to reuse the session PAT or server env-var default. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full behavioral burden and meets it: it discloses that eviction plus download runs in the background, that the tool returns status immediately, and that readiness requires a ~60 second wait. It also surfaces the PAT-override behavior and why it matters.
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 WHEN condition and triggers, then moves through rationale, parameter use, and post-conditions. The trigger list is long but earns its place for selection accuracy, and 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 single optional-parameter tool with no output schema, the description supplies everything an agent needs: purpose, trigger phrases, authentication context, asynchronous behavior, and explicit follow-up verification via healthcheck or search 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 coverage is 100% and the schema already explains the pat parameter, so the baseline is high. The description adds the semantic nuance that the PAT is an override 'for this resync,' scoping it to a one-time operation rather than a persistent configuration change.
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 opens with a specific action and object: 'force a full re-download and re-index of their Azure DevOps custom model.' This is unambiguous and clearly differentiates the tool from the other ADO, search, and healthcheck siblings, none of which perform a forced rebuild.
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 explicitly lists trigger phrases ('resync', 'reindex', 'force sync', 'my model is stale') and the PAT-failure scenario where an override is needed. It gives clear context for when to call the tool, though it does not explicitly state a 'do not use when' condition or name a direct alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
save_client_profileAInspect
WHEN: no profile was found by resolve_client_profile and the user wants one created (or updated) for their client, so future release-note requests never need v1/v2/customModelIds again. Creates or updates a Client Profile keyed by the CURRENT caller's ADO org/project (auto-detected from MCP headers -- not a parameter). Only the fields you pass are changed; omit a field to leave it untouched on an existing profile.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Friendly client name, e.g. "Acme Corp". | |
| customModelIds | No | Comma-separated custom model id(s) from the Custom Models tab -- the client's own extensions AND any separate ISV vendor models. | |
| targetVersionTag | No | The version being evaluated for upgrade, e.g. "10.0.2645.32". | |
| currentVersionTag | No | The client's current live D365FO version tag, e.g. "10.0.2527.109". |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotation readOnlyHint=false already flags mutation, so the description earns credit by adding behavioral detail beyond it: the operation is an upsert, the key is auto-detected from MCP headers rather than user-supplied, and updates are partial ('Only the fields you pass are changed; omit a field to leave it untouched'). This does not contradict the annotation. It omits the return value and failure behavior, but the mutation semantics are well covered.
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, each with a distinct job: when to use, what it does plus how keying works, and the partial-update rule. The 'WHEN:' prefix front-loads the most decision-relevant information, and no sentence repeats schema or annotation content.
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 4-parameter upsert with no output schema, the description resolves the critical unknowns: the trigger condition, the auto-detected keying behavior, and merge semantics. The one meaningful gap is that it never states what the tool returns after saving, which matters more here because no output schema exists to fill that in.
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 the schema already documents all four parameters with format examples (e.g., '"10.0.2645.32"') and domain context for customModelIds (extensions plus ISV models). The description adds the useful clarification that the profile key is not a parameter and that omitted fields stay untouched, but that is upsert/merge semantics rather than per-parameter meaning, so the baseline of 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 ('Creates or updates a Client Profile') plus the exact scope (keyed by the current caller's ADO org/project), and explicitly differentiates itself from its sibling resolve_client_profile by naming the condition that triggers it. An agent can distinguish this from the ~90 sibling tools 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?
Opens with an explicit WHEN clause ('no profile was found by resolve_client_profile and the user wants one created (or updated)') that names the alternative tool and the condition selecting between them. It also explains the downstream benefit ('future release-note requests never need v1/v2/customModelIds again'), which clarifies why the agent should persist this data.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_context_docsARead-onlyIdempotentInspect
WHEN: the user asks about business/functional context that lives OUTSIDE the D365 code KB -- specs, functional design docs, mapping sheets, contracts, meeting notes, screenshots' captions -- anything an admin uploaded via the admin portal's 'Context Documents' library (PDF, Word .docx, Excel .xlsx/.xlsm, CSV, plain text/Markdown/JSON). Does NOT search X++ code or AOT objects -- use search_d365_code / get_object_details for that. Triggers: 'what does the spec say about...', 'check the mapping document for...', 'cherche dans les documents de contexte', 'according to the functional design'. An excerpt containing a 'Image N' marker has a picture the text cannot convey (a diagram, a screenshot): call again with includeImages=true to receive those pictures inline.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Natural-language search query. | |
| maxResults | No | Max distinct documents to return (1-20). Default 8. | |
| includeImages | No | Attach the images embedded in the matched documents (Word only). Off by default because each picture is inlined as base64 and is far larger than the text around it. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark the tool as read-only and idempotent, and the description adds meaningful behavioral context: supported file formats, admin-uploaded library scope, and the 'Image N' marker behavior with instruction to re-call with includeImages=true. This goes well 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?
The description is dense but every sentence earns its place: scope, exclusions, alternatives, trigger phrases, and an image-handling instruction. It is front-loaded with the most important routing information and contains 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 read-only search tool with one required parameter and a simple schema, the description fully covers what the agent needs to select and call it correctly, including output behavior around excerpts and inline images. No output schema exists, but the description provides sufficient return-related guidance.
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 schema covers all three parameters with clear descriptions, so the baseline is 3. The tool description adds value by explaining when to set includeImages=true using the 'Image N' marker and why images are off by default, which helps the agent invoke the tool correctly beyond the schema text.
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 the tool searches business/functional context documents stored outside the D365 code KB, and explicitly distinguishes it from code search tools like search_d365_code and get_object_details. Specific document types and trigger phrases make the resource and scope 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 opens with 'WHEN', provides concrete trigger examples, explicitly states what it does NOT search, and names the sibling tools to use instead for X++ code/AOT objects. This gives an agent clear routing guidance with no inference required.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_d365_codeARead-onlyIdempotentInspect
WHEN: object name is unknown, partial, or you need to find by concept/keyword. Search the D365 F&O knowledge base for X++ code, tables, classes, forms, views, enums, EDTs, security objects using natural language or partial names. Returns ALL chunks (metadata, Declaration, methods) for the top-scoring objects so the LLM has complete context on the first call. Lower-scoring results return a short preview. No follow-up get_object_details call is needed for top results. NOT for listing all objects in a model -- use list_objects for that. NOT when the exact name is known -- use get_object_details for that. NEVER call search_d365_code twice in the same conversation turn. If one search did not find the object, answer from what you have -- do not repeat the search. When you need context on MORE THAN ONE concept simultaneously, use batch_search instead -- it runs all queries in parallel and is faster. NEVER call for ADO items (FDD, RDD, IDD, Bug, Task, PR, WorkItem, sprint, #1234) -- use ado_* tools instead.
| Name | Required | Description | Default |
|---|---|---|---|
| topK | No | Maximum number of results to return (default: 10, max: 50) | |
| query | Yes | Natural language search query. Examples: 'vendor invoice approval', 'tables in ALM', 'SalesTable fields', 'security privileges for purchasing' | |
| scope | No | Optional routing override: 'auto' (default — session/custom first, standard fallback), 'custom' (session only — fails over to standard if nothing found), 'standard' (skip session entirely), 'both' (federated, no priority). | |
| domain | No | Optional: filter results to a specific AOT type. Examples: 'AxTable', 'AxClass', 'AxForm', 'AxEnum'. Leave empty for all types. | |
| topObjects | No | Number of top-scoring objects whose ALL chunks are returned (default: 5, max: 20). Increase to broaden coverage, decrease for tighter focus. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint and idempotentHint, and the description adds substantial behavioral context beyond that: top-scoring objects return ALL chunks for full context, lower-scoring results return previews, and no follow-up get_object_details call is needed for top results. It also discloses the 'never search twice in a turn' behavior and ADO exclusion, which are not visible in 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?
The description is long and uses ALL-CAPS emphasis, but nearly every sentence carries a distinct routing or behavior constraint that helps an agent choose and invoke the tool. It front-loads the primary use case ('WHEN...') before exclusions and alternatives, which is effective despite the 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?
For a search tool with 5 parameters and no output schema, the description is remarkably complete: it explains what is returned, how top vs lower results differ, when no follow-up is needed, and when to choose alternatives. An agent has enough context to call this tool correctly and interpret its results on the first 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 description coverage is 100%, so the schema already fully documents query, topK, scope, domain, and topObjects. The description does not add new parameter-level meaning beyond what the schema provides; it reinforces behavior around topObjects but does not fill any real gap. 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 clear verb and resource: 'Search the D365 F&O knowledge base for X++ code, tables, classes, forms...' using natural language or partial names. It also names the sibling tools it is not (list_objects, get_object_details, batch_search, ado_*), making the distinction explicit without needing to open their 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?
The description provides explicit when-to-use and when-not-to-use guidance: use when object name is unknown or partial; do not use for listing all objects, for exact known names, for ADO items, or for multi-concept queries. It directly names alternatives like list_objects, get_object_details, batch_search, and ado_* tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_labelsARead-onlyIdempotentInspect
Search D365 F&O labels across all indexed languages. Given text (e.g. 'Sales order'), finds the matching label ID (@SYS12345). Given a label ID (e.g. '@SYS12345' or '@SYS:12345'), finds the text in all languages. Accepts both D365 short form (@SYS124480) and colon form (@SYS:124480) -- both are normalized automatically. Searches across 392K+ label entries. WORKFLOW: call search_labels first to resolve the label text, then call find_references with the same label ID to find ALL X++ objects (forms, tables, classes, reports) that use it in their code or metadata. Languages: en-US and fr are loaded at startup. Other languages (de, nl, ar, es, zh...) are loaded on-demand -- first call ~15s, then instant.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Text to search for (e.g. 'Sales order', 'Invoice amount') or a label ID (e.g. '@SYS12345', '@AccountsReceivable:CustInvoice') | |
| language | No | Optional: filter by language code (e.g. 'en-US', 'fr', 'de', 'nl'). Leave empty for all languages. | |
| maxResults | No | Maximum results (default: 20, max: 50) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and idempotentHint, so the safety profile is covered. The description adds valuable behavioral detail beyond annotations: both @SYS short and colon forms are normalized automatically, results span 392K+ label entries, and languages are loaded on-demand with a measurable latency caveat. No contradiction with 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?
The description is longer than average but every sentence earns its place: core capability, bidirectional examples, normalization note, workflow integration, and language performance. The key facts are front-loaded, and the WORKFLOW section provides actionable guidance without fluff.
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 search tool with no output schema, the description sufficiently explains what is returned (label ID for text searches, localized text for label ID searches) and covers input variants, language behavior, and downstream usage with find_references. Nothing an agent needs to select or invoke this tool correctly 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 100%, so the baseline is 3. The description adds meaningful semantics beyond the schema by giving concrete examples for the query parameter ('Sales order', '@SYS12345', '@SYS:12345') and clarifying that both label ID forms are accepted and normalized automatically. It also adds operational meaning to the language parameter by explaining startup vs. on-demand loading behavior, though it adds little to maxResults 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?
The description opens with a specific verb and resource ('Search D365 F&O labels') and explains the bidirectional nature: text-to-label-ID and label-ID-to-text. This clearly distinguishes it from siblings like find_references (which consumes label IDs) and search_d365_code (which searches code).
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 WORKFLOW section explicitly tells the agent to call search_labels first to resolve label text, then call find_references with the same label ID to find X++ objects. It also gives practical usage context about language loading and the ~15s first-call cost for non-startup languages, which helps agents decide when and how to use the tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
suggest_edtARead-onlyInspect
WHEN: adding a new field to a table -- find the best existing D365 EDT to extend instead of using raw primitives (str, int64, real, date). Triggers: 'what EDT for', 'which EDT should I extend', 'quel EDT pour', 'quel type étendu', 'EDT for a field'. D365 best practice mandates EDT reuse over raw primitive types. Call BEFORE declaring any field with a primitive type. Returns ranked candidate EDTs with their base type, label, and model.
| Name | Required | Description | Default |
|---|---|---|---|
| topK | No | Number of EDT candidates to return (default: 8, max: 20) | |
| purpose | Yes | Purpose of the field in plain language, e.g. 'customer account number', 'approval status enum', 'invoice amount in transaction currency' | |
| baseType | No | Optional: D365 primitive base type to filter by, e.g. 'str', 'int64', 'real', 'date', 'enum'. Leave empty to search all types. | |
| fieldName | Yes | Field name or concept, e.g. 'AccountNum', 'vendorId', 'itemCode', 'approvalStatus' |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotation readOnlyHint=true already covers safety; the description adds the D365 best-practice rationale and the exact shape of the returned data (ranked EDTs with base type, label, model). No contradiction with 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?
The description is front-loaded with 'WHEN', includes compact trigger examples, and every sentence earns its place—usage, rationale, directive, and return value. 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?
With no output schema, the description still states what the tool returns (ranked candidates and their attributes). Together with 100% schema coverage and readOnlyHint, an agent has everything needed to decide when to call it and what to do with the 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 100%, so the schema carries the parameter documentation burden. The description's field examples reinforce purpose but add minimal information 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?
The description uses a specific verb phrase ('find the best existing D365 EDT to extend') plus the concrete context of adding a field and the return of ranked candidates. It clearly differentiates the tool from generic refactoring/best-practice siblings like suggest_refactoring or fix_best_practice_violations.
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 explicit WHEN conditions, trigger phrases in multiple languages, and a strong directive ('Call BEFORE declaring any field with a primitive type'). It doesn't name a sibling alternative or state when not to call it, but the context is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
suggest_refactoringARead-onlyInspect
WHEN: developer wants to improve code quality before a PR merge or code review. Triggers: 'refactor', 'clean up', 'simplify', 'too long method', 'nested ifs', 'code smells', 'améliorer le code'. Suggest concrete refactoring actions for YOUR custom D365 F&O X++ code. [!] Only runs on custom/extension code (D365_CUSTOM_MODEL_PATH). Refactoring standard Microsoft code is not actionable. Analyzes: long methods (extract method), deep nesting (guard clauses), row-by-row operations (set-based), large switch statements (strategy pattern), hardcoded strings (constants), unprotected CLR calls (error handling), wide transactions (narrow scope). Returns before/after code examples.
| Name | Required | Description | Default |
|---|---|---|---|
| methodName | No | Optional: specific method to analyze. | |
| objectName | Yes | Object name to analyze, e.g. 'ALMMyClass', 'ALMMyTable' |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark the tool as read-only; the description adds helpful context by limiting analysis to custom/extension code (D365_CUSTOM_MODEL_PATH), enumerating seven concrete refactoring patterns, and promising before/after code examples. This goes beyond the annotation without contradicting it.
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 WHEN heading front-loads the most important decision signal, and the trigger list plus analysis categories are compressed but useful. Every sentence contributes either scope, trigger, or output information; 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 two-parameter read-only analysis tool without an output schema, the description covers intent, scope, analysis dimensions, and the return shape (before/after examples). The only minor gap is behavior on non-custom objects, but 'not actionable' makes the outcome clear enough.
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 objectName and methodName, including optionality and an example object name. The description adds high-level context about analyzed patterns but no new per-parameter semantics, 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 names a specific verb ('suggest ... refactoring actions') and a specific resource (custom D365 F&O X++ code), with explicit boundaries versus standard code. It distinguishes from sibling analysis tools like detect_performance_issues or fix_best_practice_violations by focusing on refactoring patterns and before/after examples.
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 opens with a WHEN clause and concrete trigger phrases, and states the key exclusion: standard Microsoft code is not actionable. It does not, however, name sibling alternatives explicitly, so routing is clear but not exhaustive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
summarize_for_stakeholderARead-onlyInspect
WHEN: you have a large technical tool output (get_object_details, validate_best_practices, ado_analyze_workitem, detect_performance_issues...) and need it reframed for a non-technical audience. Calls the local Ollama instance (OLLAMA_HOST env var, default localhost:11434) to produce the summary. Model is configurable via ALMXPP_SUMMARIZE_MODEL (default: llama3.2).
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes | The technical text to summarize/explain -- typically the raw output of another tool call. | |
| audience | No | Target audience: 'executive', 'business-analyst', or 'developer'. Default 'business-analyst'. | business-analyst |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, and the description does not contradict that. The description adds valuable behavioral context beyond annotations: it discloses that the tool calls a local Ollama instance, uses the OLLAMA_HOST environment variable (with default), and that the model is configurable via ALMXPP_SUMMARIZE_MODEL. This external dependency and configuration info is important for an agent to anticipate behavior. It doesn't discuss failure modes, but the core behavioral traits are disclosed.
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 opens with the 'WHEN' condition, then states the mechanism and configuration. Every sentence contributes either usage guidance or behavior transparency, with no filler. It is appropriately sized for a tool with only two simple parameters.
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 tool's simplicity (two params, no output schema), the description covers the essential aspects: when to use, what it does, external dependency, and configuration. It names example source tools, making the input type concrete. The only missing piece is explicit mention of the return value being plain text, but 'produce the summary' implies that. It is complete enough 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?
Schema coverage is 100%, so the baseline is 3. The description reinforces that 'text' is technical tool output and 'audience' relates to non-technical readers, but it adds no new parameter semantics beyond the schema's descriptions. The default audience and allowed values are already in the schema, so the description does not meaningfully increase understanding of the 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 the tool's function: taking large technical tool output and reframing it for a non-technical audience. It names specific sibling tools as example inputs (get_object_details, validate_best_practices), which distinguishes it from data-retrieval or analysis tools. The verb 'summarize' and the target audience are 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?
The description begins with 'WHEN:' and specifies the exact condition: when you have large technical output that needs reframing for non-technical stakeholders. It names example source tools, giving agents concrete context. It does not explicitly state when not to use the tool or point to alternatives, but the trigger condition is unambiguous and the audience qualifier ('non-technical') implies exclusion of technical use cases.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
trace_field_lineageARead-onlyIdempotentInspect
WHEN: you need to understand the full data lifecycle of a D365 F&O table field: who writes it, who reads it, which forms display it, which reports use it, and which tables have FK relationships to its parent table. Triggers: 'where is field X set', 'qui écrit ce champ', 'data lineage', 'GDPR field audit', 'origin of field', 'what touches this field'. Requires XRef index for writer/reader analysis. Relation graph for forms and FKs. Examples: trace_field_lineage('CustTable','CreditMax') or trace_field_lineage('LedgerJournalTrans','AmountCurDebit').
| Name | Required | Description | Default |
|---|---|---|---|
| fieldName | Yes | Field or property name, e.g. 'CreditMax'. | |
| tableName | Yes | Table or class name, e.g. 'CustTable'. | |
| maxPerCategory | No | Max results per category (default 15). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and idempotentHint, so the safety profile is known. The description adds useful behavioral context beyond those hints by stating the XRef index prerequisite for writer/reader analysis and the reliance on relation graphs for forms and FKs.
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 opens with the when-to-use condition, lists trigger phrases, notes prerequisites, and closes with examples. Every sentence earns its place 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 read-only analysis tool with no output schema, the description sufficiently explains what the agent will learn (writers, readers, forms, reports, FKs), the prerequisites, and how to call it. No essential operational detail needed to select and invoke it 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?
Since schema description coverage is 100%, the parameter definitions already carry the baseline meaning. The description adds value by giving two concrete invocation examples ('CustTable','CreditMax' and 'LedgerJournalTrans','AmountCurDebit') that clarify expected table and field name formats.
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 verb and resource ('understand the full data lifecycle of a D365 F&O table field') and enumerates concrete output categories: writers, readers, forms, reports, and FK relationships. This scope clearly separates it from sibling search/trace tools like find_references and trace_security_chain.
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 'WHEN' clause and explicit trigger phrases ('where is field X set', 'data lineage', 'GDPR field audit') give clear, even multilingual, guidance on when to invoke it, and the examples show typical calls. It does not, however, name alternatives or state when not to use this tool relative to other lineage-adjacent siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
trace_role_license_treeARead-onlyIdempotentInspect
WHEN: security design, licence audit, or 'what licence does this role require?'. Triggers: 'arborescence du rôle', 'licence nécessaire pour', 'what licence for role', 'role tree', 'droits du rôle', 'entry points of role', 'privilege tree for'. Builds the COMPLETE tree for ONE role: Role -> Duties -> Privileges -> Entry Points. For each entry point, classifies the required D365 licence per the March 2026 Licensing Guide: Team Members ($8/user/mo, read-only + named tasks), Operations-Activity ($50, warehouse mobile & production floor), Finance ($180), Supply Chain Mgmt ($180), Human Resources ($22), Project Operations ($120), Commerce (~$180). Grant-level aware: NoAccess/Read/View -> Team Members; Activity writes -> Operations-Activity; transactional writes -> full product licence based on functional area. Confidence: High (known module prefix) . Medium (keyword) . Low (fallback). Ends with a Optimization section: Team Members / Activity eligibility, role-split opportunities, per-user/month cost estimates (March 2026 MSRP). Always validate against the Microsoft D365 Licensing Guide. For a full multi-role scan, call trace_role_license_tree multiple times -- once per role. NOT for the pure technical duty/privilege/entry-point chain without licence inference -- use trace_security_chain for that.
| Name | Required | Description | Default |
|---|---|---|---|
| roleName | Yes | The exact security role name, e.g. 'SystemAdministrator', 'AccountsPayablePaymentsClerk', 'ALMMyCustomRole' | |
| maxEntryPoints | No | Maximum entry points to show per privilege (default: 20, max: 100) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark the tool as read-only and idempotent. The description adds substantial behavior beyond that: grant-level license classification, per-tier pricing, confidence levels, and an optimization section. No contradiction with 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?
The description is long but densely structured: it front-loads usage triggers, then flows into tree construction, license classification, confidence scoring, and optimization. Every section contributes distinct operational or routing 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?
Even without an output schema, the description explains what the result will contain, how licenses are assigned, how confidence is determined, and what follow-up action to take. The essential invocation behavior and output expectations are thoroughly 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 description coverage is 100%, so the baseline applies. roleName and maxEntryPoints are already fully documented in the schema, and the description does not add meaningful parameter-specific detail beyond saying it handles one role at a time.
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?
Clearly states the specific action: builds the complete Role -> Duties -> Privileges -> Entry Points tree and infers the required D365 license. It explicitly distinguishes itself from trace_security_chain, which handles the chain without license 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?
Opens with WHEN scenarios and trigger phrases, names the alternative for non-license chain analysis, and instructs multi-role scans to call this tool once per role. This gives the agent both inclusion and exclusion criteria.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
trace_security_chainARead-onlyInspect
WHEN: security audit -- need the TECHNICAL chain from Role/Duty/Privilege to Entry Points and Table/Form permissions. Also handles BUSINESS-LANGUAGE role explanation when businessLanguage=true. Triggers (technical): 'sécurité de', 'who can access', 'security for', 'role duty privilege', 'droits sur', 'technical security chain', 'trace le rôle', 'what privileges does', 'what duties are assigned', 'which role allows', 'accès au formulaire', 'what roles have access', 'quel rôle donne accès'. Triggers (business language): 'what can a user with role X do', 'explain this role', 'what does this role give access to', 'quel accès donne ce rôle', 'droits du rôle', 'what licence does this role need', 'droits requis pour'. Traverses: Role -> Duties -> Privileges -> Entry Points -> Table/Form Permissions. Set businessLanguage=true for plain-language capability list (no Duty/Privilege IDs). NOT for licence cost inference per entry point -- use trace_role_license_tree for that.
| Name | Required | Description | Default |
|---|---|---|---|
| businessLanguage | No | When true, explains the role in plain business language (capabilities list) instead of the technical Role->Duty->Privilege chain. Default: false. | |
| securityObjectName | Yes | Security object name, e.g. 'SystemAdministrator', 'VendInvoiceApprovalConfig' |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, and the description adds meaningful behavioral context beyond that: it traverses a specific chain, returns technical IDs or suppresses them in businessLanguage mode, and excludes licence-cost inference. It clarifies the exact output distinction between modes, which is valuable since there is no output 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?
The description is longer than average but well-structured: it opens with WHEN, then triggers, traversal, mode guidance, and an exclusion. Every section earns its place; the trigger list is verbose but functional for an agent deciding tool fit. It is front-loaded with the primary use case, which supports quick scanning.
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 no output schema, the description does a strong job conveying what the tool returns conceptually: a technical chain or a plain-language capability list, with IDs suppressed in the latter mode. It also covers the two supported modes, typical inputs, and the sibling exclusion. Minor gaps remain around exact response format and error cases, but for this tool complexity, it is substantially 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 100% and both parameters already have descriptive schema entries, so the baseline is 3. The description reinforces businessLanguage behavior ('plain-language capability list (no Duty/Privilege IDs)') but does not add substantial new meaning beyond the schema for securityObjectName. It adds marginal value, not significant compensation.
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 verb ('trace') and resource ('security chain'), plus a concrete traversal path: 'Role -> Duties -> Privileges -> Entry Points -> Table/Form Permissions'. It also explicitly distinguishes itself from the sibling trace_role_license_tree by stating what it is NOT for, making its purpose 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?
Usage is explicitly gated by 'WHEN: security audit' and supported with extensive trigger phrases for both technical and business-language contexts. The description clearly states when to set businessLanguage=true and explicitly names the alternative tool for licence cost inference ('use trace_role_license_tree for that'), leaving no ambiguity about selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
validate_best_practicesARead-onlyIdempotentInspect
Run an in-house best-practice audit on any AOT object (custom or standard), from the indexed source -- NOT the Microsoft BP checker. Rules are this server's own: SEC (security chain), PERF (firstOnly, set-based, N+1), TXN (ttsbegin/ttscommit pairing), ERR (error handling), COC (next() vs super()), QUAL, DATA (EDT on fields), CONV (naming, ISV prefix) and CLOUD. It runs pre-compile and needs no D365 install, so it catches things while the code is being written -- but it does not replace xppbp.exe, whose rule set and monikers are different. For the authoritative Microsoft verdict run run_best_practices_check (xppc.exe -BestPractices, whole model) or run_best_practices_check_scoped (xppbp.exe, one object). Returns violation table: severity (Critical/Warning), rule ID, code snippet, fix instruction. For deep N+1 / row-by-row performance profiling use detect_performance_issues instead. [!] Auto-fixing Critical violations requires D365_CUSTOM_MODEL_PATH (custom code only).
| Name | Required | Description | Default |
|---|---|---|---|
| methodName | No | Optional: specific method to validate. Validates all methods if not provided. | |
| objectName | Yes | Object name to validate, e.g. 'SalesTable', 'CustInvoiceJour' | |
| minSeverity | No | Minimum severity: 'Info', 'Warning', 'Critical' (default: 'Warning') | Warning |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and idempotentHint, and the description adds substantial behavioral context: it runs pre-compile, requires no D365 install, returns a violation table with severity/rule/code/fix, and warns that auto-fixing Critical violations requires D365_CUSTOM_MODEL_PATH. This goes well beyond the 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?
The description is dense but every sentence serves a purpose: core purpose, rule categories, execution model, exclusions, alternatives, return format, and a prerequisite caveat. It is longer than ideal, but the information is organized and front-loaded; no meaningful filler exists.
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 tool with no output schema, the description fully covers the return value ('violation table: severity, rule ID, code snippet, fix instruction'), execution context, exclusions, alternatives, and a credential/path prerequisite. An agent has enough context to invoke the tool correctly and interpret its 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 100%, so the schema already documents all three parameters with defaults and examples. The description mentions severities and the object scope but does not add significant meaning beyond what the schema provides, so the baseline score of 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 opens with a specific verb-resource pair: 'Run an in-house best-practice audit on any AOT object.' It immediately distinguishes itself from the Microsoft BP checker and names sibling tools with different purposes, so an agent can tell exactly what this tool is for.
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 explicit when-to-use and when-not-to-use guidance: use it for pre-compile, in-house checks without a D365 install, but for the authoritative Microsoft verdict use run_best_practices_check or run_best_practices_check_scoped, and for deep N+1 profiling use detect_performance_issues. It also notes it does not replace xppbp.exe.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
validate_object_namingARead-onlyIdempotentInspect
WHEN: developer needs to check that a proposed object name follows D365 + ISV naming conventions, is unique against the indexed KB, and does not collide with a reserved or standard prefix. Triggers: 'is this a valid name', 'check naming', 'name conflict', 'valider le nommage'. Cloud-safe: KB read only, no writes.
| Name | Required | Description | Default |
|---|---|---|---|
| aotType | Yes | AOT type the name will live in: AxClass, AxTable, AxForm, AxEdt, AxEnum, AxTableExtension, AxFormExtension, AxClassExtension, etc. | |
| isvPrefix | Yes | ISV prefix you must use, e.g. 'ALM'. Required for all custom objects. | |
| proposedName | Yes | Proposed name, e.g. 'ALMSalesLine.Extension', 'ALMCustomerTable', 'SalesLineALM_Extension'. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide readOnlyHint and idempotentHint. The description adds meaningful behavioral context about what the tool actually checks (naming conventions, KB uniqueness, reserved/standard prefix collisions) and explicitly states 'KB read only, no writes,' which reinforces but does not contradict the annotations. It does not describe return values or error behavior, but for a read-only check the core behavior is clear.
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 well-structured with 'WHEN', 'Triggers', and 'Cloud-safe' labels. Every sentence earns its place, and the trigger list is useful for an agent. The only minor redundancy is 'no writes,' which partially duplicates the annotations, but it does not bloat the text.
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 read-only validation tool with 100% schema-documented parameters and no output schema, the description covers purpose, invocation cues, and safety. It does not specify the return format, but an agent can reasonably infer a validity result. The missing return-value detail is a minor gap, not a blocker.
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 each parameter (proposedName, aotType, isvPrefix) having a descriptive explanation and examples. The tool description itself adds no additional parameter-level semantics, so the baseline score of 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 ('check') and a well-defined resource ('object name follows D365 + ISV naming conventions, is unique against the indexed KB, and does not collide with a reserved or standard prefix'). It is clearly distinct from create_aot_object and validate_best_practices in intent, though it does not explicitly name a sibling or say what it is not.
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 'WHEN' clause directly frames the scenario, and the trigger phrases ('is this a valid name', 'check naming', 'name conflict', 'valider le nommage') give concrete lexical cues for when to invoke the tool. However, it does not mention when not to use it or contrast it with validate_best_practices or other siblings.
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. Dates show when Glama detected each change.
1 tool update
- Changed
search_context_docs1 field changed- added
Input schema / properties / includeImagesAdded value: +{ + "default": false, + "description": "Attach the images embedded in the matched documents (Word only). Off by default because each picture is inlined as base64 and is far larger than the text around it.", + "type": "boolean" +}
Frequently Asked Questions
Claiming proves that you control a remote MCP connector. It does not move, proxy, or interrupt the server.
Open the connector listing, choose Claim ownership, and sign in to Glama.
Complete one verification method:
GitHub identity — fastest for official registry listings. For a namespace such as
io.github.alice/server, link the matching GitHub user, then choose Claim with GitHub. An organization namespace such asio.github.acme/serveralso needs that organization to have installed the Glama AI GitHub App and approved its permissions, because GitHub discloses organization membership only to apps it has installed. Use HTTP or DNS when it has not.HTTP challenge — works when you can deploy a public file. Generate a token, publish the exact JSON Glama shows at
/.well-known/glama.jsonon the same origin as the connector, then choose Check HTTP challenge.DNS challenge — works when you control DNS but cannot change the server. Generate a token, create the exact TXT record Glama shows, wait for it to propagate, then choose Check DNS challenge.
After verification, Glama sends a confirmation email and gives you access to listing details, thumbnails, health checks, and analytics. Keep the HTTP file or DNS record in place: Glama periodically checks it and ownership remains verified while the token is discoverable.
The HTTP ownership file has this structure:
{
"$schema": "https://glama.ai/mcp/schemas/connector.json",
"claim": "glama_claim_..."
}Claim tokens are opaque, stable, and bound to the signed-in Glama account. They contain no email address or other personal information. If Glama can no longer discover a verified HTTP or DNS token, it starts a seven-day grace period before removing claim-based access. Restore the same token during that period to keep ownership verified. Never publish an email address, Glama session token, GitHub token, or connector credential as ownership proof.
If verification fails, confirm that you copied the current token exactly. The HTTP file must be public, return valid JSON with a successful HTTP response, and stay on the connector's origin. DNS changes may need more time to propagate. A claim cannot transfer to a different origin or hostname: if the connector target changes, Glama starts the grace period and the new target must be claimed separately after the previous claim is released.
For a connector linked to the official MCP Registry, registry updates continue to replace its name, description, and URL by default. After claiming, open Manage connector and enable Use Glama listing details as the source of truth if edits made on Glama should be preserved. Categories and thumbnails are always managed on Glama; registry linkage and technical connection settings continue to sync.
Control your server's listing on Glama, including description and metadata
Access analytics and receive server usage reports
Get monitoring and health status updates for your server
Feature your server to boost visibility and reach more users
To improve your MCP server's ranking:
Claim ownership of the server listing
Complete the server profile with an accurate description and thumbnail
Provide a test profile so Glama can connect to and evaluate the server
Keep tool definitions clear and complete to earn a high Tool Definition Quality Score (TDQS)
Route real usage through the Glama Gateway; more recorded successful server uses also improve the ranking
For users:
Full audit trail – every tool call is logged with inputs and outputs for compliance and debugging
Granular tool control – enable or disable individual tools per connector to limit what your AI agents can do
Centralized credential management – store and rotate API keys and OAuth tokens in one place
Change alerts – get notified when a connector changes its schema, adds or removes tools, or updates tool definitions, so nothing breaks silently
For server owners:
Proven adoption – public usage metrics on your listing show real-world traction and build trust with prospective users
Tool-level analytics – see which tools are being used most, helping you prioritize development and documentation
Direct user feedback – users can report issues and suggest improvements through the listing, giving you a channel you would not have otherwise
The connector status is unhealthy when Glama is unable to successfully connect to the server. This can happen for several reasons:
The server is experiencing an outage
The URL of the server is wrong
Credentials required to access the server are missing or invalid
If you are the owner of this MCP connector and would like to make modifications to the listing, including providing test credentials for accessing the server, please contact support@glama.ai.
Discussions
No comments yet. Be the first to start the discussion!
Related MCP Connectors
Code intelligence platform for AI agents. 20 tools for architecture, security & impact analysis.
Governance copilot for AI-assisted coding. 72 packs, 532 rules, proof bundles.
Read-only AI coding tools for change verification, release readiness, capacity, and guidance.
AI-powered codebase analysis — call graphs, security, dead code, complexity. 150+ tools.
Related MCP Servers
- AlicenseAqualityAmaintenanceEnables AI-assisted X++ development for Dynamics 365 Finance and Operations by pre-indexing the entire codebase and providing 54 specialized tools for metadata lookup, code generation, and best practice validation.20326138MIT
- AlicenseNot gradedqualityBmaintenanceEnables AI coding assistants to ground on real D365 F&O AOT metadata locally and offline, preventing hallucinated X++ field names and Chain of Command signatures.MIT
- AlicenseAqualityAmaintenanceExposes the full capabilities of Microsoft Dynamics 365 Finance & Operations to AI assistants through 49 comprehensive tools and standardized protocol interactions. It enables sophisticated workflows including OData operations, metadata discovery, and secure database analysis.4938MIT
- FlicenseNot gradedqualityBmaintenanceEnables AI assistants to search and analyze Microsoft Dynamics 365 Finance & Operations artifacts, read local source code, and generate context-aware solutions through natural language.28712-
Glama MCP Gateway
Add one secure layer between your agents and this server.
TDQS
Most tools have distinct purposes and clear triggers, reducing ambiguity. For example, PR-related tools are separated into analysis, listing, commenting, and dependency mapping. However, some overlap exists between find_references, find_extensions, and find_callers, which could confuse an agent without careful descriptions.
Tool names follow a consistent snake_case pattern with verb_noun structure within subgroups (e.g., ado_*, find_*, search_*, generate_*). There is no mixing of camelCase or other styles, though the variety of prefixes slightly reduces predictability.
With 38 tools, the server feels slightly over-scoped for its domain. While each tool has a specific function, the number is high compared to typical well-scoped servers (10-15 tools). Some tools like find_references and find_callers could be consolidated.
The tool set covers a broad range of D365 F&O development and DevOps tasks, including code search, analysis, security, performance, upgrades, and work item management. Minor gaps exist, such as the absence of direct object modification or batch job management, but the core workflows are well covered.