{"apiVersion":"v1","directorySlug":"almxpp-mcp-4a9217a941","title":"ALM XPP","description":"AI that knows the Dynamics 365 F&O codebase. 126 tools for developers, consultants and managers. Works in GitHub Copilot and VS Code.","pageUrl":"https://www.mcpbundles.com/skills/almxpp-mcp-4a9217a941","connectPath":"importable","connectAction":"import_server","catalogListing":false,"bundleSlug":null,"listingKind":"remote_mcp","kind":"provider","transportUrl":"https://api.almxpp.com/mcp","hostedMcpUrl":null,"toolCount":90,"toolInventoryStatus":"observed","refreshedAt":"2026-11-03T13:26:00.516172+00:00","registryName":"com.almxpp/almxpp-mcp-4a9217a941","registryVersion":"2026.11.3","registryEligible":true,"tools":[{"name":"validate_best_practices","description":"Run an in-house best-practice audit on any AOT object (custom or standard), from the indexed source -- NOT the Microsoft BP checker. Rules are this server's own: SEC (security chain), PERF (firstOnly, set-based, N+1), TXN (ttsbegin/ttscommit pairing), ERR (error handling), COC (next() vs super()), QUAL, DATA (EDT on fields), CONV (naming, ISV prefix) and CLOUD. It runs pre-compile and needs no D365 install, so it catches things while the code is being written -- but it does not replace xppbp.exe","inputSchema":{"type":"object","required":["objectName"],"properties":{"methodName":{"type":["string","null"],"default":null},"objectName":{"type":"string"},"minSeverity":{"type":"string","default":"Warning"}}},"annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"validate_best_practices","displayName":"validate_best_practices","title":"validate_best_practices"},{"name":"find_extensions","description":"Find all extension objects (AxClassExtension, AxTableExtension, AxFormExtension, AxEnumExtension), CoC classes ([ExtensionOf]), and event handlers for a base object. Also queries Azure DevOps Code Search in real-time for custom extensions not yet in the KB. ALWAYS call before creating a new extension — avoid parallel customizations.","inputSchema":{"type":"object","required":["baseObjectName"],"properties":{"baseObjectName":{"type":"string"}}},"annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"find_extensions","displayName":"find_extensions","title":"find_extensions"},{"name":"ado_wiki_delete_page","description":"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).","inputSchema":{"type":"object","required":["path"],"properties":{"path":{"type":"string"},"project":{"type":["string","null"],"default":null},"wikiIdentifier":{"type":["string","null"],"default":null}}},"logicalName":"ado_wiki_delete_page","displayName":"ado_wiki_delete_page","title":"ado_wiki_delete_page","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"appinsights_diagnose_slowness","description":"WHEN: user wants to understand/deduce why a D365 F&O environment feels slow, using the\nreal Application Insights telemetry the environment already emits -- no trace file\nupload needed. Runs a set of canned KQL queries and assembles one combined report:\n  1. X++ exception hotspots (exceptions table) -- top types/messages by count.\n  2. Hot custom telemetry events (customEvents table) -- top event names by frequency,\n     plus a duration breakdown for events that carry an ElapsedMilliseconds custo","inputSchema":{"type":"object","properties":{"top":{"type":"integer","default":15},"lookbackHours":{"type":"integer","default":24},"minDurationMs":{"type":"integer","default":2000}}},"annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"appinsights_diagnose_slowness","displayName":"appinsights_diagnose_slowness","title":"appinsights_diagnose_slowness"},{"name":"ado_wiki_list","description":"AZURE DEVOPS ONLY -- List all wikis in a project (the project wiki plus any published code-as-wiki repos). Use this FIRST when the user doesn't know the wiki's exact name/id, or to confirm which wiki to target before reading/writing a page. Requires DEVOPS_ORG_URL + DEVOPS_PAT env vars.","inputSchema":{"type":"object","properties":{"project":{"type":["string","null"],"default":null}}},"annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"ado_wiki_list","displayName":"ado_wiki_list","title":"ado_wiki_list"},{"name":"get_object_details","description":"WHEN: you know the EXACT object name. Triggers: user gives an exact name like 'SalesTable', 'CustTable', 'VendInvoiceJour', any PascalCase D365 object name. Get complete details: all fields, methods, relations, indexes, source code, and metadata. COST NOTE: this returns the FULL object and can be very large (100KB+ for big tables/forms like SalesLine). If you ONLY need relations / FK / DeleteActions / data sources / who-references, call get_relation_graph instead -- it is O(1) and roughly 6x lig","inputSchema":{"type":"object","required":["objectName"],"properties":{"aotType":{"type":["string","null"],"default":null},"methodName":{"type":["string","null"],"default":null},"objectName":{"type":"string"}}},"annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"get_object_details","displayName":"get_object_details","title":"get_object_details"},{"name":"ado_update_workitem","description":"Update one or more fields on an existing Azure DevOps Work Item. Can update any standard field (System.Description, System.Title, System.State, System.AssignedTo, ...) or custom field (Custom.Extensionlifecyclestatus, ...) using its Field Reference Name. Triggers: 'mets à jour la description du workitem', 'change le state', 'update field', 'post ça en description'. Always show the user what will be changed and ask for confirmation before calling. Requires DEVOPS_PAT with Work Items: Write permis","inputSchema":{"type":"object","required":["workItemId","fieldsJson"],"properties":{"project":{"type":["string","null"],"default":null},"fieldsJson":{"type":"string"},"workItemId":{"type":"integer"}}},"logicalName":"ado_update_workitem","displayName":"ado_update_workitem","title":"ado_update_workitem","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"find_references","description":"Full index scan for all usages of an object, method, field, or label ID. Use for impact analysis before changing or deleting an object. EXPENSIVE — O(1M+ chunks). Prefer find_callers when XRef index is loaded (O(1)). Label IDs: automatically searches both `@SYS124480` and `@SYS:124480` forms. NOT for extensions only — use find_extensions for CoC/event handlers.","inputSchema":{"type":"object","required":["name"],"properties":{"name":{"type":"string"},"maxResults":{"type":"integer","default":500},"locationsPerObject":{"type":"integer","default":6}}},"annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"find_references","displayName":"find_references","title":"find_references"},{"name":"ado_gap_fit_analysis","description":"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.","inputSchema":{"type":"object","properties":{"project":{"type":["string","null"],"default":null},"workItemId":{"type":["integer","null"],"default":null},"requirements":{"type":["string","null"],"default":null},"requirementText":{"type":["string","null"],"default":null}}},"annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"ado_gap_fit_analysis","displayName":"ado_gap_fit_analysis","title":"ado_gap_fit_analysis"},{"name":"batch_search","description":"WHEN: you need context on multiple D365 objects or concepts simultaneously -- runs all queries in parallel. Use INSTEAD of multiple sequential search_d365_code calls -- each line becomes one parallel search. Maximum 6 queries per call. Results are equivalent to search_d365_code but returned together. When batch_search returns results, all matching objects are FULLY loaded (all chunks). Do NOT follow up with get_object_details on the same objects -- the complete source is already included.","inputSchema":{"type":"object","required":["queries"],"properties":{"topK":{"type":"integer","default":5},"queries":{"type":"string"},"topObjects":{"type":"integer","default":3}}},"annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"batch_search","displayName":"batch_search","title":"batch_search"},{"name":"ado_read_attachment","description":"AZURE DEVOPS ONLY -- Reads the ACTUAL CONTENT of a file attached to a work item (Excel spreadsheet, Word document, text/CSV/JSON/XML file, or image). WHEN: a work item (FDD/RDD/CR/Bug/Task/User Story) has an Excel/Word attachment with requirements, field mappings, mockups, or specs that need to be read to understand the ask. Triggers: 'read the attachment', 'open the excel file on the work item', 'what does the attached document say', 'lis le fichier joint', 'ouvre l'excel du ticket'. Call ado_a","inputSchema":{"type":"object","required":["workItemId","fileName"],"properties":{"project":{"type":["string","null"],"default":null},"fileName":{"type":"string"},"sheetName":{"type":["string","null"],"default":null},"workItemId":{"type":"integer"}}},"annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"ado_read_attachment","displayName":"ado_read_attachment","title":"ado_read_attachment"},{"name":"trace_field_lineage","description":"WHEN: you need to understand the full data lifecycle of a D365 F&O table field: who writes it, who reads it, which forms display it, which reports use it, and which tables have FK relationships to its parent table. Triggers: 'where is field X set', 'qui écrit ce champ', 'data lineage', 'GDPR field audit', 'origin of field', 'what touches this field'. Requires XRef index for writer/reader analysis. Relation graph for forms and FKs. Examples: trace_field_lineage('CustTable','CreditMax') or trace_f","inputSchema":{"type":"object","required":["tableName","fieldName"],"properties":{"fieldName":{"type":"string"},"tableName":{"type":"string"},"maxPerCategory":{"type":"integer","default":15}}},"annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"trace_field_lineage","displayName":"trace_field_lineage","title":"trace_field_lineage"},{"name":"plan_and_execute","description":"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).","inputSchema":{"type":"object","required":["goal"],"properties":{"goal":{"type":"string"},"project":{"type":["string","null"],"default":null},"assignTo":{"type":["string","null"],"default":null},"objectName":{"type":["string","null"],"default":null},"workItemId":{"type":["integer","null"],"default":null}}},"logicalName":"plan_and_execute","displayName":"plan_and_execute","title":"plan_and_execute","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"find_similar_implementations","description":"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.","inputSchema":{"type":"object","required":["objectName"],"properties":{"maxResults":{"type":"integer","default":15},"objectName":{"type":"string"},"filterAotType":{"type":["string","null"],"default":null}}},"annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"find_similar_implementations","displayName":"find_similar_implementations","title":"find_similar_implementations"},{"name":"recommend_extension_strategy","description":"WHEN: developer about to customise a standard D365 object asks 'should I use AxTableExtension, Chain of Command, EventHandler, or Delegate?'. Triggers: 'how to extend', 'best way to customise', 'extension strategy for', 'CoC ou event handler', 'comment etendre X'. Returns a ranked recommendation based on the target AOT type and the intent, with citations to the Microsoft Learn extensibility guide. Cloud-safe: pure KB lookup, no writes.","inputSchema":{"type":"object","required":["objectName","intent"],"properties":{"intent":{"type":"string"},"objectName":{"type":"string"}}},"annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"recommend_extension_strategy","displayName":"recommend_extension_strategy","title":"recommend_extension_strategy"},{"name":"diff_model_versions","description":"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.","inputSchema":{"type":"object","required":["action","path1"],"properties":{"path1":{"type":"string"},"action":{"type":"string"},"filterModel":{"type":["string","null"],"default":null},"path2OrLabel":{"type":["string","null"],"default":null}}},"annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"diff_model_versions","displayName":"diff_model_versions","title":"diff_model_versions"},{"name":"find_related_objects","description":"Returns ALL FK/DeleteAction/DataSource relations (outgoing) AND back-references (incoming). Call BEFORE generating multi-object code to understand the full dependency graph. When the relation index is loaded, delegates to get_relation_graph (O(1)) internally — do NOT call both tools for the same object.","inputSchema":{"type":"object","required":["objectName"],"properties":{"objectName":{"type":"string"}}},"annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"find_related_objects","displayName":"find_related_objects","title":"find_related_objects"},{"name":"ado_review_xpp_pr","description":"WHEN: reviewing a PR that modifies X++ code or AOT objects and you need D365-specific insights. Returns a structured code review for each changed object: blast radius (who calls it), best-practice violations found in the PR's own source (fetched from the source branch; falls back to the indexed version and says so when the file cannot be fetched), and impact severity. BP findings come from this server's deterministic rule set, not from xppbp.exe -- a PR is uncompiled, so Microsoft's checker cann","inputSchema":{"type":"object","required":["prId"],"properties":{"prId":{"type":"integer"},"project":{"type":["string","null"],"default":null},"repositoryId":{"type":["string","null"],"default":null},"maxDeepAnalysis":{"type":"integer","default":8}}},"annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"ado_review_xpp_pr","displayName":"ado_review_xpp_pr","title":"ado_review_xpp_pr"},{"name":"find_entity_for_table","description":"WHEN: developer needs to integrate via OData and wants to find the entity name for a given table. Also generates a new entity template when none exists and generateIfMissing=true. Triggers: 'which entity exposes', 'OData entity for', 'find entity for', 'quelle entité expose', 'DMF entity for', 'create data entity', 'expose via OData', 'generate entity', 'entité de données'. Find D365 F&O data entities that expose a given table for OData/DMF integrations. Answers: 'Which entity exposes SalesTable","inputSchema":{"type":"object","required":["tableName"],"properties":{"tableName":{"type":"string"},"maxResults":{"type":"integer","default":15},"generateIfMissing":{"type":"boolean","default":false}}},"annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"find_entity_for_table","displayName":"find_entity_for_table","title":"find_entity_for_table"},{"name":"summarize_for_stakeholder","description":"WHEN: you have a large technical tool output (get_object_details, validate_best_practices, ado_analyze_workitem, detect_performance_issues...) and need it reframed for a non-technical audience. Calls the local Ollama instance (OLLAMA_HOST env var, default localhost:11434) to produce the summary. Model is configurable via ALMXPP_SUMMARIZE_MODEL (default: llama3.2).","inputSchema":{"type":"object","required":["text"],"properties":{"text":{"type":"string"},"audience":{"type":"string","default":"business-analyst"}}},"annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"summarize_for_stakeholder","displayName":"summarize_for_stakeholder","title":"summarize_for_stakeholder"},{"name":"suggest_refactoring","description":"WHEN: developer wants to improve code quality before a PR merge or code review. Triggers: 'refactor', 'clean up', 'simplify', 'too long method', 'nested ifs', 'code smells', 'améliorer le code'. Suggest concrete refactoring actions for YOUR custom D365 F&O X++ code. [!] Only runs on custom/extension code (D365_CUSTOM_MODEL_PATH). Refactoring standard Microsoft code is not actionable. Analyzes: long methods (extract method), deep nesting (guard clauses), row-by-row operations (set-based), large s","inputSchema":{"type":"object","required":["objectName"],"properties":{"methodName":{"type":["string","null"],"default":null},"objectName":{"type":"string"}}},"annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"suggest_refactoring","displayName":"suggest_refactoring","title":"suggest_refactoring"},{"name":"resync_devops_index","description":"WHEN: the user wants to force a full re-download and re-index of their Azure DevOps custom model. Triggers: 'resync', 'reindex', 'force sync', 'rebuild index', 'my model is stale', 'update index', 'mon index est vieux', 'rafraîchir l\\'index', 'relancer l\\'indexation'. Useful when the server's built-in PAT does not have access to the target DevOps organisation (e.g. a different Azure DevOps org or tenant). Pass a `pat` parameter to override the server PAT for this resync. The eviction + download","inputSchema":{"type":"object","properties":{"pat":{"type":["string","null"],"default":null}}},"logicalName":"resync_devops_index","displayName":"resync_devops_index","title":"resync_devops_index","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"ado_wiki_get_page","description":"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.","inputSchema":{"type":"object","required":["path"],"properties":{"path":{"type":"string"},"project":{"type":["string","null"],"default":null},"wikiIdentifier":{"type":["string","null"],"default":null},"includeSubPages":{"type":"boolean","default":false}}},"annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"ado_wiki_get_page","displayName":"ado_wiki_get_page","title":"ado_wiki_get_page"},{"name":"find_callers","description":"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.","inputSchema":{"type":"object","required":["methodKey"],"properties":{"depth":{"type":"integer","default":2},"methodKey":{"type":"string"},"categories":{"type":"string","default":"all"},"maxResults":{"type":"integer","default":20}}},"annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"find_callers","displayName":"find_callers","title":"find_callers"},{"name":"healthcheck","description":"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.","inputSchema":{"type":"object","properties":{}},"annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"healthcheck","displayName":"healthcheck","title":"healthcheck"},{"name":"find_error_patterns","description":"WHEN: a user encounters an error message, infolog error, or runtime exception in D365. Also handles business-language error explanation when audienceType='business'. Triggers (developer): 'fix this error', 'what causes', 'exception thrown', 'infolog error', 'update conflict', 'outside tts', 'number sequence'. Triggers (business): 'what does this error mean', 'explain this error to me', 'user gets error X', 'que signifie cette erreur', 'message d\\'erreur', 'what should the user do when they see t","inputSchema":{"type":"object","required":["errorOrSymptom"],"properties":{"audienceType":{"type":"string","default":"developer"},"errorOrSymptom":{"type":"string"}}},"annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"find_error_patterns","displayName":"find_error_patterns","title":"find_error_patterns"},{"name":"suggest_edt","description":"WHEN: adding a new field to a table -- find the best existing D365 EDT to extend instead of using raw primitives (str, int64, real, date). Triggers: 'what EDT for', 'which EDT should I extend', 'quel EDT pour', 'quel type étendu', 'EDT for a field'. D365 best practice mandates EDT reuse over raw primitive types. Call BEFORE declaring any field with a primitive type. Returns ranked candidate EDTs with their base type, label, and model.","inputSchema":{"type":"object","required":["fieldName","purpose"],"properties":{"topK":{"type":"integer","default":8},"purpose":{"type":"string"},"baseType":{"type":["string","null"],"default":null},"fieldName":{"type":"string"}}},"annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"suggest_edt","displayName":"suggest_edt","title":"suggest_edt"},{"name":"get_object_context","description":"WHEN: you need a COMPLETE picture of a D365 object in ONE call. Returns in a single response: full structure (fields, method signatures, relation summary) AND all CoC extensions / event handlers -- equivalent to calling get_object_details THEN find_extensions. Use this INSTEAD of those two separate calls to reduce round-trips. Optionally includes best-practice violations (set includeValidation=true). Pass `methodName` to also include the full body of a specific method. Pass `aotType` to disambig","inputSchema":{"type":"object","required":["objectName"],"properties":{"aotType":{"type":["string","null"],"default":null},"methodName":{"type":["string","null"],"default":null},"objectName":{"type":"string"},"includeValidation":{"type":"boolean","default":false}}},"annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"get_object_context","displayName":"get_object_context","title":"get_object_context"},{"name":"odata_upsert_rows","description":"Idempotent import of rows into any entity via OData: PATCH when the record\nexists (matched by keyFields), otherwise POST. Safe to re-run -- duplicates\nare updated, not re-created. Best for small-to-medium transactional loads\n(e.g. <= a few thousand rows). For bulk loads use dmf_import_file.\nProvide rows as a JSON array of objects; resolve key fields from the KB\n(get_data_entity_info) -- do not guess them.","inputSchema":{"type":"object","required":["entitySet","rowsJson","keyFields"],"properties":{"rowsJson":{"type":"string"},"entitySet":{"type":"string"},"keyFields":{"type":"string"},"legalEntity":{"type":["string","null"],"default":null},"crossCompany":{"type":"boolean","default":true}}},"logicalName":"odata_upsert_rows","displayName":"odata_upsert_rows","title":"odata_upsert_rows","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"find_change_impact","description":"WHEN: about to modify an X++ object or method and need to understand what could break. Returns a blast-radius report: direct callers, transitive dependents (BFS up to 3 hops), custom model extensions, interface propagation, and severity classification (Critical/High/Medium/Low). Requires the XRef index (loaded from xref_index.json.gz). Triggers: 'what breaks if I change X', 'impact of modifying SalesLine', 'blast radius', 'refactoring risk', 'quel impact si je modifie', 'qu\\'est-ce qui dépend de","inputSchema":{"type":"object","required":["objectName"],"properties":{"maxDepth":{"type":"integer","default":3},"objectName":{"type":"string"}}},"annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"find_change_impact","displayName":"find_change_impact","title":"find_change_impact"},{"name":"generate_security_report","description":"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.","inputSchema":{"type":"object","properties":{"filterModel":{"type":["string","null"],"default":null},"maxRolesDetail":{"type":"integer","default":50}}},"annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"generate_security_report","displayName":"generate_security_report","title":"generate_security_report"},{"name":"appinsights_set_connection","description":"Securely register the D365 F&O environment's Application Insights / Log Analytics\nconnection for the CURRENT session. The client secret is encrypted in memory\n(AES-256-GCM), never written to disk and never echoed back. Once set, appinsights_query\nand appinsights_diagnose_slowness use it automatically until it expires or you call\nappinsights_clear_connection.","inputSchema":{"type":"object","required":["workspaceId","tenantId","clientId","clientSecret"],"properties":{"clientId":{"type":"string"},"tenantId":{"type":"string"},"ttlMinutes":{"type":"integer","default":60},"workspaceId":{"type":"string"},"clientSecret":{"type":"string"}}},"logicalName":"appinsights_set_connection","displayName":"appinsights_set_connection","title":"appinsights_set_connection","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"dmf_get_job_status","description":"Poll the status of a DMF import/export execution by its executionId\n(e.g. NotRun, Executing, Succeeded, PartiallySucceeded, Failed). For a\ncompleted export, also returns the download URL.","inputSchema":{"type":"object","required":["executionId"],"properties":{"executionId":{"type":"string"}}},"annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"dmf_get_job_status","displayName":"dmf_get_job_status","title":"dmf_get_job_status"},{"name":"detect_performance_issues","description":"Profile an X++ object for N+1 queries, queries in loops, missing field lists, row-by-row inserts/updates, missing firstOnly. Returns compact issue table with line + fix. Only call when performance is explicitly the concern — for general quality use validate_best_practices. [!] Auto-fixing requires D365_CUSTOM_MODEL_PATH (custom code only).","inputSchema":{"type":"object","required":["objectName"],"properties":{"methodName":{"type":["string","null"],"default":null},"objectName":{"type":"string"}}},"annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"detect_performance_issues","displayName":"detect_performance_issues","title":"detect_performance_issues"},{"name":"get_relation_graph","description":"WHEN: you need the COMPLETE bidirectional relation graph for an object in ONE call. Triggers: 'relations of', 'FK of', 'what tables link to', 'quelles tables liées à', 'avant de générer du code', 'before generating code', 'foreign keys', 'delete actions', 'who references', 'qui référence', 'graph de relations'. Returns ALL outgoing edges (FK relations, DeleteActions, DataSources, Extensions, Security...) AND all incoming back-references (forms, entities, CoC classes, privileges... that reference","inputSchema":{"type":"object","required":["objectName"],"properties":{"maxEdges":{"type":"integer","default":200},"objectName":{"type":"string"},"aotTypeFilter":{"type":["string","null"],"default":null}}},"annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"get_relation_graph","displayName":"get_relation_graph","title":"get_relation_graph"},{"name":"d365fo_clear_connection","description":"Removes the D365 F&O connection cached for the current session by d365fo_set_connection.","inputSchema":{"type":"object","properties":{}},"logicalName":"d365fo_clear_connection","displayName":"d365fo_clear_connection","title":"d365fo_clear_connection","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"generate_xpp_template","description":"WHEN: writing an extension or customization -- generates ready-to-use X++ code. Triggers: 'génère un CoC', 'crée une extension', 'generate extension', 'write a CoC class', 'event handler pour', 'template pour'. Uses REAL metadata from the KB (actual field names, method signatures). 'coc' = Chain of Command class, 'table_extension' = extend table with fields/methods, 'event_handler' = pre/post event handler, 'job' = runnable class, 'find_method' = find/exist pattern. ALWAYS call get_object_detail","inputSchema":{"type":"object","required":["templateType","objectName"],"properties":{"methodName":{"type":["string","null"],"default":null},"objectName":{"type":"string"},"templateType":{"type":"string"}}},"annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"generate_xpp_template","displayName":"generate_xpp_template","title":"generate_xpp_template"},{"name":"get_security_coverage_for_object","description":"WHEN: developer/security architect needs to know WHICH ROLES can access a specific form, table, menu item or service operation. Triggers: 'who can access', 'which roles see', 'security coverage for', 'quels roles ont accès à', 'find roles with access'. Walks the security graph backwards (EntryPoint -> Privilege -> Duty -> Role) and returns all roles that grant any level of access (Read / Update / Create / Delete / Correct) on the given object. Read-only: scans the in-memory KB, never writes.","inputSchema":{"type":"object","required":["objectName"],"properties":{"maxRoles":{"type":"integer","default":30},"minGrant":{"type":"string","default":"Any"},"objectName":{"type":"string"}}},"annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"get_security_coverage_for_object","displayName":"get_security_coverage_for_object","title":"get_security_coverage_for_object"},{"name":"get_output_page","description":"Retrieve the NEXT page of a previously PAGINATED tool output. When a tool result is too large for a single response, it is split losslessly into ordered pages — the footer of each page gives you a `token` and the next `page` number. Call this tool with that token to read the continuation; nothing is dropped, so you can walk every page in order and reconstruct the full result. Pages are cached only briefly (the last few large results). If the token is unknown or expired, re-run the original tool","inputSchema":{"type":"object","required":["token"],"properties":{"page":{"type":"integer","default":2},"token":{"type":"string"}}},"annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"get_output_page","displayName":"get_output_page","title":"get_output_page"},{"name":"ado_pr_dependency_map","description":"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.","inputSchema":{"type":"object","required":["repositoryId"],"properties":{"top":{"type":"integer","default":30},"status":{"type":"string","default":"Active"},"project":{"type":["string","null"],"default":null},"repositoryId":{"type":"string"},"targetBranch":{"type":["string","null"],"default":null}}},"annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"ado_pr_dependency_map","displayName":"ado_pr_dependency_map","title":"ado_pr_dependency_map"},{"name":"generate_fdd","description":"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.","inputSchema":{"type":"object","required":["objectName"],"properties":{"context":{"type":["string","null"],"default":null},"language":{"type":"string","default":"en"},"objectName":{"type":"string"}}},"annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"generate_fdd","displayName":"generate_fdd","title":"generate_fdd"},{"name":"map_business_process","description":"WHEN: mapping the technical D365 objects behind a business process, or understanding which tables/forms implement a flow. Triggers: 'processus métier', 'Order-to-Cash', 'Procure-to-Pay', 'Record-to-Report', 'business process flow', 'qui est impliqué dans', 'map the process', 'flux du processus', 'quels objets dans le flux'. Map a D365 F&O business process to its complete object chain. For known processes (Order-to-Cash, Procure-to-Pay, Record-to-Report, Plan-to-Produce, Inventory-Management, Hir","inputSchema":{"type":"object","required":["processName"],"properties":{"processName":{"type":"string"}}},"annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"map_business_process","displayName":"map_business_process","title":"map_business_process"},{"name":"ado_post_comment","description":"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'.\nWARNING: 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 + DEVOP","inputSchema":{"type":"object","required":["workItemId","commentText"],"properties":{"project":{"type":["string","null"],"default":null},"workItemId":{"type":"integer"},"commentText":{"type":"string"}}},"logicalName":"ado_post_comment","displayName":"ado_post_comment","title":"ado_post_comment","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"get_data_entity_info","description":"WHEN: developer building an OData / DMF integration needs a quick rundown of a specific data entity: its public OData name, datasources, key fields, and IsPublic status. Triggers: 'data entity info', 'OData entity details', 'is X a public entity', 'entity datasources'. Cloud-safe: pure metadata read from the KB.","inputSchema":{"type":"object","required":["entityName"],"properties":{"entityName":{"type":"string"}}},"annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"get_data_entity_info","displayName":"get_data_entity_info","title":"get_data_entity_info"},{"name":"compare_objects","description":"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.","inputSchema":{"type":"object","required":["objectNameA","objectNameB"],"properties":{"objectNameA":{"type":"string"},"objectNameB":{"type":"string"}}},"annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"compare_objects","displayName":"compare_objects","title":"compare_objects"},{"name":"list_objects","description":"WHEN: you need ALL objects of a given type or in a given model. Triggers: 'list all tables in ALM', 'show all classes', 'quels objets dans le modèle', 'give me all forms'. Full index scan -- returns EVERY matching object, not just top search results. Use to discover what tables, classes, forms, enums, etc. exist in a specific model. When no filters are given and a custom model is configured, defaults to listing that model. NOT for a single object -- use get_object_details. NOT for natural langua","inputSchema":{"type":"object","properties":{"aotType":{"type":["string","null"],"default":null},"modelName":{"type":["string","null"],"default":null}}},"annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"list_objects","displayName":"list_objects","title":"list_objects"},{"name":"explain_workflow","description":"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`.","inputSchema":{"type":"object","required":["objectName"],"properties":{"objectName":{"type":"string"}}},"annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"explain_workflow","displayName":"explain_workflow","title":"explain_workflow"},{"name":"trace_role_license_tree","description":"WHEN: security design, licence audit, or 'what licence does this role require?'. Triggers: 'arborescence du rôle', 'licence nécessaire pour', 'what licence for role', 'role tree', 'droits du rôle', 'entry points of role', 'privilege tree for'. Builds the COMPLETE tree for ONE role: Role -> Duties -> Privileges -> Entry Points. For each entry point, classifies the required D365 licence per the March 2026 Licensing Guide: Team Members (~$8/user/mo, read-only + named tasks), Operations-Activity (~$","inputSchema":{"type":"object","required":["roleName"],"properties":{"roleName":{"type":"string"},"maxEntryPoints":{"type":"integer","default":20}}},"annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"trace_role_license_tree","displayName":"trace_role_license_tree","title":"trace_role_license_tree"},{"name":"ado_wiki_create_or_update_page","description":"AZURE DEVOPS ONLY -- Create a new wiki page, or OVERWRITE an existing one with new markdown content. ALWAYS call ado_wiki_get_page first if you intend to edit (not replace) an existing page's content, since this tool replaces the ENTIRE page body -- it does not merge/append. Automatically handles the page's ETag for safe concurrent-edit detection. Requires DEVOPS_ORG_URL + DEVOPS_PAT env vars (PAT needs Wiki: Read & Write scope).","inputSchema":{"type":"object","required":["path","content"],"properties":{"path":{"type":"string"},"content":{"type":"string"},"project":{"type":["string","null"],"default":null},"wikiIdentifier":{"type":["string","null"],"default":null}}},"logicalName":"ado_wiki_create_or_update_page","displayName":"ado_wiki_create_or_update_page","title":"ado_wiki_create_or_update_page","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"resolve_workspace_roots","description":"WHEN: you need to know which folder(s) are configured as the workspace/project root for the current caller. Reads D365-Custom-Model-Path and D365-Standard-Model-Path from the request headers or environment variables. Use before any tool that accepts a customModelPath/standardModelPath parameter.","inputSchema":{"type":"object","properties":{}},"annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"resolve_workspace_roots","displayName":"resolve_workspace_roots","title":"resolve_workspace_roots"},{"name":"resolve_client_profile","description":"WHEN: at the START of any release-note / upgrade-impact conversation -- call this BEFORE list_release_note_inputs to check whether a Client Profile already exists for the CURRENT caller's Azure DevOps org/project (auto-detected from DEVOPS_ORG_URL/DEVOPS_PROJECT MCP headers -- you don't pass anything). If found, it gives you the client's currentVersionTag, targetVersionTag, customModelIds (their own extensions AND any attached ISV/vendor models) and the latest diff snapshot in one call -- use th","inputSchema":{"type":"object","properties":{}},"annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"resolve_client_profile","displayName":"resolve_client_profile","title":"resolve_client_profile"},{"name":"create_aot_object","description":"Generate a complete, ready-to-deploy D365 F&O AOT XML scaffold for any object type.\n    Returns the XML + the correct file path inside the model -- the calling client (VS Extension,\n    Cursor, Copilot Chat) is responsible for writing the result to disk. This tool is fully\n    read-only on the server: it never writes to the filesystem, never mutates external state,\n    and is safe to expose from the cloud MCP.\n    When the knowledge base is available the scaffold is auto-enriched with real metad","inputSchema":{"type":"object","required":["aotType","name"],"properties":{"name":{"type":"string"},"aotType":{"type":"string"},"options":{"type":["object","null"],"default":null,"additionalProperties":{"type":["string","null"]}}}},"annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"create_aot_object","displayName":"create_aot_object","title":"create_aot_object"},{"name":"d365fo_set_connection","description":"Securely register the D365 F&O connection (URL + Entra app-registration credentials)\nfor the CURRENT session. The client secret is encrypted in memory (AES-256-GCM),\nnever written to disk and never echoed back. Once set, all odata_* and dmf_* tools\nuse it automatically until it expires or you call d365fo_clear_connection.","inputSchema":{"type":"object","required":["baseUrl","tenantId","clientId","clientSecret"],"properties":{"baseUrl":{"type":"string"},"clientId":{"type":"string"},"tenantId":{"type":"string"},"ttlMinutes":{"type":"integer","default":60},"clientSecret":{"type":"string"}}},"logicalName":"d365fo_set_connection","displayName":"d365fo_set_connection","title":"d365fo_set_connection","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"appinsights_clear_connection","description":"Removes the Application Insights connection cached for the current session by appinsights_set_connection.","inputSchema":{"type":"object","properties":{}},"logicalName":"appinsights_clear_connection","displayName":"appinsights_clear_connection","title":"appinsights_clear_connection","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"find_event_handlers","description":"Find all event handlers that subscribe to events on a D365 table or class. Searches the knowledge base for [SubscribesTo(classStr(objectName), ...)] / [SubscribesTo(tableStr(objectName), ...)] attribute patterns. Use eventName to narrow results to a specific event (e.g. 'OnInserted'). WHEN: 'who handles X', 'what subscribes to Y', 'event handlers for Z', 'qui écoute l'événement', 'abonnés à l'événement', 'SubscribesTo', 'data events for'.","inputSchema":{"type":"object","required":["objectName"],"properties":{"eventName":{"type":["string","null"],"default":null},"objectName":{"type":"string"},"handlerType":{"type":["string","null"],"default":null}}},"annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"find_event_handlers","displayName":"find_event_handlers","title":"find_event_handlers"},{"name":"appinsights_query","description":"Run a raw KQL (Kusto) query against the D365FO environment's Application Insights /\nLog Analytics workspace (read-only -- the query language has no mutation operators).\nRequires the connection to be configured first via appinsights_set_connection (or server\nenv vars). Use the standard App Insights schema: requests, dependencies, exceptions,\ntraces, customEvents, pageViews, performanceCounters. Prefer appinsights_diagnose_slowness\nfor a ready-made \"why is it slow\" report -- use this tool for anyt","inputSchema":{"type":"object","required":["kql"],"properties":{"kql":{"type":"string"},"maxRows":{"type":"integer","default":100},"lookbackHours":{"type":"integer","default":24}}},"annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"appinsights_query","displayName":"appinsights_query","title":"appinsights_query"},{"name":"search_context_docs","description":"WHEN: the user asks about business/functional context that lives OUTSIDE the D365 code KB -- specs, functional design docs, mapping sheets, contracts, meeting notes, screenshots' captions -- anything an admin uploaded via the admin portal's 'Context Documents' library (PDF, Word .docx, Excel .xlsx/.xlsm, CSV, plain text/Markdown/JSON). Does NOT search X++ code or AOT objects -- use search_d365_code / get_object_details for that. Triggers: 'what does the spec say about...', 'check the mapping doc","inputSchema":{"type":"object","required":["query"],"properties":{"query":{"type":"string"},"maxResults":{"type":"integer","default":8},"includeImages":{"type":"boolean","default":false}}},"annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"search_context_docs","displayName":"search_context_docs","title":"search_context_docs"},{"name":"trace_security_chain","description":"WHEN: security audit -- need the TECHNICAL chain from Role/Duty/Privilege to Entry Points and Table/Form permissions. Also handles BUSINESS-LANGUAGE role explanation when businessLanguage=true. Triggers (technical): 'sécurité de', 'who can access', 'security for', 'role duty privilege', 'droits sur', 'technical security chain', 'trace le rôle', 'what privileges does', 'what duties are assigned', 'which role allows', 'accès au formulaire', 'what roles have access', 'quel rôle donne accès'. Trigge","inputSchema":{"type":"object","required":["securityObjectName"],"properties":{"businessLanguage":{"type":"boolean","default":false},"securityObjectName":{"type":"string"}}},"annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"trace_security_chain","displayName":"trace_security_chain","title":"trace_security_chain"},{"name":"find_relation_path","description":"WHEN: you need to know HOW two AOT objects are connected -- the chain of relations linking them. Triggers: 'how is X related to Y', 'comment X est lié à Y', 'path between', 'chemin entre', 'lien entre deux tables', 'connection between', 'is X reachable from Y'. Walks the pre-computed relation graph (FK, DeleteAction, DataSource, Extension, Security edges -- both directions) and returns the SHORTEST navigation path(s) as a chain of object names + edge kinds. Token-light: returns ONLY names and re","inputSchema":{"type":"object","required":["source","target"],"properties":{"source":{"type":"string"},"target":{"type":"string"},"maxDepth":{"type":"integer","default":4},"maxPaths":{"type":"integer","default":5}}},"annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"find_relation_path","displayName":"find_relation_path","title":"find_relation_path"},{"name":"ado_estimate_effort","description":"WHEN: user asks for an effort estimate, chiffrage, or development hours for a D365 Work Item. [~] PRIORITY TRIGGER: call AFTER `ado_analyze_workitem` when the user asks 'how long?', 'estimate this', 'chiffre ce WI'.","inputSchema":{"type":"object","required":["workItemId"],"properties":{"project":{"type":["string","null"],"default":null},"workItemId":{"type":"integer"},"focusObjects":{"type":["string","null"],"default":null}}},"annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"ado_estimate_effort","displayName":"ado_estimate_effort","title":"ado_estimate_effort"},{"name":"validate_object_naming","description":"WHEN: developer needs to check that a proposed object name follows D365 + ISV naming conventions, is unique against the indexed KB, and does not collide with a reserved or standard prefix. Triggers: 'is this a valid name', 'check naming', 'name conflict', 'valider le nommage'. Cloud-safe: KB read only, no writes.","inputSchema":{"type":"object","required":["proposedName","aotType","isvPrefix"],"properties":{"aotType":{"type":"string"},"isvPrefix":{"type":"string"},"proposedName":{"type":"string"}}},"annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"validate_object_naming","displayName":"validate_object_naming","title":"validate_object_naming"},{"name":"generate_diagram","description":"WHEN: generating a visual diagram of D365 table relationships or security chains. Triggers: 'generate diagram', 'diagramme', 'visualize', 'schéma', 'ER diagram', 'entity-relationship', 'relation diagram', 'security diagram', 'show connections'. Generate visual Mermaid diagrams from D365 F&O knowledge base data. Diagrams render directly in Copilot Chat, Cursor, Claude, and markdown viewers. Types: 'er' (entity-relationship diagram for a table and its relations), 'security' (security chain: Role->","inputSchema":{"type":"object","required":["diagramType","objectName"],"properties":{"maxRelated":{"type":"integer","default":12},"methodName":{"type":["string","null"],"default":null},"objectName":{"type":"string"},"diagramType":{"type":"string"}}},"annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"generate_diagram","displayName":"generate_diagram","title":"generate_diagram"},{"name":"save_client_profile","description":"WHEN: no profile was found by resolve_client_profile and the user wants one created (or updated) for their client, so future release-note requests never need v1/v2/customModelIds again. Creates or updates a Client Profile keyed by the CURRENT caller's ADO org/project (auto-detected from MCP headers -- not a parameter). Only the fields you pass are changed; omit a field to leave it untouched on an existing profile.","inputSchema":{"type":"object","required":["name"],"properties":{"name":{"type":"string"},"customModelIds":{"type":["string","null"],"default":null},"targetVersionTag":{"type":["string","null"],"default":null},"currentVersionTag":{"type":["string","null"],"default":null}}},"logicalName":"save_client_profile","displayName":"save_client_profile","title":"save_client_profile","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"dmf_export_package","description":"Trigger a bulk export through the Data Management package REST API and return\nthe download URL when complete. NOTE: the DMF EXPORT project (definitionGroupId)\nmust already exist in FO with its entities + mapping configured -- create it with\ndmf_create_data_project if needed. For ad-hoc exports without a project, use\nodata_export_entity instead.","inputSchema":{"type":"object","required":["definitionGroupId","legalEntity"],"properties":{"reExecute":{"type":"boolean","default":true},"legalEntity":{"type":"string"},"packageName":{"type":["string","null"],"default":null},"definitionGroupId":{"type":"string"},"pollTimeoutSeconds":{"type":"integer","default":300}}},"logicalName":"dmf_export_package","displayName":"dmf_export_package","title":"dmf_export_package","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"list_release_note_inputs","description":"WHEN: ALWAYS call this FIRST, before prepare_release_note_context -- it discovers the exact D365FO version strings and custom model ids actually indexed on THIS server, which you cannot guess. Triggers: 'release note', 'compare D365 versions', 'upgrade impact for a client', 'what changed for this client', 'regression risk', 'note de version'. Returns every indexed version (exact 'version' string to use as v1/v2, e.g. 10.0.2527.109) and every ready-to-use custom model (exact 'id' to use as custom","inputSchema":{"type":"object","properties":{}},"annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"list_release_note_inputs","displayName":"list_release_note_inputs","title":"list_release_note_inputs"},{"name":"federated_search","description":"Fan-out search across multiple ALM XPP MCP server instances in parallel and merge results using Reciprocal Rank Fusion (RRF). Useful when D365 code is split across multiple organisations or knowledge bases (e.g. one per client, one standard KB). Peer servers are configured via D365_FEDERATION_PEERS env var (comma-separated list of base URLs, e.g. https://org2.almxpp.com). The local server is always included as the primary source.","inputSchema":{"type":"object","required":["query"],"properties":{"topK":{"type":"integer","default":5},"query":{"type":"string"},"peerApiKeys":{"type":["string","null"],"default":null}}},"annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"federated_search","displayName":"federated_search","title":"federated_search"},{"name":"search_labels","description":"Search D365 F&O labels across all indexed languages. Given text (e.g. 'Sales order'), finds the matching label ID (@SYS12345). Given a label ID (e.g. '@SYS12345' or '@SYS:12345'), finds the text in all languages. Accepts both D365 short form (@SYS124480) and colon form (@SYS:124480) -- both are normalized automatically. Searches across 392K+ label entries. WORKFLOW: call search_labels first to resolve the label text, then call find_references with the same label ID to find ALL X++ objects (forms","inputSchema":{"type":"object","required":["query"],"properties":{"query":{"type":"string"},"language":{"type":["string","null"],"default":null},"maxResults":{"type":"integer","default":20}}},"annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"search_labels","displayName":"search_labels","title":"search_labels"},{"name":"list_custom_model_objects","description":"WHEN: developer wants to see what custom/extension objects exist in their model. Triggers: 'list my custom objects', 'what have we customized', 'show ISV objects', 'list custom model', 'what objects are in our model'. List all D365 F&O objects in the custom/extension model directory on disk. Reads the file system directly -- always reflects the latest uncommitted state. Pass `customModelPath` to specify a model directory; or set it once via the `D365-Custom-Model-Path` header in your .mcp.json (","inputSchema":{"type":"object","properties":{"customModelPath":{"type":["string","null"],"default":null}}},"annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"list_custom_model_objects","displayName":"list_custom_model_objects","title":"list_custom_model_objects"},{"name":"analyze_upgrade_impact","description":"WHEN: upgrading D365 F&O to a new version or applying a Microsoft update -- check if your custom code will break. Triggers: 'upgrade D365', 'mise à niveau', 'will this break after upgrade', 'compatibilité après upgrade', 'impact de la mise à jour', 'check CoC targets after update'. Analyze upgrade risk for your custom D365 F&O model. Cross-references EVERY Chain of Command target, event handler hook, table/form/class extension, and hard-coded object reference in your custom model against the sta","inputSchema":{"type":"object","properties":{}},"annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"analyze_upgrade_impact","displayName":"analyze_upgrade_impact","title":"analyze_upgrade_impact"},{"name":"fix_best_practice_violations","description":"WHEN: validate_best_practices returned violations and you want concrete X++ fix suggestions. Returns each BP violation with its built-in fix suggestion AND (when Ollama is available) an AI-generated X++ code patch using the source from the knowledge base. Triggers: 'fix best practice', 'corriger les violations', 'generate fix', 'patch BP'. Set generatePatches=true to call Ollama (ALMXPP_SUMMARIZE_MODEL) for code patches -- requires Ollama running at OLLAMA_HOST. Falls back to built-in fix sugges","inputSchema":{"type":"object","required":["objectName"],"properties":{"objectName":{"type":"string"},"maxViolations":{"type":"integer","default":10},"generatePatches":{"type":"boolean","default":false}}},"annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"fix_best_practice_violations","displayName":"fix_best_practice_violations","title":"fix_best_practice_violations"},{"name":"get_menu_item_info","description":"WHEN: developer needs to resolve a menu item -- find its target object (form / action / output), linked security privilege, label, and parameters. Triggers: 'menu item info', 'what does menu item X open', 'menu item target', 'security privilege for menu item'. Cloud-safe: parses the AxMenuItem XML already loaded in the KB. Returns the resolved object name, menu item type (Display/Action/Output), linked privilege, and the form/class/report it points to.","inputSchema":{"type":"object","required":["menuItemName"],"properties":{"menuItemName":{"type":"string"},"menuItemType":{"type":["string","null"],"default":null}}},"annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"get_menu_item_info","displayName":"get_menu_item_info","title":"get_menu_item_info"}],"toolSource":"directory_preview","agentAction":"both","installLinks":[{"id":"cursor","label":"Cursor","href":"cursor://anysphere.cursor-deeplink/mcp/install?name=ALM-XPP&config=eyJ1cmwiOiAiaHR0cHM6Ly9hcGkuYWxteHBwLmNvbS9tY3AifQ%3D%3D"},{"id":"vscode","label":"VS Code","href":"vscode:mcp/install?%7B%22name%22%3A%22ALM-XPP%22%2C%22type%22%3A%22http%22%2C%22url%22%3A%22https%3A%2F%2Fapi.almxpp.com%2Fmcp%22%7D"},{"id":"vscode-insiders","label":"VS Code Insiders","href":"vscode-insiders:mcp/install?%7B%22name%22%3A%22ALM-XPP%22%2C%22type%22%3A%22http%22%2C%22url%22%3A%22https%3A%2F%2Fapi.almxpp.com%2Fmcp%22%7D"},{"id":"claude-web","label":"Claude.ai","href":"https://claude.ai/customize/connectors?modal=add-custom-connector&connectorName=ALM+XPP&connectorUrl=https%3A%2F%2Fapi.almxpp.com%2Fmcp"},{"id":"codex","label":"Codex","copyText":"codex mcp add \"ALM-XPP\" --url \"https://api.almxpp.com/mcp\""},{"id":"chatgpt","label":"ChatGPT","href":"https://www.mcpbundles.com/docs/integrations/chatgpt"}],"catalogUrl":"https://www.mcpbundles.com/api/directory/v1/servers/almxpp-mcp-4a9217a941","callUrl":"https://www.mcpbundles.com/api/directory/v1/servers/almxpp-mcp-4a9217a941/tools/{tool}","mcpServerUrl":"https://api.almxpp.com/mcp","liveCatalogUrl":"https://www.mcpbundles.com/api/directory/v1/servers/almxpp-mcp-4a9217a941?live=1"}