alimbenhelal-pro avatar

ALM X++ MCP Server

alimbenhelal-pro/alm-xpp-mcp

If you work in D365 Finance & Operations, this gives your AI assistant direct access to X++ code search, object metadata, relation graphs, and extension discovery across your entire AOT. It also wires up Azure DevOps for querying work items, creating tasks, analyzing PRs, and posting comments. Beyond lookup, you get code generation for templates, queries, and unit tests, plus security tracing that follows role and license chains. The package includes a separate D365FO data proxy that uses Azure CLI auth to hit live environment endpoints, so you can cross reference knowledge base results with real table data and forms. Useful when you need to trace upgrade impact, find callers, or connect custom code to ADO work items without leaving your editor.

GitHub stars
4
tools
80
auth
Secret needed
transport
STDIO, HTTP
env var
1
last updated
Aug 21, 2026

Install

From registry metadata
$ npx add-mcp https://api.almxpp.com/mcp --name alm-xpp-mcp

Run in your terminal. add-mcp asks which agents to add it to (Claude Code, Codex, Cursor and more). Add -g to install it for every project.

Review the command, arguments and environment values before installing. MCP servers run with your local permissions.

Other ways

Claude Code

$ claude mcp add --transport http alm-xpp-mcp https://api.almxpp.com/mcp

Run in your terminal. Add --scope user to make it available in every project.

Tools

Verified live · 80 tools

Verified live against the running server on Nov 6, 2026.

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

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

Parameters* required
methodNamestring
Optional: specific method to validate. Validates all methods if not provided.
minSeveritystring
Minimum severity: 'Info', 'Warning', 'Critical' (default: 'Warning')default: Warning
objectName*string
Object name to validate, e.g. 'SalesTable', 'CustInvoiceJour'
find_extensionsFind 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...1 params

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

Parameters* required
baseObjectName*string
The base object name, e.g. 'SalesTable', 'SalesFormLetter', 'VendTable'
ado_create_bug_from_testWHEN: a test case failed and the failure must become a Bug in Azure DevOps. Triggers: 'open a bug for this failed test', 'crée le bug depuis le test', 'file the defect'. Builds the Bug from the test case: its steps become the reproduction steps, `observed` is what actually hap...7 params

WHEN: a test case failed and the failure must become a Bug in Azure DevOps. Triggers: 'open a bug for this failed test', 'crée le bug depuis le test', 'file the defect'. Builds the Bug from the test case: its steps become the reproduction steps, `observed` is what actually hap...

Parameters* required
confirmboolean
false (default): preview only. true: create. Only after the user agreed.default: false
expectedstring
Optional: what was expected, if the test case does not say it clearly.
observed*string
What was observed when it failed: the message, the wrong value, the screen.
projectstring
Azure DevOps project. Falls back to DEVOPS_PROJECT.
severitystring
Optional: 1-Critical, 2-High (default), 3-Medium, 4-Low.
testCaseId*integer
Id of the Test Case work item that failed.
titlestring
Optional: Bug title. Default: '[Test failed] ' and the test case title.
dmf_import_fileBulk-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...8 params

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

Parameters* required
csvContentstring
Inline CSV content (header row + data). Provide this OR filePath.
definitionGroupIdstring
DMF definition group (data project) id. Default: auto-generated from entity + timestamp.
entityName*string
Target entity name as known to DMF (the entity, not the OData set), e.g. 'Customers V3'.
executeboolean
Execute the import after staging (true) or stage only (false). Default true.default: true
filePathstring
Path to a .csv file on disk. Provide this OR csvContent.
legalEntity*string
Legal entity / company id to import into, e.g. 'USMF'.
overwriteboolean
Overwrite an existing project definition with the same id. Default true.default: true
pollTimeoutSecondsinteger
Max seconds to poll for completion before returning the executionId. Default 300.default: 300
search_d365_codeWHEN: 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, meth...5 params

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, meth...

Parameters* required
domainstring
Optional: filter results to a specific AOT type. Examples: 'AxTable', 'AxClass', 'AxForm', 'AxEnum'. Leave empty for all types.
query*string
Natural language search query. Examples: 'vendor invoice approval', 'tables in ALM', 'SalesTable fields', 'security privileges for purchasing'
scopestring
Optional routing override: 'auto' (default — session/custom first, standard fallback), 'custom' (session only — fails over to standard if nothing found), 'standard' (skip session entirely), 'both'...
topKinteger
Maximum number of results to return (default: 10, max: 50)default: 10
topObjectsinteger
Number of top-scoring objects whose ALL chunks are returned (default: 5, max: 20). Increase to broaden coverage, decrease for tighter focus.default: 5
dmf_transform_excelTransform 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), fileP...8 params

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

Parameters* required
fileContentBase64string
Base64-encoded .xlsx content (inline upload, small files). Provide one of sourceUrl/filePath/fileContentBase64.
filePathstring
Local path to a .xlsx file. Provide one of sourceUrl/filePath/fileContentBase64.
formatstring
Output format: 'csv' (default) or 'json'.default: csv
listSheetsOnlyboolean
If true, only list the workbook's sheet names (diagnostic). mappingJson not required.default: false
mappingJsonstring
Mapping spec JSON (columnMappings, conditionalValues, staticValues, deduplicateOn, autoGeneratedFields, sourceSheet). Optional when listSheetsOnly=true.
outputPathstring
Optional file path to also write the full transformed result to.
sheetNamestring
Override the source sheet name. Empty = use mappingJson.sourceSheet, else the first sheet.
sourceUrlstring
URL to the .xlsx (Blob/SharePoint SAS or Graph downloadUrl). Provide one of sourceUrl/filePath/fileContentBase64.
generate_queryWHEN: 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 un...8 params

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

Parameters* required
crossCompanyboolean
Whether to add crosscompany clause (default: false)default: false
descriptionstring
Optional: natural language description of the query. If provided, fields/joins/filters are auto-detected.
fieldsstring
Optional: specific fields to select (comma-separated). All fields if not specified.
filtersstring
Optional: WHERE filter expressions (comma-separated), e.g. 'CustAccount == 1001, SalesStatus == SalesStatus::Open'
joinTablesstring
Optional: tables to join (comma-separated), e.g. 'CustTable,SalesLine'
orderBystring
Optional: field to ORDER BY
tableName*string
Primary table name, e.g. 'SalesTable', 'CustTable'
topinteger
Optional: limit rows (1 = firstonly, N = top N)
ado_wiki_delete_pageAZURE 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).3 params

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

Parameters* required
path*string
Wiki page path to delete, e.g. '/Architecture/Old-Design'.
projectstring
Optional: Azure DevOps project name. Falls back to DEVOPS_PROJECT env var.
wikiIdentifierstring
Wiki name or id. Omit to auto-resolve to the project's only/first wiki (call ado_wiki_list if there are several).
appinsights_diagnose_slownessWHEN: 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 hotspot...3 params

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

Parameters* required
lookbackHoursinteger
How far back to analyze, in hours (1-720). Default 24.default: 24
minDurationMsinteger
Minimum average duration (ms) for a custom event to be flagged as 'slow'. Default 2000.default: 2000
topinteger
Max rows per section (1-50). Default 15.default: 15
ado_wiki_listAZURE 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...1 params

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

Parameters* required
projectstring
Optional: Azure DevOps project name. Falls back to DEVOPS_PROJECT env var.
get_object_detailsWHEN: 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 FU...3 params

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

Parameters* required
aotTypestring
Optional: AOT type to disambiguate when several objects share the name, e.g. 'AxTable', 'AxForm', 'AxClass' (shorthand 'table'/'form'/'class'/'enum'/'edt'/'view'/'entity' also accepted). When omitt...
methodNamestring
Optional: specific method name to return full body for, e.g. 'send', 'run', 'validate'. When provided, returns the complete method source instead of the signature table.
objectName*string
The exact object name, e.g. 'SalesTable', 'VendInvoiceApprovalConfig', 'ALMAlternativeItemsTable'
ado_query_workitemsAZURE 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', 'ba...11 params

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

Parameters* required
areaPathstring
Optional: filter by area path (exact or under), e.g. 'MyProject\SER'.
assignedTostring
Optional: filter by assignee display name or email (partial match), e.g. 'Alim' or 'alim@contoso.com'.
changedSincestring
Optional: only return items changed since this date, e.g. '2025-01-01' or '7' (days ago).
iterationPathstring
Optional: filter by iteration/sprint path, e.g. 'MyProject\Sprint 5'. Use 'current' for @CurrentIteration.
priorityinteger
Optional: filter by priority level: 1 (Critical), 2 (High), 3 (Medium), 4 (Low).
projectstring
Optional: Azure DevOps project name. Falls back to DEVOPS_PROJECT env var.
query*string
WIQL query, shortcut ('bugs', 'my bugs', 'recent', 'sprint'), title search, or '*' to use filters only.
statestring
Optional: filter by state, e.g. 'Active', 'New', 'Resolved', 'Closed'.
tagstring
Optional: filter by tag (partial match), e.g. 'D365' or 'hotfix'.
whereClausestring
Optional: extra WHERE condition(s) for custom fields, appended with AND. Use the Field Reference Name, e.g. "[Custom.Extensionlifecyclestatus]='010. Registered'". Multiple conditions: separate with...
workItemTypestring
Optional: filter by work item type, e.g. 'Bug', 'Task', 'User Story', 'Feature'.
dmf_apply_entity_filterApply 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 th...5 params

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

Parameters* required
aotEntityName*string
AOT entity name the kernel resolves, e.g. 'VendVendorV2Entity'.
entityRowName*string
Entity row label as shown on the project line, e.g. 'Vendors V2'.
fieldName*string
Entity field to filter on, e.g. 'VendorAccountNumber'.
filterValue*string
Value or wildcard to match, e.g. '1001' or '1001*'.
projectName*string
Existing DMF project (definitionGroupId) in FO.
ado_update_workitemUpdate 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...3 params

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

Parameters* required
fieldsJson*string
JSON object mapping Field Reference Names to values. Examples: {"System.Description":"<p>New desc</p>"} or {"System.State":"Active","Custom.MyField":"value"}. Use HTML for Description/ReproSteps. S...
projectstring
Optional: Azure DevOps project name.
workItemId*integer
Work item ID to update.
find_referencesFull 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 `@SY...3 params

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

Parameters* required
locationsPerObjectinteger
Maximum number of call sites (methods/fields) to display per referencing object (default: 6, max: 20). Increase to see more usage locations.default: 6
maxResultsinteger
Maximum referencing objects to return (default: 500, max: 2000)default: 500
name*string
The object or method name to find references to, e.g. 'SalesTable', 'validateWrite'
ado_gap_fit_analysisWHEN: 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...4 params

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

Parameters* required
projectstring
Optional: Azure DevOps project name. Falls back to DEVOPS_PROJECT env var.
requirementTextstring
Optional: raw requirement text to analyse directly (when no WI ID is provided).
requirementsstring
Optional: comma-separated list of requirement sentences to analyse individually (overrides WI + requirementText).
workItemIdinteger
Optional: Work Item ID to fetch the requirement from ADO (e.g. 6587). Leave empty to use requirementText.
batch_searchWHEN: 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_cod...3 params

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

Parameters* required
queries*string
Newline-separated search queries (max 6). Example: "SalesTable\nVendTable\nvendor invoice posting"
topKinteger
Results per query (default: 5, max: 15)default: 5
topObjectsinteger
Full-chunk objects per query (default: 3, max: 8)default: 3
ado_read_attachmentAZURE 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...4 params

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

Parameters* required
fileName*string
Exact attachment file name as shown by ado_analyze_workitem, e.g. 'Field Mapping.xlsx'. Case-insensitive.
projectstring
Optional: Azure DevOps project name. Falls back to DEVOPS_PROJECT env var.
sheetNamestring
Optional: sheet name for .xlsx/.xlsm attachments. Defaults to the first sheet.
workItemId*integer
Work item ID, e.g. 1234
erp_read_sessionWHEN: to READ from the ERP through form tools, where several calls must share ONE ERP session: open a form, filter its grid, read its values. Each separate erp_read / erp_call starts a new ERP session, so a form opened by one call is gone at the next; this tool runs the steps...2 params

WHEN: to READ from the ERP through form tools, where several calls must share ONE ERP session: open a form, filter its grid, read its values. Each separate erp_read / erp_call starts a new ERP session, so a form opened by one call is gone at the next; this tool runs the steps...

Parameters* required
instance*string
Instance alias from erp_list_instances.
stepsJson*string
JSON array of steps: [{"tool":"<name from erp_list_tools>","arguments":{...}}].
trace_field_lineageWHEN: 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...3 params

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

Parameters* required
fieldName*string
Field or property name, e.g. 'CreditMax'.
maxPerCategoryinteger
Max results per category (default 15).default: 15
tableName*string
Table or class name, e.g. 'CustTable'.
plan_and_executeCHAIN-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)...6 params

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

Parameters* required
assignTostring
Optional: assignee email for task creation step, e.g. 'dev@company.com'.
descriptionstring
Optional: additional description text to pass to task creation step.
goal*string
Natural language goal OR a JSON array of explicit steps. Examples: 'analyse WI #6587 and create a task', 'check best practices for ALMMyClass'.
objectNamestring
Optional: object name to use when goal references a D365 object (overrides name parsed from goal).
projectstring
Optional: Azure DevOps project name. Falls back to DEVOPS_PROJECT env var.
workItemIdinteger
Optional: work item ID to use when goal references 'WI #N' (overrides ID parsed from goal text).
find_similar_implementationsFind 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.3 params

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.

Parameters* required
filterAotTypestring
Optional: filter to a specific AOT type, e.g. 'AxTable', 'AxClass'. If not set, uses the same type as the source object.
maxResultsinteger
Maximum results (default: 15, max: 30)default: 15
objectName*string
Object name to find similar objects for, e.g. 'ALMERSftpConnectionTable', 'SalesTable'
recommend_extension_strategyWHEN: 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 ra...2 params

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

Parameters* required
intent*string
Plain-language goal of the customisation. Examples: 'add a status field', 'change validateWrite logic', 'react to record insert', 'replace the posting logic', 'override the find method', 'extend th...
objectName*string
Target standard D365 object name, e.g. 'SalesTable', 'CustTable', 'SalesLineType', 'PurchFormLetter_Confirmation'.
diff_model_versionsCompare two D365 F&O KB snapshots to produce a changelog (added/removed/modified objects). Use action 'save_baseline' once, then 'compare' between two snapshots.4 params

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.

Parameters* required
action*string
Action: 'compare' (current vs baseline), 'compare_caches' (two cache files), or 'save_baseline' (save current state)
filterModelstring
Optional: filter to a specific model name
path1*string
For 'compare': path to baseline cache file. For 'compare_caches': path to first cache. For 'save_baseline': output path for the baseline file.
path2OrLabelstring
Optional: For 'compare_caches': path to second cache file. For 'compare'/'save_baseline': label for the baseline.
find_related_objectsReturns 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...1 params

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

Parameters* required
objectName*string
The object name to find relationships for, e.g. 'SalesTable', 'VendInvoiceJour'
ado_review_xpp_prWHEN: 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 b...4 params

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

Parameters* required
maxDeepAnalysisinteger
Max AOT objects to deeply analyse (1-20, default 8). Objects beyond this limit are listed but not deeply analysed.default: 8
prId*integer
Pull Request ID to review.
projectstring
Azure DevOps project name. Falls back to DEVOPS_PROJECT env var.
repositoryIdstring
Git repository name or ID.
lesson_saveWHEN: a problem has just been solved, or a convention or procedure was agreed, and it should not need explaining again. Triggers: 'keep this', 'retiens ça', 'save this lesson', 'note this for next time', 'capitalise'. Propose it to the user first and save only with their agree...8 params

WHEN: a problem has just been solved, or a convention or procedure was agreed, and it should not need explaining again. Triggers: 'keep this', 'retiens ça', 'save this lesson', 'note this for next time', 'capitalise'. Propose it to the user first and save only with their agree...

Parameters* required
causestring
Why it happened, when known.
kindstring
'lesson' (default), 'convention' (how this client does things) or 'procedure' (a repeatable how-to).default: lesson
objectsstring
Optional: comma-separated D365 objects involved.
problem*string
The problem as it appeared: symptom, error message, where.
solution*string
What fixed it, in steps.
sourceRefstring
Optional: where it came from, e.g. 'WI 6587' or 'PR 142'.
tagsstring
Optional: comma-separated keywords.
title*string
Short title that says what it is about, e.g. 'Sales invoice posting fails when the tax group is empty'.
dmf_create_data_projectCreate (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 AutoGener...4 params

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

Parameters* required
entities*string
Comma-separated DMF entity names, e.g. 'Customers V3,Released products V2'.
operationTypestring
Operation type: 'Export' (default) or 'Import'.default: Export
projectName*string
Name of the data project (definitionGroupId) to create or extend.
sourceName*string
Existing DMF source data format name that defines the file format.
find_entity_for_tableWHEN: 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',...3 params

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

Parameters* required
generateIfMissingboolean
When true and no public entity is found, generates a new AxDataEntityView XML template for the table. Default: false.default: false
maxResultsinteger
Maximum results (default: 15, max: 30)default: 15
tableName*string
Table name to find entities for, e.g. 'SalesTable', 'CustTable', 'VendInvoiceJour'
summarize_for_stakeholderWHEN: 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 p...2 params

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

Parameters* required
audiencestring
Target audience: 'executive', 'business-analyst', or 'developer'. Default 'business-analyst'.default: business-analyst
text*string
The technical text to summarize/explain -- typically the raw output of another tool call.
ado_create_regression_suiteWHEN: the test cases of some touched objects should be grouped in one suite of an existing test plan, to replay them. Triggers: 'create the regression suite', 'suite de non-régression pour la PR N', 'group the tests of these objects'. Creates a query-based (dynamic) suite that...5 params

WHEN: the test cases of some touched objects should be grouped in one suite of an existing test plan, to replay them. Triggers: 'create the regression suite', 'suite de non-régression pour la PR N', 'group the tests of these objects'. Creates a query-based (dynamic) suite that...

Parameters* required
confirmboolean
false (default): preview only. true: create. Only after the user agreed.default: false
namestring
Suite name. Default: 'Regression - ' and the first objects.
objects*string
Comma-separated D365 objects whose test cases the suite gathers.
planId*integer
Id of the test plan that will hold the suite.
projectstring
Azure DevOps project. Falls back to DEVOPS_PROJECT.
suggest_refactoringWHEN: 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 r...2 params

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

Parameters* required
methodNamestring
Optional: specific method to analyze.
objectName*string
Object name to analyze, e.g. 'ALMMyClass', 'ALMMyTable'
resync_devops_indexWHEN: 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 w...1 params

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

Parameters* required
patstring
Optional: Personal Access Token with Code (Read) permission for the target Azure DevOps org. Provide this when the server's built-in PAT lacks access (e.g. a different tenant, cross-org). Leave bla...
erp_list_toolsWHEN: after erp_list_instances, to discover which tools the ERP MCP server of ONE instance exposes (name, description, input schema, read-only hint) before calling erp_call. Results are cached for 5 minutes.1 params

WHEN: after erp_list_instances, to discover which tools the ERP MCP server of ONE instance exposes (name, description, input schema, read-only hint) before calling erp_call. Results are cached for 5 minutes.

Parameters* required
instance*string
Instance alias from erp_list_instances, e.g. "uat".
ado_wiki_get_pageAZURE 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.4 params

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.

Parameters* required
includeSubPagesboolean
Also list immediate sub-page paths under this page.default: false
path*string
Wiki page path, e.g. '/Home' or '/Architecture/Deployment'.
projectstring
Optional: Azure DevOps project name. Falls back to DEVOPS_PROJECT env var.
wikiIdentifierstring
Wiki name or id. Omit to auto-resolve to the project's only/first wiki (call ado_wiki_list if there are several).
dmfConsolidated 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...20 params

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

Parameters* required
action*string
import | create_project | apply_filter | export | status
aotEntityNamestring
apply_filter: AOT entity name, e.g. 'VendVendorV2Entity'.
csvContentstring
import: inline CSV content (or use filePath).
definitionGroupIdstring
import/export: definitionGroupId (DMF project id).
entitiesstring
create_project: comma-separated DMF entity names.
entityNamestring
import: target DMF entity name, e.g. 'Customers V3'.
entityRowNamestring
apply_filter: entity row label, e.g. 'Vendors V2'.
executeboolean
import: execute after staging. Default true.default: true
executionIdstring
status: the executionId returned by an import or export action.
fieldNamestring
apply_filter: field to filter on, e.g. 'VendorAccountNumber'.
filePathstring
import: path to a .csv file on disk (or use csvContent).
filterValuestring
apply_filter: value or wildcard to match.
legalEntitystring
import/export: legal entity / company id, e.g. 'USMF'.
operationTypestring
create_project: 'Export' (default) or 'Import'.
overwriteboolean
import: overwrite existing project definition. Default true.default: true
packageNamestring
export: optional package name.
pollTimeoutSecondsinteger
import/export: max seconds to poll for completion. Default 300.default: 300
projectNamestring
create_project/apply_filter: DMF project name.
reExecuteboolean
export: re-execute the project. Default true.default: true
sourceNamestring
create_project: existing DMF source data format name.
find_callersFull 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.4 params

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.

Parameters* required
categoriesstring
Categories to include: 'all' (default), or comma-separated subset: 'calls,inheritance,usage,interfaces,overrides,attributes'default: all
depthinteger
Depth of caller chain to trace upward (default: 2, max: 4)default: 2
maxResultsinteger
Maximum results per category (default: 20, max: 50)default: 20
methodKey*string
Object or method key. Format: 'ClassName.methodName' for methods, 'ClassName' for class-level queries.
healthcheckWHEN: 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.

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.

No parameters. Call it with no arguments.

ado_analyze_pr_impact[~] 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 R...7 params

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

Parameters* required
includeSourceboolean
Embed the un-merged SOURCE of each analysed file in the output so the reviewer can do a full semantic code review without a local git checkout. Default true.default: true
includeWarningsboolean
Include Warning-level violations in addition to Critical (default: true). Set false for Critical-only.default: true
maxFilesDeepinteger
Max X++ files to fully analyse (default 10, max 20). Larger PRs get a summary for remaining files.default: 10
prId*integer
Pull Request ID (integer), e.g. 42.
projectstring
Optional: Azure DevOps project name. Falls back to DEVOPS_PROJECT env var.
repositoryId*string
Git repository name or ID.
sourceCharsPerFileinteger
Max characters of source to embed per file when includeSource is true (1000-40000, default 8000). Larger files are truncated with a note.default: 8000
find_error_patternsWHEN: 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',...2 params

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

Parameters* required
audienceTypestring
Audience type: 'developer' (default) for root-cause analysis, or 'business' for a plain-language explanation targeted at end users.default: developer
errorOrSymptom*string
Error message text or symptom description, e.g. 'update conflict', 'number sequence not set up', 'cannot create record outside tts'
suggest_edtWHEN: 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...4 params

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

Parameters* required
baseTypestring
Optional: D365 primitive base type to filter by, e.g. 'str', 'int64', 'real', 'date', 'enum'. Leave empty to search all types.
fieldName*string
Field name or concept, e.g. 'AccountNum', 'vendorId', 'itemCode', 'approvalStatus'
purpose*string
Purpose of the field in plain language, e.g. 'customer account number', 'approval status enum', 'invoice amount in transaction currency'
topKinteger
Number of EDT candidates to return (default: 8, max: 20)default: 8
get_object_contextWHEN: 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...4 params

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

Parameters* required
aotTypestring
Optional: AOT type to disambiguate, e.g. 'AxTable', 'AxClass', 'AxForm'.
includeValidationboolean
Include best-practice violations (default false -- adds latency for large objects).default: false
methodNamestring
Optional: specific method name to include full body for.
objectName*string
Exact object name, e.g. 'SalesTable', 'CustTable', 'VendInvoiceJour'
odata_upsert_rowsIdempotent 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 dm...5 params

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

Parameters* required
crossCompanyboolean
Set true to allow cross-company writes.default: true
entitySet*string
OData public entity set name, e.g. 'CustomersV3'.
keyFields*string
Comma-separated business key fields used to detect existing records, e.g. 'CustomerAccount' or 'dataAreaId,ItemNumber'.
legalEntitystring
Optional legal entity (dataAreaId) injected into each row when absent.
rowsJson*string
JSON array of row objects, e.g. [{"CustomerAccount":"C0001","Name":"Acme"}].
find_change_impactWHEN: 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...2 params

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

Parameters* required
maxDepthinteger
Max BFS depth (1-5). Default 3.default: 3
objectName*string
Object or method to analyse, e.g. 'SalesLine' or 'SalesLine.insert'.
generate_security_reportGenerate 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.2 params

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.

Parameters* required
filterModelstring
Optional: restrict the report to a single model name (e.g. 'ApplicationSuite', 'ContosoCustom'). Empty = all indexed models.
maxRolesDetailinteger
Maximum number of roles to expand in detail (default 50, max 200).default: 50
ado_create_taskWHEN: 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 De...10 params

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

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

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

Parameters* required
clientId*string
App registration (client) id (GUID), granted Log Analytics Reader on the workspace.
clientSecret*string
App registration client secret. Encrypted in memory; never logged or persisted.
tenantId*string
Entra (Azure AD) tenant id (GUID).
ttlMinutesinteger
Minutes the connection stays cached for this session (1-480). Default 60.default: 60
workspaceId*string
Log Analytics workspace ID (GUID) behind the linked Application Insights resource.
erp_list_instancesWHEN: first step whenever the user wants to read from or act on a Dynamics 365 F&O (ERP) environment through this server. Lists the F&O instances you may use (alias, label, whether it is protected like PROD, whether it is readOnly, and whether the user has already connected it...

WHEN: first step whenever the user wants to read from or act on a Dynamics 365 F&O (ERP) environment through this server. Lists the F&O instances you may use (alias, label, whether it is protected like PROD, whether it is readOnly, and whether the user has already connected it...

No parameters. Call it with no arguments.

dmf_get_job_statusPoll 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.1 params

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.

Parameters* required
executionId*string
The executionId returned by dmf_import_file or dmf_export_package.
detect_performance_issuesProfile 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. [!]...2 params

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. [!]...

Parameters* required
methodNamestring
Optional: specific method to analyze. Analyzes all methods if not provided.
objectName*string
Object name to analyze, e.g. 'SalesTable', 'CustInvoiceJour'
get_relation_graphWHEN: 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', 'qu...3 params

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

Parameters* required
aotTypeFilterstring
Optional: filter edges by relation kind to reduce noise. Comma-separated. Examples: 'TableFK', 'DeleteAction', 'Extension', 'DataSource', 'Security'. Leave empty for all kinds.
maxEdgesinteger
Maximum edges to show per direction (default: 200, max: 500)default: 200
objectName*string
The exact object name, e.g. 'SalesTable', 'CustTable', 'SalesFormLetter'
d365fo_clear_connectionRemoves the D365 F&O connection cached for the current session by d365fo_set_connection.

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

No parameters. Call it with no arguments.

ado_find_tests_for_objectsWHEN: a change touched some D365 objects (a pull request, a hotfix) and you need the test cases to replay. Triggers: 'which tests cover SalesLine', 'quels tests rejouer', 'regression tests for PR N', 'couverture de test des objets'. Finds the Test Case work items tagged obj:<o...2 params

WHEN: a change touched some D365 objects (a pull request, a hotfix) and you need the test cases to replay. Triggers: 'which tests cover SalesLine', 'quels tests rejouer', 'regression tests for PR N', 'couverture de test des objets'. Finds the Test Case work items tagged obj:<o...

Parameters* required
objects*string
Comma-separated D365 objects, e.g. 'SalesLine, CustInvoiceJour'. Take them from the pull request or find_change_impact.
projectstring
Azure DevOps project. Falls back to DEVOPS_PROJECT.
generate_xpp_templateWHEN: 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 signatu...3 params

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

Parameters* required
methodNamestring
Optional: specific method name for CoC or event handler templates
objectName*string
The base object, e.g. 'SalesTable', 'VendInvoiceJour'
templateType*string
Template type: 'coc', 'table_extension', 'event_handler', 'job', 'find_method'
lesson_searchWHEN: BEFORE investigating a problem, designing a change or answering a question about how a client's D365 F&O works: check whether it was already solved. Returns the lessons learned that best match, with their problem, cause and solution. Triggers: 'did we already see this',...3 params

WHEN: BEFORE investigating a problem, designing a change or answering a question about how a client's D365 F&O works: check whether it was already solved. Returns the lessons learned that best match, with their problem, cause and solution. Triggers: 'did we already see this',...

Parameters* required
maxResultsinteger
Maximum lessons to return (1-10, default 5).default: 5
objectsstring
Optional: comma-separated D365 objects involved, e.g. 'SalesLine, CustInvoiceJour'.
query*string
The symptom, error message or question, in plain words.
get_security_coverage_for_objectWHEN: 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...3 params

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

Parameters* required
maxRolesinteger
Maximum roles to expand (default 30, max 100).default: 30
minGrantstring
Optional: minimum grant level to include in results. Values: 'Read', 'Update', 'Create', 'Delete', 'Correct', 'Any'. Default: 'Any'.default: Any
objectName*string
Object name to audit (form, table, menu item, service operation). Example: 'CustTable', 'SalesTableListPage', 'CustCustomerServiceMenu'.
get_output_pageRetrieve 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 c...2 params

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

Parameters* required
pageinteger
The page number to retrieve (the previous page footer tells you the next one). Defaults to 2.default: 2
token*string
The pagination token from a paginated tool's footer, e.g. 'op_a1b2c3d4e5'.
ado_pr_dependency_mapPR 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 multipl...5 params

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

Parameters* required
projectstring
Optional: Azure DevOps project name. Falls back to DEVOPS_PROJECT env var.
repositoryId*string
Git repository name or ID.
statusstring
PR status filter: Active (default), Completed, Abandoned, All.default: Active
targetBranchstring
Optional: filter by target branch, e.g. 'develop'.
topinteger
Maximum PRs to analyse (default: 30, max: 60).default: 30
generate_fddWHEN: 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 si...3 params

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

Parameters* required
contextstring
Optional: additional business context, requirements, or audience note to include in the header
languagestring
Optional: output language ('en', 'fr', 'nl', 'de'). Default: endefault: en
objectName*string
D365 object or business process name, e.g. 'SalesTable', 'VendInvoiceInfoTable', 'ALMDemandeAchat'
map_business_processWHEN: 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', '...1 params

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

Parameters* required
processName*string
Business process name (e.g. 'Order-to-Cash', 'Procure-to-Pay', 'sales', 'purchasing') or an object name to trace from. Use 'list' to see all known processes.
ado_post_commentWHEN: 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 befo...3 params

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

Parameters* required
commentText*string
Markdown text to post. Use the ready-to-post block from `ado_analyze_workitem`.
projectstring
Optional: Azure DevOps project name. Falls back to DEVOPS_PROJECT env var.
workItemId*integer
Work item ID (integer), e.g. 1234
get_data_entity_infoWHEN: 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-s...1 params

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

Parameters* required
entityName*string
Data entity name (AxDataEntityView), e.g. 'CustCustomerV3Entity', 'SalesOrderHeaderV2Entity'.
compare_objectsCompare 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.2 params

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.

Parameters* required
objectNameA*string
First object name, e.g. 'SalesTable'
objectNameB*string
Second object name, e.g. 'PurchTable'
list_objectsWHEN: 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 table...2 params

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

Parameters* required
aotTypestring
Filter by AOT type: AxClass, AxTable, AxForm, AxView, AxEnum, AxEdt, AxDataEntityView, AxSecurityPrivilege, AxSecurityDuty, AxSecurityRole, AxQuery, AxReport, Documentation. Leave empty for all types.
modelNamestring
Filter: matches BOTH package/module name (partial) AND object name (substring). Examples: 'ALM' (package), 'Cust' (any object containing 'Cust'), 'SalesTable'. Leave empty for all.
explain_workflowWHEN: 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 approv...1 params

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

Parameters* required
objectName*string
D365 object or workflow name, e.g. 'SalesTable', 'PurchTable', 'ALMDemandeAchatWorkflow'
ado_test_statusWHEN: the user asks whether a feature is tested and what the results are: 'is WI N tested', 'where are we on the tests', 'état des tests de la story', 'what failed'. Lists the test cases tied to a work item with their latest outcome in its test plan suite (Passed, Failed, Bloc...3 params

WHEN: the user asks whether a feature is tested and what the results are: 'is WI N tested', 'where are we on the tests', 'état des tests de la story', 'what failed'. Lists the test cases tied to a work item with their latest outcome in its test plan suite (Passed, Failed, Bloc...

Parameters* required
planIdinteger
Optional: the test plan id.
projectstring
Azure DevOps project. Falls back to DEVOPS_PROJECT.
workItemId*integer
Work item the tests verify, e.g. 6587.
trace_role_license_treeWHEN: 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...2 params

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

Parameters* required
maxEntryPointsinteger
Maximum entry points to show per privilege (default: 20, max: 100)default: 20
roleName*string
The exact security role name, e.g. 'SystemAdministrator', 'AccountsPayablePaymentsClerk', 'ALMMyCustomRole'
prepare_release_note_contextWHEN: 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 prof...4 params

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

Parameters* required
businessContextstring
Optional free-text business/functional context about the client (modules used, key customizations, priorities) to sharpen the opportunity/regression assessment.
customModelIdsstring
Comma-separated custom model id(s) from the Admin > Custom Models tab. Omit to auto-fill from the caller's resolved client profile. Pass several when a client combines their own extensions with a s...
v1string
Older/baseline D365FO version to compare FROM, e.g. "10.0.2527.109". Omit to auto-fill from the caller's resolved client profile (see resolve_client_profile).
v2string
Newer D365FO version to compare TO, e.g. "10.0.2645.32". Omit to auto-fill from the caller's resolved client profile.
ado_analyze_workitemAZURE 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',...6 params

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

Parameters* required
focusObjectsstring
Comma-separated D365 object names to force-include in KB analysis, e.g. 'SalesTable,CustTable'. Providing these speeds up analysis significantly.
includeImagesboolean
Include image attachments as base64 data URIs for visual analysis by Copilot. Default: false. Set true only when screenshots are needed -- adds latency and token cost.default: false
maxCommentsinteger
Number of recent comments to include (default 5, max 20). Use 3 for faster results.default: 5
projectstring
Optional: Azure DevOps project name. Falls back to DEVOPS_PROJECT env var.
sourceBranchstring
Git branch to read custom code from when no PR or commit is linked to the work item. Default: 'main'. Use this to point at the integration branch (e.g. 'develop', 'release/2025').default: main
workItemId*integer
Work item ID (integer), e.g. 1234
erp_call_sessionWHEN: to run several ERP tools in ONE ERP session, in order, when the steps depend on each other: open a form, click New, set field values, save, close. Each separate erp_call starts a new ERP session, so a form opened by one call is gone at the next; this tool keeps them toge...3 params

WHEN: to run several ERP tools in ONE ERP session, in order, when the steps depend on each other: open a form, click New, set field values, save, close. Each separate erp_call starts a new ERP session, so a form opened by one call is gone at the next; this tool keeps them toge...

Parameters* required
confirmboolean
Required true to run steps that can change data, on any instance, and only after the user agreed to those exact steps.default: false
instance*string
Instance alias from erp_list_instances.
stepsJson*string
JSON array of steps: [{"tool":"<name from erp_list_tools>","arguments":{...}}].
ado_wiki_create_or_update_pageAZURE 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. A...4 params

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

Parameters* required
content*string
Full markdown content for the page (replaces any existing content).
path*string
Wiki page path, e.g. '/Home' or '/Architecture/Deployment'. Parent pages are created automatically if missing.
projectstring
Optional: Azure DevOps project name. Falls back to DEVOPS_PROJECT env var.
wikiIdentifierstring
Wiki name or id. Omit to auto-resolve to the project's only/first wiki (call ado_wiki_list if there are several).
erp_readWHEN: to READ from ONE Dynamics 365 F&O instance, as the signed-in user (their own F&O roles and legal entities apply): look up entities, query data, open a form to read it. Same arguments as erp_call, but it refuses every tool that could change data, on every instance, so it...3 params

WHEN: to READ from ONE Dynamics 365 F&O instance, as the signed-in user (their own F&O roles and legal entities apply): look up entities, query data, open a form to read it. Same arguments as erp_call, but it refuses every tool that could change data, on every instance, so it...

Parameters* required
argumentsstring
JSON object with the tool arguments, as a string. Omit or "{}" when none.
instance*string
Instance alias from erp_list_instances.
tool*string
Exact tool name from erp_list_tools.
resolve_workspace_rootsWHEN: 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/standardM...

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/standardM...

No parameters. Call it with no arguments.

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

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

No parameters. Call it with no arguments.

generate_unit_testWHEN: 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 te...4 params

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

Parameters* required
methodNamestring
Optional: specific method to test. If not provided, generates tests for all testable methods.
objectName*string
Object name to generate tests for, e.g. 'ALMERSftpConnectionTable', 'ALMMyClass'
sampleValuesstring
Optional: JSON object mapping field name to sample value used in each ARRANGE block, e.g. '{"AccountNum":"C0001","Amount":1500.50}'. Replaces the 'TODO: set up test data' placeholders with concrete...
testScenariosstring
Test scenarios provided by the functional consultant, e.g. 'Create a connection with valid SFTP host; Validate that empty host fails; Delete cleans up related records'. Separate scenarios with semi...
create_aot_objectGenerate 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 o...3 params

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

Parameters* required
aotType*string
AOT type, e.g. 'AxTable', 'AxClass', 'AxForm', 'AxEnum', 'AxEdt', 'AxSecurityPrivilege', etc.
name*string
Object name -- must start with the ISV prefix, e.g. 'ALMMyTable', 'ABCSalesService'.
optionsobject
Key-value options dict. Provide only the keys relevant to your aotType. Example for AxTable: { "label": "My Table", "tableGroup": "Main", "fields": "MyId:String:MyIdEdt:My ID...
d365fo_set_connectionSecurely 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 i...5 params

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

Parameters* required
baseUrl*string
F&O environment base URL, e.g. https://yourenv.cloudax.dynamics.com (https only).
clientId*string
App registration (client) id (GUID).
clientSecret*string
App registration client secret. Encrypted in memory; never logged or persisted.
tenantId*string
Entra (Azure AD) tenant id (GUID).
ttlMinutesinteger
Minutes the connection stays cached for this session (1-480). Default 60.default: 60
appinsights_clear_connectionRemoves the Application Insights connection cached for the current session by appinsights_set_connection.

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

No parameters. Call it with no arguments.

generate_data_entityWHEN: 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é...6 params

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

Parameters* required
entityName*string
Desired entity name, e.g. 'ALMSalesOrderEntity'
fieldsstring
Optional: specific fields to include (comma-separated). All fields if not specified.
isPublicboolean
Whether the entity should be available via OData (default: true)default: true
joinTablesstring
Optional: additional tables to join (comma-separated), e.g. 'CustTable,InventDim'
publicEntityNamestring
Optional: OData collection name (e.g. 'SalesOrders'). Auto-generated if not provided.
tableName*string
Primary table name, e.g. 'SalesTable', 'CustTable'
find_event_handlersFind 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. 'OnIns...3 params

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

Parameters* required
eventNamestring
Optional: filter to a specific event name, e.g. 'OnInserted', 'OnUpdated', 'OnDeleted', 'OnValidatingWrite'.
handlerTypestring
Optional: filter by handler type — 'DataEventHandler' or 'PrePostEventHandler'.
objectName*string
Table or class name to find event handlers for, e.g. 'SalesTable', 'PurchTable'.

Sponsors

Configuration

ALMXPPMCP_API_KEY*secret

Your ALM X++ license key -- request one at https://www.almxpp.com

Readme

Details

Repository
github.com/alimbenhelal-pro/alm-xpp-mcp
Website
www.almxpp.com
Package
almxppmcp
Transport
STDIO, HTTP
Auth
Required
Registry
MCP registry, active
Resources
4
Prompts
4
Tools verified
Nov 6, 2026