
ALM X++ MCP Server
D365 F&O: 90 AI tools over 200K+ objects, 25M+ cross-refs, 24M+ label translations.
Connector by alimbenhelal-pro · GitHub account verified by the MCP Registry
Chalk Labs
Need help deploying ALM X++ MCP Server?
Chalk Labs sets up agents like this inside real teams: connected to your tools, tested on your data, with a human in the loop where it matters.
Install
Works with Claude Code, VS Code, Codex, Cursor, Windsurf, Claude Desktop. Read the repository before you give any tool access to your data.
npx agentmarket install connector/alimbenhelal-pro-alm-xpp-mcp
Asks which of your tools to add it to (Claude Code, Codex, Cursor, VS Code, Windsurf, Gemini CLI, Claude Desktop) and shows the change first. See https://agentmart.dev/cli.
Remote endpoint
https://api.almxpp.com/mcpRemote (HTTP)
Get the weekly diff
The weekly diff: one email a week with new agent tools, notable updates and grade changes, plus security alerts for tools you follow. Double opt-in, one-click unsubscribe.
About
Reviews
Write a reviewNo reviews yet. Installed it? Reviews come from verified installers only. How reviews work
Permissions
What this server can do and what it asks for, from its tool list, install config and code. Checked Nov 1, 2026.
- Tools
- 69 read · 11 write · 10 delete
- Secrets
- 1 (API keys, tokens or passwords)
- Install scripts
- None found
- Runs as
- Node.js package
Tools by what they do 90
From the running server's own tool list (tools/list) on Oct 25, 2026.
Read 69 · Look things up without changing anything.
ado_analyze_pr_impactado_analyze_workitemado_estimate_effortado_gap_fit_analysisado_list_prsado_pr_dependency_mapado_query_workitemsado_read_attachmentado_review_xpp_prado_wiki_get_pageado_wiki_listanalyze_upgrade_impact
Show 57 more tools
appinsights_diagnose_slownessappinsights_querybatch_searchcompare_objectscreate_aot_objectdetect_performance_issuesdiff_model_versionsdmf_get_job_statusexplain_workflowfederated_searchfind_callersfind_change_impactfind_entity_for_tablefind_error_patternsfind_event_handlersfind_extensionsfind_referencesfind_related_objectsfind_relation_pathfind_similar_implementationsfix_best_practice_violationsgenerate_data_entitygenerate_diagramgenerate_fddgenerate_querygenerate_security_reportgenerate_unit_testgenerate_xpp_formgenerate_xpp_templateget_data_entity_infoget_menu_item_infoget_object_contextget_object_detailsget_output_pageget_relation_graphget_security_coverage_for_objecthealthchecklist_custom_model_objectslist_objectslist_release_note_inputsmap_business_processodata_export_entityprepare_release_note_contextrecommend_extension_strategyresolve_client_profileresolve_workspace_rootssearch_context_docssearch_d365_codesearch_labelssuggest_edtsuggest_refactoringsummarize_for_stakeholdertrace_field_lineagetrace_role_license_treetrace_security_chainvalidate_best_practicesvalidate_object_naming
Write 11 · Create, change, send or run things.
ado_create_taskado_post_commentado_post_pr_commentappinsights_set_connectiond365fo_set_connectiondmfdmf_apply_entity_filterdmf_create_data_projectdmf_export_packagedmf_transform_excelgenerate_release_note_document
Delete 10 · Delete, drop, revoke or wipe things.
ado_update_workitemado_wiki_create_or_update_pageado_wiki_delete_pageappinsights_clear_connectiond365fo_clear_connectiondmf_import_fileodata_upsert_rowsplan_and_executeresync_devops_indexsave_client_profile
Secrets and settings it asks for
Secrets: values you paste in that let it act as you.
ALMXPPMCP_API_KEY
Network hosts it talks to 3
almxpp.com· found in codeapi.almxpp.com· found in remote endpoint, install command, codegithub.com· found in code
Files it touches
- Any path the agent passes to its tools
Tools (90)
As the server listed them on Oct 25, 2026. Descriptions are the server’s own words; hidden characters are shown as [U+…].
ado_analyze_pr_impactread-only[~] 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 loc…
ado_analyze_workitemread-onlyAZURE 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 cri…
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 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.…
ado_estimate_effortread-onlyWHEN: 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 fou…
ado_gap_fit_analysisread-onlyWHEN: 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 develop…
ado_list_prsread-only[~] 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, creati…
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 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.
ado_post_pr_commentWHEN: 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).
ado_pr_dependency_mapread-onlyPR 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 sequ…
ado_query_workitemsread-onlyAZURE 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 …
ado_read_attachmentread-onlyAZURE 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 alrea…
ado_review_xpp_prread-onlyWHEN: reviewing a PR that modifies X++ code or AOT objects and you need D365-specific insights. Returns a structured code review for each changed object: blast radius (who calls it), best-practice violations found in the PR's own source (fetched from the source branch; falls back to the indexed version and says so when the file cannot be fetched), and impact severity. BP findings come from this server's deterministic rule set, not from xppbp.exe -- a PR is uncompiled, so Microsoft's checker cannot run on it. Use find_error_patterns for Microsoft rule text. Triggers: 'review this PR', 'code rev…
ado_update_workitemcan change or delete dataUpdate 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.
ado_wiki_create_or_update_pagecan change or delete dataAZURE 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).
ado_wiki_delete_pagecan change or delete dataAZURE 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).
Show 75 more tools
ado_wiki_get_pageread-onlyAZURE 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.
ado_wiki_listread-onlyAZURE 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.
analyze_upgrade_impactread-onlyWHEN: 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 (RunBas…
appinsights_clear_connectionRemoves the Application Insights connection cached for the current session by appinsights_set_connection.
appinsights_diagnose_slownessread-onlyWHEN: 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 sa…
appinsights_queryread-onlyRun 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 anal…
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_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 administ…
batch_searchread-onlyWHEN: 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', 'seve…
compare_objectsread-onlyCompare 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.
create_aot_objectread-onlyGenerate 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.). …
d365fo_clear_connectionRemoves the D365 F&O connection cached for the current session by d365fo_set_connection.
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 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.
detect_performance_issuesread-onlyProfile 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).
diff_model_versionsread-onlyCompare two D365 F&O KB snapshots to produce a changelog (added/removed/modified objects). Use action 'save_baseline' once, then 'compare' between two snapshots.
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 / 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_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 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: filteri…
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 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…
dmf_export_packageTrigger 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.
dmf_get_job_statusread-onlyPoll 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.
dmf_import_filecan change or delete dataBulk-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.
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), 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…
explain_workflowread-onlyWHEN: 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', 'circui…
federated_searchread-onlyFan-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.
find_callersread-onlyFull 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.
find_change_impactread-onlyWHEN: 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 me…
find_entity_for_tableread-onlyWHEN: 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.…
find_error_patternsread-onlyWHEN: 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. Ma…
find_event_handlersread-onlyFind 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'.
find_extensionsread-onlyFind 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.
find_referencesread-onlyFull 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.
find_related_objectsread-onlyReturns 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.
find_relation_pathread-onlyWHEN: 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` …
find_similar_implementationsread-onlyFind 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.
fix_best_practice_violationsread-onlyWHEN: 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.
generate_data_entityread-onlyWHEN: 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 fir…
generate_diagramread-onlyWHEN: generating a visual diagram of D365 table relationships or security chains. Triggers: 'generate diagram', 'diagramme', 'visualize', 'schéma', 'ER diagram', 'entity-relationship', 'relation diagram', 'security diagram', 'show connections'. Generate visual Mermaid diagrams from D365 F&O knowledge base data. Diagrams render directly in Copilot Chat, Cursor, Claude, and markdown viewers. Types: 'er' (entity-relationship diagram for a table and its relations), 'security' (security chain: Role->Duty->Privilege->EntryPoints -- use when you need a VISUAL Mermaid diagram; for the structured text …
generate_fddread-onlyWHEN: user asks to write or generate a Functional Design Document, FDD, functional spec, CdC, or cahier des charges. NOT for developer technical docs -- use `get_object_details` for that. FUNCTIONAL DESIGN DOCUMENT GENERATOR -- Produces a structured FDD ready for review and sign-off. Sections generated: Purpose, Business Context, Data Fields (with resolved labels), Business Rules, Related Objects, Security, and Open Questions. Triggers: 'write FDD for', 'generate FDD', 'functional spec for', 'document this process', 'write functional design', 'rédiger le cahier des charges', 'CdC pour', 'f…
generate_queryread-onlyWHEN: developer needs correct X++ select or T-SQL for D365 tables with proper joins. Triggers: 'X++ select', 'generate a query', 'SQL for', 'join with', 'how to query', 'générer une requête', 'write a select statement', 'select from', 'X++ query for', 'requête X++', 'écrire une select'. Generate both X++ select statements and equivalent T-SQL queries for D365 F&O tables. Uses real field names, relations, and indexes from the knowledge base to produce correct joins. Supports: field selection, multi-table joins (auto-detects relations), WHERE filters, ORDER BY, TOP/firstonly, cross-company. Also…
generate_release_note_documentWHEN: you have already called prepare_release_note_context and analyzed its 'objects' array yourself, producing a findings JSON array per the 'instructions' field it returned. This tool renders that findings array into a downloadable Word (.docx, detailed appendix) and PowerPoint (.pptx, executive summary) release note and returns their download URLs. Does NOT call any LLM itself -- the reasoning must already be done by you.
generate_security_reportread-onlyGenerate 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.
generate_unit_testread-onlyWHEN: developer needs to write or scaffold unit tests for a custom D365 object. Triggers: 'generate tests', 'unit test', 'SysTest', 'write test for', 'scénarios de test', 'test this class'. Generate X++ SysTest unit test code for a CUSTOM D365 F&O object based on functional test scenarios. [!] Only meaningful on custom/extension code (D365_CUSTOM_MODEL_PATH). SysTest tests in D365 are highly context-specific -- a generic template rarely compiles without adaptation. REQUIRED: provide test scenarios in the 'testScenarios' parameter (supplied by the functional consultant). Each scenario becomes a…
generate_xpp_formread-onlyGenerate a complete, compilable AxForm AOT XML with the CORRECT control serialization (<AxFormControl xmlns="" i:type="...">) for the requested pattern. Patterns: SimpleList, DetailsMaster, DetailsTransaction, ListPage, Dialog, DropDialog, Workspace, Extension. After generation, call validate_form_pattern on the result before write_aot_object.
generate_xpp_templateread-onlyWHEN: writing an extension or customization -- generates ready-to-use X++ code. Triggers: 'génère un CoC', 'crée une extension', 'generate extension', 'write a CoC class', 'event handler pour', 'template pour'. Uses REAL metadata from the KB (actual field names, method signatures). 'coc' = Chain of Command class, 'table_extension' = extend table with fields/methods, 'event_handler' = pre/post event handler, 'job' = runnable class, 'find_method' = find/exist pattern. ALWAYS call get_object_details first to verify the object exists.
get_data_entity_inforead-onlyWHEN: developer building an OData / DMF integration needs a quick rundown of a specific data entity: its public OData name, datasources, key fields, and IsPublic status. Triggers: 'data entity info', 'OData entity details', 'is X a public entity', 'entity datasources'. Cloud-safe: pure metadata read from the KB.
get_menu_item_inforead-onlyWHEN: developer needs to resolve a menu item -- find its target object (form / action / output), linked security privilege, label, and parameters. Triggers: 'menu item info', 'what does menu item X open', 'menu item target', 'security privilege for menu item'. Cloud-safe: parses the AxMenuItem XML already loaded in the KB. Returns the resolved object name, menu item type (Display/Action/Output), linked privilege, and the form/class/report it points to.
get_object_contextread-onlyWHEN: you need a COMPLETE picture of a D365 object in ONE call. Returns in a single response: full structure (fields, method signatures, relation summary) AND all CoC extensions / event handlers -- equivalent to calling get_object_details THEN find_extensions. Use this INSTEAD of those two separate calls to reduce round-trips. Optionally includes best-practice violations (set includeValidation=true). Pass `methodName` to also include the full body of a specific method. Pass `aotType` to disambiguate when several AOT objects share the same name.
get_object_detailsread-onlyWHEN: you know the EXACT object name. Triggers: user gives an exact name like 'SalesTable', 'CustTable', 'VendInvoiceJour', any PascalCase D365 object name. Get complete details: all fields, methods, relations, indexes, source code, and metadata. COST NOTE: this returns the FULL object and can be very large (100KB+ for big tables/forms like SalesLine). If you ONLY need relations / FK / DeleteActions / data sources / who-references, call get_relation_graph instead -- it is O(1) and roughly 6x lighter (no source code). Reserve get_object_details for when you genuinely need field details, method …
get_output_pageread-onlyRetrieve the NEXT page of a previously PAGINATED tool output. When a tool result is too large for a single response, it is split losslessly into ordered pages — the footer of each page gives you a `token` and the next `page` number. Call this tool with that token to read the continuation; nothing is dropped, so you can walk every page in order and reconstruct the full result. Pages are cached only briefly (the last few large results). If the token is unknown or expired, re-run the original tool to regenerate it.
get_relation_graphread-onlyWHEN: you need the COMPLETE bidirectional relation graph for an object in ONE call. Triggers: 'relations of', 'FK of', 'what tables link to', 'quelles tables liées à', 'avant de générer du code', 'before generating code', 'foreign keys', 'delete actions', 'who references', 'qui référence', 'graph de relations'. Returns ALL outgoing edges (FK relations, DeleteActions, DataSources, Extensions, Security...) AND all incoming back-references (forms, entities, CoC classes, privileges... that reference it). Backed by the pre-computed relation index -- O(1) lookup, no vector scan. Much faster and more…
get_security_coverage_for_objectread-onlyWHEN: developer/security architect needs to know WHICH ROLES can access a specific form, table, menu item or service operation. Triggers: 'who can access', 'which roles see', 'security coverage for', 'quels roles ont accès à', 'find roles with access'. Walks the security graph backwards (EntryPoint -> Privilege -> Duty -> Role) and returns all roles that grant any level of access (Read / Update / Create / Delete / Correct) on the given object. Read-only: scans the in-memory KB, never writes.
healthcheckread-onlyWHEN: 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.
list_custom_model_objectsread-onlyWHEN: developer wants to see what custom/extension objects exist in their model. Triggers: 'list my custom objects', 'what have we customized', 'show ISV objects', 'list custom model', 'what objects are in our model'. List all D365 F&O objects in the custom/extension model directory on disk. Reads the file system directly -- always reflects the latest uncommitted state. Pass `customModelPath` to specify a model directory; or set it once via the `D365-Custom-Model-Path` header in your .mcp.json (applies to all tool calls automatically).
list_objectsread-onlyWHEN: you need ALL objects of a given type or in a given model. Triggers: 'list all tables in ALM', 'show all classes', 'quels objets dans le modèle', 'give me all forms'. Full index scan -- returns EVERY matching object, not just top search results. Use to discover what tables, classes, forms, enums, etc. exist in a specific model. When no filters are given and a custom model is configured, defaults to listing that model. NOT for a single object -- use get_object_details. NOT for natural language search -- use search_d365_code.
list_release_note_inputsread-onlyWHEN: ALWAYS call this FIRST, before prepare_release_note_context -- it discovers the exact D365FO version strings and custom model ids actually indexed on THIS server, which you cannot guess. Triggers: 'release note', 'compare D365 versions', 'upgrade impact for a client', 'what changed for this client', 'regression risk', 'note de version'. Returns every indexed version (exact 'version' string to use as v1/v2, e.g. 10.0.2527.109) and every ready-to-use custom model (exact 'id' to use as customModelIds, plus its name and optional clientGroup tag -- models sharing the same clientGroup belong t…
map_business_processread-onlyWHEN: mapping the technical D365 objects behind a business process, or understanding which tables/forms implement a flow. Triggers: 'processus métier', 'Order-to-Cash', 'Procure-to-Pay', 'Record-to-Report', 'business process flow', 'qui est impliqué dans', 'map the process', 'flux du processus', 'quels objets dans le flux'. Map a D365 F&O business process to its complete object chain. For known processes (Order-to-Cash, Procure-to-Pay, Record-to-Report, Plan-to-Produce, Inventory-Management, Hire-to-Retire, Project-Accounting, Asset-Lifecycle): shows every step with forms, tables, classes, ent…
odata_export_entityread-onlyExport any D365 F&O data entity via OData (transactional, no DMF project required). Universal: works for ANY public entity. Supports $select, $filter, $orderby and follows server paging automatically. Returns CSV (default) or JSON. Use for live/ad-hoc exports and small-to-medium volumes. For very large bulk exports prefer dmf_export_package. Resolve the entity set name from the KB first (find_entity_for_table / get_data_entity_info) -- do not invent entity names.
odata_upsert_rowscan change or delete dataIdempotent import of rows into any entity via OData: PATCH when the record exists (matched by keyFields), otherwise POST. Safe to re-run -- duplicates are updated, not re-created. Best for small-to-medium transactional loads (e.g. <= a few thousand rows). For bulk loads use dmf_import_file. Provide rows as a JSON array of objects; resolve key fields from the KB (get_data_entity_info) -- do not guess them.
plan_and_executecan change or delete dataCHAIN-OF-TOOLS PLANNER -- Execute a multi-step JSON plan in ONE call by chaining tools. Pass an EXPLICIT JSON array of steps (NL parsing disabled to prevent ambiguity). Maximum 5 steps per plan. The chain stops on any critical failure (ado_analyze_workitem, get_object_details). ## Required Format (JSON array) `[{"tool":"get_object_details","args":{"objectName":"SalesTable"}},{"tool":"validate_best_practices","args":{"objectName":"SalesTable"}}]` ## When to use - You already know the exact sequence of 2-5 tool calls needed - The output of step N is independent of step N+1 (or matches the car…
prepare_release_note_contextread-onlyWHEN: building an AI-assisted D365 F&O upgrade release note (regressions + opportunities) for a specific client, and you (the calling assistant) want to do the reasoning yourself instead of the server calling its own LLM. Call resolve_client_profile FIRST -- if it finds a profile, OMIT v1/v2/customModelIds here and they will be auto-filled from it. If no profile exists, call list_release_note_inputs to get real values and pass them explicitly -- never guess them. Triggers: 'release note', 'upgrade impact for this client', 'what breaks for a client between these versions', 'regression risk', 'n…
recommend_extension_strategyread-onlyWHEN: developer about to customise a standard D365 object asks 'should I use AxTableExtension, Chain of Command, EventHandler, or Delegate?'. Triggers: 'how to extend', 'best way to customise', 'extension strategy for', 'CoC ou event handler', 'comment etendre X'. Returns a ranked recommendation based on the target AOT type and the intent, with citations to the Microsoft Learn extensibility guide. Cloud-safe: pure KB lookup, no writes.
resolve_client_profileread-onlyWHEN: at the START of any release-note / upgrade-impact conversation -- call this BEFORE list_release_note_inputs to check whether a Client Profile already exists for the CURRENT caller's Azure DevOps org/project (auto-detected from DEVOPS_ORG_URL/DEVOPS_PROJECT MCP headers -- you don't pass anything). If found, it gives you the client's currentVersionTag, targetVersionTag, customModelIds (their own extensions AND any attached ISV/vendor models) and the latest diff snapshot in one call -- use those directly as v1/v2/customModelIds for prepare_release_note_context, no further discovery needed. …
resolve_workspace_rootsread-onlyWHEN: you need to know which folder(s) are configured as the workspace/project root for the current caller. Reads D365-Custom-Model-Path and D365-Standard-Model-Path from the request headers or environment variables. Use before any tool that accepts a customModelPath/standardModelPath parameter.
resync_devops_indexcan change or delete dataWHEN: the user wants to force a full re-download and re-index of their Azure DevOps custom model. Triggers: 'resync', 'reindex', 'force sync', 'rebuild index', 'my model is stale', 'update index', 'mon index est vieux', 'rafraîchir l\'index', 'relancer l\'indexation'. Useful when the server's built-in PAT does not have access to the target DevOps organisation (e.g. a different Azure DevOps org or tenant). Pass a `pat` parameter to override the server PAT for this resync. The eviction + download runs in the background; returns status immediately. After calling, wait ~60 s then call `healthcheck…
save_client_profilecan change or delete dataWHEN: no profile was found by resolve_client_profile and the user wants one created (or updated) for their client, so future release-note requests never need v1/v2/customModelIds again. Creates or updates a Client Profile keyed by the CURRENT caller's ADO org/project (auto-detected from MCP headers -- not a parameter). Only the fields you pass are changed; omit a field to leave it untouched on an existing profile.
search_context_docsread-onlyWHEN: the user asks about business/functional context that lives OUTSIDE the D365 code KB -- specs, functional design docs, mapping sheets, contracts, meeting notes, screenshots' captions -- anything an admin uploaded via the admin portal's 'Context Documents' library (PDF, Word .docx, Excel .xlsx/.xlsm, CSV, plain text/Markdown/JSON). Does NOT search X++ code or AOT objects -- use search_d365_code / get_object_details for that. Triggers: 'what does the spec say about...', 'check the mapping document for...', 'cherche dans les documents de contexte', 'according to the functional design'. An ex…
search_d365_coderead-onlyWHEN: object name is unknown, partial, or you need to find by concept/keyword. Search the D365 F&O knowledge base for X++ code, tables, classes, forms, views, enums, EDTs, security objects using natural language or partial names. Returns ALL chunks (metadata, Declaration, methods) for the top-scoring objects so the LLM has complete context on the first call. Lower-scoring results return a short preview. No follow-up get_object_details call is needed for top results. NOT for listing all objects in a model -- use list_objects for that. NOT when the exact name is known -- use get_object_details f…
search_labelsread-onlySearch D365 F&O labels across all indexed languages. Given text (e.g. 'Sales order'), finds the matching label ID (@SYS12345). Given a label ID (e.g. '@SYS12345' or '@SYS:12345'), finds the text in all languages. Accepts both D365 short form (@SYS124480) and colon form (@SYS:124480) -- both are normalized automatically. Searches across 392K+ label entries. WORKFLOW: call search_labels first to resolve the label text, then call find_references with the same label ID to find ALL X++ objects (forms, tables, classes, reports) that use it in their code or metadata. Languages: en-US and fr are loade…
suggest_edtread-onlyWHEN: adding a new field to a table -- find the best existing D365 EDT to extend instead of using raw primitives (str, int64, real, date). Triggers: 'what EDT for', 'which EDT should I extend', 'quel EDT pour', 'quel type étendu', 'EDT for a field'. D365 best practice mandates EDT reuse over raw primitive types. Call BEFORE declaring any field with a primitive type. Returns ranked candidate EDTs with their base type, label, and model.
suggest_refactoringread-onlyWHEN: developer wants to improve code quality before a PR merge or code review. Triggers: 'refactor', 'clean up', 'simplify', 'too long method', 'nested ifs', 'code smells', 'améliorer le code'. Suggest concrete refactoring actions for YOUR custom D365 F&O X++ code. [!] Only runs on custom/extension code (D365_CUSTOM_MODEL_PATH). Refactoring standard Microsoft code is not actionable. Analyzes: long methods (extract method), deep nesting (guard clauses), row-by-row operations (set-based), large switch statements (strategy pattern), hardcoded strings (constants), unprotected CLR calls (error han…
summarize_for_stakeholderread-onlyWHEN: you have a large technical tool output (get_object_details, validate_best_practices, ado_analyze_workitem, detect_performance_issues...) and need it reframed for a non-technical audience. Calls the local Ollama instance (OLLAMA_HOST env var, default localhost:11434) to produce the summary. Model is configurable via ALMXPP_SUMMARIZE_MODEL (default: llama3.2).
trace_field_lineageread-onlyWHEN: you need to understand the full data lifecycle of a D365 F&O table field: who writes it, who reads it, which forms display it, which reports use it, and which tables have FK relationships to its parent table. Triggers: 'where is field X set', 'qui écrit ce champ', 'data lineage', 'GDPR field audit', 'origin of field', 'what touches this field'. Requires XRef index for writer/reader analysis. Relation graph for forms and FKs. Examples: trace_field_lineage('CustTable','CreditMax') or trace_field_lineage('LedgerJournalTrans','AmountCurDebit').
trace_role_license_treeread-onlyWHEN: security design, licence audit, or 'what licence does this role require?'. Triggers: 'arborescence du rôle', 'licence nécessaire pour', 'what licence for role', 'role tree', 'droits du rôle', 'entry points of role', 'privilege tree for'. Builds the COMPLETE tree for ONE role: Role -> Duties -> Privileges -> Entry Points. For each entry point, classifies the required D365 licence per the March 2026 Licensing Guide: Team Members (~$8/user/mo, read-only + named tasks), Operations-Activity (~$50, warehouse mobile & production floor), Finance (~$180), Supply Chain Mgmt (~$180), Human Resource…
trace_security_chainread-onlyWHEN: security audit -- need the TECHNICAL chain from Role/Duty/Privilege to Entry Points and Table/Form permissions. Also handles BUSINESS-LANGUAGE role explanation when businessLanguage=true. Triggers (technical): 'sécurité de', 'who can access', 'security for', 'role duty privilege', 'droits sur', 'technical security chain', 'trace le rôle', 'what privileges does', 'what duties are assigned', 'which role allows', 'accès au formulaire', 'what roles have access', 'quel rôle donne accès'. Triggers (business language): 'what can a user with role X do', 'explain this role', 'what does this role …
validate_best_practicesread-onlyRun an in-house best-practice audit on any AOT object (custom or standard), from the indexed source -- NOT the Microsoft BP checker. Rules are this server's own: SEC (security chain), PERF (firstOnly, set-based, N+1), TXN (ttsbegin/ttscommit pairing), ERR (error handling), COC (next() vs super()), QUAL, DATA (EDT on fields), CONV (naming, ISV prefix) and CLOUD. It runs pre-compile and needs no D365 install, so it catches things while the code is being written -- but it does not replace xppbp.exe, whose rule set and monikers are different. For the authoritative Microsoft verdict run run_best_pr…
validate_object_namingread-onlyWHEN: developer needs to check that a proposed object name follows D365 + ISV naming conventions, is unique against the indexed KB, and does not collide with a reserved or standard prefix. Triggers: 'is this a valid name', 'check naming', 'name conflict', 'valider le nommage'. Cloud-safe: KB read only, no writes.
Signals
- Stars
- 3
- Forks
- 0
- Open issues
- 0
- Last commit
- Sep 4, 2026 (2 months ago)
- Last release
- Aug 21, 2026 (2 months ago)
From GitHub (fetched Oct 24, 2026).
Details
- Registry name
io.github.alimbenhelal-pro/alm-xpp-mcp- Version
- 1.5.1
- Auth
- Auth not stated, API key
- Packages
- npm almxppmcp
- License
- MIT
- Repository
- github.com/alimbenhelal-pro/ALM-XPP-MCP
- Website
- www.almxpp.com
- First seen
- Oct 24, 2026
- Last checked
- Nov 1, 2026
Done for you
Rather not set it up yourself?
Chalk Labs scopes, builds and runs agents for your team: the task audit, the eval harness, the integrations and the weekly ops report. Fixed scope, priced before we start.
See how we build AI agents →Read the case studies
Chalk Labs is a two-founder AI and growth studio. We build AI agents, CRMs and MVPs for Web3 and AI companies, and have shipped 50+ product and token launches.
- launches shipped
- 50+
- launches shipped
- media placements
- 500+
- media placements
- founders on every account
- 2
- founders on every account
Press we've placed: Forbes · CoinDesk · Decrypt · Cointelegraph · The Block
Rahil Jain, Co-founder, Chalk Labs. Ex-Goldman Sachs engineer. You talk to the person who builds it.
Get ALM X++ MCP Server running in your business
Tell us what you want to automate. A founder replies within one working day with a plan, not a pitch deck.
Cite this page
ALM X++ MCP Server. Agent Mart. https://agentmart.dev/connectors/alimbenhelal-pro-alm-xpp-mcp (last updated 2026-11-01)