Skip to content

[WIP][MCP] Server Features in MCP configuration: API Tools, Dynamic Tool Mode, AL Query Tools (Preview)#8085

Draft
onbuyuka wants to merge 10 commits into
mainfrom
private/onbuyuka/631012-al-query-mcp-config-ui
Draft

[WIP][MCP] Server Features in MCP configuration: API Tools, Dynamic Tool Mode, AL Query Tools (Preview)#8085
onbuyuka wants to merge 10 commits into
mainfrom
private/onbuyuka/631012-al-query-mcp-config-ui

Conversation

@onbuyuka
Copy link
Copy Markdown
Contributor

@onbuyuka onbuyuka commented May 11, 2026

Summary

Adds a Server Features surface to the MCP configuration card so admins can opt configurations into the upcoming AL Query Tools (Preview) MCP runtime, alongside the existing Dynamic Tool Mode and API Tools controls. Each feature is a self-contained handler behind an interface, so the card is data-driven and extensible. The shape is intentional; storage and runtime hookups land once the platform-side pieces are in (see Pending platform dependencies below).

Feature handlers (interface-based)

  • New interface "MCP Server Features"SetActive / IsActive / HasSettings / OpenSettings / Description / LoadSystemTools. enum "MCP Server Feature" implements it, binding each value to a handler codeunit; resolving ServerFeature := Rec.Feature replaces the old per-feature case blocks.
  • Both the MCP Server Feature List and MCP System Tool List pages are fully generic: each walks ServerFeature.Ordinals() + FromInteger(...) (the same pattern as MCP Config Warning Type) and dispatches every action — activation, settings, descriptions, and system-tool loading — through the handler. Adding a feature is a new enum value + handler codeunit — no page edits.
  • Each feature owns its description, activation, settings, system tools, and rules; SetActive delegates to codeunit "MCP Config Implementation". Dynamic Tool Mode's handler is real (EnableDynamicToolMode / DiscoverReadOnlyObjects + the real system-tool catalog); API Tools and AL Query Tools are platform-pending stubs whose IsActive returns false until the config fields ship.

Card UX

  • Server Features list-part with per-row Activate / Deactivate / Configure, mirroring page 7775 "Copilot AI Capabilities"Copilot Capabilities GA. Configure appears only for features that have settings — gated on a per-row Configurable flag set from the handler's HasSettings().
    • API Tools — gates the Available APIs list-part (Visible = not IsDefault and APIToolsActive), where the admin curates which API pages / queries the client can reach. No settings.
    • Dynamic Tool Mode — its Configure dialog hosts Discover Additional Read-Only Objects; activation flows to EnableDynamicToolMode, deactivation cascade-clears DiscoverReadOnlyObjects. (A "requires API Tools enabled first" gate lives in impl.EnableDynamicToolMode as a commented PLATFORM-PENDING check — inactive until the API Tools field exists.)
    • AL Query Tools (Preview) — contributes the AL Query system tools when active. No settings (the earlier mock Max Rows / Query Timeout were dropped).
  • The single settings StandardDialog (page 8369 "MCP Server Feature Settings") is used only by Dynamic Tool Mode; its handler runs it via OpenSettings, writing on OK.
  • The System Tools list-part (right-rail FactBox, Server Feature column) is rebuilt by iterating the active features and calling each handler's LoadSystemTools. The curated-APIs list-part (page 8352) was renamed 'Available Tools''API Tools''Available APIs' to disambiguate it from the API Tools feature row.

Public API

  • codeunit 8350 "MCP Config" exposes EnableAPITools and EnableALQueryTools — empty // MOCK: no-ops until the platform adds the corresponding MCP Configuration fields — alongside the existing EnableDynamicToolMode. Feature handlers persist activation through codeunit "MCP Config Implementation". (The earlier SetALQueryMaxRowsPerQuery / SetALQueryTimeoutSeconds procedures were removed with the mock sub-settings.)

New objects

  • interface "MCP Server Features"
  • enum 8351 "MCP Server Feature" (implements "MCP Server Features"; API Tools, Dynamic Tool Mode, AL Query Tools)
  • table 8355 "MCP Server Feature" (temporary, in-app; carries a Configurable flag)
  • page 8368 "MCP Server Feature List", page 8369 "MCP Server Feature Settings"
  • handler codeunits 8369 "MCP API Tools Feature", 8368 "MCP AL Query Tools Feature", 8370 "MCP Dyn. Tool Mode Feature"

Pending platform dependencies

This PR is WIP pending platform-side work:

  1. Activation boolean fields on MCP Configuration for API Tools and AL Query Tools — the handlers delegate to MCP Config Implementation (EnableAPITools / EnableALQueryTools), today empty no-ops, and IsActive returns false. The "API Tools required for Dynamic Tool Mode" gate in impl.EnableDynamicToolMode is commented out until the API Tools field lands.
  2. MCP Utilities exposing the real AL Query system tool catalog (replacing the hardcoded compile_al_query / run_al_query inserts in the AL Query handler's LoadSystemTools).
  3. The AL Query runtime itself (compile + execute of client-submitted code).

Once those land, each feature's wire-up is localized to its handler codeunit (and impl.Enable*) — grep -rn "MOCK:\|PLATFORM-PENDING:" src/System\ Application/App/MCP/ enumerates every site.

Test plan

  • MCP Config Test (codeunit 130130): facade smoke tests for EnableAPITools and EnableALQueryTools (callable no-ops; // MOCK: placeholders to become real state assertions once the platform fields exist).
  • Server Features TestPage tests on page 8351 "MCP Config Card": the list shows all three features in enum order, Configure is enabled only on Dynamic Tool Mode, activating Dynamic Tool Mode flips its row Status and sets EnableDynamicToolMode, and the part is hidden on the default configuration. (Also fixed TestDefaultConfigurationPage, which still referenced card fields D22 had moved into the Configure dialog.)
  • Manual walkthrough of the Server Features list / Configure / Activate-Deactivate cycle against a local BC instance.

Fixes AB#631012

🤖 Generated with Claude Code

onbuyuka and others added 3 commits May 6, 2026 16:37
…n card

UX-only prototype for the upcoming AL Query MCP server. Replaces the prior
AL Query Server fasttab with a generic Server Features list-part on the card
(Activate / Deactivate / Configure actions per row, mirroring page 7775
"Copilot AI Capabilities") and a per-feature StandardDialog for settings.
Tool Mode toggles (EnableDynamicToolMode + DiscoverReadOnlyObjects) stay on
the General fasttab — they're contract modifiers, not features.

System Tools sub-page now uses a push pattern (parent calls Reload(...))
instead of the prior pull/SubPageLink approach, fixing a render-collapsed bug
that affected newly-visible parts.

No real runtime, no platform fields, no public API, no Export/Import or
telemetry round-trip, no automated tests. See al-query-mock.md "Next steps to
production" for the full path to shipping.

New objects:
- enum 8351 "MCP Server Feature"
- table 8355 "MCP Server Feature" (temp)
- page 8368 "MCP Server Feature List"
- page 8369 "MCP Server Feature Settings"

Fixes AB#631012

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Three empty-body procedures on codeunit 8350 "MCP Config" mirror the existing
EnableDynamicToolMode / EnableDiscoverReadOnlyObjects shapes for the prototype's
AL Query Server feature: EnableALQueryServer, SetALQueryMaxRowsPerQuery, and
SetALQueryTimeoutSeconds. Each has a // MOCK: comment in the implementation
spelling out the GetBySystemId → assign → Modify → LogConfigurationModified
flow to wire up once the platform adds the real fields.

MCPServerFeatureSettings.SaveChanges() is restored as an empty stub with a
commented-out routing-through-the-facade template, and OpenSettings re-gates
the call on Action::OK so the OK/Cancel contract is preserved.

Six minimal MCPConfigTest tests verify each facade procedure is callable; each
is // MOCK commented and just calls the API. Replace with real state assertions
once the platform-side fields exist.

Fixes AB#631012

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@onbuyuka onbuyuka changed the title [MCP] Prototype AL Query Server (Preview) feature in MCP configuration [MCP] AL Query Server (Preview) feature in MCP configuration May 11, 2026
@onbuyuka onbuyuka changed the title [MCP] AL Query Server (Preview) feature in MCP configuration [WIP][MCP] AL Query Server (Preview) feature in MCP configuration May 11, 2026
@github-actions github-actions Bot added this to the Version 29.0 milestone May 11, 2026
Copy link
Copy Markdown
Contributor

@github-actions github-actions Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

AL Documentation Audit

Documentation gaps were detected in the following apps:

  • MCP-Test: 0% documentation coverage
  • MCP: 67% documentation coverage

To generate documentation, run /al-docs init or /al-docs update using GitHub Copilot CLI or Claude Code.
This review is for awareness to help keep documentation in sync with code changes. It is okay to dismiss this request.

onbuyuka and others added 3 commits May 12, 2026 23:39
Removes docs/features/al-query-mcp-config-ui/design.md and
src/System Application/App/MCP/docs/al-query-mock.md from the PR. The code
+ // MOCK: comments are the source of truth going forward.

Fixes AB#631012

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…ature)

- Renamed "AL Query Server" -> "AL Query Tools" everywhere (enum value identifier
  and caption `'AL Query Tools (Preview)'`, facade procedure EnableALQueryServer
  -> EnableALQueryTools, test names, comments).

- Dynamic Tool Mode is back in the Server Features list as a feature row (enum
  ordinal 0, replacing the blank value introduced earlier). Removed
  EnableDynamicToolMode and DiscoverReadOnlyObjects fields from the card's
  General fasttab, along with the Tool Modes description block and its labels.
  Discover Additional Read-Only Objects is now exposed in the Configure dialog
  under Dynamic Tool Mode (loaded from / saved to Rec.DiscoverReadOnlyObjects
  on OK). The cascade "deactivating Dynamic Tool Mode clears
  DiscoverReadOnlyObjects" lives in the row's SetActive. LoadSystemTools tags
  the search/describe/invoke system tools with the Dynamic Tool Mode enum
  value so every System Tools row has a concrete feature label.

- MCPConfigToolList caption: 'Available Tools' -> 'API Tools'. All three CUD
  actions (SelectTools, AddToolsByAPIGroup, AddStandardAPITools) guard on
  `Enabled = not IsConfigActive`. New internal SetConfigActive(IsActive)
  procedure accepts a push from MCPConfigCard.RefreshSubPages. The redraw is
  triggered by CurrPage.Update() at the end of Active.OnValidate on the card,
  which cascades through UpdatePropagation = Both.

- System Tools list-part moved from area(Content) to area(FactBoxes).

- Restored docs/features/al-query-mcp-config-ui/design.md with D21-D24,
  iteration entries 10-13, and lessons 10-11 covering the above changes.

Fixes AB#631012

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@onbuyuka onbuyuka changed the title [WIP][MCP] AL Query Server (Preview) feature in MCP configuration [WIP][MCP] AL Query Tools (Preview) feature in MCP configuration May 29, 2026
…e APIs"

- enum 8351: API Tools (0), Dynamic Tool Mode (1), AL Query Tools (2)
- Server Features list seeds an API Tools row; activation is a page-local
  mock (APIToolsActiveLocal) exposed via IsAPIToolsActive()
- Dynamic Tool Mode pre-flights API Tools (APIToolsRequiredForDynamicErr)
- Card: "Available APIs" sub-part gated on `not IsDefault and APIToolsActive`
- page 8352 caption 'API Tools' -> 'Available APIs'; description labels updated
- design.md D25 / Appendix C #14 corrected to match the code (no AllowProdChanges
  relocation; API Tools Configure has no sub-settings yet)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@onbuyuka onbuyuka changed the title [WIP][MCP] AL Query Tools (Preview) feature in MCP configuration [WIP][MCP] Server Features in MCP configuration: API Tools, Dynamic Tool Mode, AL Query Tools (Preview) May 29, 2026
onbuyuka and others added 3 commits May 29, 2026 12:58
Introduce interface "MCP Feature Handler" implemented by enum
"MCP Server Feature"; each feature is a handler codeunit (MCP API Tools
Feature 8369, MCP AL Query Tools Feature 8368, MCP Dyn. Tool Mode Feature
8370). The list page resolves a handler and dispatches instead of a
per-feature case, and Reload walks the enum's Ordinals()/FromInteger()
so adding a feature needs no page edit.

- Description, activation, settings, and the Dynamic-Tool-Mode-requires-
  API-Tools pre-flight live in the handlers; the page holds no per-feature data
- temp table gains Configurable (= Handler.HasSettings()); Configure gates on it
- Dynamic Tool Mode handler is real; API Tools + AL Query are platform-pending
  stubs (IsActive returns false until the MCP Configuration booleans ship)
- drop AL Query Tools mock sub-settings (Max Rows / Query Timeout) and the
  SetALQueryMaxRowsPerQuery / SetALQueryTimeoutSeconds facade + impl + 4 tests
- extend MCP/app.json idRanges to 8365-8370 for the handler codeunits
- design.md D26 + D27

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…tem tools

- rename interface "MCP Feature Handler" -> "MCP Server Features"
- handlers' SetActive delegate to MCP Config Implementation (EnableAPITools
  added to facade + impl, mock); the "API Tools required for Dynamic Tool Mode"
  gate moved into impl.EnableDynamicToolMode as a PLATFORM-PENDING commented
  check (inactive until the API Tools field is in symbols)
- add LoadSystemTools to the interface; Dyn. Tool Mode emits the real
  GetSystemToolsInDynamicMode() catalog, AL Query the mock tools, API Tools
  none; remove impl.LoadSystemTools + InsertSystemTool + the Include* flags
- MCP System Tool List.Reload(ConfigId) iterates the enum and dispatches to
  each active feature; card calls SystemToolList.Reload(Rec.SystemId)
- rename interface vars Handler -> ServerFeature

design.md D28-D29.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- API Tools facade smoke tests (EnableAPITools enable/disable)
- Server Features TestPage tests on MCP Config Card: lists all three features,
  Configure gated to Dynamic Tool Mode, Activate flips status + sets
  EnableDynamicToolMode, part hidden on the default configuration
- fix TestDefaultConfigurationPage: drop assertions on EnableDynamicToolMode /
  DiscoverReadOnlyObjects fields that D22 moved off the card (stale TestPage
  references that blocked the test codeunit from compiling)
- design.md Appendix C #19

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant