Skip to main content
Glama

Server Details

D365 F&O: 90 AI tools over 200K+ objects, 25M+ cross-refs, 24M+ label translations.

If you are the author of this connector, you can claim ownership with GitHub, an HTTP challenge, or a DNS record. Claimed connector authors can inspect health checks, view analytics, and manage their listing.
Status
Healthy
Last Tested
Transport
Streamable HTTP
URL
Repository
alimbenhelal-pro/ALM-XPP-MCP
GitHub Stars
0

TDQS

A4/5.0

Scored across 90 tools

Disambiguation3/5

The descriptions are exceptionally explicit about when to use which tool (extensive NEVER/use-instead cross-references), which rescues many close calls. However, real overlaps remain: get_object_details vs get_object_context vs get_relation_graph, find_related_objects vs get_relation_graph, and most notably the consolidated `dmf` tool duplicating the five dedicated dmf_* tools. Several purposeful families (search_*, entity, best-practice) blur at the edges, so an agent still has to reason carefully.

Naming Consistency4/5

Overwhelmingly consistent snake_case verb_noun with clean domain namespaces (ado_, appinsights_, dmf_, odata_, d365fo_). Minor deviations like `healthcheck` (no verb/underscore), the noun-only `dmf`, and some noun-phrase names (federated_search, plan_and_execute) break the pattern only slightly.

Tool Count2/5

90 tools is far beyond the recommended 3-15 range and risks overwhelming an agent's selection ability even with strong descriptions. The D365 F&O domain is genuinely broad (code search, ADO, DMF, OData, App Insights, security, release notes), but this is well past the point where each tool clearly earns its slot, especially with duplicated dmf_* tools.

Completeness5/5

The surface covers an enormous lifecycle: search/discovery, object analysis, impact/references, BP and performance validation, code/AOT/entity/diagram generation, security and licensing, release notes, plus ADO work items, PRs, wiki, attachments, DMF, OData and App Insights. Pipelines are complete end-to-end (e.g. release-note context -> document; analyze_workitem -> post_comment), leaving essentially no dead ends.

Available Tools

90 tools
ado_analyze_pr_impactA
Read-onlyIdempotent
Inspect

[~] 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).

ParametersJSON Schema
NameRequiredDescriptionDefault
prIdYesPull Request ID (integer), e.g. 42.
projectNoOptional: Azure DevOps project name. Falls back to DEVOPS_PROJECT env var.
maxFilesDeepNoMax X++ files to fully analyse (default 10, max 20). Larger PRs get a summary for remaining files.
repositoryIdYesGit repository name or ID.
includeSourceNoEmbed 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.
includeWarningsNoInclude Warning-level violations in addition to Critical (default: true). Set false for Critical-only.
sourceCharsPerFileNoMax characters of source to embed per file when includeSource is true (1000-40000, default 8000). Larger files are truncated with a note.

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare readOnly/idempotent/open-world/non-destructive; the description adds substantial behavior: it reads un-merged source via the ADO REST API, analyses against the indexed standard KB, embeds source when includeSource is true, acknowledges the BP engine's X++-centric limitation for AOT XML, and states the required scope (DEVOPS_ORG_URL + DEVOPS_PAT with Code:Read). 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.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with a priority trigger and organized around numbered analysis steps, so an agent can quickly identify the tool's purpose. It is long and contains some redundant warnings ('DO NOT fall back' vs 'NEVER run git'), but nearly every sentence carries operational or selection value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite having no output schema, the description fully covers the input preconditions, the method, the returned content (source and four concrete analysis outputs), and the follow-up action (ado_post_pr_comment requiring user confirmation). This gives an agent enough context to invoke and interpret the tool correctly for a complex PR analysis.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% with detailed per-parameter docs, so the baseline is 3 and the description need not compensate. The description repeats context for includeSource but contributes little new meaning for prId, repositoryId, maxFilesDeep, or sourceCharsPerFile; the 'FULL source' claim is also tempered by the sourceCharsPerFile truncation rule in the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a clear, specific purpose: 'Analyse the full D365 F&O code impact of a Pull Request,' with enumerated outputs (BP validation, upgrade impact, extension conflicts, review comment). It also explicitly frames itself as the tool to use for PR review and names search_d365_code as the tool to avoid, so its scope is unambiguous against at least the most likely sibling.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides unusually explicit trigger phrases, a hard 'NEVER' exclusion for search_d365_code, and direction not to use local git workflows or to call ado_post_pr_comment afterwards. However, it does not disambiguate from the closely named sibling ado_review_xpp_pr, which likely occupies the same PR-review space, leaving some potential selection ambiguity.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ado_analyze_workitemA
Read-onlyIdempotent
Inspect

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:

  1. Work item metadata (title, description, repro steps, acceptance criteria, comments)

  2. D365 standard KB object details: fields, methods, code snippets for every matched object

  3. Custom code on disk (customer extension model): existing CoC methods, extension bodies

  4. 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:

  1. Compréhension du besoin -- résume ce que le client demande en 2-3 phrases claires

  2. Analyse technique -- identifie la cause racine en croisant le besoin + les objets KB + le code custom

  3. 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

  4. Estimation -- chiffrage en heures/jours selon la complexité détectée

  5. 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.

ParametersJSON Schema
NameRequiredDescriptionDefault
projectNoOptional: Azure DevOps project name. Falls back to DEVOPS_PROJECT env var.
workItemIdYesWork item ID (integer), e.g. 1234
maxCommentsNoNumber of recent comments to include (default 5, max 20). Use 3 for faster results.
focusObjectsNoComma-separated D365 object names to force-include in KB analysis, e.g. 'SalesTable,CustTable'. Providing these speeds up analysis significantly.
sourceBranchNoGit 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
includeImagesNoInclude 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

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false; the description adds genuine behavioral context beyond this: the tool returns raw structured context only (not a finished analysis), it requires DEVOPS_ORG_URL + DEVOPS_PAT, and it defines the post-call synthesis obligation including the comment-posting restriction. No contradiction with the annotations exists — 'Fetch and assemble' is consistent with readOnly/idempotent.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long (~350+ words) but well-structured with headers and front-loaded with purpose, triggers, and exclusions. There is noticeable redundancy: the 'no emojis / sans icônes' constraint appears twice, and the posting restriction is stated both in section 5 and again in the IMPORTANT sentence. The extensive 'YOUR JOB AS COPILOT' section partially substitutes for the missing output schema, but could be tightened.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

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 return contents (metadata, KB object details, custom code, relation graph), required environment variables, exclusions, and the expected downstream synthesis in French. Notable but not fatal gaps: no contrast with the close sibling ado_analyze_pr_impact and no error/edge-case behavior (e.g., work item not found, missing env vars). Overall it is complete enough for an agent to invoke and use the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline 3 applies and the schema already documents all six parameters well (e.g., focusObjects notes it 'speeds up analysis significantly', includeImages notes latency and token cost). The description adds no parameter-level meaning beyond the schema — it neither clarifies formats nor adds missing semantics. This is acceptable given the rich schema, but the description itself contributes nothing here.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The opening line states a specific verb+resource: 'Fetch a Work Item and assemble ALL technical context needed for D365 F&O expert analysis.' The NEVER-for clause explicitly carves out labels, X++ code lookup, and AOT objects, routing those to search_labels/search_d365_code, which distinguishes it from those siblings. However, it does not contrast with close analysis siblings like ado_analyze_pr_impact or data-retrieval siblings like ado_query_workitems, so differentiation is only partial.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides an explicit PRIORITY TRIGGER list ('analyse le workitem', 'read the work item', '#1234', 'WI#') and an explicit NEVER-for list naming alternatives (search_labels / search_d365_code). It also constrains post-call behavior by forbidding ado_post_comment on any linked/related work item. Selection conditions and exclusions are fully spelled out with nothing left to inference.

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).

ParametersJSON Schema
NameRequiredDescriptionDefault
projectNoOptional: Azure DevOps project name. Falls back to DEVOPS_PROJECT env var.
areaPathNoOptional: area path for the new task, e.g. 'MyProject\SER'. Inherits from parent if omitted.
assignToNoOptional: email address of the person to assign the task to, e.g. 'dev@company.com'.
notifyListNoOptional: comma-separated list of email addresses to notify (added to task description), e.g. 'lead@company.com,qa@company.com'.
workItemIdYesID of the selected Work Item (parent, bug, issue, etc.) to base the task on.
descriptionNoOptional: additional description / acceptance criteria text to append to the task.
effortHoursNoOptional: estimated effort in hours (Original Estimate).
repositoryIdNoOptional: Git repository name to create the branch in. If omitted, uses the first repository found.
sourceBranchNoOptional: source branch to branch from (default: repo default branch, e.g. 'main').
iterationPathNoOptional: iteration path for the new task, e.g. 'MyProject\Sprint 5'. Inherits from parent if omitted.

TDQS

A4.3/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description richly discloses behavior beyond the annotations: automatic Git branch creation, the three-case naming convention logic (A/B/C), the N counter increment behavior, assignee/CC embedding in the task description, the French/English language rule, and credential requirements (DEVOPS_ORG_URL + DEVOPS_PAT with specific permissions). readOnlyHint=false is consistent with a create operation; no contradiction.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but earns its length given the tool's complexity (10 parameters, three naming branches, language rule, auth requirements). It is well-structured and front-loaded with WHEN triggers before rules and requirements. Minor redundancy exists in repeating trigger examples and the naming convention explanation, but no sentence is wasted.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a high-complexity tool with no output schema, the description covers usage, naming behavior, branch creation, language handling, and credentials. The main gap is that it never states what the tool returns (task ID, branch name, URL), which an agent would need to continue a workflow after creating the task.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

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 10 parameters, warranting the baseline of 3. The description adds indirect context—naming rules depend on the parent work item (workItemId) and assignee/CC get embedded in the description—but it does not add per-parameter semantic detail beyond what the schema provides.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: 'Create a D365 F&O development Task work item in Azure DevOps following the project naming convention.' It also includes concrete trigger phrases ('create task', 'start development on', 'créer une tâche') that make selection unambiguous. The create-vs-update distinction is clear against siblings like ado_update_workitem.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit WHEN guidance with trigger phrases ('create task', 'créer une tâche', 'start development on', etc.), which is strong usage direction. It does not explicitly name alternatives to avoid or when-not conditions, but the trigger listing plus the creation-oriented rules make the intended invocation context clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ado_estimate_effortA
Read-onlyIdempotent
Inspect

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'.

ParametersJSON Schema
NameRequiredDescriptionDefault
projectNoOptional: Azure DevOps project name. Falls back to DEVOPS_PROJECT env var.
workItemIdYesWork Item ID to estimate, e.g. 6587.
focusObjectsNoOptional: comma-separated D365 object names to force-include in analysis (speeds up estimation).

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly/idempotent/non-destructive, and the description adds non-redundant behavioral context: it uses 'KB signals ... combined with ADO history' and returns a per-phase breakdown, confidence level, and risk factors. 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.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is structured with WHEN, PRIORITY TRIGGER, purpose, returns, and trigger phrases, which makes it scannable. It is slightly redundant because the WHEN section and the final Triggers list mostly repeat the same example phrases, but overall it stays reasonably lean.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

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, it fully describes what the estimate is based on, what is returned (phase breakdown, KB signals, confidence, risk factors), and how the output can be used. An agent can select and invoke this tool correctly with the information provided.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

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 workItemId, project, and focusObjects. The description mentions Work Item IDs via trigger examples but adds no meaning beyond the schema for parameters like focusObjects or project fallback.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The opening 'EFFORT ESTIMATOR -- Estimate D365 F&O development effort for a Work Item' states a specific verb, target resource, and domain. It is clearly differentiated from sibling tools like ado_analyze_workitem by focusing on hour estimates and phase breakdowns rather than general analysis.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives explicit WHEN triggers ('user asks for an effort estimate, chiffrage, or development hours') and a priority instruction to call AFTER ado_analyze_workitem. It does not explicitly state when not to use the tool or name mutually exclusive alternatives, so it falls short of a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ado_gap_fit_analysisA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
projectNoOptional: Azure DevOps project name. Falls back to DEVOPS_PROJECT env var.
workItemIdNoOptional: Work Item ID to fetch the requirement from ADO (e.g. 6587). Leave empty to use requirementText.
requirementsNoOptional: comma-separated list of requirement sentences to analyse individually (overrides WI + requirementText).
requirementTextNoOptional: raw requirement text to analyse directly (when no WI ID is provided).

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and destructiveHint=false, so the description is not burdened with basic safety disclosure. It adds useful behavioral context: extension lookup only happens if D365_CUSTOM_MODEL_PATH is set, and the tool returns a structured analysis including standard objects, effort estimate, and reasoning. No annotation contradiction exists.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense and front-loaded with WHEN, followed by classification definitions, return sections, triggers, and an input-mode caveat. It is somewhat long and the WHEN section overlaps with the later Triggers list, but every section carries useful information for a complex classifier tool.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

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 must explain return values, and it does: detected domain, standard objects, existing extensions, effort estimate, and reasoning. It also covers all four input modes (project, workItemId, requirements, requirementText) and their relationships, making the tool safely callable without external documentation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

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, but the description adds meaningful usage nuance: it explains that requirements overrides WI and requirementText, and that requirementText should be preferred when a WI was already analyzed. This goes beyond the schema's individual parameter descriptions and helps an agent choose the correct parameter combination.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

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 identifies itself as a 'GAP / FIT CLASSIFIER' that analyzes D365 F&O requirements and classifies them into four defined verdicts. This immediately distinguishes it from generic work item analysis tools like ado_analyze_workitem and effort-only estimators.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It provides explicit trigger phrases, states when the tool is relevant ('Also triggered by gap analysis or fit/gap classification'), and gives a concrete routing rule: if a work item was already analyzed by ado_analyze_workitem, pass requirementText directly and do NOT re-fetch with workItemId. This is actionable guidance for choosing the right input mode.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ado_list_prsA
Read-onlyIdempotent
Inspect

[~] 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).

ParametersJSON Schema
NameRequiredDescriptionDefault
topNoMax results to return (1-100, default 25).
authorNoOptional: filter by author display name (partial match), e.g. 'Alim'.
statusNoPR status filter: Active (default), Completed, Abandoned, All.Active
projectNoOptional: Azure DevOps project name. Falls back to DEVOPS_PROJECT env var.
repositoryIdNoGit repository name or ID. If not known, leave empty to list all repos first.
targetBranchNoOptional: filter by target branch, e.g. 'main', 'develop'.

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the readOnlyHint and idempotentHint annotations, the description discloses the fallback behavior when repositoryId is unknown, the required credentials and scope (DEVOPS_ORG_URL + DEVOPS_PAT with Code: Read scope), and the returned fields. This adds meaningful behavioral context that annotations alone do not provide.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is longer than average but every sentence earns its place: trigger phrases, an explicit alternative exclusion, core functionality, repositoryId handling, filters, return values, related tool, and auth requirements. The priority trigger is front-loaded, ensuring the agent immediately knows when to call this tool.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a list PR tool with six fully documented parameters and no output schema, the description is complete. It covers invocation triggers, filtering options, repositoryId behavior, expected return fields, authentication needs, and the natural follow-up tool. Nothing essential for an agent to call it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

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 valuable semantics beyond the schema: it explains how to handle an unknown repositoryId (omit it to list all repositories) and clarifies the filter semantics (status, author display name, target branch). This nudges it above the baseline, though it doesn't add details for every parameter.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description starts with a specific verb and resource: 'List Pull Requests in an Azure DevOps Git repository.' It also states the exact output (PR ID, title, author, source->target branch, review status, linked work items, creation date) and clearly distinguishes itself from search_d365_code and ado_analyze_pr_impact. This makes the tool's role unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides an explicit priority trigger list of user phrases and a direct exclusion: 'NEVER call search_d365_code for PR listing requests.' It also routes follow-up analysis to ado_analyze_pr_impact. This is outstanding guidance for when to use the tool versus alternatives.

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
projectNoOptional: Azure DevOps project name. Falls back to DEVOPS_PROJECT env var.
workItemIdYesWork item ID (integer), e.g. 1234
commentTextYesMarkdown text to post. Use the ready-to-post block from `ado_analyze_workitem`.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Discloses that this is a write operation requiring DEVOPS_PAT with Work Items: Write permission, warns confirmation is needed, and clarifies it should be called after analysis. Annotations confirm readOnlyHint=false and destructiveHint=false, and the description adds meaningful context 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.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Information is front-loaded with WHEN and PRIORITY TRIGGER labels, then the confirmation warning and workflow. Slightly long but every sentence serves a purpose, and the structured labels make it scannable.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers when to use, prerequisites, workflow, permissions, and parameter source. No output schema exists and none is needed for a simple write operation. Lacks a note about idempotency or duplicate comments, but the provided context is otherwise sufficient.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so parameters are already documented. Description adds valuable semantic context: the commentText should be the ready-to-post block from `ado_analyze_workitem`, and project falls back to DEVOPS_PROJECT env var. Slight extra value beyond schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description explicitly states the action: post, add, or save a comment to an ADO Work Item. Distinguishes itself from sibling `ado_post_pr_comment` by targeting Work Items specifically, though it could be clearer about that exact difference.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit WHEN trigger, PRIORITY TRIGGER conditions, a recommended workflow with step-by-step sequencing, a warning to always ask for user confirmation, and required permissions. This is exemplary usage guidance.

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).

ParametersJSON Schema
NameRequiredDescriptionDefault
prIdYesPull Request ID (integer), e.g. 42.
projectNoOptional: Azure DevOps project name. Falls back to DEVOPS_PROJECT env var.
filePathNoOptional: file path for an inline comment. Leave empty for a top-level PR comment.
lineNumberNoOptional: line number for an inline comment (used with filePath).
commentTextYesMarkdown text to post. Use the ready-to-post block from `ado_analyze_pr_impact`.
repositoryIdYesGit repository name or ID.

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes beyond annotations by disclosing that explicit user confirmation is mandatory, and that DEVOPS_ORG_URL and DEVOPS_PAT are required with Pull Request Threads Read & Write permission. 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.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Well-structured and front-loaded with the WHEN condition, then the warning and workflow. A bit verbose, but every sentence carries actionable guidance and there is no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers when to use, prerequisites, confirmation requirement, and the full recommended workflow. It does not describe the return value, but that is not essential for correctly invoking this write operation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline applies. The tool description itself adds little parameter detail beyond the overall action, though the schema already documents each field adequately.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Uses a specific verb and resource: 'post, add, or save a review comment to an ADO Pull Request.' It also states the WHEN condition and names the related analysis tool, making it easy to distinguish from the generic sibling ado_post_comment.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit when-to-use triggers, including example user phrases, and a recommended confirmation workflow that requires calling ado_analyze_pr_impact first and asking the user before posting. This is strong routing guidance with no ambiguity.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ado_pr_dependency_mapA
Read-onlyIdempotent
Inspect

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).

ParametersJSON Schema
NameRequiredDescriptionDefault
topNoMaximum PRs to analyse (default: 30, max: 60).
statusNoPR status filter: Active (default), Completed, Abandoned, All.Active
projectNoOptional: Azure DevOps project name. Falls back to DEVOPS_PROJECT env var.
repositoryIdYesGit repository name or ID.
targetBranchNoOptional: filter by target branch, e.g. 'develop'.

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false. The description adds meaningful behavioral context beyond that: it requires DEVOPS_ORG_URL + DEVOPS_PAT with Code: Read scope, computes a topological merge order, and detects branch-chain relationships. This gives a fuller picture of what the tool actually does 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.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but well-structured: purpose first, then per-PR behavior, output sections, triggers, and prerequisites. The trigger list is somewhat extensive, but it earns its place by helping an agent recognize the right invocation context. Slightly tighter wording could improve it, but it is not wasteful.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

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 correctly enumerates what the tool returns: per-PR object table, conflict matrix, dependency graph summary, and ordered merge sequence. It also covers the two core analysis dimensions and the required credentials. Given the tool's complexity, this is a reasonably complete definition, though it could mention behavior on empty or invalid PR sets.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

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 five parameters. The description adds no extra parameter-level semantics beyond what the schema provides; it focuses on behavior and output. This matches the baseline of 3 for fully-covered schemas.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

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: 'Scan multiple Pull Requests and build a cross-PR dependency graph'. It clearly distinguishes itself from sibling tools like ado_list_prs or ado_analyze_pr_impact by focusing on cross-PR dependency analysis, object conflicts, and merge ordering.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides a Triggers section with concrete natural-language phrases ('PR dependencies', 'ordre de merge des PR', 'conflits entre PR') that tell an agent when this tool is appropriate. It does not explicitly name alternatives or list when-not-to-use conditions, but the trigger list gives clear contextual guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ado_query_workitemsA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
tagNoOptional: filter by tag (partial match), e.g. 'D365' or 'hotfix'.
queryYesWIQL query, shortcut ('bugs', 'my bugs', 'recent', 'sprint'), title search, or '*' to use filters only.
stateNoOptional: filter by state, e.g. 'Active', 'New', 'Resolved', 'Closed'.
projectNoOptional: Azure DevOps project name. Falls back to DEVOPS_PROJECT env var.
areaPathNoOptional: filter by area path (exact or under), e.g. 'MyProject\SER'.
priorityNoOptional: filter by priority level: 1 (Critical), 2 (High), 3 (Medium), 4 (Low).
assignedToNoOptional: filter by assignee display name or email (partial match), e.g. 'Alim' or 'alim@contoso.com'.
whereClauseNoOptional: 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 '.
changedSinceNoOptional: only return items changed since this date, e.g. '2025-01-01' or '7' (days ago).
workItemTypeNoOptional: filter by work item type, e.g. 'Bug', 'Task', 'User Story', 'Feature'.
iterationPathNoOptional: filter by iteration/sprint path, e.g. 'MyProject\Sprint 5'. Use 'current' for @CurrentIteration.

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already mark the tool as read-only and idempotent, but the description adds valuable operational context: it requires DEVOPS_ORG_URL and DEVOPS_PAT env vars, returns a maximum of 50 items, and specifies the returned fields. It also discloses behavioral scope by restricting the tool to Azure DevOps and excluding labels/code scenarios.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense and front-loaded with purpose and scope, followed by triggers, exclusions, shortcuts, and constraints. It is long and somewhat noisy, but nearly every sentence carries routing or usage information, so it earns its length.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool has 11 parameters with 100% schema coverage and no output schema, the description still provides the missing return shape (ID, title, type, state, priority, area, assigned-to), a result cap, env var prerequisites, and explicit usage patterns. Nothing critical is left unexplained.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

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 goes beyond the schema by explaining what each shortcut expands to ('bugs' = all active bugs, 'my bugs' = assigned to me, 'recent' = updated last 7 days, 'sprint' = current iteration), which meaningfully aids parameter use.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a clear verb-resource pair: 'Query Work Items ... in Azure DevOps' and names the work item types covered. It is unambiguous about scope ('AZURE DEVOPS ONLY') and clearly distinct from sibling tools that create, update, or analyze work items.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It provides explicit trigger keywords, explicit never-use cases, and named alternatives ('For labels -> use search_labels', 'For D365 code -> use search_d365_code or get_object_details'). This gives an agent strong routing guidance beyond the tool name.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ado_read_attachmentA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
projectNoOptional: Azure DevOps project name. Falls back to DEVOPS_PROJECT env var.
fileNameYesExact attachment file name as shown by ado_analyze_workitem, e.g. 'Field Mapping.xlsx'. Case-insensitive.
sheetNameNoOptional: sheet name for .xlsx/.xlsm attachments. Defaults to the first sheet.
workItemIdYesWork item ID, e.g. 1234

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the readOnlyHint annotations, the description discloses important behavioral details: supported formats and their exact return representations, max attachment size (25 MB), image size limit (4 MB), the fallback behavior for unsupported binary formats, and environment variable requirements. This richly supplements the annotation layer 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.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but every sentence earns its place: purpose, trigger conditions, prerequisites, format-specific behavior, limits, and env vars. The critical purpose is front-loaded, and the dense format list replaces the need for an output schema. No filler or redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite having no output schema, the description fully covers return behavior for every supported format, explicitly lists unsupported formats, states size limits, and notes the required environment variables. An agent has everything it needs to decide whether to call this tool and what to expect from the response.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

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's parameter-related details (fileName case-insensitivity, sheetName default, project env fallback) largely repeat what the schema already states. It adds useful context for fileName ('as shown by ado_analyze_workitem') but does not significantly elevate understanding beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

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: 'Reads the ACTUAL CONTENT of a file attached to a work item.' It enumerates supported formats and return behavior, making the tool's scope unmistakable and distinguishing it from sibling tools like ado_analyze_workitem, which is referenced only as a prerequisite for discovering filenames.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly provides a 'WHEN' clause, concrete trigger phrases, and a clear prerequisite ('Call ado_analyze_workitem first'). It also states what the tool does NOT parse, giving the agent an exclusion boundary for unsupported formats. This is as explicit as usage guidance gets.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ado_review_xpp_prA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
prIdYesPull Request ID to review.
projectNoAzure DevOps project name. Falls back to DEVOPS_PROJECT env var.
repositoryIdNoGit repository name or ID.
maxDeepAnalysisNoMax AOT objects to deeply analyse (1-20, default 8). Objects beyond this limit are listed but not deeply analysed.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already mark this read-only and idempotent, and the description adds significant behavioral detail: it fetches source from the PR branch with fallback to the indexed version and announces when that fallback occurs, explains why xppbp.exe cannot run (PR is uncompiled), and notes the deterministic rule set used. It also discloses required credentials and dependencies. 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.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with 'WHEN', then flows logically through output, limitations, trigger phrases, prerequisites, and follow-up action. While lengthy, every sentence carries useful information for tool selection and invocation; the trigger examples aid intent recognition and the technical caveats are essential for correct use. No filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with this complexity—requiring Azure DevOps credentials, XRef index, D365-specific analysis, and interplay with sibling tools—the description covers prerequisites, fallback behavior, output structure, and integration points. The absence of an output schema is mitigated by naming the exact dimensions of review (blast radius, BP violations, impact severity). Nothing critical is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

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 does not elaborate on individual parameters, but the schema already documents prId, project, repositoryId, and maxDeepAnalysis clearly. The description's mention of 'each changed object' and fallback behavior adds context but not parameter-level semantics, so it neither improves nor degrades from baseline.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

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: reviewing a PR that modifies X++ code or AOT objects and returning a structured code review. It clearly differentiates itself from siblings like find_error_patterns and find_callers by specifying that it produces D365-specific PR review insights covering blast radius, best-practice violations, and impact severity.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The 'WHEN:' prefix explicitly states the exact conditions for use, and it names find_error_patterns as the alternative for Microsoft rule text. It also mentions combining with ado_post_pr_comment for posting findings, giving the agent a clear workflow. This goes beyond generic context and provides actionable routing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ado_update_workitemA
DestructiveIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
projectNoOptional: Azure DevOps project name.
fieldsJsonYesJSON 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.
workItemIdYesWork item ID to update.

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations, the description adds important behavioral context: the need to always show the user what will be changed and ask for confirmation, and the prerequisite of DEVOPS_PAT with Work Items: Write permission. These details help the agent understand safety and authorization requirements that annotations alone do not convey.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense but efficient: it front-loads the core purpose, then covers supported fields, trigger phrases, safety behavior, and authorization in a concise, scannable format. Every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a three-parameter update tool with annotations and a fully documented schema, the description is complete: it explains what the tool updates, how fields are selected, when to trigger it, how to handle confirmation, and what permissions are required. No output schema exists, and the description does not need to explain return values for this mutation tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

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 fields use Field Reference Names and can be standard or custom, but it largely duplicates the examples already present in the fieldsJson parameter description rather than adding substantial new parameter-level meaning.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the specific action ('Update one or more fields on an existing Azure DevOps Work Item') and identifies the resource. It distinguishes itself from sibling tools like ado_create_task by explicitly targeting existing work items, and from read/query tools by the update verb.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear context for when to use this tool, including user trigger phrases and the requirement to show changes and get confirmation before calling. However, it does not explicitly state when not to use it or name alternative tools such as ado_create_task for new work items, so it falls just 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.

ado_wiki_create_or_update_pageA
DestructiveIdempotent
Inspect

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).

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYesWiki page path, e.g. '/Home' or '/Architecture/Deployment'. Parent pages are created automatically if missing.
contentYesFull markdown content for the page (replaces any existing content).
projectNoOptional: Azure DevOps project name. Falls back to DEVOPS_PROJECT env var.
wikiIdentifierNoWiki name or id. Omit to auto-resolve to the project's only/first wiki (call ado_wiki_list if there are several).

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description adds substantial behavioral context beyond the annotations: it discloses the tool replaces the ENTIRE page body and does not merge/append, it documents ETag-based concurrent-edit safety handling, and it states the required env vars and PAT scope (Wiki: Read & Write). This is exactly the kind of destructive-context and auth detail an agent needs. No contradiction with readOnlyHint=false, destructiveHint=true, or idempotentHint=true.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four dense sentences, each earning its place: scope constraint, core action, critical edit-vs-replace warning, concurrency safety, and auth prerequisites. The most decision-relevant information is front-loaded ('AZURE DEVOPS ONLY', create/overwrite, call get_page first). Zero fluff or repetition of schema content.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a destructive write tool, the description covers everything an agent needs to select and invoke it correctly: prerequisites (env vars + PAT scope), safety mechanism (ETag), destructive scope (entire body replaced), and routing to sibling tools. All four parameters are documented in the schema. The only omission is return-value format, which is minor for an upsert tool and not required given no output schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3 — the schema already documents all four parameters with examples, fallback behavior, and disambiguation guidance. The description adds minimal parameter-specific meaning beyond the schema, only lightly reinforcing that content is 'new markdown content.' It does not need to compensate, so 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific action ('Create a new wiki page, or OVERWRITE an existing one with new markdown content') tied to a concrete resource. It also distinguishes itself from sibling tools by explicitly naming ado_wiki_get_page as the tool to call first for edits, and the scope constraint 'AZURE DEVOPS ONLY' anchors it against non-DevOps siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit when-to-use guidance is present: 'ALWAYS call ado_wiki_get_page first if you intend to edit (not replace) an existing page's content.' This routes the agent to the correct alternative with a clear condition. It also routes to ado_wiki_list for the wikiIdentifier disambiguation case. This is model-level usage guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ado_wiki_delete_pageA
DestructiveIdempotent
Inspect

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).

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYesWiki page path to delete, e.g. '/Architecture/Old-Design'.
projectNoOptional: Azure DevOps project name. Falls back to DEVOPS_PROJECT env var.
wikiIdentifierNoWiki name or id. Omit to auto-resolve to the project's only/first wiki (call ado_wiki_list if there are several).

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already mark the tool as destructive, idempotent, and non-read-only. The description adds important behavioral detail beyond those hints by revealing the cascading deletion of sub-pages and the exact authentication requirements. 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.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, with the most important constraints (scope, deletion behavior, prerequisites) front-loaded. Every sentence adds necessary information and there is no filler or repetition of schema content.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a destructive tool with no output schema, the description provides the essential context: platform restriction, destructive cascade, and required credentials. It could mention what happens on success or error, but the prerequisites and behavior are sufficiently covered 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.

Parameters3/5

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, including defaults and fallback behavior. The description does not add parameter-level detail beyond the schema, which is acceptable given full coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific verb ('Delete') and resource ('wiki page') and states that sub-pages are also deleted. It clearly distinguishes this from sibling tools like ado_wiki_get_page and ado_wiki_create_or_update_page by describing a destructive operation rather than a read or write.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description makes the Azure DevOps-only scope explicit and lists required environment variables plus PAT scopes. It doesn't explicitly name alternatives like ado_wiki_create_or_update_page for edits, but the destructive purpose and prerequisites provide clear context for when this tool should be used.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ado_wiki_get_pageA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYesWiki page path, e.g. '/Home' or '/Architecture/Deployment'.
projectNoOptional: Azure DevOps project name. Falls back to DEVOPS_PROJECT env var.
wikiIdentifierNoWiki name or id. Omit to auto-resolve to the project's only/first wiki (call ado_wiki_list if there are several).
includeSubPagesNoAlso list immediate sub-page paths under this page.

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds useful behavioral context beyond annotations: it requires DEVOPS_ORG_URL and DEVOPS_PAT, uses page-path syntax, and reads immediate sub-page paths. No annotation contradiction exists.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Single sentence with no filler. The environment constraint, main action, path syntax, and auth requirements are all front-loaded and each contributes necessary information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given rich annotations and full schema coverage, the description covers the essential context: environment, auth, path syntax, and behavior. With no output schema, it leaves the exact return format unspecified, but 'Read the content' is sufficient for a simple read operation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so baseline is 3. The description repeats path syntax examples already present in the schema and adds no additional meaning for project, wikiIdentifier, or includeSubPages.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific read verb and resource: 'Read the content of a wiki page'. The Azure DevOps-only qualifier and the mention of immediate sub-page paths further scope the operation. It does not explicitly distinguish itself from ado_wiki_list, but the read/get semantics make the purpose clear.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides clear usage context: Azure DevOps only, required env vars, and wiki page-path syntax. It does not explicitly name alternatives or say when not to use this tool, but the read action naturally separates it from the create/update/delete wiki siblings.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ado_wiki_listA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
projectNoOptional: Azure DevOps project name. Falls back to DEVOPS_PROJECT env var.

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover read-only, idempotent, and non-destructive behavior. The description adds useful context beyond annotations: the tool depends on specific env vars, targets Azure DevOps specifically, and its result set includes both project wikis and published code-as-wiki repos. No contradictions 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.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Every sentence earns its place: scope warning, purpose with detail, explicit usage guidance, and environmental requirements. It is front-loaded with 'AZURE DEVOPS ONLY' and contains no filler or repetition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple list operation with one optional parameter, rich annotations, and clear usage guidance, the description is complete. It explains when to use the tool, what it returns conceptually, and what environment setup is needed. No critical information is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%: the only parameter, project, is fully described with its optionality and fallback to DEVOPS_PROJECT env var. The tool description does not add parameter-level detail, but the schema already carries that burden, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('List') and resource ('all wikis in a project'), and elaborates on what counts as a wiki ('project wiki plus any published code-as-wiki repos'). This clearly distinguishes it from sibling wiki tools like ado_wiki_get_page or ado_wiki_create_or_update_page, which operate on individual pages.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly tells the agent when to use it: '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.' It also gives environmental prerequisites (env vars) and an 'AZURE DEVOPS ONLY' scope, leaving no ambiguity about invocation context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

analyze_upgrade_impactA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, and non-destructive behavior. The description adds substantial behavioral detail: it cross-references every extensibility hook, detects specific breakage categories, and returns a prioritized risk report with fixes. This goes well beyond the annotations and gives the agent an accurate model of tool execution.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the WHEN condition and trigger phrases, then moves efficiently through scope, detection categories, and output. The trigger list is slightly redundant with the WHEN clause, but every sentence contributes usable guidance for tool selection.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter tool with no output schema, the description covers the required input, the analysis scope, the detected failure modes, and the return format. It is mostly complete, though it could add caveats about how D365_CUSTOM_MODEL_PATH is configured or any runtime/scale limitations.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has zero properties, so the description is the only source of input semantics. It names the required D365_CUSTOM_MODEL_PATH, which is critical context beyond the empty schema, but it does not clarify the path's format, where it is resolved from, or whether it is an environment variable.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific action (analyze upgrade risk), a specific resource (custom D365 F&O model), and enumerates concrete detection targets such as Chain of Command, event handlers, and extensions. It is clearly distinguishable from sibling tools by its upgrade-version detection focus, even without naming a specific alternative.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit WHEN guidance (upgrading D365 F&O or applying a Microsoft update) and a rich set of trigger phrases for agent matching. It does not explicitly name alternative tools or state when not to use this tool, so it falls short of a full exclusion-based usage guideline.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

appinsights_clear_connectionA
Idempotent
Inspect

Removes the Application Insights connection cached for the current session by appinsights_set_connection.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate idempotentHint=true and destructiveHint=false. The description adds valuable context by specifying the scope ('current session') and that it affects only the cached connection, not the underlying Application Insights resource. This goes beyond the structured 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.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, front-loaded sentence with no filler. It states the action, the target, and the scope efficiently, earning its place completely.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple zero-parameter, no-output-schema tool, the description is complete: it explains what is removed, the session scope, and the origin of the cached connection. No critical information is missing 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.

Parameters4/5

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. The description adds relevant context by naming the connection being cleared, which is sufficient given no parameters exist to document.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('Removes') and identifies the exact resource: the Application Insights connection cached for the current session by appinsights_set_connection. This clearly distinguishes it from sibling connection tools like d365fo_clear_connection and from the paired set_connection tool.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description clearly implies its usage as the counterpart to appinsights_set_connection: it clears the session-level cache that tool created. However, it does not explicitly state when to prefer it over alternatives or provide a 'use when' condition, so it falls just short of full usage guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

appinsights_diagnose_slownessA
Read-onlyIdempotent
Inspect

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:

  1. X++ exception hotspots (exceptions table) -- top types/messages by count.

  2. 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).

  3. 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'.

ParametersJSON Schema
NameRequiredDescriptionDefault
topNoMax rows per section (1-50). Default 15.
lookbackHoursNoHow far back to analyze, in hours (1-720). Default 24.
minDurationMsNoMinimum average duration (ms) for a custom event to be flagged as 'slow'. Default 2000.

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already carry the safety profile (readOnlyHint, idempotentHint, destructiveHint=false), lowering the bar; the description adds real behavioral context on top: the report-assembly behavior, conditional rendering of section 3 only 'if the workspace actually has data there', and the ElapsedMilliseconds convention used to flag slow events. 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.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Information is front-loaded with the WHEN purpose, and the numbered sections make the report output easy to anticipate. The trigger-phrase list is slightly redundant (the same intent repeated across languages) but earns its place for multilingual intent matching; no sentence is wasted.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema present, the description carries the burden of explaining return values — and it does: three clearly enumerated report sections with their source tables (exceptions, customEvents, requests/dependencies), the conditional empty-data behavior, and the connection prerequisite. Combined with full schema parameter ranges, an agent has everything needed to decide on and invoke this tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% for all three parameters, so the baseline is 3. The description adds value beyond the schema by explaining the telemetry convention behind minDurationMs: events carrying an 'ElapsedMilliseconds custom property' (ALMMonitoring-instrumented FDDs, out-of-box signals) get the duration breakdown and 'slow' threshold. This ties the parameter to the actual data source rather than restating schema text.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with a specific WHEN and a precise verb-resource pair: it diagnoses why a 'D365 F&O environment feels slow' using 'real Application Insights telemetry the environment already emits'. The three numbered report sections (exception hotspots, hot custom telemetry events, slow web requests/dependencies) concretely define the output and separate it from generic query tools like appinsights_query.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

States an explicit trigger condition ('WHEN: user wants to understand/deduce why a D365 F&O environment feels slow') and names the prerequisite (appinsights_set_connection or server env vars). 'No trace file upload needed' implies an alternative that requires trace uploads, but it never explicitly names the competing sibling (e.g., detect_performance_issues), leaving a small inference step.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

appinsights_queryA
Read-onlyIdempotent
Inspect

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'.

ParametersJSON Schema
NameRequiredDescriptionDefault
kqlYesKQL 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).
maxRowsNoMax rows to return (1-500). Default 100.
lookbackHoursNoHow far back to query, in hours (1-720). Default 24.

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and non-destructive behavior. The description adds useful context beyond this: the KQL language has no mutation operators, a connection must be configured first, and the standard App Insights schema is expected. This is valuable behavioral disclosure 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.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core action and then adds prerequisites, schema guidance, and sibling routing. The trigger-phrase list is slightly long but useful for selection. Minor redundancy exists with the annotations around read-only behavior, but it does not harm clarity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers the prerequisite, the scope, the alternative tool, and the schema family. With all parameters already documented in the schema and safety covered by annotations, the main missing piece is an explicit statement of the result shape, but for a raw query tool the returned table is fairly self-explanatory.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

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 clearly, including the lookbackHours time-range behavior and maxRows limits. The description adds schema-context guidance (which tables are available) but no additional parameter-level semantics beyond what the schema provides.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: 'Run a raw KQL query against the D365FO environment's Application Insights / Log Analytics workspace.' It also explicitly distinguishes itself from appinsights_diagnose_slowness, so an agent can tell which tool to pick.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit when-to-use guidance: prefer appinsights_diagnose_slowness for a ready-made slowdown report, use this tool for more specific/custom queries. It also names the prerequisite (configured connection via appinsights_set_connection or env vars) and includes trigger phrases.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

appinsights_set_connectionA
Idempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
clientIdYesApp registration (client) id (GUID), granted Log Analytics Reader on the workspace.
tenantIdYesEntra (Azure AD) tenant id (GUID).
ttlMinutesNoMinutes the connection stays cached for this session (1-480). Default 60.
workspaceIdYesLog Analytics workspace ID (GUID) behind the linked Application Insights resource.
clientSecretYesApp registration client secret. Encrypted in memory; never logged or persisted.

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description goes well beyond annotations by disclosing that the client secret is AES-256-GCM encrypted in memory, never written to disk, never echoed back, and that only read-only permissions are needed/used. It also explains session-scoped lifetime and automatic reuse behavior. No contradiction with annotations was found.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is detailed but well-structured, with the core behavior front-loaded and the credential-procurement guidance separated into a clearly labeled section. Every sentence adds useful information, including the locked-server caveat that directly affects whether the agent should attempt this call.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a session-configuration tool, the description covers the critical setup, reuse, expiry, clearing, and locked-server behavior, along with detailed credential guidance. The only minor gap is that it does not describe the success/error response shape, but with no output schema and a semantically simple setter operation, this is a low-risk omission.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the schema already documents every parameter. The description adds meaningful real-world guidance for sourcing workspaceId and the Entra ID parameters, including the critical distinction between workspace ID and App Insights app ID, plus required roles. However, ttlMinutes receives no extra description-level guidance beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('register') and resource ('the D365 F&O environment's Application Insights / Log Analytics connection') and further scopes it to the 'CURRENT session'. It also distinguishes itself from siblings by noting that appinsights_query and appinsights_diagnose_slowness use this connection automatically and that appinsights_clear_connection removes it.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly explains when to use the tool: before querying or diagnosing via Application Insights, and that it remains active until expiry or explicit clearing. It also documents the locked-server deployment scenario where the tool is disabled and server credentials are used instead, which is a clear exclusion/alternative condition.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

compare_objectsA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
objectNameAYesFirst object name, e.g. 'SalesTable'
objectNameBYesSecond object name, e.g. 'PurchTable'

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false; description adds the comparison scope but does not disclose return shape or failure behavior. With safety covered by annotations, 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.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two focused sentences that front-load the action and detail, with a usage cue in the second sentence; no wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Enough for a simple read-only two-parameter tool: schema covers parameters and annotations cover safety. The only gap is no explicit statement of output/return value, since no output schema exists.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema covers both parameters fully (100%) with examples; description reinforces comparison semantics but adds no syntax or additional parameter-specific guidance, so baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description names a specific verb ('Compare'), resource ('two D365 F&O objects'), and comparison dimensions ('fields, methods, signatures'), which clearly separates it from single-object lookup tools like get_object_details and version diff tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

States two concrete use cases ('standard vs customisation', 'two similar tables'), telling an agent when the tool is appropriate, though it does not explicitly name alternatives or exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_aot_objectA
Read-onlyIdempotent
Inspect
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
ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesObject name -- must start with the ISV prefix, e.g. 'ALMMyTable', 'ABCSalesService'.
aotTypeYesAOT type, e.g. 'AxTable', 'AxClass', 'AxForm', 'AxEnum', 'AxEdt', 'AxSecurityPrivilege', etc.
optionsNoKey-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

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations (readOnlyHint, idempotentHint, destructiveHint), it explicitly states 'never writes to the filesystem, never mutates external state, and is safe to expose from the cloud MCP' and clarifies that disk writing is the client's job. This fully discloses the tool's side-effect boundary and is consistent with 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.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is very long, but the length is justified by about 20 AOT types with distinct option sets. It is front-loaded with purpose and safety, then organized by type with consistent formatting; minor formatting inconsistencies and overall bulk keep it from a perfect score.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite having no output schema, it states the return value ('XML + the correct file path') and the caller's follow-up action. Combined with exhaustive parameter documentation and side-effect disclosure, nothing critical is missing for an agent to invoke the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema only defines a generic options dictionary, but the description documents every aotType-specific option with syntax, defaults, enums, CSV layouts, and examples. This is far beyond what the input schema provides and is essential for correctly invoking the tool.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with a specific verb and resource: 'Generate a complete, ready-to-deploy D365 F&O AOT XML scaffold for any object type.' It also states the two outputs (XML + file path) and the caller's write responsibility, making the tool's scope unambiguous and distinct from code-generation siblings 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.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear context: it is for producing AOT XML scaffolds, is server-side read-only, and the client is responsible for persisting output. It does not explicitly name sibling tools to use instead for other generation tasks, so it stops short of a full when/when-not statement.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

d365fo_clear_connectionA
Idempotent
Inspect

Removes the D365 F&O connection cached for the current session by d365fo_set_connection.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already convey idempotency and non-destructiveness, and the description adds useful context by specifying that the removal is scoped to the current session and targets the cache created by d365fo_set_connection. This goes beyond the structural 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.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single sentence that names the action, the resource, the scope, and the originating tool. There is no redundancy or filler, and the essential information is front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter, session-state-clearing tool with a clear relation to d365fo_set_connection, the description fully covers what an agent needs to know. No output schema is present, but none is necessary for this trivial no-input operation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, so there is no parameter meaning to add. The description correctly confirms that the action operates on session state rather than requiring any input, which is sufficient.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('removes') and a specific resource ('D365 F&O connection cached for the current session'), and it references the paired tool d365fo_set_connection that created the connection. This makes the tool's function unambiguous and clearly distinguishable from its sibling set_connection.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description clearly implies this is used after d365fo_set_connection to clear the connection for the current session. It does not explicitly list when not to use it or name alternatives, but the pairing with d365fo_set_connection gives sufficient context 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.

d365fo_set_connectionA
Idempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
baseUrlYesF&O environment base URL, e.g. https://yourenv.cloudax.dynamics.com (https only).
clientIdYesApp registration (client) id (GUID).
tenantIdYesEntra (Azure AD) tenant id (GUID).
ttlMinutesNoMinutes the connection stays cached for this session (1-480). Default 60.
clientSecretYesApp registration client secret. Encrypted in memory; never logged or persisted.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations, the description discloses meaningful behavior: client secret encryption (AES-256-GCM), no disk persistence, no echoing back, automatic propagation to odata_* and dmf_* tools, expiration, and the clear_connection lifecycle. These details are not present in the annotations and materially affect how an agent should treat credential state.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core purpose, and every following sentence contributes non-obvious context: security guarantees, propagation behavior, recommendation, and locked-deployment exception. There is no filler or repetition of schema content.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a session-level connection setter, the description covers what the tool does, how the secret is handled, how long the connection lasts, how it is cleared, and when it must not be invoked. With the schema fully documenting parameters, no critical call-time information is missing even without an output schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

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 five parameters (baseUrl, tenantId, clientId, clientSecret, ttlMinutes). The description adds only high-level context ('URL + Entra app-registration credentials') rather than new per-parameter semantics, matching the baseline for complete schema coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('register') and identifies the exact resource ('D365 F&O connection') with a clear session scope. It also distinguishes itself from sibling connection tools by naming d365fo_clear_connection 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.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly says 'Use this instead of resending the secret on every call,' giving a concrete when-to-use recommendation. It also covers the key exclusion: in locked server deployments (D365FO_LOCK_SERVER_CONFIG=true) the tool is disabled and server credentials are used instead, steering agents away from a broken call.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

detect_performance_issuesA
Read-onlyIdempotent
Inspect

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).

ParametersJSON Schema
NameRequiredDescriptionDefault
methodNameNoOptional: specific method to analyze. Analyzes all methods if not provided.
objectNameYesObject name to analyze, e.g. 'SalesTable', 'CustInvoiceJour'

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds the return format ('compact issue table with line + fix') and a meaningful environmental prerequisite. The phrase 'Auto-fixing' introduces slight ambiguity about whether this tool mutates code, but it does not directly contradict 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.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences with zero redundancy: the first defines scope and issue types, the second states the output, and the third provides usage guidance and a prerequisite. Information is front-loaded and every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description responsibly states the return value as an issue table with line and fix. It also covers when to use the tool and a key environment prerequisite. The only gap is that it does not clarify whether 'Auto-fixing' is an action this tool performs or an external follow-up, but the core context for calling and interpreting results is present.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

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 and methodName adequately. The description reinforces the object-level scope ('Profile an X++ object') but adds no extra parameter semantics beyond the schema. Baseline 3 is appropriate when the schema carries the load.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb 'Profile' plus resource 'X++ object' and enumerates exact performance issue patterns (N+1, queries in loops, missing field lists, row-by-row, missing firstOnly). The description also distinguishes this from validate_best_practices, making 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.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says 'Only call when performance is explicitly the concern' and directs to validate_best_practices for general quality. It also discloses the D365_CUSTOM_MODEL_PATH prerequisite for auto-fixing, giving an agent clear context on when to invoke and what conditions apply.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

diff_model_versionsA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
path1YesFor 'compare': path to baseline cache file. For 'compare_caches': path to first cache. For 'save_baseline': output path for the baseline file.
actionYesAction: 'compare' (current vs baseline), 'compare_caches' (two cache files), or 'save_baseline' (save current state)
filterModelNoOptional: filter to a specific model name
path2OrLabelNoOptional: For 'compare_caches': path to second cache file. For 'compare'/'save_baseline': label for the baseline.

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint and idempotentHint, so the description need not repeat them. It adds the useful behavioral detail that a baseline must be saved before comparing, implying persistent local state. The save_baseline action's local file write does not contradict the readOnlyHint annotation since it does not mutate the external D365 system.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences with no filler: the purpose statement is front-loaded, and the usage guideline follows immediately. Every word contributes value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers the primary workflow but fails to mention the 'compare_caches' action, so an agent reading only the description would not know that direct cache-to-cache comparison is possible. It does not describe the changelog return format beyond naming the categories, though no output schema exists. Overall moderately complete but with a clear gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so each parameter is already documented per action. The description adds a temporal relationship between parameters (save baseline first) but no additional parameter syntax or format details, 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.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('Compare') and resource ('two D365 F&O KB snapshots') and names the output ('changelog with added/removed/modified objects'). This clearly distinguishes it from sibling tools like compare_objects or list_objects, which operate on different resources or produce different outputs.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives an explicit workflow: 'Use action save_baseline once, then compare between two snapshots,' which explains the required ordering. It does not name alternatives or exclusions, and it omits the third action (compare_caches), so it stops short of a full 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

dmfA
Idempotent
Inspect

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

ParametersJSON Schema
NameRequiredDescriptionDefault
actionYesimport | create_project | apply_filter | export | status
executeNoimport: execute after staging. Default true.
entitiesNocreate_project: comma-separated DMF entity names.
filePathNoimport: path to a .csv file on disk (or use csvContent).
fieldNameNoapply_filter: field to filter on, e.g. 'VendorAccountNumber'.
overwriteNoimport: overwrite existing project definition. Default true.
reExecuteNoexport: re-execute the project. Default true.
csvContentNoimport: inline CSV content (or use filePath).
entityNameNoimport: target DMF entity name, e.g. 'Customers V3'.
sourceNameNocreate_project: existing DMF source data format name.
executionIdNostatus: the executionId returned by an import or export action.
filterValueNoapply_filter: value or wildcard to match.
legalEntityNoimport/export: legal entity / company id, e.g. 'USMF'.
packageNameNoexport: optional package name.
projectNameNocreate_project/apply_filter: DMF project name.
aotEntityNameNoapply_filter: AOT entity name, e.g. 'VendVendorV2Entity'.
entityRowNameNoapply_filter: entity row label, e.g. 'Vendors V2'.
operationTypeNocreate_project: 'Export' (default) or 'Import'.
definitionGroupIdNoimport/export: definitionGroupId (DMF project id).
pollTimeoutSecondsNoimport/export: max seconds to poll for completion. Default 300.

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

It discloses important behavior beyond annotations: action routing to identical implementations, per-action parameter groups, optionality markers, defaults like execute/overwrite/reExecute, and the use of executionId for status polling. It does not describe return values or failure behavior, but annotations already establish the read/write/destructive profile.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Despite covering five operations and 20 parameters, the description is well-structured and front-loaded. Each action gets one compact line listing its parameters, and the introductory sentence establishes the purpose without wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a consolidated tool with 20 parameters, no output schema, and annotations available, this description is very complete: it covers all five operations, their dedicated-tool equivalences, and relevant defaults. The main remaining gap is that it does not describe return or status-response shapes, but the action mapping and executionId hint mitigate this.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the schema already documents each parameter. The description adds meaning by grouping parameters by action, marking optionality inline, and clarifying key relationships such as filePath OR csvContent, executionId from import/export, and operationType defaulting to 'Export'.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The opening sentence clearly states this is a consolidated entry point for all five DMF operations and explicitly lists them. It also distinguishes itself from the dedicated sibling tools by saying it forwards to the exact same implementation with identical behavior and validation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit action values and maps each one to its dedicated tool, so an agent knows exactly which action to select for a given operation. It notes the dedicated tools remain available unchanged, but does not explicitly state when one should prefer the consolidated tool over a dedicated one.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

dmf_apply_entity_filterA
Idempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
fieldNameYesEntity field to filter on, e.g. 'VendorAccountNumber'.
filterValueYesValue or wildcard to match, e.g. '1001' or '1001*'.
projectNameYesExisting DMF project (definitionGroupId) in FO.
aotEntityNameYesAOT entity name the kernel resolves, e.g. 'VendVendorV2Entity'.
entityRowNameYesEntity row label as shown on the project line, e.g. 'Vendors V2'.

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well beyond the annotations by disclosing the internal mechanism (kernel builds the packed query, container envelope stripped at QueryRun.pack(), inner blob PATCHed onto DataManagementDefinitionGroupDetails.QueryData), the exact persisted format, the environment prerequisite, and the non-cascading side-effect on child rows. No contradiction with annotations: idempotentHint=true aligns with filter reapplication, destructiveHint=false aligns with the scoped, non-cascading change.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The purpose is front-loaded in sentence one, and each subsequent clause carries decision-relevant content: scope limit, wildcard behavior, parent/child caveat, and prerequisite. The mid-section kernel/container/PATCH detail is dense jargon but earns its place by explaining why the persisted format matches DMFDefinitionGroupEntity; it is only slightly heavier than strictly necessary.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with deep D365 FO internals, 5 required parameters, and no output schema, the description thoroughly covers scope, constraints, side-effect boundaries, and prerequisites. The remaining gaps: it does not state whether reapplying the tool with a different value on the same row replaces or merges the existing filter, nor describe the success/completion signal.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

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 real semantic nuance: it explains the per-call constraint ('single field = single value per call'), explicitly states wildcard pass-through ('1001*'), and provides additional entityRowName examples ('Vendor bank accounts', 'Vendor postal addresses') that clarify how to use the parameter beyond the schema's single example.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The first sentence names a specific verb ('Apply'), resource ('ONE entity row of an existing DMF project'), and outcome ('export only contains the matching records'). It distinguishes itself from sibling DMF tools (dmf_create_data_project, dmf_export_package, dmf_get_job_status) by scoping to filtering an existing project row, and explicitly states the single-field/single-value limit.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides clear usage context: call once per entity row, wildcards pass through, and the critical caveat that filtering a parent does NOT auto-filter child rows, so the same filter must be applied to related rows. It also states the environment prerequisite ('GenerateQueryData' action). However, it never explicitly names sibling alternatives or says 'use this instead of X', so when-not guidance is scenario-based rather than tool-comparative.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

dmf_create_data_projectA
Idempotent
Inspect

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).

ParametersJSON Schema
NameRequiredDescriptionDefault
entitiesYesComma-separated DMF entity names, e.g. 'Customers V3,Released products V2'.
sourceNameYesExisting DMF source data format name that defines the file format.
projectNameYesName of the data project (definitionGroupId) to create or extend.
operationTypeNoOperation type: 'Export' (default) or 'Import'.Export

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description discloses the concrete side effects beyond what the annotations provide: it POSTs to DataManagementDefinitionGroups and DataManagementDefinitionGroupDetails with AutoGenerateMapping=Yes, revealing exactly which OData endpoints are touched and that FO auto-generates mappings. It also elaborates the idempotency annotation by explaining the practical meaning (existing project reused, entities present are skipped). No contradiction exists between the description and 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.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

All five sentences earn their place: purpose, mechanism, idempotency, workflow routing, and parameter guidance each carry distinct value. The purpose is front-loaded in the first sentence. It is on the longer side, but the tool is complex (4 parameters, domain-specific DMF concepts, several siblings) and every clause contributes, so the length is justified.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers the key prerequisites (existing source data format, no X++ customization) and the post-condition workflow for exports. With no output schema, a brief note on what the tool returns would strengthen it, and the import path's next step (dmf_import_file exists among siblings) is not mentioned. These are minor gaps against an otherwise dense and sufficient description for a 4-parameter tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 100% schema coverage, the baseline is 3, but the description adds meaningful guidance beyond the schema: it warns that sourceName must reference an EXISTING format and gives a concrete example ('comma-delimited format'). It also explains why entities is a comma-separated string by describing the underlying per-entity row creation, and it contextualizes operationType by noting EXPORT projects are later run by dmf_export_package.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb-plus-resource ('Create (or extend) a DMF data project') and immediately disambiguates the operation modes (EXPORT or IMPORT). It distinguishes itself from the sibling dmf_export_package by clarifying that this tool only builds the project while running it is a separate step. The naming convention also differentiates it clearly from dmf_apply_entity_filter and dmf_import_file.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit workflow guidance: 'For EXPORT, the project can then be run with dmf_export_package,' which tells the agent this tool is a setup step and points to the correct sibling for execution. It also states the idempotent reuse behavior, which informs when calling it again is safe. However, it does not explicitly contrast with dmf_import_file or address when a user would need custom X++ mapping instead.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

dmf_export_packageA
Idempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
reExecuteNoRe-execute the project (true) or reuse last staging (false). Default true.
legalEntityYesLegal entity / company id to export from, e.g. 'USMF'.
packageNameNoOptional package name. Default derived from the project id.
definitionGroupIdYesExisting DMF export project (definitionGroupId) in FO.
pollTimeoutSecondsNoMax seconds to poll for completion. Default 300.

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations indicate mutation (readOnlyHint=false), idempotency, and non-destructive behavior; description adds meaningful context: it is a trigger operation, it waits until completion to return a URL, and it requires a preconfigured project. It does not explicitly detail polling/timeout behavior, but the schema parameter and 'when complete' phrase cover the essential trait.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences with no wasted words: action/result, critical prerequisite with a creation fallback, and the ad-hoc alternative. The prerequisite warning is placed immediately after the main action where it matters.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

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 states the return value and key precondition, and routes to the correct sibling. The only notable gap is lack of detail about the polling behavior or failure outcome, but pollTimeoutSeconds in schema plus 'when complete' make the tool callable.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the schema documents all five parameters. The description only reinforces definitionGroupId's requirement ('must already exist') without adding new semantic detail about legalEntity, reExecute, packageName, or pollTimeoutSeconds, so baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description opens with the concrete action ('Trigger a bulk export through the Data Management package REST API') and names the deliverable ('return the download URL when complete'). It further differentiates from siblings by pointing to odata_export_entity for ad-hoc exports and dmf_create_data_project for creating the prerequisite project.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states when the tool applies (bulk export through an existing DMF project) and gives two routing rules: create the missing project with dmf_create_data_project, or use odata_export_entity for ad-hoc exports. This is clearer than most sibling descriptions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

dmf_get_job_statusA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
executionIdYesThe executionId returned by dmf_import_file or dmf_export_package.

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, and non-destructive behavior. The description adds value beyond annotations by disclosing that the tool is a poller, enumerating possible statuses, and noting that a completed export returns a download URL. 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.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences with no filler. The core action and target are front-loaded, the status examples are compactly placed in parentheses, and the download-URL detail is a single meaningful addition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a one-parameter, read-only, idempotent polling tool with no output schema, the description gives an agent everything essential: how to identify the job, what statuses to expect, and what extra result appears for completed exports. Nothing critical is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema already fully documents executionId, including that it is required and returned by dmf_import_file or dmf_export_package, with 100% schema description coverage. The tool description reinforces 'by its executionId' but does not add new parameter 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.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('Poll') and target resource ('status of a DMF import/export execution'), keyed by executionId. It also lists concrete status values and mentions the download-URL behavior for completed exports, making it clearly distinguishable from dmf_import_file, dmf_export_package, and other siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description establishes a clear usage context: it is the follow-up polling operation after an import/export is started, and the schema's executionId description explicitly points to dmf_import_file or dmf_export_package as the source. It does not explicitly list exclusions or alternatives, but the intended workflow is obvious.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

dmf_import_fileA
Destructive
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
executeNoExecute the import after staging (true) or stage only (false). Default true.
filePathNoPath to a .csv file on disk. Provide this OR csvContent.
overwriteNoOverwrite an existing project definition with the same id. Default true.
csvContentNoInline CSV content (header row + data). Provide this OR filePath.
entityNameYesTarget entity name as known to DMF (the entity, not the OData set), e.g. 'Customers V3'.
legalEntityYesLegal entity / company id to import into, e.g. 'USMF'.
definitionGroupIdNoDMF definition group (data project) id. Default: auto-generated from entity + timestamp.
pollTimeoutSecondsNoMax seconds to poll for completion before returning the executionId. Default 300.

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Adds substantial context beyond the annotations: the in-memory package build, Azure blob upload, ImportFromPackage call, the auto-creation of the data project, batch execution with polling, and an error-keys file URL on row failures. The destructiveHint and non-idempotent annotations are consistent with the described overwrite-and-import behavior, so there is no contradiction.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four sentences arranged as purpose, mechanism, execution behavior, then usage requirements — front-loaded and logically ordered with no filler. For a tool this complex, each sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Since no output schema exists, the description correctly covers return values (final status and error-keys file URL) plus the full execution flow. Minor gaps: 'polls until completion' overlooks the pollTimeoutSeconds early-return behavior, and the stage-only mode (execute=false) appears only in the schema — both are documented there, limiting practical impact.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

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 genuine semantic value by tying entityName to a resolution workflow ('Resolve the entity name from the KB (find_entity_for_table) -- do not invent it'), which the schema's example does not convey. The filePath/csvContent exclusivity is useful reinforcement even though both parameter descriptions already state it.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The first sentence states a specific verb and resource — 'Bulk-import a CSV file into a D365 F&O entity through the Data Management package REST API' — and the AUTO-CREATES clause explicitly distinguishes it from sibling dmf_create_data_project. The import direction separates it from dmf_export_package and odata_export_entity, so an agent can pick it 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.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides clear usage context: the caller must supply either filePath or csvContent, and it instructs the agent to resolve entityName via find_entity_for_table ('do not invent it'), naming the right sibling for the prerequisite step. It stops short of explicit when-not-to-use guidance against alternatives such as odata_upsert_rows for non-bulk loads.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

dmf_transform_excelA
Idempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
formatNoOutput format: 'csv' (default) or 'json'.csv
filePathNoLocal path to a .xlsx file. Provide one of sourceUrl/filePath/fileContentBase64.
sheetNameNoOverride the source sheet name. Empty = use mappingJson.sourceSheet, else the first sheet.
sourceUrlNoURL to the .xlsx (Blob/SharePoint SAS or Graph downloadUrl). Provide one of sourceUrl/filePath/fileContentBase64.
outputPathNoOptional file path to also write the full transformed result to.
mappingJsonNoMapping spec JSON (columnMappings, conditionalValues, staticValues, deduplicateOn, autoGeneratedFields, sourceSheet). Optional when listSheetsOnly=true.
listSheetsOnlyNoIf true, only list the workbook's sheet names (diagnostic). mappingJson not required.
fileContentBase64NoBase64-encoded .xlsx content (inline upload, small files). Provide one of sourceUrl/filePath/fileContentBase64.

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations (idempotent, non-read-only, non-destructive), the description discloses that no FO credentials are needed, that autoGeneratedFields are stripped from the output 'so FO generates them', and that base64 upload is limited to small files. It also exposes the CSV-vs-JSON output differentiation and the listSheetsOnly diagnostic mode. No statement contradicts the annotations, and the idempotentHint=true aligns with the offline pure-transform behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core purpose and the key differentiator (offline transform, no credentials), and nearly every sentence carries load-bearing information with zero fluff. However, the mapping spec details are crammed into a single dense sentence with mixed bracket notation, and breaking the content into short bullets or lines would improve parseability without adding bulk.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

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 input source constraints ('one of', 'small files only'), the mapping spec shape, output routing, and diagnostic mode — nearly everything an agent needs to invoke it correctly. Minor gaps remain, such as the exact shape of the listSheetsOnly response and failure behavior when none of the three input sources is provided.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

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 substantial meaning the schema lacks: the full mappingJson spec structure (conditionalValues with {sourceColumn,matches[],values{}}, staticValues, deduplicateOn, autoGeneratedFields as array or sheet-keyed object with a concrete example) and the semantic consequence that those fields get removed. It also enriches the format parameter by mapping it to downstream consumers (dmf_import_file vs odata_upsert_rows), which the bare 'csv or json' schema text does not provide.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The opening sentence names a specific action (transform), resource (multi-sheet .xlsx), mechanism (data-driven JSON mapping), and outcome (DMF-ready rows). It anchors the tool as the offline equivalent of FO_TransformExcelForDMF, and the output-routing sentences ('feed to dmf_import_file' / 'feed to odata_upsert_rows') keep it clearly distinct from the import/upsert siblings in the same DMF family.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description tells the agent exactly what to do with the result — CSV goes to dmf_import_file, JSON goes to odata_upsert_rows — and states when the tool applies ('NO FO credentials required (offline transform)'). It also explains the diagnostic mode (listSheetsOnly=true) and the 'one of three inputs' constraint. It never explicitly names a when-not-to-use alternative, but the pipeline routing effectively positions it against its siblings.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

explain_workflowA
Read-onlyIdempotent
Inspect

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'.

ParametersJSON Schema
NameRequiredDescriptionDefault
objectNameYesD365 object or workflow name, e.g. 'SalesTable', 'PurchTable', 'ALMDemandeAchatWorkflow'

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, so the safety profile is covered. The description adds useful behavioral context by stating the output is 'plain business language' with 'no X++ or workflow engine jargon,' which helps an agent set user expectations beyond what annotations convey.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the WHEN clause and trigger examples, making it easy for an agent to quickly match intent. It is slightly repetitive with the 'WORKFLOW EXPLAINER' header and the following explanation, but every section still contributes useful guidance.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a low-complexity tool with one documented parameter and annotations covering safety, the description is complete: it specifies when to use it, what it explains, the output style, and the alternative for technical details. No critical information 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.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema covers the single parameter objectName fully with example values such as 'SalesTable' and 'PurchTable', so the baseline is 3. The description does not add additional parameter-specific semantics beyond indicating the object is a workflow-related D365 object, which the schema already implies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states a specific verb and resource: it 'Explains a D365 approval workflow: who approves, what states exist, and what happens on approval or rejection.' It distinguishes itself from get_object_details by explicitly saying it is NOT for 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.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides an explicit WHEN section with concrete user phrasings such as 'explain the workflow for' and 'what happens when a user submits.' It also names get_object_details as the alternative for technical workflow class details, giving clear routing guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

find_callersA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
depthNoDepth of caller chain to trace upward (default: 2, max: 4)
methodKeyYesObject or method key. Format: 'ClassName.methodName' for methods, 'ClassName' for class-level queries.
categoriesNoCategories to include: 'all' (default), or comma-separated subset: 'calls,inheritance,usage,interfaces,overrides,attributes'all
maxResultsNoMaximum results per category (default: 20, max: 50)

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare the operation read-only and idempotent, so the description does not need to repeat safety. It adds valuable behavioral context beyond annotations: the dependency on xref_index.json.gz (with generation command) and the vector-search fallback when the index is not loaded. This tells the agent about data availability and degraded behavior in a way the schema and annotations do not.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences carry all essential information with no filler: the first defines the tool's scope and output categories, the second states the prerequisite and fallback behavior. Information is front-loaded, with the most important purpose statement first.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only cross-reference tool with annotations covering safety, the description is mostly complete: it names the target, the output categories, the prerequisite index, and the fallback. There is no output schema, so some ambiguity about the exact result structure remains, but the description provides enough context for an agent to decide whether and how to invoke it.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

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 methodKey format, depth bounds, categories, and maxResults. The description's list of categories (callers, callees, inheritance, etc.) loosely maps to the categories parameter, but it does not add substantive semantic 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.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly identifies the resource (a class or method) and the verb (build a full cross-reference profile), and enumerates the content: callers, callees, inheritance chain, interface implementations, overrides, attributes. It is distinguishable from siblings like find_references by this explicit scope, though it never names a sibling or states the comparison directly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives important context about when the tool can be used: it requires xref_index.json.gz and falls back to vector-search when XRef is not loaded. However, it does not explicitly state when to prefer this tool over sibling tools such as find_references or find_change_impact, nor does it provide exclusions or alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

find_change_impactA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
maxDepthNoMax BFS depth (1-5). Default 3.
objectNameYesObject or method to analyse, e.g. 'SalesLine' or 'SalesLine.insert'.

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The annotations already declare the operation read-only and idempotent; the description adds meaningful behavioral context: it requires the XRef index, uses BFS up to 3 hops, and reports custom model extensions, interface propagation, and severity classifications. 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.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense but well-organized: WHEN, output contents, prerequisite, trigger phrases, and examples are presented in a logical order. The trigger list is somewhat redundant with the opening WHEN but still supports intent matching across languages.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with two parameters, no output schema, and strong annotations, the description is complete enough for selection and invocation. It explains the report contents, severity classes, BFS hop limit, prerequisite XRef index, and concrete examples, leaving no major gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

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 real value by showing how objectName='SalesLine' means table/class-level impact while objectName='SalesLine.insert' means method-level impact. It also ties maxDepth to BFS hop behavior, though it does not add new syntax details beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states what the tool does: it assesses the blast radius of modifying an X++ object or method and returns a report with direct callers, transitive dependents, extensions, interface propagation, and severity. This differentiates it from siblings like find_callers and find_references by emphasizing impact analysis and severity classification.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives an explicit WHEN condition ('about to modify an X++ object or method'), concrete trigger phrases, and a worked example for both object-level and method-level analysis. It does not explicitly say when to prefer simpler sibling tools such as find_callers or find_references, so it lacks a full when-not/alternatives matrix.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

find_entity_for_tableA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
tableNameYesTable name to find entities for, e.g. 'SalesTable', 'CustTable', 'VendInvoiceJour'
maxResultsNoMaximum results (default: 15, max: 30)
generateIfMissingNoWhen true and no public entity is found, generates a new AxDataEntityView XML template for the table. Default: false.

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description discloses the scanning behavior ('Scans all indexed AxDataEntityView objects') and the conditional generation side effect ('generateIfMissing=true to auto-generate an AxDataEntityView XML template'). Since readOnlyHint, idempotentHint, and destructiveHint annotations already cover the safety profile, this adds useful behavioral context without contradiction.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with WHEN and the core find purpose, and the structure is organized. However, it is somewhat long and repeats the generateIfMissing guidance in the opening and closing sentences; the trigger list is extensive and 'Essential for integration development' adds little value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite having no output schema, the description enumerates the returned fields and explains the search mechanism and the conditional template generation. It leaves minor gaps, such as explicit behavior when no entity is found and generateIfMissing=false, but overall it is complete for a read-only lookup tool with schema-documented parameters.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema covers 100% of parameters with descriptions, so the baseline is 3. The description adds operational context for generateIfMissing ('auto-generate ... when no public entity is found') but does not add meaning beyond what the schema already provides for tableName or maxResults.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: 'Find D365 F&O data entities that expose a given table for OData/DMF integrations,' and specifies the returned fields: entity name, public entity name, IsPublic status, key fields, and data sources. It also distinguishes the find-by-table use case from sibling creation/inspection tools by adding the optional generateIfMissing behavior.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description opens with explicit WHEN guidance: 'developer needs to integrate via OData and wants to find the entity name for a given table,' and provides trigger phrases and an example question. It does not explicitly name alternative tools or list when-not-to-use, but the context is clear enough to route an agent to this tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

find_error_patternsA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
audienceTypeNoAudience type: 'developer' (default) for root-cause analysis, or 'business' for a plain-language explanation targeted at end users.developer
errorOrSymptomYesError message text or symptom description, e.g. 'update conflict', 'number sequence not set up', 'cannot create record outside tts'

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and idempotentHint=true, and the description adds substantial behavioral detail beyond that: it matches against a built-in error database, extracts D365 label IDs, searches the indexed codebase, returns root causes and resolutions, and distinguishes plain-language business explanations from developer-grade outputs. 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.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but information-dense: the WHEN clause is front-loaded, trigger examples are compactly listed, and the [~] routing notes are separated. Every segment contributes operational guidance, so the length is justified by the tool's complexity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only diagnostic tool with no output schema, the description is remarkably complete. It states inputs, audience modes, known error categories, label-resolution behavior, best-practice moniker handling, and the return contents (root causes, step-by-step resolution, label matches, and source code locations). 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.

Parameters4/5

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 real semantic value by explaining audienceType's developer/business split and associating errorOrSymptom with concrete triggering examples ('update conflict', 'number sequence not set up'), which helps the agent formulate valid input.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific verb and resource: 'Find known D365 F&O error patterns matching an error message or symptoms description.' It details what the tool does beyond simple search — resolving label IDs, searching the codebase, and returning root causes — and is clearly distinct from sibling tools like search_d365_code and search_labels.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly opens with WHEN it should be used, provides concrete developer and business trigger phrases, and gives routing guidance: call search_labels first for '@SYS' label IDs, and use run_best_practices_check_scoped for deciding whether an object breaks a BP rule. This leaves 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.

find_event_handlersA
Read-onlyIdempotent
Inspect

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'.

ParametersJSON Schema
NameRequiredDescriptionDefault
eventNameNoOptional: filter to a specific event name, e.g. 'OnInserted', 'OnUpdated', 'OnDeleted', 'OnValidatingWrite'.
objectNameYesTable or class name to find event handlers for, e.g. 'SalesTable', 'PurchTable'.
handlerTypeNoOptional: filter by handler type — 'DataEventHandler' or 'PrePostEventHandler'.

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description discloses that the tool searches the knowledge base for specific attribute patterns, which signals the underlying mechanism and potential limitation (static pattern matching rather than runtime inspection). Annotations already cover read-only and non-destructive behavior, so the description adds useful method context beyond those.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is efficiently structured with the core action first, followed by pattern details, filter usage, and WHEN examples. The WHEN list includes redundant language variants, but the space is justified by the multilingual user base.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

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, the description covers purpose, search method, optional filters, and common query intents. There is no output schema, but the expected result (event handlers) is implied clearly enough for an agent to call it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

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 adds a concrete event example and clarifies objectName refers to a table or class name, but this is marginal beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool finds event handlers that subscribe to events on a D365 table or class, naming the exact attribute patterns searched. This distinguishes it from broader sibling tools like find_references or find_callers by focusing specifically on SubscribesTo handlers.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit WHEN guidance with concrete query intents and example phrases, including non-English variants. It does not explicitly state when to use an alternative tool, but the intent list is specific enough to guide selection.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

find_extensionsA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
baseObjectNameYesThe base object name, e.g. 'SalesTable', 'SalesFormLetter', 'VendTable'

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations cover read-only, idempotent, and non-destructive behavior; description adds that it queries Azure DevOps Code Search in real-time and may include extensions not yet in the KB. This is useful behavioral context beyond the schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences pack the purpose, coverage, and usage mandate without fluff. The most important guidance is front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a one-parameter search tool with no output schema, it explains what is searched, why it matters, and the real-time KB fallback. It does not detail output or failure modes, but those are not critical with this simple contract.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The single baseObjectName parameter is fully described in the schema with examples, so schema coverage is high. The description adds no additional parameter-level semantics beyond calling it the base object.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states it finds all extension objects, CoC classes, and event handlers for a base object, distinguishing its broad discovery role. The explicit reference to specific artifact types makes purpose unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly directs ALWAYS calling before creating a new extension to avoid parallel customizations, providing a strong usage cue. It does not explicitly name alternative sibling tools or 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_referencesA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesThe object or method name to find references to, e.g. 'SalesTable', 'validateWrite'
maxResultsNoMaximum referencing objects to return (default: 500, max: 2000)
locationsPerObjectNoMaximum number of call sites (methods/fields) to display per referencing object (default: 6, max: 20). Increase to see more usage locations.

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly/idempotent/non-destructive; the description adds non-obvious runtime behavior: an O(1M+ chunks) expense warning, dual-form label ID expansion (`@SYS124480` and `@SYS:124480`), and the extension-handler exclusion. All fully consistent with the annotations — no contradiction.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Six compact sentences with the core action and use case front-loaded, followed by the cost warning, alternatives, and exclusions. Every sentence earns its place; no repetition of schema or annotation info.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

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 schema's maxResults ('Maximum referencing objects to return') and locationsPerObject ('call sites... per referencing object') already convey the result shape. The description covers purpose, usage timing, cost, alternatives, special label handling, and exclusions — an agent has everything needed 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.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3. The description still adds meaning by broadening the name parameter domain beyond the schema's 'object or method name' to include fields and label IDs, and by documenting the label ID format expansion. maxResults and locationsPerObject are already well described by the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with 'Full index scan for all usages of an object, method, field, or label ID' — a specific verb, resource, and scope. The label-ID and not-for-extensions clauses directly distinguish it from siblings find_callers and find_extensions, so an agent can disambiguate 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.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states the trigger ('Use for impact analysis before changing or deleting an object'), the cost-based alternative ('Prefer find_callers when XRef index is loaded (O(1))'), and a hard exclusion ('NOT for extensions only — use find_extensions for CoC/event handlers'). Nothing is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

find_relation_pathA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
sourceYesStart object name, e.g. 'SalesTable'
targetYesDestination object name, e.g. 'CustTable'
maxDepthNoMaximum hops to traverse (default: 4, max: 8). Higher = slower, more paths.
maxPathsNoMaximum number of distinct paths to return (default: 5, max: 20).

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations (readOnly, idempotent, not destructive), the description discloses non-obvious behavior: it walks a pre-computed relation graph in both directions, uses BFS with O(1)-per-node cost, returns only names and relation kinds to save tokens, and enumerates the included edge types. This is exactly the kind of behavioral context agents benefit from.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured: trigger condition, triggers, algorithm behavior, output token-lightness, and sibling comparison. Every sentence serves a clear purpose, and the key usage condition is front-loaded. The length is justified by the need to disambiguate from closely related tools.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only multi-hop traversal tool with no output schema, the description is complete: it defines the input semantics with examples, describes the output shape as a chain of object names and edge kinds, and provides performance context. Error cases like unreachable nodes are not mentioned, but that's a minor omission given the strong annotation and schema coverage.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema already documents all four parameters with descriptions, defaults, and max values (100% coverage), so the description doesn't need to add much. It does not clarify parameter semantics beyond the schema, which is acceptable under the baseline for full schema coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: find how two AOT objects are connected via the chain of relations linking them. It explicitly contrasts with `get_relation_graph`, making the tool's unique role unmistakable. The trigger phrases further reinforce the intended use case.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It opens with 'WHEN: you need to know HOW two AOT objects are connected' and lists concrete trigger examples in English and French. It explicitly tells the agent to use `get_relation_graph` for a single object's full neighbourhood, leaving no ambiguity about when to select this tool instead.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

find_similar_implementationsA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
maxResultsNoMaximum results (default: 15, max: 30)
objectNameYesObject name to find similar objects for, e.g. 'ALMERSftpConnectionTable', 'SalesTable'
filterAotTypeNoOptional: filter to a specific AOT type, e.g. 'AxTable', 'AxClass'. If not set, uses the same type as the source object.

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover the read-only, idempotent, non-destructive safety profile. The description adds useful behavioral context by defining what 'structurally similar' means (same kind, similar method set, similar field set), which goes beyond the tool name and helps an agent predict behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two concise sentences: the first states the core behavior and similarity criteria, the second states the primary use case. Every word earns its place with no fluff or repetition of schema content.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description is adequate for a read-only, list-returning tool with annotations covering safety and a self-explanatory schema. It does not describe the return format (e.g., list of object names), but given the tool name and 'find ... objects' wording, an agent can infer the output shape. Minor gap: no explicit mention of result ordering or default scoping.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

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 three parameters. The description does not add parameter-level detail beyond what the schema provides, which is acceptable under the baseline of 3.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly identifies the verb (Find), the resource (D365 objects), and the distinguishing behavior (structurally similar, same kind, similar method set, similar field set). This differentiates it from sibling search/find tools like search_d365_code or find_references, which are text- or reference-based.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives a clear when-to-use trigger: 'when you need a working reference implementation to copy from.' It does not explicitly name alternative tools or state when not to use it, but the use case is specific enough to guide an agent.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

fix_best_practice_violationsA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
objectNameYesObject or method to fix, e.g. 'SalesLine' or 'SalesLine.insert'.
maxViolationsNoMax violations to process (1-20, default 10).
generatePatchesNoGenerate X++ code patches via Ollama (requires OLLAMA_HOST). Default false.

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the readOnly/idempotent/destructive hints, it discloses the optional external Ollama dependency, the OLLAMA_HOST requirement, the ALMXPP_SUMMARIZE_MODEL usage, and the fallback to built-in suggestions when Ollama is unavailable. This gives the agent an accurate model of runtime behavior and side effects.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loaded with the key WHEN condition, then states the return value, then covers triggers and optional behavior. Every sentence adds practical information with no filler or redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description usefully summarizes what the tool returns: built-in fix suggestions plus optional AI patches. It also covers the external prerequisite and fallback. It could be slightly more explicit about how maxViolations shapes the output, but the description is adequate for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

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 adds useful reinforcement that generatePatches=true triggers Ollama calls, but otherwise offers no new parameter-level semantics beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states what the tool does: returns BP violations with built-in fix suggestions and optionally AI-generated X++ code patches. It explicitly ties itself to validate_best_practices, distinguishing its role as the follow-up fix suggestion step.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides an explicit WHEN: use it when validate_best_practices returned violations. Trigger phrases are included, and the Ollama prerequisite/fallback is described. However, it does not explicitly say when not to use it versus related tools like suggest_refactoring.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

generate_data_entityA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
fieldsNoOptional: specific fields to include (comma-separated). All fields if not specified.
isPublicNoWhether the entity should be available via OData (default: true)
tableNameYesPrimary table name, e.g. 'SalesTable', 'CustTable'
entityNameYesDesired entity name, e.g. 'ALMSalesOrderEntity'
joinTablesNoOptional: additional tables to join (comma-separated), e.g. 'CustTable,InventDim'
publicEntityNameNoOptional: OData collection name (e.g. 'SalesOrders'). Auto-generated if not provided.

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds behavioral context by stating it produces complete AxDataEntityView XML with data sources, field mappings, entity key, OData public naming, and a staging table template, and that it uses real field names and relations from the local custom model. This clarifies the read-only, generative nature of the tool 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.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with a 'WHEN' label, a trigger list, output details, and a clearly highlighted always-do instruction. It is longer than average due to the trigger phrases, but those phrases serve a real purpose for agent intent matching and are organized into a discrete section rather than buried in prose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given there is no output schema, the description does a good job explaining what the tool produces: complete AxDataEntityView AOT XML with data sources, field mappings, entity key, OData settings, and staging table template. It also communicates essential context about using the local custom model and the prerequisite call to find_entity_for_table. It could be more explicit about how the XML is returned (e.g., string vs. file), but the core information needed to invoke and interpret the tool is present.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

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 six parameters. The description adds some context by linking parameters to outputs — e.g., field mappings, IsPublic/PublicEntityName for OData, and join/data source behavior — but it does not add per-parameter details beyond what the schema provides. Score 3 is the appropriate baseline for full schema coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a highly specific action — CREATE/generate a data entity (AxDataEntityView) AOT XML from a table — and clarifies the intended use cases: OData, DMF, and data migration. It includes a broad set of trigger phrases that make intent matching robust, and the mention of AxDataEntityView clearly distinguishes it from generic AOT creation tools like 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.

Usage Guidelines5/5

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 ('developer needs to CREATE a data entity...'), provides trigger examples, and gives a mandatory precondition: 'ALWAYS call find_entity_for_table first to verify a standard entity doesn't already exist.' This effectively defines when not to generate a new entity and names the sibling tool to consult first.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

generate_diagramA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
maxRelatedNoOptional: maximum related entities to show (default: 12, max: 20)
methodNameNoNot used -- flow diagrams are disabled.
objectNameYesObject name to diagram, e.g. 'SalesTable', 'SystemAdministrator'
diagramTypeYesDiagram type: 'er' (entity-relationship) or 'security' (security chain). 'flow' is disabled.

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered and the description does not contradict it. The description adds context beyond annotations: output is Mermaid diagrams that render directly in Copilot Chat, Cursor, Claude, and markdown viewers, and it explains why 'flow' is intentionally disabled (static call trees are misleading due to CoC and event handlers). This is meaningful behavioral context, though it doesn't discuss failure modes or edge cases.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is on the longer side but front-loads the WHEN clause and triggers, and every subsequent section is functional: rendering environments, per-type semantics, sibling routing, and the disabled-mode rationale. The nine-trigger list is mildly redundant (several are near-synonyms), but it supports reliable surface-form matching for an agent.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description correctly carries the burden of explaining outputs — Mermaid diagrams and their rendering environments. It covers both active modes, the disabled mode with a reason, parameter intent, and the key sibling alternative. The only minor gap is that it doesn't distinguish the 'er' mode from the sibling get_relation_graph, which could overlap in scope.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

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 beyond the schema by expanding diagramType semantics — spelling out the security chain structure (Role->Duty->Privilege->EntryPoints) and the ER scope ('a table and its relations'). It also explains why methodName is inert in practice ('Not used — flow diagrams are disabled'), which the schema states only tersely.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a precise verb+resource construction — 'Generate visual Mermaid diagrams from D365 F&O knowledge base data' — and enumerates the two active diagram types ('er' for entity-relationships, 'security' for Role->Duty->Privilege->EntryPoints chains) plus the disabled 'flow' type. It explicitly differentiates itself from the sibling trace_security_chain by framing that tool as the structured-text alternative, so an agent can reliably distinguish them.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description opens with an explicit WHEN clause and lists nine concrete trigger phrases ('generate diagram', 'diagramme', 'visualize', 'ER diagram', etc.). It states the exact selection condition for the alternative tool — 'for the structured text chain with tables of duties/privileges/entry-points use trace_security_chain instead' — and explicitly disables 'flow' with a rationale. This is exemplary routing guidance that leaves nothing to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

generate_fddA
Read-onlyIdempotent
Inspect

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'.

ParametersJSON Schema
NameRequiredDescriptionDefault
contextNoOptional: additional business context, requirements, or audience note to include in the header
languageNoOptional: output language ('en', 'fr', 'nl', 'de'). Default: enen
objectNameYesD365 object or business process name, e.g. 'SalesTable', 'VendInvoiceInfoTable', 'ALMDemandeAchat'

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already mark this as read-only, idempotent, and non-destructive, and the description adds useful behavioral context by listing the exact sections produced (Purpose, Business Context, Data Fields, Business Rules, Related Objects, Security, Open Questions). It clearly signals that the tool composes a document rather than modifying system state.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well organized with WHEN, function statement, generated sections, and triggers. It is slightly redundant because trigger phrases in the WHEN line overlap with the Triggers list, but it is still compact, scannable, and every section adds useful information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

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, the description covers the main requirements: what it generates, when to use it, when not to use it, and the trigger phrases. It does not explicitly describe the output format or return value, but 'structured FDD ready for review and sign-off' provides sufficient expectation for the agent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

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 does not add much beyond the schema for parameters, though the mention of 'with resolved labels' gives a small hint about how `objectName` affects the output. The optional `context` and `language` are already well documented in the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description identifies a specific verb and resource: 'WHEN: user asks to write or generate a Functional Design Document' and 'Produces a structured FDD'. It also explicitly distinguishes itself from `get_object_details`, which is for developer technical docs, so an agent can select the right tool without ambiguity.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit WHEN conditions, a clear NOT case, names the alternative tool (`get_object_details`), and lists concrete trigger phrases in multiple languages. This gives the agent strong, actionable guidance on when to use this tool versus siblings.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

generate_queryA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
topNoOptional: limit rows (1 = firstonly, N = top N)
fieldsNoOptional: specific fields to select (comma-separated). All fields if not specified.
filtersNoOptional: WHERE filter expressions (comma-separated), e.g. 'CustAccount == 1001, SalesStatus == SalesStatus::Open'
orderByNoOptional: field to ORDER BY
tableNameYesPrimary table name, e.g. 'SalesTable', 'CustTable'
joinTablesNoOptional: tables to join (comma-separated), e.g. 'CustTable,SalesLine'
descriptionNoOptional: natural language description of the query. If provided, fields/joins/filters are auto-detected.
crossCompanyNoWhether to add crosscompany clause (default: false)

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare read-only, idempotent, and non-destructive behavior. The description adds valuable behavioral context by explaining that generated X++ is only a template, that joins depend on the relation index, and that results are returned side-by-side with explanations. 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.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is longer than average but well-structured with WHEN, triggers, supported features, warnings, and return value. Every section earns its place, and important usage warnings are clearly flagged.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

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 explicitly states the return format: side-by-side X++ and SQL with explanations. It also covers prerequisites, supported query features, natural-language input, and the production caveat, making it sufficient for an agent to invoke correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

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 by explaining that natural-language descriptions trigger auto-detection of fields/joins/filters and that multi-table joins are auto-detected from relations, which clarifies the description and joinTables parameters beyond schema details.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific action—generate both X++ select statements and equivalent T-SQL queries for D365 F&O tables—and clearly identifies the resource and output. It also distinguishes itself from related tools by referencing the prerequisite use of find_related_objects and get_relation_graph for join accuracy.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The 'WHEN' section and trigger phrase list tell an agent exactly when to invoke this tool. It also gives explicit guidance to call find_related_objects or get_relation_graph first for multi-table joins, and warns that generated X++ is a template requiring adaptation, which is strong usage direction.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

generate_release_note_documentA
Idempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
v1YesOlder D365FO version (same value passed to prepare_release_note_context).
v2YesNewer D365FO version (same value passed to prepare_release_note_context).
findingsJsonYesJSON 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":"..."}]
touchedAddedYestouchedAdded count returned by prepare_release_note_context.
touchedRemovedYestouchedRemoved count returned by prepare_release_note_context.
businessContextNoOptional business/functional context (same value passed to prepare_release_note_context), included in the Word document.
touchedModifiedYestouchedModified count returned by prepare_release_note_context.
customModelLabelYesCustom model label(s) -- use the customModelLabel field returned by prepare_release_note_context.

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already mark the tool as idempotent and non-destructive, and the description adds meaningful behavioral context: it renders files, returns download URLs, does not invoke an LLM, and depends on prior manual analysis. This goes beyond the structured hints, though it does not describe failure modes, auth requirements, or file lifecycle details.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two compact sentences with no filler. The WHEN condition is front-loaded, the action is stated directly, and the critical non-LLM caveat is placed at the end where it reinforces rather than distracts.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For an 8-parameter tool with 100% schema coverage and no output schema, the description provides the essential workflow context: the prerequisite call, the expected input structure origin, the two output formats, and the return type. It could go slightly further by describing what the agent should do with the returned URLs or how errors manifest, but nothing critical is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema fully documents every parameter. The description adds a small amount of extra meaning by tying findingsJson to the instructions field from prepare_release_note_context and clarifying the relationship between v1/v2/customModelLabel and the same values passed to the context tool, but this is marginal beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's specific action: rendering a pre-analyzed findings array into downloadable Word (.docx) and PowerPoint (.pptx) release notes and returning their URLs. It distinguishes itself from the sibling prepare_release_note_context by explicitly framing this as the post-analysis rendering step and by noting it does not call any LLM itself.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives an explicit precondition: call this only after prepare_release_note_context has been used and the agent has manually analyzed the objects array to produce findings. It also warns that the tool does no reasoning, so the agent must not expect it to fill that gap. However, it does not name alternative tools or formally state when not to use it beyond the implied precondition.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

generate_security_reportA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
filterModelNoOptional: restrict the report to a single model name (e.g. 'ApplicationSuite', 'ContosoCustom'). Empty = all indexed models.
maxRolesDetailNoMaximum number of roles to expand in detail (default 50, max 200).

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, and non-destructive behavior; the description is consistent and adds meaningful behavioral detail: per-role listing, inferred license tiers, and surfacing orphan duties/privileges. It does not describe output format or scale, but for a read-only report generator this is a reasonable disclosure level.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three concise sentences with no filler. The purpose is front-loaded, the report contents are listed efficiently, and the orphan-detection behavior is a distinctive final sentence. Every sentence contributes information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's moderate complexity, high schema coverage, and strong annotations, the description is nearly complete: it defines the deliverable, its contents, and a unique behavioral feature. It does not explain the return format or limits, but this is a minor gap since the report nature is clear.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

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 documented. The description does not add extra semantic meaning about how filterModel or maxRolesDetail influence the report beyond the schema. This meets the baseline but adds no additional value.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific action and resource: 'Generate a security & licensing governance report.' It then details the report contents (duties, privileges, entry points, inferred license tier, orphan duties/privileges), which clearly distinguishes it from security-related siblings like get_security_coverage_for_object and trace_role_license_tree.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No explicit guidance is given for when to choose this tool over related security/reporting siblings. It does not mention prerequisites, conditions, or alternatives such as get_security_coverage_for_object or trace_role_license_tree. The intended use is implied by the description but not stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

generate_unit_testA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
methodNameNoOptional: specific method to test. If not provided, generates tests for all testable methods.
objectNameYesObject name to generate tests for, e.g. 'ALMERSftpConnectionTable', 'ALMMyClass'
sampleValuesNoOptional: 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.
testScenariosNoTest 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

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds genuine behavioral context beyond that: it warns that 'a generic template rarely compiles without adaptation' (managing expectations about output quality), discloses data provenance ('Uses REAL field names and method signatures from the knowledge base'), and specifies generation behavior per object type. 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.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Well front-loaded: WHEN and triggers come first, then the core purpose, then constraints, then parameter guidance. The trigger list is slightly redundant with the WHEN clause but serves agent intent-matching, and every sentence carries information. A bit long, but no wasted words given the complexity being conveyed.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 4-parameter tool with no output schema, the description covers the essential ground: when to use, what input is required, what the generated output looks like (arrange/act/assert, per-type method generation), and key constraints (custom-only, adaptation likely needed). The only notable gap is the output delivery format (inline code vs. file), which is minor given how much else is specified.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

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 value above the schema: it flags testScenarios as REQUIRED even though the schema's required array only lists objectName, explains that each scenario becomes a concrete arrange/act/assert test method, and clarifies type-specific output (find/exist/validateWrite/initValue for tables vs. public-method stubs for classes). This materially aids correct invocation.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb and resource: 'Generate X++ SysTest unit test code for a CUSTOM D365 F&O object based on functional test scenarios.' The 'CUSTOM' qualifier and the explicit 'SysTest' method clearly separate it from siblings like generate_data_entity, generate_query, and generate_xpp_form. The scope is unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides an explicit WHEN clause ('developer needs to write or scaffold unit tests for a custom D365 object'), a concrete trigger-phrase list ('generate tests', 'unit test', 'SysTest', etc.), and a usage exclusion ('Only meaningful on custom/extension code'). It stops short of naming alternative tools for the when-not case, but the context is clear and actionable.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

generate_xpp_formA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
fieldsNoComma-separated field names to include in the grid/header, e.g. 'AccountNum,Name,Status'
formNameYesPascalCase form name, e.g. 'ALMCustomerForm'
modelNameNoModel name for label prefix, e.g. 'ALMMyModel'
fieldTypesNoOptional: 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).
formPatternYesForm pattern: 'SimpleList', 'DetailsMaster', 'DetailsTransaction', 'ListPage', 'Dialog', 'DropDialog', 'Workspace', 'Extension'
primaryTableNoPrimary/header table name, e.g. 'ALMCustomerTable'
secondaryTableNoSecondary/joined table name (DetailsTransaction: lines table; ListPage: InnerJoin lookup table), e.g. 'SalesTable'

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare the tool read-only, idempotent, and non-destructive. The description adds useful behavioral context: the output is a complete, compilable XML artifact with correct control serialization, and generation is not the final write step since validation is expected before writing. No annotation contradiction.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is three sentences with no filler. The key action and correctness requirement are front-loaded, the pattern list is compact, and the post-generation validation instruction is placed at the end.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers the generation scope and the intended workflow, and the schema covers all parameters. However, it references validate_form_pattern and write_aot_object, which are not present in the sibling tool list, making that part of the guidance potentially unactionable. The absence of an output schema is partially mitigated by the clear expectation that the tool returns generated XML.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, with all 7 parameters already documented in the input schema. The description itself 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.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('Generate') and a specific resource ('AxForm AOT XML'), and further clarifies the exact serialization requirement. The pattern enumeration makes its scope unambiguous and distinguishes it from sibling generators like generate_xpp_template, generate_query, or generate_data_entity.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives clear sequential workflow guidance: generate, then validate_form_pattern, then write_aot_object. It does not explicitly state when not to use this tool versus alternative generator tools, but the target artifact (AxForm AOT XML) strongly implies its use case.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

generate_xpp_templateA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
methodNameNoOptional: specific method name for CoC or event handler templates
objectNameYesThe base object, e.g. 'SalesTable', 'VendInvoiceJour'
templateTypeYesTemplate type: 'coc', 'table_extension', 'event_handler', 'job', 'find_method'

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover the safety profile (readOnlyHint=true, idempotentHint=true, destructiveHint=false), and the description adds behavioral context beyond them: 'Uses REAL metadata from the KB (actual field names, method signatures)' and the hard dependency on a prior get_object_details call. It does not detail the return payload or failure modes, but generation semantics are consistent with the read-only, idempotent annotations — no contradiction.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The content is front-loaded — the WHEN frame and purpose come first, followed by triggers, glossary, and the precondition. Every clause earns its place; the trigger list is slightly long with some French/English duplication, but that redundancy is arguably useful for matching a multilingual agent's input. It is dense but not bloated.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

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 five distinct generation modes, the description covers the essential gaps: when to use it, what it produces, what each templateType value means, and the required upstream call (get_object_details). The one omission — describing the exact return format — is minor because the generated code is self-evidently the output.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, giving a baseline of 3, but the description goes beyond the bare value list by defining each templateType: '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. This vocabulary expansion is exactly the kind of meaning the schema alone does not provide.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource — 'generates ready-to-use X++ code' — scoped to 'writing an extension or customization.' It differentiates from siblings like generate_xpp_form, generate_query, and generate_unit_test by enumerating its five template types (coc, table_extension, event_handler, job, find_method), so an agent can select it without inspecting other schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The 'WHEN:' frame plus the trigger phrases ('génère un CoC', 'crée une extension', 'generate extension', 'write a CoC class') give concrete, multilingual conditions for invocation. It also enforces a workflow precondition: 'ALWAYS call get_object_details first to verify the object exists.' It stops short of naming sibling alternatives or stating when not to use the tool, which keeps it a step below a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_data_entity_infoA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
entityNameYesData entity name (AxDataEntityView), e.g. 'CustCustomerV3Entity', 'SalesOrderHeaderV2Entity'.

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false. The description adds value beyond those by specifying 'Cloud-safe: pure metadata read from the KB', which tells the agent the operation touches no business data and which source backs it. 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.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and well-organized: purpose first, then triggers, then safety. Each labeled segment earns its place. The trigger phrase list is slightly verbose but functional for intent matching rather than padding.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-parameter, fully schema-documented, annotation-backed read tool, the description is nearly complete. It compensates for the absent output schema by stating what fields the rundown includes. Minor gaps remain: exact-match behavior for entityName and not-found handling are not mentioned.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%; the schema already explains entityName with the AxDataEntityView naming convention and concrete examples. The description adds no new parameter-level meaning, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

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: 'getting a quick rundown of a specific data entity' for OData/DMF integration, and enumerates exactly what is returned (public OData name, datasources, key fields, IsPublic status). This clearly distinguishes it from related siblings like get_object_details, find_entity_for_table, and list_objects.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The 'WHEN' clause gives concrete context (building an OData/DMF integration, needing a quick entity rundown) and explicit trigger phrases ('data entity info', 'OData entity details', 'is X a public entity') that help an agent match intents. It lacks explicit when-not-to-use guidance or named alternatives, which keeps it a step below 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_menu_item_infoA
Read-onlyIdempotent
Inspect

WHEN: developer needs to resolve a menu item -- find its target object (form / action / output), linked security privilege, label, and parameters. Triggers: 'menu item info', 'what does menu item X open', 'menu item target', 'security privilege for menu item'. Cloud-safe: parses the AxMenuItem XML already loaded in the KB. Returns the resolved object name, menu item type (Display/Action/Output), linked privilege, and the form/class/report it points to.

ParametersJSON Schema
NameRequiredDescriptionDefault
menuItemNameYesMenu item name (without prefix), e.g. 'CustTable', 'SalesTableListPage', 'ALMMyMenuItem'.
menuItemTypeNoOptional: menu item type to disambiguate when multiple exist with the same name. 'Display', 'Action', or 'Output'. Default: try all.

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already mark this as read-only, idempotent, and non-destructive. The description adds meaningful context by noting it parses AxMenuItem XML already loaded in the KB, implying no external fetch, and by spelling out the exact return fields. This supplements annotation data 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.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is slightly wordy but well-structured: trigger conditions are front-loaded, the cloud-safe behavior is stated, and the return contract completes it. Every sentence contributes useful selection or invocation information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

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 with no output schema, the description sufficiently covers trigger conditions, safety behavior, and return values. It does not mention not-found or error handling, but that is a minor gap given the tool's simplicity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so both parameters are already fully documented with names, defaults, and examples. The description adds no new parameter-level semantics, but none are needed because the schema carries the burden.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('resolve') and resource ('menu item'), and enumerates exactly what is resolved: target object (form/action/output), linked security privilege, label, and parameters. This is clearly distinguishable from sibling metadata tools by its menu-item-specific scope.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly frames the trigger condition ('WHEN: developer needs to resolve a menu item') and provides common user phrasings like 'menu item info' and 'what does menu item X open'. It lacks explicit exclusions or named alternatives, 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.

get_object_contextA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
aotTypeNoOptional: AOT type to disambiguate, e.g. 'AxTable', 'AxClass', 'AxForm'.
methodNameNoOptional: specific method name to include full body for.
objectNameYesExact object name, e.g. 'SalesTable', 'CustTable', 'VendInvoiceJour'
includeValidationNoInclude best-practice violations (default false -- adds latency for large objects).

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds meaningful behavioral context beyond that: the call is equivalent to two sibling calls, includeValidation adds latency for large objects, and methodName conditionally expands the payload with a full method body. This gives the agent a realistic picture of cost and return composition.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is one dense paragraph, but it is front-loaded with the trigger condition and delivers the core value proposition in the first sentence. Every clause earns its place — the sibling equivalence, the INSTEAD routing, and the three optional-parameter behaviors. It could be slightly better organized with bullets, but nothing is wasted.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only tool with four fully documented parameters and no output schema, the description adequately covers return contents (structure, method signatures, relation summary, extensions, event handlers, optional validation results) and parameter behavior. The main gap is the absence of any output format or size expectation, though for a read-context tool with annotations already covering safety, this is a minor omission.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

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 adds value on top by explaining the intent and tradeoffs: includeValidation triggers best-practice violation checks (with a latency caveat), methodName includes a full method body, and aotType resolves ambiguity when several AOT objects share a name. This goes beyond mere syntax into selection rationale.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific purpose: getting a COMPLETE picture of a D365 object in one call, returning full structure plus CoC extensions/event handlers. It explicitly distinguishes itself from siblings by naming get_object_details and find_extensions and stating it is the combined equivalent. An agent can immediately tell what this tool does and how it differs from neighboring tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description opens with an explicit condition ('WHEN: you need a COMPLETE picture...') and explicitly tells the agent to use this INSTEAD of the two separate calls to reduce round-trips. It also gives usage conditions for each optional parameter. It does not, however, state when not to use it (e.g., when only structure or only extensions are needed, the lighter siblings would be preferable), leaving that exclusion implicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_object_detailsA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
aotTypeNoOptional: 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.
methodNameNoOptional: 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.
objectNameYesThe exact object name, e.g. 'SalesTable', 'VendInvoiceApprovalConfig', 'ALMAlternativeItemsTable'

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Despite annotations already declaring readOnlyHint, idempotentHint, and non-destructive behavior, the description adds significant behavioral context: response can exceed 100KB, methodName changes output from signatures to full source, disk source takes priority, ambiguous names return the primary type and note alternates. These are non-obvious behaviors an agent needs to invoke correctly, and none contradict 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.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is longer than average, but it earns its length with dense, non-redundant guidance organized into readable sections (WHEN, COST NOTE, DISAMBIGUATION, NOT). A small amount of repetition exists around when to prefer get_relation_graph, but overall the structure front-loads the critical trigger and keeps each sentence informative.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

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 returned data contains (fields, methods, relations, indexes, source code, metadata), size expectations, the signature-vs-full-body distinction, disk-source merging, and type disambiguation. Given the tool's complexity and no output schema, this is a complete, self-sufficient description for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so a baseline of 3 applies, but the description adds substantial meaning: objectName must be 'EXACT' and PascalCase; methodName omission yields only signatures while providing it yields the full body; aotType is explained as a disambiguation mechanism with accepted shorthand values. It also clarifies a subtle interaction between methodName and the intended two-step workflow, going well beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: 'Get complete details: all fields, methods, relations, indexes, source code, and metadata' for an exact object name. It distinguishes itself clearly from search_d365_code and list_objects, and from get_relation_graph, making 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.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is exceptionally well-specified: it says to use this tool only when exact names are known, and explicitly directs to get_relation_graph for relations-only needs, search_d365_code for uncertain names, and list_objects for listing a model's objects. It also documents the intended two-step calling pattern and warns against a third call, leaving no ambiguity about when and how to use it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_output_pageA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNoThe page number to retrieve (the previous page footer tells you the next one). Defaults to 2.
tokenYesThe pagination token from a paginated tool's footer, e.g. 'op_a1b2c3d4e5'.

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly, idempotent, and non-destructive behavior. The description adds valuable context beyond that: pages are losslessly ordered, cached only briefly, and expired/unknown tokens fail with a clear recovery path. This gives the agent a realistic model of the tool's runtime behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core purpose and then efficiently explains the pagination mechanism, caching caveat, and failure recovery. Every sentence contributes necessary information without redundancy or filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a two-parameter read-only tool with no output schema, the description covers all required context: when to call, what inputs to supply, how the response is structured (ordered pages), and what to do when the token is invalid. No essential behavioral information is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and both parameters have descriptions, so the baseline is 3. The description adds extra semantic value by explaining that the token and page number come from a previous tool's footer, and that the page defaults to 2 — tying the parameters directly to the pagination workflow.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('Retrieve') and resource ('NEXT page of a previously PAGINATED tool output'), making the tool's purpose unmistakable. It also distinguishes this tool from the many siblings by embedding the pagination concept directly in the definition.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly explains when to invoke the tool: when a prior tool result was split into ordered pages and the footer provided a token and page number. It also gives an alternative pathway for failure — re-run the original tool if the token is unknown or expired — which effectively tells the agent when not to use this tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_relation_graphA
Read-onlyIdempotent
Inspect

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).

ParametersJSON Schema
NameRequiredDescriptionDefault
maxEdgesNoMaximum edges to show per direction (default: 200, max: 500)
objectNameYesThe exact object name, e.g. 'SalesTable', 'CustTable', 'SalesFormLetter'
aotTypeFilterNoOptional: filter edges by relation kind to reduce noise. Comma-separated. Examples: 'TableFK', 'DeleteAction', 'Extension', 'DataSource', 'Security'. Leave empty for all kinds.

TDQS

A4.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already establish readOnly, idempotent, non-destructive behavior, so the bar is lower. The description adds useful context about the pre-computed relation index, O(1) lookup, and the categories of outgoing and incoming edges. However, it claims the result is 'ALL' and 'COMPLETE' while the schema caps maxEdges at 200/500 per direction, and the description does not qualify that limitation, slightly overstating the tool's behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Although the description is longer than average, every segment earns its place: the WHEN trigger, the multilingual trigger phrases, the return scope, the pre-computed index rationale, the ALWAYS rule, and the fallback tool. It is front-loaded with the most decision-relevant information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Since there is no output schema, the description compensates by enumerating the types of outgoing edges and incoming back-references, giving an agent a clear expectation of results. It also covers the fallback to find_related_objects. It loses a point because it does not reconcile 'ALL' with the maxEdges cap or describe the graph response structure.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, and each parameter already has a detailed description with examples and defaults. The description adds no parameter-specific semantics beyond triggering context and performance rationale, so it earns the baseline 3.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

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: 'get the COMPLETE bidirectional relation graph for an object in ONE call.' It clearly distinguishes itself from find_related_objects by naming what it returns and why it is faster/more complete, so there is no ambiguity about its purpose.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It provides an explicit 'WHEN:' statement, trigger phrases, and an unconditional rule: 'ALWAYS call this before generating code that touches multiple objects or requires join logic.' It also names the exact fallback alternative: 'Use find_related_objects 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_objectA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
maxRolesNoMaximum roles to expand (default 30, max 100).
minGrantNoOptional: minimum grant level to include in results. Values: 'Read', 'Update', 'Create', 'Delete', 'Correct', 'Any'. Default: 'Any'.Any
objectNameYesObject name to audit (form, table, menu item, service operation). Example: 'CustTable', 'SalesTableListPage', 'CustCustomerServiceMenu'.

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The annotations already declare readOnlyHint and destructiveHint, and the description reinforces this with 'Read-only: scans the in-memory KB, never writes.' It adds behavioral detail beyond the annotations by revealing the backward graph traversal path (EntryPoint -> Privilege -> Duty -> Role) and the full set of grant levels considered. 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.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is organized into tight labeled segments: a WHEN clause, trigger phrases, a traversal explanation, and a read-only note. Each section earns its place, and the trigger list improves discoverability for an agent matching user intent. It is slightly longer than strictly necessary but remains efficient and well-structured.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema present, the description explains the core return value (roles granting any access level) and how the result is computed. It does not spell out the exact result structure or the behavior when maxRoles is exceeded, but the provided context is enough for an agent to decide when to invoke it. The explanation reasonably compensates for the missing output schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema already describes all three parameters completely, so the description carries little additional burden. It does contextualize objectName as a form/table/menu item/service operation and lists grant levels, but these largely overlap with the schema's examples and values. The phrase 'returns all roles' also sits slightly at odds with the maxRoles parameter, so the description does not add meaningful parametric clarity beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific objective: determining which roles can access a specific form, table, menu item, or service operation. It explicitly names object types and states the backward graph traversal that returns granting roles, which clearly distinguishes it from sibling tools. This is a precise, unambiguous definition.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides a clear WHEN clause and a list of natural-language triggers, making the invocation context concrete for an agent. However, it does not mention alternative tools like trace_security_chain or generate_security_report, nor does it give explicit when-not-to-use conditions. The context is sufficient for basic routing but lacks exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

healthcheckA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover read-only, idempotent, and non-destructive behavior, so the description's main contribution is the return contract: JSON with status, chunk count, version, and model path. This adds useful behavioral 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.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loaded with the most important 'WHEN' information, followed by triggers and return fields. Every sentence earns its place with no filler or redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With zero parameters, an output schema present, and annotations declaring the tool safe and idempotent, the description provides everything an agent needs to invoke it correctly. It even lists the expected JSON response fields.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, so the description is not required to explain parameter semantics. The baseline of 4 applies because there are no parameter gaps for an agent to resolve.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

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, which is a specific purpose. It does not explicitly differentiate itself from sibling tools, but the healthcheck intent is unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit when-to-use conditions and concrete trigger phrases like 'status', 'statut', and 'is the server ready'. It does not mention when not to use it or name alternatives, but the usage context is clearly communicated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_custom_model_objectsA
Read-onlyIdempotent
Inspect

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).

ParametersJSON Schema
NameRequiredDescriptionDefault
customModelPathNoOptional: path to the custom model directory (e.g. 'C:\\AOTExport\\MyModel'). Overrides the header and server-configured path.

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already mark it read-only, idempotent, and non-destructive. The description adds genuinely useful behavior beyond that: it reads the file system directly and 'always reflects the latest uncommitted state,' which critically distinguishes it from any metadata/DB-backed listing. It also discloses the header-level persistence behavior for customModelPath. 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.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the WHEN intent, followed by a crisp one-sentence definition and configuration mechanics. The trigger list is somewhat long (five examples) but earns its place for agent intent-matching. Every section contributes; nothing is filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-optional-parameter, read-only tool this is quite complete: what, when, how it behaves, and parameter semantics are all covered. The only real gap is that there is no output schema and the description never hints at the return shape (object names? full paths?), which an agent would benefit from knowing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

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 explaining parameter precedence — passing customModelPath overrides the header and server-configured path, while the D365-Custom-Model-Path header applies to all calls automatically. This precedence information is absent from the schema's parameter documentation.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

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 all D365 F&O objects in the custom/extension model directory on disk' — and the WHEN/trigger section clarifies the exact user intent it serves. The custom/extension scope distinguishes it from siblings like list_objects, and the trigger examples ('show ISV objects', 'what have we customized') make matching unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The explicit WHEN clause plus five concrete trigger phrases give clear guidance on when to invoke this tool. It does not name alternative tools or state when not to use it, but the disk/custom-model scoping effectively separates it from general listing siblings.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_objectsA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
aotTypeNoFilter by AOT type: AxClass, AxTable, AxForm, AxView, AxEnum, AxEdt, AxDataEntityView, AxSecurityPrivilege, AxSecurityDuty, AxSecurityRole, AxQuery, AxReport, Documentation. Leave empty for all types.
modelNameNoFilter: matches BOTH package/module name (partial) AND object name (substring). Examples: 'ALM' (package), 'Cust' (any object containing 'Cust'), 'SalesTable'. Leave empty for all.

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, and non-destructive behavior. The description adds valuable behavioral context beyond this: it warns about a full index scan returning every match rather than top search results, and explains the default-to-custom-model behavior. 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.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is slightly longer than necessary, but it is front-loaded with the WHEN trigger, followed by concrete usage examples and clear exclusions. Each sentence adds useful routing or behavioral information; the trigger examples are repetitive but aid recognition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

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 list operation with fully documented parameters and strong annotation coverage, the description covers the key decision points: what it returns, when to use it, when not to use it, and default behavior. The absence of an output schema means return format is not specified, but this is a minor gap for a discovery-oriented list tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, and both parameters already have detailed descriptions including accepted values, filtering semantics, and examples. The tool description adds no meaningful parameter-level information beyond what the schema provides, so a baseline score of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a clear verb-resource pair: list ALL objects of a given type or in a given model. It explicitly names sibling tools it is not (get_object_details, search_d365_code), so an agent can distinguish it 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.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides an explicit 'WHEN' section with natural language triggers, explains the 'all objects' behavior, and gives direct exclusion guidance with named alternatives for single-object lookup and natural-language search. It also clarifies default model behavior when no filters are provided.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_release_note_inputsA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.8/5.0
Behavior5/5

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: the data is the actual indexed code diff on this server, the returned version strings are exact inputs for v1/v2, and custom model grouping semantics (clientGroup) are explained. It also clarifies that this tool exposes real client-specific data rather than public generic knowledge.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but well-structured and front-loaded with the most important instruction (WHEN: ALWAYS call this FIRST). It is organized into trigger phrases, return value detail, and an important exclusion note. Every section adds value, though some repetition of 'actual/THIS server' makes it slightly heavier than necessary.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no input schema and no output schema, the description carries the full burden, and it succeeds: it explains return shape, exact usage of values as v1/v2 and customModelIds, grouping semantics, precedence over sibling tools, and exclusion of generic tools. Nothing essential is missing for an agent to invoke this correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, so parameter semantics are largely irrelevant. Baseline 4 applies because there are no parameters to explain, and the description correctly focuses on what the tool returns rather than inputs.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's job: discover exact D365FO version strings and custom model ids indexed on this server, and explicitly says to call it FIRST before prepare_release_note_context. It distinguishes itself from generic documentation tools and from the sibling prepare_release_note_context.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage guidance is explicit and excellent: ALWAYS call this first, with trigger phrases provided, and with an explicit exclusion warning that generic Microsoft Learn/Azure Updates tools must NOT be used for this client-specific purpose. No ambiguity remains about when this tool should be selected.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

map_business_processA
Read-onlyIdempotent
Inspect

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).

ParametersJSON Schema
NameRequiredDescriptionDefault
processNameYesBusiness 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

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, and the description does not contradict them. It adds meaningful behavioral detail beyond annotations: known processes produce a complete step-by-step object chain, unknown objects trigger dependency tracing, and the output is a Mermaid process flow diagram. This gives the agent a clear picture of what invoking the tool will do.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is longer than average, but it is front-loaded with the key WHEN context and trigger phrases before moving into behavior and alternatives. Every section serves a purpose: triggers aid selection, process-name examples clarify input, and the final exclusion prevents misuse. A little trimming of the trigger list would improve brevity, but the structure is still effective.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

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 must explain return values, and it does: it produces a Mermaid process flow diagram and enumerates the object types involved. It also covers the 'list' discovery mechanism and the key boundary with find_related_objects. Minor gaps such as potential size or performance of dependency tracing are not mentioned, but the essential context is present.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the parameter is already documented with examples and the special 'list' value. The description adds extra semantics by explaining the two behavioral branches for processName: known process names map the full end-to-end flow, while arbitrary object names trigger dependency tracing. This goes beyond the schema's basic description.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific action and resource: mapping a D365 F&O business process to its complete object chain, covering forms, tables, classes, entities, reports, and security roles. It explicitly differentiates itself from find_related_objects, so an agent can distinguish it from siblings without inspecting schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description opens with a WHEN clause and lists concrete trigger phrases in both English and French. It also provides explicit guidance on when NOT to use it ('NOT for a single object's FK relations only') and names the recommended alternative, find_related_objects, with reasoning that it is faster and more precise.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

odata_export_entityA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
filterNoOptional OData $filter expression.
formatNoOutput format: 'csv' (default) or 'json'.csv
selectNoOptional $select (comma-separated fields). Empty = all fields.
maxRowsNoMax rows to return (0/empty = no cap, follows all pages). Default 1000.
orderByNoOptional $orderby expression.
entitySetYesOData public entity set name, e.g. 'CustomersV3', 'ReleasedProductsV2'.
outputPathNoOptional file path to also write the full result to (e.g. C:\temp\export.csv).
crossCompanyNoSet true to query across all legal entities (adds cross-company=true).

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already state readOnlyHint=true, idempotentHint=true, and destructiveHint=false, and the description reinforces this by calling the export transactional and non-destructive. It adds meaningful behavioral detail beyond annotations, including automatic server paging, CSV/JSON return formats, and the absence of a DMF project requirement.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured and information-dense without being bloated. It leads with the core purpose, then covers key capabilities, output formats, usage conditions, and a critical prerequisite in a compact, readable block.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only export tool with full parameter documentation and rich annotations, the description provides all necessary operational context: what it exports, how it pages, what formats it returns, when to use it, and what to do before calling it. The lack of an output schema is mitigated by the explicit statement that results are CSV or JSON.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the structured schema already documents each parameter. The description adds general context about supported OData features ($select, $filter, $orderby) and paging, but these largely mirror the existing schema descriptions rather than adding new semantic depth, 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.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool exports any D365 F&O data entity via OData, naming the action, resource, and mechanism. It also distinguishes itself from DMF-based exports by explicitly saying 'no DMF project required' and positioning it as a universal, live export path.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit guidance on when to use this tool: 'Use for live/ad-hoc exports and small-to-medium volumes.' It also names the alternative for large bulk exports ('prefer dmf_export_package') and instructs the agent to resolve the entity set name via find_entity_for_table/get_data_entity_info rather than guessing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

odata_upsert_rowsA
DestructiveIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
rowsJsonYesJSON array of row objects, e.g. [{"CustomerAccount":"C0001","Name":"Acme"}].
entitySetYesOData public entity set name, e.g. 'CustomersV3'.
keyFieldsYesComma-separated business key fields used to detect existing records, e.g. 'CustomerAccount' or 'dataAreaId,ItemNumber'.
legalEntityNoOptional legal entity (dataAreaId) injected into each row when absent.
crossCompanyNoSet true to allow cross-company writes.

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description explains the PATCH/POST upsert semantics, that duplicates are updated rather than re-created, and that re-running is safe. This goes beyond the annotations' idempotentHint and destructiveHint by clarifying exactly what modification will occur. It does not disclose potential indirect effects of cross-company writes, but the most important behavioral traits are covered.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences carry the core semantics, usage scope, alternative tool, and a critical usage instruction. The most important fact, idempotent upsert behavior, is front-loaded, and nothing extraneous is included. Every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with five parameters, full schema documentation, and no output schema, the description covers the key behavioral contract, idempotency, size limits, alternative routing, and key-field resolution guidance. There is no missing information an agent would need to invoke this tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and each parameter already has a meaningful description. The description adds value by instructing that rows must be a JSON array of objects and that key fields must be resolved via get_data_entity_info, which helps an agent avoid a common failure mode. Baseline 3 is exceeded, though not by a wide margin because the schema already explains all five parameters.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

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', and clearly distinguishes itself from dmf_import_file and odata_export_entity. An agent can immediately understand what this tool does and how it differs from bulk import and export siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly scopes usage to small-to-medium transactional loads, suggests a lower bound by example ('<= a few thousand rows'), and names dmf_import_file as the alternative for bulk loads. It also gives a concrete prerequisite: resolve key fields from get_data_entity_info rather than guessing them. This leaves no ambiguity about when 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.

plan_and_executeA
Destructive
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
goalYesNatural language goal OR a JSON array of explicit steps. Examples: 'analyse WI #6587 and create a task', 'check best practices for ALMMyClass'.
projectNoOptional: Azure DevOps project name. Falls back to DEVOPS_PROJECT env var.
assignToNoOptional: assignee email for task creation step, e.g. 'dev@company.com'.
objectNameNoOptional: object name to use when goal references a D365 object (overrides name parsed from goal).
workItemIdNoOptional: work item ID to use when goal references 'WI #N' (overrides ID parsed from goal text).
descriptionNoOptional: additional description text to pass to task creation step.

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already signal mutating/destructive capability and non-read-only behavior. The description adds planner-specific traits: NL parsing disabled, maximum 5 steps, chain stop on critical failure, SSE progress events, and pure in-process execution. The parenthetical listing tools as 'critical failures' is somewhat ambiguous, but it does not contradict 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.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose is front-loaded and the content is organized with headings, bullets, and an example. A few phrases are redundant ('chain-of-tools' vs 'chaining tools') and the critical-failure parenthetical is confusing, but the length is justified by the tool's complexity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers when and how to call the tool, the maximum number of steps, and failure-stopping behavior. However, there is no output schema and the description never states what the call returns (e.g., per-step results vs aggregated response), which is a notable gap for an orchestration tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

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 extra semantics for the overloaded 'goal' parameter by showing the exact JSON array format and a concrete example, and by clarifying that natural language parsing is disabled. Optional parameters are left to the schema, which is acceptable at full coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with 'Execute a multi-step JSON plan in ONE call by chaining tools', giving a specific verb, object, and mechanism. The 'CHAIN-OF-TOOLS PLANNER' label and explicit JSON array format distinguish it from the sibling single-purpose tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides dedicated 'When to use' and 'When NOT to use' sections with concrete conditions: exact sequence known, 2-5 steps, independent outputs, and SSE progress desired. It explicitly excludes single calls, interactive decisions, and plans over 5 steps, which gives 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_contextA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
v1NoOlder/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).
v2NoNewer D365FO version to compare TO, e.g. "10.0.2645.32". Omit to auto-fill from the caller's resolved client profile.
customModelIdsNoComma-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.
businessContextNoOptional free-text business/functional context about the client (modules used, key customizations, priorities) to sharpen the opportunity/regression assessment.

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate readOnlyHint, idempotentHint, and destructiveHint, but the description adds substantial behavioral detail beyond them: the result is capped at 60 objects, prioritized Removed > Modified > Added, filtered to only client-touched changes, and returned as a JSON payload containing an 'instructions' field. It also clarifies that the caller must analyze the 'objects' array itself and then call generate_release_note_document to produce the deliverable, which is valuable non-obvious behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense and organized with clear cues like 'WHEN', 'Triggers', and workflow ordering. It is longer than minimal, but nearly every sentence carries operational value: trigger phrases, parameter omission rules, result cap, priority ordering, and next-step routing. A small amount of redundancy exists between the version-role explanation and the parameter descriptions, but overall it earns its length.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with four optional parameters and no output schema, the description is remarkably complete: it defines when to use it, how to resolve parameter values, what behavior to expect, and what to do with the result. It even tells the agent that the returned payload contains an 'instructions' field specifying the exact schema to produce, which compensates for the lack of an output schema. No critical operational step is left unexplained.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, and the description goes further by clarifying the ordering semantics of v1 (older) and v2 (newer), the auto-fill behavior from resolve_client_profile, and that customModelIds can be comma-separated to cover multiple client and ISV models. It also explains that businessContext sharpens the opportunity/regression assessment. This is meaningful added guidance, though not exhaustive enough to warrant 5.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific verb and resource: preparing an AI-assisted D365 F&O upgrade release-note context for a client. It clearly scopes what the tool does by diffing two indexed versions, cross-referencing custom models, and returning only the touched subset of changes. It also distinguishes itself from nearby siblings by positioning itself as the context-preparation step that feeds generate_release_note_document, and by noting the calling assistant does the reasoning rather than the server.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit when-to-use guidance with trigger phrases like 'release note' and 'regression risk'. It names prerequisites and alternatives directly: call resolve_client_profile first, omit v1/v2/customModelIds if a profile exists, and call list_release_note_inputs to get real values when no profile exists. It also explicitly instructs the agent never to guess parameter values and names the downstream tool to call next.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

recommend_extension_strategyA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
intentYesPlain-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'.
objectNameYesTarget standard D365 object name, e.g. 'SalesTable', 'CustTable', 'SalesLineType', 'PurchFormLetter_Confirmation'.

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Adds behavioral context beyond the annotations: discloses this is a 'pure KB lookup' with no D365 dependency, and that output is a ranked recommendation with citations to the Microsoft Learn extensibility guide. These claims are fully consistent with readOnlyHint=true, idempotentHint=true, and destructiveHint=false, adding useful operational color to 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.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Roughly 60 words with a labeled WHEN → Triggers → Returns → Safety structure that front-loads the decision context. Every clause earns its place; the only slight redundancy, 'no writes', is a brief phrase that reinforces the safety profile without bloating the text.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only, two-parameter KB-lookup tool, the description covers decision context, trigger phrases, output behavior, and safety, while the schema fully documents both parameters. The absence of an output schema is acceptable because the description states what the agent will receive (a ranked recommendation with citations), so nothing needed for correct invocation is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%: both intent and objectName have detailed descriptions with concrete examples ('add a status field', 'SalesTable', 'PurchFormLetter_Confirmation'). The description adds only the mapping of objectName to 'target AOT type', which is marginal on top of an already self-documenting schema, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Names a specific verb and resource: 'Returns a ranked recommendation' for choosing among AxTableExtension, Chain of Command, EventHandler, or Delegate when customising a standard D365 object. The WHEN clause and trigger phrases ('how to extend', 'extension strategy for') make the tool's scope unmistakable and clearly distinguish it from siblings like find_extensions (finds existing extensions) or create_aot_object (creates objects).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit when-to-use context ('WHEN: developer about to customise a standard D365 object asks...') plus concrete trigger phrases in both English and French ('CoC ou event handler', 'comment etendre X'). It does not name when-not-to-use conditions or point at alternative tools, so it stops short of the full exclusion guidance required for a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

resolve_client_profileA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds meaningful behavioral context: auto-detection from MCP headers, zero arguments needed, and the exact data returned when a profile exists. There is no contradiction with 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.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense and front-loaded with the WHEN trigger, and every sentence serves a purpose: timing, preconditions, return data, downstream use, or fallback. The explicit 'WHEN:' marker and sibling references keep the paragraph scannable despite its length.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

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 tells the agent what to expect (currentVersionTag, targetVersionTag, customModelIds, diff snapshot), how to consume those outputs in the next tool, and what to do on the not-found path. This is sufficient for correct invocation in the broader workflow.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With zero parameters and 100% schema coverage, the baseline is 4, but the description goes further by explaining why no arguments are needed: org/project are auto-detected from DEVOPS_ORG_URL/DEVOPS_PROJECT MCP headers. This is genuinely useful semantic information beyond the empty schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific verb (resolve) and resource (client profile) and pins down exactly when it is relevant: at the START of any release-note/upgrade-impact conversation. It explicitly distinguishes itself from siblings by referencing list_release_note_inputs, save_client_profile, and prepare_release_note_context, so an agent can route correctly 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.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description is explicit about when to call this tool (before list_release_note_inputs), what conditions lead to using its results directly, and which tools to fall back to if no profile exists. This gives the agent a complete decision tree.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

resolve_workspace_rootsA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already mark the tool as read-only, idempotent, and non-destructive. The description adds meaningful behavioral detail by specifying that it reads from request headers or environment variables and which exact variables are used. This goes beyond what annotations state, though it does not cover edge cases like missing variables or precedence.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and well-structured: a WHEN clause, the mechanism, and a direct usage directive. Every sentence earns its place and the most important usage context is front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple, zero-parameter, non-destructive lookup tool, the description covers when to use it, what it reads, and how it relates to other tools. It does not specify the exact return shape, but the description's mention of knowing folder(s) is adequate for agent invocation; an explicit output contract would make it fully complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, so schema coverage is trivially 100% and there is nothing to document. The description compensates by explaining what information the tool resolves, which is sufficient for a parameterless lookup.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: determining which folders are configured as workspace/project roots for the current caller. It names the exact configuration keys read (D365-Custom-Model-Path and D365-Standard-Model-Path), making the behavior specific and distinguishable 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.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description opens with 'WHEN' and gives explicit guidance: use this tool before any tool accepting customModelPath/standardModelPath. This directly tells an agent when to invoke it and frames its role as a prerequisite helper, which is clear usage guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

resync_devops_indexA
DestructiveIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
patNoOptional: 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

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true, readOnlyHint=false, and idempotentHint=true. The description adds valuable context that the operation runs in the background, returns status immediately, and involves eviction plus re-download. This goes beyond the annotations and explains the operational behavior an agent needs to know. A small deduction because it doesn't mention possible failure modes or the full extent of the eviction side effect.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is longer than average but well-structured: trigger conditions first, then use case, then parameter guidance, then post-call behavior. The multi-language trigger list is lengthy but earns its place by disambiguating user intent. No sentence is redundant, though it could be trimmed slightly without losing value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with only one optional parameter and no output schema, this description is fully complete. It explains what happens, why to use it, when to pass `pat`, the asynchronous/background behavior, the immediate status return, and the recommended verification step. An agent has everything it needs to invoke the tool and follow up correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

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 semantic nuance beyond the schema by clarifying that `pat` is a one-time override 'for this resync' and explicitly ties it to the cross-org/cross-tenant scenario. This helps the agent decide when to populate the parameter, exceeding what the schema alone provides.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific action ('force a full re-download and re-index') and a specific resource ('Azure DevOps custom model'), which makes it unambiguous. Trigger phrases and examples also clarify what user intent maps to this tool, distinguishing it from the many sibling tools that perform queries or other Azure DevOps actions.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description begins with 'WHEN' and enumerates explicit trigger phrases in both English and French. It also provides a targeted use case (server PAT lacking access), details when to supply the `pat` parameter, and gives follow-up instructions to wait ~60s and call `healthcheck`. This is strong, actionable guidance with no ambiguity.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

save_client_profileA
DestructiveIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesFriendly client name, e.g. "Acme Corp".
customModelIdsNoComma-separated custom model id(s) from the Custom Models tab -- the client's own extensions AND any separate ISV vendor models.
targetVersionTagNoThe version being evaluated for upgrade, e.g. "10.0.2645.32".
currentVersionTagNoThe client's current live D365FO version tag, e.g. "10.0.2527.109".

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already signal mutating, idempotent, and destructive behavior; the description adds valuable details: the profile key is derived from MCP headers rather than a parameter, and the tool performs a partial upsert (only passed fields change, omitted fields remain untouched). It stops short of saying what the call returns or clarifying null-vs-omitted field semantics.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the key WHEN condition, followed by a compact behavioral summary. Every sentence earns its place; the rationale about future release-note requests is brief and adds context rather than padding.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a four-scalar-parameter upsert with no output schema, the description covers the main decision, keying, and partial-update behavior well. The only notable gap is that it does not describe the return value or success signal, and it leaves the null-clearing behavior ambiguous.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the schema carries the baseline. The description adds meaning by explaining that the org/project key is not a parameter and that omitted parameters are left untouched on update. The nullable/default null parameters could have been clarified (does passing null clear a field?), which prevents a 5.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('Creates or updates') plus resource ('Client Profile') and explicitly names the triggering condition involving resolve_client_profile. It also distinguishes its scope by noting the profile is keyed to the caller's ADO org/project, so it is not a generic save utility.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It opens with an explicit 'WHEN' condition: no profile was found by resolve_client_profile and the user wants one created or updated. This clearly routes the agent to the tool and implies resolve_client_profile is the retrieval counterpart, making the choice between siblings unambiguous.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_context_docsA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
queryYesNatural-language search query.
maxResultsNoMax distinct documents to return (1-20). Default 8.
includeImagesNoAttach 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

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare the tool read-only, idempotent, and non-destructive. The description adds valuable behavioral context: it searches only admin-uploaded documents, returns text excerpts, and explains that 'Image N' markers indicate embedded pictures that require includeImages=true to retrieve. It does not contradict the annotations and gives useful operational detail.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense but every sentence earns its place: scope, exclusions, triggers, and the image-marker edge case are all covered. It is front-loaded with the WHEN guidance and uses clear signposting ('WHEN', 'Does NOT search', 'Triggers'). No filler or redundant restatement of the name.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers scope, exclusions, alternatives, triggers, and the image-inclusion behavior. Since there is no output schema, a brief explicit statement of the result shape (e.g., ranked document excerpts) would have made it fully complete, but the excerpt and image references strongly imply it. Overall, it is sufficient for an agent to invoke the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

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 well. The description adds extra semantic value by explaining natural-language trigger examples for 'query' and the practical workflow for 'includeImages' when image markers appear. This goes slightly beyond the schema descriptions without repeating them.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: searching business/functional context documents stored in the 'Context Documents' library, explicitly listing supported file types. It clearly distinguishes itself from search_d365_code and get_object_details by stating what it does NOT search. The trigger examples further pin down the intended purpose.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

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, provides concrete trigger phrases, and names alternatives for code/AOT searches. It also gives practical guidance on how to handle excerpts containing 'Image N' markers by calling again with includeImages=true. This leaves no ambiguity about when to select this tool over siblings.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_d365_codeA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
topKNoMaximum number of results to return (default: 10, max: 50)
queryYesNatural language search query. Examples: 'vendor invoice approval', 'tables in ALM', 'SalesTable fields', 'security privileges for purchasing'
scopeNoOptional 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).
domainNoOptional: filter results to a specific AOT type. Examples: 'AxTable', 'AxClass', 'AxForm', 'AxEnum'. Leave empty for all types.
topObjectsNoNumber of top-scoring objects whose ALL chunks are returned (default: 5, max: 20). Increase to broaden coverage, decrease for tighter focus.

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations (readOnlyHint=true, idempotentHint=true, destructiveHint=false), the description discloses rich behavioral traits: top-scoring objects return ALL chunks (metadata, Declaration, methods) so no follow-up get_object_details is needed, lower-scoring results return only a short preview, and the hard rule against calling twice in one turn. This meaningfully shapes agent expectations about output size and call strategy.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but every sentence earns its place — it covers routing, behavior, and hard operational rules with zero filler. The WHEN/NOT/NEVER markers provide effective scannable structure despite being a single paragraph, and the most decision-critical info (when to use) is front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

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 explains return behavior (full chunks vs preview). The name-based, listing-based, multi-concept, and ADO alternatives are all named. Safety is covered by annotations, parameters are fully documented in the schema, and edge-case policies (don't repeat search, answer from what you have) are included. Nothing an agent needs to call this correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

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 real semantic value: it explains the practical consequence of topObjects/topK ('Returns ALL chunks for the top-scoring objects... Lower-scoring results return a short preview') and implies that top results are self-sufficient. It doesn't add per-parameter syntax, but the result-behavior mapping goes beyond the schema's generic parameter descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('Search') plus resource ('the D365 F&O knowledge base') and enumerates exactly what can be found: X++ code, tables, classes, forms, views, enums, EDTs, security objects, via natural language or partial names. It clearly distinguishes itself from siblings by stating what it is NOT (list_objects, get_object_details, batch_search, ado_* tools).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage conditions are explicit and comprehensive: use it WHEN the name is unknown/partial or searching by concept; use list_objects for listing a model; use get_object_details when the exact name is known; use batch_search for multiple simultaneous concepts; use ado_* tools for ADO items. It even forbids repeated calls in the same turn, leaving zero 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.

search_labelsA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
queryYesText to search for (e.g. 'Sales order', 'Invoice amount') or a label ID (e.g. '@SYS12345', '@AccountsReceivable:CustInvoice')
languageNoOptional: filter by language code (e.g. 'en-US', 'fr', 'de', 'nl'). Leave empty for all languages.
maxResultsNoMaximum results (default: 20, max: 50)

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly/idempotent/non-destructive, and the description adds substantial operational context on top: automatic normalization of @SYS vs @SYS: label ID forms, the 392K+ entry scale, and the language-loading latency model (en-US/fr at startup, other languages ~15s on first call then instant). This is the kind of behavior an agent needs to anticipate format quirks and timing. 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.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense but every sentence earns its place: purpose, bidirectional mode, input normalization, scale, workflow, and performance caveat. The WORKFLOW marker gives clear structural segmentation, and core purpose is front-loaded ahead of operational detail.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

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 core return semantics implicitly (matching label ID or text in all languages) and covers scale, performance, and the recommended downstream call. The only gap is the exact result shape or empty-result behavior, which is minor given the explicit maxResults parameter.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

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 genuine meaning: the query parameter accepts either plain text or a label ID in two interchangeable formats, and the language parameter carries the on-demand loading implication (~15s first call). maxResults semantics are already fully documented in the schema, so no additional value is needed there.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The first sentence names a specific verb and resource ('Search D365 F&O labels across all indexed languages') and immediately differentiates the tool's two modes: text→label ID and label ID→text. It distinguishes itself from the sibling find_references by positioning itself as the resolution step in a two-stage workflow. 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.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The WORKFLOW section explicitly instructs the agent to call search_labels first, then find_references with the same label ID to locate X++ objects — clear routing to the key sibling. It states when to use the tool (resolving label text to IDs and vice versa) but does not provide exclusions for other search siblings like search_d365_code or federated_search.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

suggest_edtA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
topKNoNumber of EDT candidates to return (default: 8, max: 20)
purposeYesPurpose of the field in plain language, e.g. 'customer account number', 'approval status enum', 'invoice amount in transaction currency'
baseTypeNoOptional: D365 primitive base type to filter by, e.g. 'str', 'int64', 'real', 'date', 'enum'. Leave empty to search all types.
fieldNameYesField name or concept, e.g. 'AccountNum', 'vendorId', 'itemCode', 'approvalStatus'

TDQS

A3.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already establish the safety profile (readOnlyHint=true, idempotentHint=true, destructiveHint=false), so the bar for extra disclosure is lower. The description adds value by stating the return shape — 'Returns ranked candidate EDTs with their base type, label, and model' — which matters because there is no output schema, but it omits behavioral details like the data source consulted or behavior on empty results. 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.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is roughly 70 words and front-loaded with the WHEN condition before triggers, rationale, and return format, so an agent gets the gating condition first. Each section earns its place, though the ranked list of trigger phrases in multiple languages adds density beyond strictly necessary.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Because there is no output schema, the description correctly fills the return-value gap by specifying ranked candidates with base type, label, and model. The 4-parameter surface is fully covered by the schema, and the only notable omissions — whether an active D365 environment connection is required and what happens when no match is found — are minor for a read-only lookup tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so all four parameters (fieldName, purpose, baseType, topK) are already documented with examples and defaults. The description's mention of primitive types (str, int64, real, date) merely echoes the baseType parameter examples in the schema, adding no new semantic information. Per the high-coverage baseline rule, 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: 'find the best existing D365 EDT to extend instead of using raw primitives (str, int64, real, date)'. It clearly names the D365 concept (EDT) and the anti-pattern it replaces, and it is easily distinguished from siblings like suggest_refactoring or validate_best_practices because no other tool returns ranked EDT candidates.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description is explicitly framed around invocation timing: 'WHEN: adding a new field to a table' and 'Call BEFORE declaring any field with a primitive type,' reinforced by concrete trigger phrases like 'what EDT for' and 'EDT for a field'. It explains the D365 best-practice rationale, but it does not name alternative tools or state explicit when-not conditions, 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.

suggest_refactoringA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
methodNameNoOptional: specific method to analyze.
objectNameYesObject name to analyze, e.g. 'ALMMyClass', 'ALMMyTable'

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already signal readOnly, idempotent, non-destructive; the description goes beyond by stating the scope constraint (custom/extension code only, D365_CUSTOM_MODEL_PATH) and the exact analysis capabilities (e.g., long methods → extract method, nested ifs → guard clauses). It also discloses the return format ('before/after code examples'), which the schema does not. 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.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences plus a compact list; the WHEN and TRIGGERS are front-loaded, and each listed pattern maps to a concrete refactoring suggestion. No filler or repeated schema content.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool has only 2 parameters and no output schema, but the description tells an agent what triggers it, what code it operates on, what patterns it finds, and what the result looks like (before/after examples). That is enough for an agent to invoke it and interpret the response.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema covers both parameters with descriptions (100% coverage), so the description does not need to repeat them. The description adds general context that objectName refers to a custom D365 F&O object and methodName is optional for focusing the analysis, but it does not add parameter-specific 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.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('Suggest') and resource ('custom D365 F&O X++ code'), states it returns before/after examples, and enumerates the refactoring patterns it analyzes (long methods, deep nesting, etc.). It is clearly distinct from siblings like fix_best_practice_violations or detect_performance_issues because it focuses on refactoring suggestions with code examples rather than compliance or performance diagnosis.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly states 'WHEN' and lists natural-language triggers ('refactor', 'clean up', 'simplify', 'code smells', 'améliorer le code') that an agent can match. It also states a critical exclusion: only custom/extension code is supported, and refactoring standard Microsoft code is 'not actionable.' This gives clear go/no-go context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

summarize_for_stakeholderA
Read-onlyIdempotent
Inspect

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).

ParametersJSON Schema
NameRequiredDescriptionDefault
textYesThe technical text to summarize/explain -- typically the raw output of another tool call.
audienceNoTarget audience: 'executive', 'business-analyst', or 'developer'. Default 'business-analyst'.business-analyst

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Adds valuable context beyond annotations: it calls a local Ollama instance, reads OLLAMA_HOST, and respects ALMXPP_SUMMARIZE_MODEL. This informs the agent of an external dependency and configuration that the readOnly/idempotent/destructive annotations do not convey.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences, correctly front-loading the usage condition before implementation detail. Each sentence earns its place: when to use, what service is called, and how to configure the model.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple two-parameter tool with annotations covering safety, the description supplies selection criteria, the external dependency, and configuration. It does not explicitly describe the return value format, but the name and 'produce the summary' make the output obvious; a no-output-schema tool might still benefit from one explicit sentence.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Both parameters are fully described in the schema (100% coverage), so the baseline is 3. The description reinforces that 'text' is the raw output of another tool call, but that meaning is already present in the schema's description; no additional parameter detail is added.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a clear trigger ('large technical tool output') and purpose ('reframed for a non-technical audience'). The examples of source tools (get_object_details, validate_best_practices) tie it to a specific workflow and differentiate it from sibling tools, none of which summarize output for stakeholders.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly opens with 'WHEN: you have a large technical tool output... and need it reframed for a non-technical audience', which is a precise selection condition. It doesn't discuss alternatives or when not to use it, but no sibling tool performs the same role.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

trace_field_lineageA
Read-onlyIdempotent
Inspect

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').

ParametersJSON Schema
NameRequiredDescriptionDefault
fieldNameYesField or property name, e.g. 'CreditMax'.
tableNameYesTable or class name, e.g. 'CustTable'.
maxPerCategoryNoMax results per category (default 15).

TDQS

A4.2/5.0
Behavior4/5

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 operational context by stating that XRef index is required for writer/reader analysis and that a relation graph is used for forms and FKs, which is useful behavioral information 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.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with scannable labels ('WHEN', 'Triggers', 'Requires', 'Examples') and is front-loaded with the core purpose. Every sentence contributes meaningful information, including multilingual trigger phrases and two concrete invocation examples, with no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

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 gives a solid picture of what the tool returns by listing result categories: writers, readers, forms, reports, and FK relationships. It could be more explicit about output grouping or behavior when the XRef index is unavailable, but the prerequisites and examples make invocation practical.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

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; all three parameters already have descriptions. The examples 'trace_field_lineage('CustTable','CreditMax')' and the LedgerJournalTrans call provide concrete usage context, but the description adds no substantially new parameter semantics beyond what the schema already provides.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

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: 'understand the full data lifecycle of a D365 F&O table field' and then enumerates the exact artifact categories involved (writers, readers, forms, reports, FK tables). This clearly distinguishes it from generic search or reference tools even though no sibling is named.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The 'WHEN' section and trigger phrases ('where is field X set', 'data lineage', 'GDPR field audit') give clear context for when to invoke the tool, and the XRef dependency is stated. It does not explicitly name alternatives or when not to use it, so it stops short of a perfect score.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

trace_role_license_treeA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
roleNameYesThe exact security role name, e.g. 'SystemAdministrator', 'AccountsPayablePaymentsClerk', 'ALMMyCustomRole'
maxEntryPointsNoMaximum entry points to show per privilege (default: 20, max: 100)

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly, idempotent, and non-destructive behavior, and the description adds substantial behavioral context: grant-level license classification, confidence levels, an Optimization section with cost estimates, and validation against the Microsoft licensing guide. This goes well beyond what annotations alone provide, and there is no contradiction.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but front-loaded with WHEN and trigger information, and each section contributes to invocation or output interpretation. It could be slightly tighter, especially the repeated license-pricing details, but it remains organized and scannable for an agent.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

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 describing the expected output sections: the tree, license classification with MSRP, confidence levels, and optimization advice. It covers the main invocation and interpretation needs, though edge behavior such as role-not-found handling is not addressed.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema provides 100% coverage of both parameters, including examples for roleName and defaults for maxEntryPoints. The description reinforces the role-centric behavior but does not add new parameter-level semantics beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific action and resource: it builds the COMPLETE tree for ONE role (Role -> Duties -> Privileges -> Entry Points) and classifies the required D365 license per entry point. It clearly differentiates itself from the sibling trace_security_chain, which handles the technical 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.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description opens with explicit WHEN scenarios and trigger phrases, including French triggers. It also gives direct routing guidance: call multiple times for a multi-role scan, and use trace_security_chain instead when license inference is not needed. This leaves no ambiguity about when to select 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.

trace_security_chainA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
businessLanguageNoWhen true, explains the role in plain business language (capabilities list) instead of the technical Role->Duty->Privilege chain. Default: false.
securityObjectNameYesSecurity object name, e.g. 'SystemAdministrator', 'VendInvoiceApprovalConfig'

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The annotations already cover read-only, idempotent, and non-destructive behavior. The description adds the traversal path, the dual-mode behavior controlled by businessLanguage, and the fact that business mode omits Duty/Privilege IDs. It does not describe the exact return format, but the safety profile is well covered by annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured and front-loaded with WHEN, but the trigger lists are long and partially redundant with the prose. Still, the structure makes it skimmable and the content is relevant rather than filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a two-parameter read-only tool, the description is largely complete: it gives context, modes, scope, and an explicit alternative. It does not describe the return shape in the technical mode, and there are other security-related siblings (e.g., generate_security_report) that are not explicitly differentiated, but the core guidance is strong.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema already documents both parameters with 100% coverage, including an example for securityObjectName and the default for businessLanguage. The description adds value by explaining what businessLanguage=true changes in the output and when each mode is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool traces the technical security chain from Role/Duty/Privilege to Entry Points and Table/Form permissions, and also explains roles in business language when requested. This is specific and distinguishes it from siblings like trace_role_license_tree.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit WHEN guidance, trigger phrases for both technical and business language modes, and an explicit exclusion: NOT for licence cost inference, with the alternative tool named. An agent can decide between this tool and trace_role_license_tree without guessing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

validate_best_practicesA
Read-onlyIdempotent
Inspect

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).

ParametersJSON Schema
NameRequiredDescriptionDefault
methodNameNoOptional: specific method to validate. Validates all methods if not provided.
objectNameYesObject name to validate, e.g. 'SalesTable', 'CustInvoiceJour'
minSeverityNoMinimum severity: 'Info', 'Warning', 'Critical' (default: 'Warning')Warning

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already mark it read-only, non-destructive, and idempotent. The description adds substantial behavioral context: it operates on the indexed source, runs pre-compile, does not invoke xppbp.exe, and returns a structured violation table. It also discloses the environment variable requirement for auto-fixing, which is beyond what the 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.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core purpose and avoids filler. It is denser than necessary, with rule categories and multiple alternatives packed in, but every sentence still contributes useful routing or behavioral information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool has no output schema, the description explicitly describes the return format: severity, rule ID, code snippet, and fix instruction. It also covers prerequisites, constraints, and alternatives, giving an agent everything needed 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.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema description coverage is 100%, so all three parameters are already documented in the schema. The description contributes scope and result details but does not add 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.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description begins with a specific verb and resource: 'Run an in-house best-practice audit on any AOT object (custom or standard), from the indexed source.' It also explicitly distinguishes itself from the Microsoft BP checker, which makes 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.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear usage context: it runs pre-compile, requires no D365 install, and is meant for catching issues during development. It explicitly states when not to use it and names alternatives for the Microsoft verdict and for deep performance profiling.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

validate_object_namingA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
aotTypeYesAOT type the name will live in: AxClass, AxTable, AxForm, AxEdt, AxEnum, AxTableExtension, AxFormExtension, AxClassExtension, etc.
isvPrefixYesISV prefix you must use, e.g. 'ALM'. Required for all custom objects.
proposedNameYesProposed name, e.g. 'ALMSalesLine.Extension', 'ALMCustomerTable', 'SalesLineALM_Extension'.

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false. The description reinforces this with 'KB read only, no writes' and adds behavioral context about the indexed KB and reserved/standard prefix checks. 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.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three compact sections (WHEN, Triggers, Cloud-safe) front-load the essential guidance and add zero filler. Every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Tool is simple, fully annotated, and has fully described parameters. No output schema exists, but the description's three checks give enough behavioral context for correct invocation. It could mention the return format, but this is a minor gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% with clear examples for each parameter. The description adds no parameter-specific meaning beyond what the schema already provides, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description states a specific verb ('check') and a precise resource (proposed object name) against clear criteria: D365+ISV naming conventions, uniqueness against indexed KB, and reserved/standard prefix collisions. This distinguishes it from siblings like validate_best_practices 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.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit 'WHEN:' clause with concrete trigger phrases gives clear context for when to use the tool. It doesn't mention when not to use it or name alternatives, but the context is specific enough for an agent to select it correctly.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    A
    maintenance
    Exposes 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.
    49
    39
    MIT
  • F
    license
    Not graded
    quality
    B
    maintenance
    Enables AI assistants to search and analyze Microsoft Dynamics 365 Finance & Operations artifacts, read local source code, and generate context-aware solutions through natural language.
    40
    12
    -
Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.