Skip to content
verify mcp Beta VerifyMCP is currently in beta. If you notice any issues, get in touch and we’ll put it right.

ALM X++ MCP Server

REMOTE · API.ALMXPP.COM · 2 COMPONENTS · SCANNED AUG 19

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

67 Trust /100
Trust breakdown (6 categories)

How this component scores in each security and reliability category. Every signal is checked automatically against the live server, and we only credit what we can confirm. How we score →

Endpoint Security66
  • The endpoint's TLS certificate is valid, in date, and uses a strong key. View diagnostics → Pass
  • Authorisation not fully verified: this server exposes a tool marked destructive (dmf_import_file) and its handshake is open, but we could not confirm whether a tool call is gated, so we do not assert it is callable unauthenticated. View diagnostics → Unverified
  • HTTPS is enforced; there's no plaintext access path. View diagnostics → Pass
  • The HSTS (Strict-Transport-Security) header is present. View diagnostics → Pass
  • DNSSEC is configured correctly; the domain's records validate against the full chain to the root. View diagnostics → Pass
Transport & Reachability100
Schema Quality & AI Usability77
  • 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).Pass
  • AI-judged instruction clarity (excellent).Pass
  • Context-footprint check failed: tool/resource definitions use about 27883 tokens (~296/item across 94 items; 90 tools + 4 resources), over budget; trim descriptions and params. See how to fix → Fail
  • Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management3
  • Stability observed for 1 of 30 days with no destabilising changes; credit accrues until the full window elapses.Partial
Tool Coverage100
  • 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
  • 100% of tool parameters carry a description.Pass
  • Structured output schemas are declared (1% of tools); any adoption earns full credit.Pass
Capabilities100
  • Implements a current MCP spec version (2026-07-28).Pass
Install

Add this component to your MCP client. Where a client-specific snippet is available, pick your client below and copy it straight into your config; otherwise use the connection detail shown.

remote · api.almxpp.com

# add to Claude Code
claude mcp add --transport http alimbenhelal-pro-alm-xpp-mcp https://api.almxpp.com/mcp
# ~/.codex/config.toml
[mcp_servers.alimbenhelal-pro-alm-xpp-mcp]
url = "https://api.almxpp.com/mcp"
// opencode.json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "alimbenhelal-pro-alm-xpp-mcp": {
      "type": "remote",
      "url": "https://api.almxpp.com/mcp",
      "enabled": true
    }
  }
}
# add to OpenClaw
openclaw mcp add alimbenhelal-pro-alm-xpp-mcp --url https://api.almxpp.com/mcp --transport streamable-http
# ~/.hermes/config.yaml
mcp_servers:
  alimbenhelal-pro-alm-xpp-mcp:
    url: "https://api.almxpp.com/mcp"
// mcp.json
{
  "mcpServers": {
    "alimbenhelal-pro-alm-xpp-mcp": {
      "type": "http",
      "url": "https://api.almxpp.com/mcp"
    }
  }
}

The mcpServers block is a cross-client convention. Remote transports vary, so check your client's docs.

Changelog

Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.

  • 19 Aug 26 0
    • Stability: unverified → 0.03 functional
    • Server version: 1.4.447 → 1.4.450 functional
    • Server version: 1.4.442 → 1.4.447 functional
  • 18 Aug 26 67

    First indexed and scored.

Diagnostics

Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.

Captured 19 Aug 2026 · Probed https://api.almxpp.com/mcp

TLS valid

Negotiated TLS 1.3 with TLS_AES_128_GCM_SHA256 .

Subject Issuer Valid from Valid until Key Signature Serial
CN=api.almxpp.com CN=GeoTrust TLS RSA CA G1,OU=www.digicert.com,O=DigiCert Inc,C=US 13 Aug 2026 11 Feb 2027 RSA 2048 SHA256-RSA 87577e9fc48f42828f95e780d2a2a88
SANs: api.almxpp.com
CN=GeoTrust TLS RSA CA G1,OU=www.digicert.com,O=DigiCert Inc,C=US (CA) CN=DigiCert Global Root G2,OU=www.digicert.com,O=DigiCert Inc,C=US 2 Nov 2017 2 Nov 2027 RSA 2048 SHA256-RSA d07782a133fc6f9a57296e131ffd179
CN=DigiCert Global Root G2,OU=www.digicert.com,O=DigiCert Inc,C=US (CA) CN=DigiCert Global Root G2,OU=www.digicert.com,O=DigiCert Inc,C=US 1 Aug 2013 15 Jan 2038 RSA 2048 SHA256-RSA 33af1e6a711a9a0bb2864b11d09fae5
DNSSEC secure

Validation of api.almxpp.com. Secure

Zone DS Keys Algorithms Outcome
. trust_anchor 20326, 38696 8, 8 Verified
com. present 19718 13 Verified
almxpp.com. present 43502 8 Verified
api.almxpp.com. Verified address RRset verified with the apex keys
Authentication No authorisation required

The endpoint answered without asking for a token. Anyone who knows the URL can reach it.

Result No authorisation required
HTTP status 200
Header Value
strict-transport-security max-age=31536000; includeSubDomains; preload
content-security-policy default-src 'self'; script-src 'self' 'nonce-pKGpnYYD2xmP/uVdedD6+g==' cdn.jsdelivr.net blob:; style-src 'self' 'unsafe-inline' cdn.jsdelivr.net fonts.googleapis.com; font-src 'self' cdn.jsdelivr.net fonts.gstatic.com; img-src 'self' data: https: lh3.googleusercontent.com; connect-src 'self' blob: https://*.azurecontainerapps.io https://www.almxpp.com https://api.almxpp.com cdn.jsdelivr.net https://ipapi.co; worker-src 'self' blob:; object-src 'none'; frame-ancestors 'none'; base-uri 'self'; form-action 'self' https://accounts.google.com https://login.microsoftonline.com;
x-content-type-options nosniff
x-frame-options SAMEORIGIN
referrer-policy strict-origin-when-cross-origin
permissions-policy camera=(), microphone=(), geolocation=(), payment=()
Transports 2 probes
Transport URL Outcome Status Location
streamable-http https://api.almxpp.com/mcp Verified 200
http (plaintext) http://api.almxpp.com/mcp HTTPS enforced 301 https://api.almxpp.com/mcp
MCP tools · 90 exposed · ~25,099 tokens

The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability.

Tool Tokens
ado_analyze_pr_impact ~625

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

NameTypeReqDescription
includeSourcebooleanEmbed 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.
includeWarningsbooleanInclude Warning-level violations in addition to Critical (default: true). Set false for Critical-only.
maxFilesDeepintegerMax X++ files to fully analyse (default 10, max 20). Larger PRs get a summary for remaining files.
prIdintegeryesPull Request ID (integer), e.g. 42.
projectstring|nullOptional: Azure DevOps project name. Falls back to DEVOPS_PROJECT env var.
repositoryIdstringyesGit repository name or ID.
sourceCharsPerFileintegerMax characters of source to embed per file when includeSource is true (1000-40000, default 8000). Larger files are truncated with a note.

No output schema declared.

No examples provided.

ado_analyze_workitem ~714

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.

NameTypeReqDescription
focusObjectsstring|nullComma-separated D365 object names to force-include in KB analysis, e.g. 'SalesTable,CustTable'. Providing these speeds up analysis significantly.
includeImagesbooleanInclude 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.
maxCommentsintegerNumber of recent comments to include (default 5, max 20). Use 3 for faster results.
projectstring|nullOptional: Azure DevOps project name. Falls back to DEVOPS_PROJECT env var.
sourceBranchstringGit 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').
workItemIdintegeryesWork item ID (integer), e.g. 1234

No output schema declared.

No examples provided.

ado_create_task ~629

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

NameTypeReqDescription
areaPathstring|nullOptional: area path for the new task, e.g. 'MyProject\SER'. Inherits from parent if omitted.
assignTostring|nullOptional: email address of the person to assign the task to, e.g. 'dev@company.com'.
descriptionstring|nullOptional: additional description / acceptance criteria text to append to the task.
effortHoursinteger|nullOptional: estimated effort in hours (Original Estimate).
iterationPathstring|nullOptional: iteration path for the new task, e.g. 'MyProject\Sprint 5'. Inherits from parent if omitted.
notifyListstring|nullOptional: comma-separated list of email addresses to notify (added to task description), e.g. 'lead@company.com,qa@company.com'.
projectstring|nullOptional: Azure DevOps project name. Falls back to DEVOPS_PROJECT env var.
repositoryIdstring|nullOptional: Git repository name to create the branch in. If omitted, uses the first repository found.
sourceBranchstring|nullOptional: source branch to branch from (default: repo default branch, e.g. 'main').
workItemIdintegeryesID of the selected Work Item (parent, bug, issue, etc.) to base the task on.

No output schema declared.

No examples provided.

ado_estimate_effort ~302

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

NameTypeReqDescription
focusObjectsstring|nullOptional: comma-separated D365 object names to force-include in analysis (speeds up estimation).
projectstring|nullOptional: Azure DevOps project name. Falls back to DEVOPS_PROJECT env var.
workItemIdintegeryesWork Item ID to estimate, e.g. 6587.

No output schema declared.

No examples provided.

ado_gap_fit_analysis ~419

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

NameTypeReqDescription
projectstring|nullOptional: Azure DevOps project name. Falls back to DEVOPS_PROJECT env var.
requirementTextstring|nullOptional: raw requirement text to analyse directly (when no WI ID is provided).
requirementsstring|nullOptional: comma-separated list of requirement sentences to analyse individually (overrides WI + requirementText).
workItemIdinteger|nullOptional: Work Item ID to fetch the requirement from ADO (e.g. 6587). Leave empty to use requirementText.

No output schema declared.

No examples provided.

ado_list_prs ~343

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

NameTypeReqDescription
authorstring|nullOptional: filter by author display name (partial match), e.g. 'Alim'.
projectstring|nullOptional: Azure DevOps project name. Falls back to DEVOPS_PROJECT env var.
repositoryIdstring|nullGit repository name or ID. If not known, leave empty to list all repos first.
statusstringPR status filter: Active (default), Completed, Abandoned, All.
targetBranchstring|nullOptional: filter by target branch, e.g. 'main', 'develop'.
topintegerMax results to return (1-100, default 25).

No output schema declared.

No examples provided.

ado_post_comment ~218

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.

NameTypeReqDescription
commentTextstringyesMarkdown text to post. Use the ready-to-post block from `ado_analyze_workitem`.
projectstring|nullOptional: Azure DevOps project name. Falls back to DEVOPS_PROJECT env var.
workItemIdintegeryesWork item ID (integer), e.g. 1234

No output schema declared.

No examples provided.

ado_post_pr_comment ~284

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

NameTypeReqDescription
commentTextstringyesMarkdown text to post. Use the ready-to-post block from `ado_analyze_pr_impact`.
filePathstring|nullOptional: file path for an inline comment. Leave empty for a top-level PR comment.
lineNumberinteger|nullOptional: line number for an inline comment (used with filePath).
prIdintegeryesPull Request ID (integer), e.g. 42.
projectstring|nullOptional: Azure DevOps project name. Falls back to DEVOPS_PROJECT env var.
repositoryIdstringyesGit repository name or ID.

No output schema declared.

No examples provided.

ado_pr_dependency_map ~339

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

NameTypeReqDescription
projectstring|nullOptional: Azure DevOps project name. Falls back to DEVOPS_PROJECT env var.
repositoryIdstringyesGit repository name or ID.
statusstringPR status filter: Active (default), Completed, Abandoned, All.
targetBranchstring|nullOptional: filter by target branch, e.g. 'develop'.
topintegerMaximum PRs to analyse (default: 30, max: 60).

No output schema declared.

No examples provided.

ado_query_workitems ~676

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.

NameTypeReqDescription
areaPathstring|nullOptional: filter by area path (exact or under), e.g. 'MyProject\SER'.
assignedTostring|nullOptional: filter by assignee display name or email (partial match), e.g. 'Alim' or 'alim@contoso.com'.
changedSincestring|nullOptional: only return items changed since this date, e.g. '2025-01-01' or '7' (days ago).
iterationPathstring|nullOptional: filter by iteration/sprint path, e.g. 'MyProject\Sprint 5'. Use 'current' for @CurrentIteration.
priorityinteger|nullOptional: filter by priority level: 1 (Critical), 2 (High), 3 (Medium), 4 (Low).
projectstring|nullOptional: Azure DevOps project name. Falls back to DEVOPS_PROJECT env var.
querystringyesWIQL query, shortcut ('bugs', 'my bugs', 'recent', 'sprint'), title search, or '*' to use filters only.
statestring|nullOptional: filter by state, e.g. 'Active', 'New', 'Resolved', 'Closed'.
tagstring|nullOptional: filter by tag (partial match), e.g. 'D365' or 'hotfix'.
whereClausestring|nullOptional: 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 '…
workItemTypestring|nullOptional: filter by work item type, e.g. 'Bug', 'Task', 'User Story', 'Feature'.

No output schema declared.

No examples provided.

ado_read_attachment ~394

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.

NameTypeReqDescription
fileNamestringyesExact attachment file name as shown by ado_analyze_workitem, e.g. 'Field Mapping.xlsx'. Case-insensitive.
projectstring|nullOptional: Azure DevOps project name. Falls back to DEVOPS_PROJECT env var.
sheetNamestring|nullOptional: sheet name for .xlsx/.xlsm attachments. Defaults to the first sheet.
workItemIdintegeryesWork item ID, e.g. 1234

No output schema declared.

No examples provided.

ado_review_xpp_pr ~229

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), existing best-practice violations, performance issues, and impact severity. 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.

NameTypeReqDescription
maxDeepAnalysisintegerMax AOT objects to deeply analyse (1-20, default 8). Objects beyond this limit are listed but not deeply analysed.
prIdintegeryesPull Request ID to review.
projectstring|nullAzure DevOps project name. Falls back to DEVOPS_PROJECT env var.
repositoryIdstring|nullGit repository name or ID.

No output schema declared.

No examples provided.

ado_update_workitem ~241

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.

NameTypeReqDescription
fieldsJsonstringyesJSON 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. Sta…
projectstring|nullOptional: Azure DevOps project name.
workItemIdintegeryesWork item ID to update.

No output schema declared.

No examples provided.

ado_wiki_create_or_update_page ~221

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

NameTypeReqDescription
contentstringyesFull markdown content for the page (replaces any existing content).
pathstringyesWiki page path, e.g. '/Home' or '/Architecture/Deployment'. Parent pages are created automatically if missing.
projectstring|nullOptional: Azure DevOps project name. Falls back to DEVOPS_PROJECT env var.
wikiIdentifierstring|nullWiki name or id. Omit to auto-resolve to the project's only/first wiki (call ado_wiki_list if there are several).

No output schema declared.

No examples provided.

ado_wiki_delete_page ~139

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

NameTypeReqDescription
pathstringyesWiki page path to delete, e.g. '/Architecture/Old-Design'.
projectstring|nullOptional: Azure DevOps project name. Falls back to DEVOPS_PROJECT env var.
wikiIdentifierstring|nullWiki name or id. Omit to auto-resolve to the project's only/first wiki (call ado_wiki_list if there are several).

No output schema declared.

No examples provided.

ado_wiki_get_page ~165

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.

NameTypeReqDescription
includeSubPagesbooleanAlso list immediate sub-page paths under this page.
pathstringyesWiki page path, e.g. '/Home' or '/Architecture/Deployment'.
projectstring|nullOptional: Azure DevOps project name. Falls back to DEVOPS_PROJECT env var.
wikiIdentifierstring|nullWiki name or id. Omit to auto-resolve to the project's only/first wiki (call ado_wiki_list if there are several).

No output schema declared.

No examples provided.

ado_wiki_list ~102

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.

NameTypeReqDescription
projectstring|nullOptional: Azure DevOps project name. Falls back to DEVOPS_PROJECT env var.

No output schema declared.

No examples provided.

analyze_upgrade_impact ~184

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.

Input schema present but exposes no named parameters.

No output schema declared.

No examples provided.

appinsights_clear_connection ~28

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

Input schema present but exposes no named parameters.

No output schema declared.

No examples provided.

appinsights_diagnose_slowness ~351

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

NameTypeReqDescription
lookbackHoursintegerHow far back to analyze, in hours (1-720). Default 24.
minDurationMsintegerMinimum average duration (ms) for a custom event to be flagged as 'slow'. Default 2000.
topintegerMax rows per section (1-50). Default 15.

No output schema declared.

No examples provided.

appinsights_query ~265

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

NameTypeReqDescription
kqlstringyesKQL 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 (a…
lookbackHoursintegerHow far back to query, in hours (1-720). Default 24.
maxRowsintegerMax rows to return (1-500). Default 100.

No output schema declared.

No examples provided.

appinsights_set_connection ~381

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.

NameTypeReqDescription
clientIdstringyesApp registration (client) id (GUID), granted Log Analytics Reader on the workspace.
clientSecretstringyesApp registration client secret. Encrypted in memory; never logged or persisted.
tenantIdstringyesEntra (Azure AD) tenant id (GUID).
ttlMinutesintegerMinutes the connection stays cached for this session (1-480). Default 60.
workspaceIdstringyesLog Analytics workspace ID (GUID) behind the linked Application Insights resource.

No output schema declared.

No examples provided.

batch_search ~232

WHEN: you need context on multiple D365 objects or concepts simultaneously -- runs all queries in parallel. Use INSTEAD of multiple sequential search_d365_code calls -- each line becomes one parallel search. Maximum 6 queries per call. Results are equivalent to search_d365_code but returned together. When batch_search returns results, all matching objects are FULLY loaded (all chunks). Do NOT follow up with get_object_details on the same objects -- the complete source is already included. Triggers: 'find all of these', 'look up multiple', 'cherche plusieurs', 'SalesTable AND VendTable', 'several objects at once', 'lookup X and Y and Z', 'plusieurs objets en même temps', 'context on all of these'.

NameTypeReqDescription
queriesstringyesNewline-separated search queries (max 6). Example: "SalesTable\nVendTable\nvendor invoice posting"
topKintegerResults per query (default: 5, max: 15)
topObjectsintegerFull-chunk objects per query (default: 3, max: 8)

No output schema declared.

No examples provided.

compare_objects ~80

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.

NameTypeReqDescription
objectNameAstringyesFirst object name, e.g. 'SalesTable'
objectNameBstringyesSecond object name, e.g. 'PurchTable'

No output schema declared.

No examples provided.

create_aot_object ~1,648

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 / gener…

NameTypeReqDescription
aotTypestringyesAOT type, e.g. 'AxTable', 'AxClass', 'AxForm', 'AxEnum', 'AxEdt', 'AxSecurityPrivilege', etc.
namestringyesObject name -- must start with the ISV prefix, e.g. 'ALMMyTable', 'ABCSalesService'.
optionsobject|nullKey-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:m…

No output schema declared.

No examples provided.

d365fo_clear_connection ~30

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

Input schema present but exposes no named parameters.

No output schema declared.

No examples provided.

d365fo_set_connection ~237

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.

NameTypeReqDescription
baseUrlstringyesF&O environment base URL, e.g. https://yourenv.cloudax.dynamics.com (https only).
clientIdstringyesApp registration (client) id (GUID).
clientSecretstringyesApp registration client secret. Encrypted in memory; never logged or persisted.
tenantIdstringyesEntra (Azure AD) tenant id (GUID).
ttlMinutesintegerMinutes the connection stays cached for this session (1-480). Default 60.

No output schema declared.

No examples provided.

detect_performance_issues ~133

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

NameTypeReqDescription
methodNamestring|nullOptional: specific method to analyze. Analyzes all methods if not provided.
objectNamestringyesObject name to analyze, e.g. 'SalesTable', 'CustInvoiceJour'

No output schema declared.

No examples provided.

diff_model_versions ~180

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.

NameTypeReqDescription
actionstringyesAction: 'compare' (current vs baseline), 'compare_caches' (two cache files), or 'save_baseline' (save current state)
filterModelstring|nullOptional: filter to a specific model name
path1stringyesFor 'compare': path to baseline cache file. For 'compare_caches': path to first cache. For 'save_baseline': output path for the baseline file.
path2OrLabelstring|nullOptional: For 'compare_caches': path to second cache file. For 'compare'/'save_baseline': label for the baseline.

No output schema declared.

No examples provided.

dmf ~642

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

NameTypeReqDescription
actionstringyesimport | create_project | apply_filter | export | status
aotEntityNamestring|nullapply_filter: AOT entity name, e.g. 'VendVendorV2Entity'.
csvContentstring|nullimport: inline CSV content (or use filePath).
definitionGroupIdstring|nullimport/export: definitionGroupId (DMF project id).
entitiesstring|nullcreate_project: comma-separated DMF entity names.
entityNamestring|nullimport: target DMF entity name, e.g. 'Customers V3'.
entityRowNamestring|nullapply_filter: entity row label, e.g. 'Vendors V2'.
executebooleanimport: execute after staging. Default true.
executionIdstring|nullstatus: the executionId returned by an import or export action.
fieldNamestring|nullapply_filter: field to filter on, e.g. 'VendorAccountNumber'.
filePathstring|nullimport: path to a .csv file on disk (or use csvContent).
filterValuestring|nullapply_filter: value or wildcard to match.
legalEntitystring|nullimport/export: legal entity / company id, e.g. 'USMF'.
operationTypestring|nullcreate_project: 'Export' (default) or 'Import'.
overwritebooleanimport: overwrite existing project definition. Default true.
packageNamestring|nullexport: optional package name.
pollTimeoutSecondsintegerimport/export: max seconds to poll for completion. Default 300.
projectNamestring|nullcreate_project/apply_filter: DMF project name.
reExecutebooleanexport: re-execute the project. Default true.
sourceNamestring|nullcreate_project: existing DMF source data format name.

No output schema declared.

No examples provided.

dmf_apply_entity_filter ~327

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.

NameTypeReqDescription
aotEntityNamestringyesAOT entity name the kernel resolves, e.g. 'VendVendorV2Entity'.
entityRowNamestringyesEntity row label as shown on the project line, e.g. 'Vendors V2'.
fieldNamestringyesEntity field to filter on, e.g. 'VendorAccountNumber'.
filterValuestringyesValue or wildcard to match, e.g. '1001' or '1001*'.
projectNamestringyesExisting DMF project (definitionGroupId) in FO.

No output schema declared.

No examples provided.

dmf_create_data_project ~236

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

NameTypeReqDescription
entitiesstringyesComma-separated DMF entity names, e.g. 'Customers V3,Released products V2'.
operationTypestringOperation type: 'Export' (default) or 'Import'.
projectNamestringyesName of the data project (definitionGroupId) to create or extend.
sourceNamestringyesExisting DMF source data format name that defines the file format.

No output schema declared.

No examples provided.

dmf_export_package ~189

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.

NameTypeReqDescription
definitionGroupIdstringyesExisting DMF export project (definitionGroupId) in FO.
legalEntitystringyesLegal entity / company id to export from, e.g. 'USMF'.
packageNamestring|nullOptional package name. Default derived from the project id.
pollTimeoutSecondsintegerMax seconds to poll for completion. Default 300.
reExecutebooleanRe-execute the project (true) or reuse last staging (false). Default true.

No output schema declared.

No examples provided.

dmf_get_job_status ~78

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.

NameTypeReqDescription
executionIdstringyesThe executionId returned by dmf_import_file or dmf_export_package.

No output schema declared.

No examples provided.

dmf_import_file ~327

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.

NameTypeReqDescription
csvContentstring|nullInline CSV content (header row + data). Provide this OR filePath.
definitionGroupIdstring|nullDMF definition group (data project) id. Default: auto-generated from entity + timestamp.
entityNamestringyesTarget entity name as known to DMF (the entity, not the OData set), e.g. 'Customers V3'.
executebooleanExecute the import after staging (true) or stage only (false). Default true.
filePathstring|nullPath to a .csv file on disk. Provide this OR csvContent.
legalEntitystringyesLegal entity / company id to import into, e.g. 'USMF'.
overwritebooleanOverwrite an existing project definition with the same id. Default true.
pollTimeoutSecondsintegerMax seconds to poll for completion before returning the executionId. Default 300.

No output schema declared.

No examples provided.

dmf_transform_excel ~433

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.

NameTypeReqDescription
fileContentBase64string|nullBase64-encoded .xlsx content (inline upload, small files). Provide one of sourceUrl/filePath/fileContentBase64.
filePathstring|nullLocal path to a .xlsx file. Provide one of sourceUrl/filePath/fileContentBase64.
formatstringOutput format: 'csv' (default) or 'json'.
listSheetsOnlybooleanIf true, only list the workbook's sheet names (diagnostic). mappingJson not required.
mappingJsonstring|nullMapping spec JSON (columnMappings, conditionalValues, staticValues, deduplicateOn, autoGeneratedFields, sourceSheet). Optional when listSheetsOnly=true.
outputPathstring|nullOptional file path to also write the full transformed result to.
sheetNamestring|nullOverride the source sheet name. Empty = use mappingJson.sourceSheet, else the first sheet.
sourceUrlstring|nullURL to the .xlsx (Blob/SharePoint SAS or Graph downloadUrl). Provide one of sourceUrl/filePath/fileContentBase64.

No output schema declared.

No examples provided.

explain_workflow ~187

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

NameTypeReqDescription
objectNamestringyesD365 object or workflow name, e.g. 'SalesTable', 'PurchTable', 'ALMDemandeAchatWorkflow'

No output schema declared.

No examples provided.

federated_search ~167

Fan-out search across multiple ALM XPP MCP server instances in parallel and merge results using Reciprocal Rank Fusion (RRF). Useful when D365 code is split across multiple organisations or knowledge bases (e.g. one per client, one standard KB). Peer servers are configured via D365_FEDERATION_PEERS env var (comma-separated list of base URLs, e.g. https://org2.almxpp.com). The local server is always included as the primary source.

NameTypeReqDescription
peerApiKeysstring|nullOptional MCP API keys for peer servers, comma-separated (same order as D365_FEDERATION_PEERS)
querystringyesNatural language search query
topKintegerNumber of results to return per server (default 5)

No output schema declared.

No examples provided.

find_callers ~182

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.

NameTypeReqDescription
categoriesstringCategories to include: 'all' (default), or comma-separated subset: 'calls,inheritance,usage,interfaces,overrides,attributes'
depthintegerDepth of caller chain to trace upward (default: 2, max: 4)
maxResultsintegerMaximum results per category (default: 20, max: 50)
methodKeystringyesObject or method key. Format: 'ClassName.methodName' for methods, 'ClassName' for class-level queries.

No output schema declared.

No examples provided.

find_change_impact ~225

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.

NameTypeReqDescription
maxDepthintegerMax BFS depth (1-5). Default 3.
objectNamestringyesObject or method to analyse, e.g. 'SalesLine' or 'SalesLine.insert'.

No output schema declared.

No examples provided.

find_entity_for_table ~285

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.

NameTypeReqDescription
generateIfMissingbooleanWhen true and no public entity is found, generates a new AxDataEntityView XML template for the table. Default: false.
maxResultsintegerMaximum results (default: 15, max: 30)
tableNamestringyesTable name to find entities for, e.g. 'SalesTable', 'CustTable', 'VendInvoiceJour'

No output schema declared.

No examples provided.

find_error_patterns ~364

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. Set audienceType='business' for a plain-language explanation targeted at end users instead of developers.

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

No output schema declared.

No examples provided.

find_event_handlers ~216

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

NameTypeReqDescription
eventNamestring|nullOptional: filter to a specific event name, e.g. 'OnInserted', 'OnUpdated', 'OnDeleted', 'OnValidatingWrite'.
handlerTypestring|nullOptional: filter by handler type — 'DataEventHandler' or 'PrePostEventHandler'.
objectNamestringyesTable or class name to find event handlers for, e.g. 'SalesTable', 'PurchTable'.

No output schema declared.

No examples provided.

find_extensions ~105

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.

NameTypeReqDescription
baseObjectNamestringyesThe base object name, e.g. 'SalesTable', 'SalesFormLetter', 'VendTable'

No output schema declared.

No examples provided.

find_references ~192

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.

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

No output schema declared.

No examples provided.

find_related_objects ~97

Returns ALL FK/DeleteAction/DataSource relations (outgoing) AND back-references (incoming). Call BEFORE generating multi-object code to understand the full dependency graph. When the relation index is loaded, delegates to get_relation_graph (O(1)) internally — do NOT call both tools for the same object.

NameTypeReqDescription
objectNamestringyesThe object name to find relationships for, e.g. 'SalesTable', 'VendInvoiceJour'

No output schema declared.

No examples provided.

find_relation_path ~262

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.

NameTypeReqDescription
maxDepthintegerMaximum hops to traverse (default: 4, max: 8). Higher = slower, more paths.
maxPathsintegerMaximum number of distinct paths to return (default: 5, max: 20).
sourcestringyesStart object name, e.g. 'SalesTable'
targetstringyesDestination object name, e.g. 'CustTable'

No output schema declared.

No examples provided.

find_similar_implementations ~142

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.

NameTypeReqDescription
filterAotTypestring|nullOptional: filter to a specific AOT type, e.g. 'AxTable', 'AxClass'. If not set, uses the same type as the source object.
maxResultsintegerMaximum results (default: 15, max: 30)
objectNamestringyesObject name to find similar objects for, e.g. 'ALMERSftpConnectionTable', 'SalesTable'

No output schema declared.

No examples provided.

fix_best_practice_violations ~201

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.

NameTypeReqDescription
generatePatchesbooleanGenerate X++ code patches via Ollama (requires OLLAMA_HOST). Default false.
maxViolationsintegerMax violations to process (1-20, default 10).
objectNamestringyesObject or method to fix, e.g. 'SalesLine' or 'SalesLine.insert'.

No output schema declared.

No examples provided.

generate_data_entity ~308

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.

NameTypeReqDescription
entityNamestringyesDesired entity name, e.g. 'ALMSalesOrderEntity'
fieldsstring|nullOptional: specific fields to include (comma-separated). All fields if not specified.
isPublicbooleanWhether the entity should be available via OData (default: true)
joinTablesstring|nullOptional: additional tables to join (comma-separated), e.g. 'CustTable,InventDim'
publicEntityNamestring|nullOptional: OData collection name (e.g. 'SalesOrders'). Auto-generated if not provided.
tableNamestringyesPrimary table name, e.g. 'SalesTable', 'CustTable'

No output schema declared.

No examples provided.