Skip to content

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

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

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

Conversation

@onbuyuka

@onbuyuka onbuyuka commented May 11, 2026

Copy link
Copy Markdown
Contributor

Summary

Adds a Server Features surface to the MCP configuration card so admins can opt configurations into the Data 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. Activation persists on the real MCP Configuration fields shipped in BC-Platform #44811; only the Data Query Tools server runtime lands separately (see Platform dependency).

Feature handlers (interface-based)

  • New interface "MCP Server Features"SetActive / IsActive / HasSettings / OpenSettings / Description / LoadSystemTools / TryGetParentFeature. 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", which reads/writes the real MCP Configuration fields (EnableDynamicToolMode, EnableApiTools, EnableAlQueryTools); IsActive reads them back.

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(). Dynamic Tool Mode renders indented as a sub-feature of API Tools (TryGetParentFeature + an Indentation column on the temp table).
    • 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 Read-Only Objects; activation flows to EnableDynamicToolMode, deactivation cascade-clears DiscoverReadOnlyObjects. Enabling it requires API Tools to be enabled firstimpl.EnableDynamicToolMode enforces the gate (APIToolsRequiredForDynamicErr).
    • Data Query Tools (Preview) — contributes the Data Query Tools system tools when active. No settings.
  • Available APIs (page 8352) — the curated API list. Its Select APIs action opens a single lookup listing both API pages and API queries (new temp table "MCP API Object Buffer" + page "MCP API Object Lookup", populated by impl.LookupAPIObjects); the per-row Object Id lookup shares the same path. The part was renamed 'Available Tools''API Tools''Available APIs' to disambiguate it from the API Tools feature row.
  • 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) is rebuilt by iterating the active features and calling each handler's LoadSystemTools.

Configuration list (page 8350)

  • The Default field is read-only on the card; Set as Default / Clear Default actions (promoted) live on the configuration list instead.
  • Read-only API Tools / Data Query Tools status columns (bound to Rec.EnableApiTools / Rec.EnableAlQueryTools) replaced the previous Dynamic Tool Mode / Discover Read-Only Objects columns.

Public API

  • codeunit 8350 "MCP Config" exposes EnableAPITools and EnableDataQueryTools alongside the existing EnableDynamicToolMode / EnableDiscoverReadOnlyObjects. The two feature procedures read/write the MCP Configuration.EnableApiTools / .EnableAlQueryTools fields.

New objects

  • interface "MCP Server Features"
  • enum 8351 "MCP Server Feature" (implements "MCP Server Features"; API Tools, Dynamic Tool Mode, Data Query Tools)
  • table 8355 "MCP Server Feature" (temporary; carries Configurable + Indentation)
  • table 8357 "MCP API Object Buffer" (temporary; unifies API pages + queries for the Select APIs lookup)
  • page 8368 "MCP Server Feature List", page 8369 "MCP Server Feature Settings", page 8376 "MCP API Object Lookup"
  • handler codeunits 8369 "MCP API Tools Feature", 8368 "MCP Data Query Tools Feature", 8370 "MCP Dyn. Tool Mode Feature"

Deprecated

  • Pages 8353 "MCP API Config Tool Lookup" / 8367 "MCP Query Config Tool Lookup" are obsoleted (ObsoleteState = Pending, ObsoleteTag = '29.0', wrapped in #if not CLEAN29) — superseded by the unified MCP API Object Lookup (8376). They're public System Application objects, so they're deprecated rather than deleted (removing them breaks dependent extensions — AS0029). Their internal MCP Config Implementation lookup procedures (LookupAPIPageTools / LookupAPIQueryTools) and the test-library wrappers were removed (neither is public surface).

Permissions

  • MCP - Objects lists the new app tables (MCP Server Feature, MCP API Object Buffer).

Platform dependency

BC-Platform PR #44811 has merged, and this PR is productionized against it — no mocks remain (grep -rn "MOCK:|PLATFORM-PENDING" "src/System Application/App/MCP/" is empty).

  • Activation persists on MCP Configuration.EnableApiTools (field 8, InitValue = true) / .EnableAlQueryTools (field 9), read/written through four MCP Config Implementation procedures. An upgrade (MCP Upgrade.EnableApiToolsOnExistingConfigurations) turns API Tools on for existing configurations (InitValue only covers new ones).
  • Data Query Tools system tools come from "MCP Utilities".GetSystemToolsInDataQuery().

The platform uses the "AL Query Tools" field name; our UX stays "Data Query Tools" (it maps onto EnableAlQueryTools).

The Data Query Tools server runtime (compile + execute of client-submitted AL queries) is a separate, larger platform dependency — this PR only configures and advertises the tools. See Appendix E in docs/features/al-query-mcp-config-ui/design.md.

Test plan

  • MCP Config Test (codeunit 130130): activation tests asserting the real EnableApiTools / EnableAlQueryTools field state; a Server Features TestPage set on page 8351 "MCP Config Card" (the list shows all three features in 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; API Tools is enabled before Dynamic Tool Mode so the gate is satisfied); TestLookupAPIObjects exercising the unified API lookup; and Export/Import round-trip tests asserting the two new fields survive.
  • Manual walkthrough of the Server Features list / Configure / Activate-Deactivate cycle and the Select APIs lookup 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

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown
Contributor

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 7 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>
…te/onbuyuka/631012-al-query-mcp-config-ui
Continues the Server Features work with activation persistence and UX polish.

- Persistence (mock): new internal table 8360 "MCP Feature Activation" holds the
  API Tools / AL Query Tools activation flags keyed by config SystemId, behind four
  MCP Config Implementation procedures (EnableAPITools/EnableALQueryTools and
  IsAPIToolsEnabled/IsALQueryToolsEnabled). These flags belong on the platform-owned
  MCP Configuration table, which the app can't extend; every mock site is tagged
  "// MOCK:" and Appendix E of the design doc lists the exact steps to remove them.
- Gate: EnableDynamicToolMode now requires API Tools to be enabled first
  (APIToolsRequiredForDynamicErr) - previously a platform-pending stub.
- Dynamic Tool Mode renders as an indented sub-feature of API Tools
  (interface TryGetParentFeature + MCP Server Feature.Indentation).
- UI polish: align the curated list with "Available APIs" terminology (action and
  field renames), drop the Server Feature column from the System Tools factbox, and
  promote Export/Import on the config list.
- Tests: enable API Tools before Dynamic Tool Mode so the new gate is satisfied.
- Docs: design doc D30-D32, Appendix C #20-22, Appendix D #12-13, and a new
  Appendix E "Productionizing - removing the mocks". D32 / Appendix D #13 record the
  card list-part "always collapsed" investigation (BC platform limitation, AL #6258).

AB#631012

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Review follow-ups on top of d71487c:

- Tag the MCPConfigCard.APIToolsActive page-local with "// MOCK:" so the
  productionizing grep surfaces it (it reads the mock activation table). The note
  is comment-only - the page-local code itself stays.
- Correct two stale "// MOCK:" comments in MCP Config Test that still called the
  EnableAPITools / EnableALQueryTools facade procedures "no-ops with no
  persistence" - they persist to the mock "MCP Feature Activation" table now.
- Shorten the Dynamic Tool Mode setting caption "Discover Additional Read-Only
  Objects" -> "Discover Read-Only Objects" (the longer one truncated in the
  dialog); the tooltip keeps the full meaning and it matches the config list
  page's default caption.
- Design doc Appendix E: note the card + facade mock comments are comment-only and
  "// MOCK:"-tagged, and drop the contradictory "not a mock" bullet for
  APIToolsActive.

AB#631012

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
8356 is contiguous with table 8355 "MCP Server Feature" (8360 left a gap) and is
a free table ID within the app's 8350-8362 idRange. Every reference to the table
is by name, so there are no code-wiring changes - only the table declaration and
the design doc's 8360 mentions. PR description updated to match.

AB#631012

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@onbuyuka
onbuyuka force-pushed the private/onbuyuka/631012-al-query-mcp-config-ui branch from 3a3217d to 49b399f Compare June 2, 2026 08:52
onbuyuka and others added 3 commits June 2, 2026 14:31
Implements the review feedback on the MCP configuration feature plus a
follow-up quality pass.

Feedback:
- Default field is read-only on the card; Set as Default / Clear Default
  actions (promoted) are back on the configuration list.
- Renamed AL Query Tools -> Data Query Tools (Preview) across the code: enum
  value, handler codeunit (MCP Data Query Tools Feature), facade/impl
  procedures, the mock activation field, and tests. The mock system-tool IDs
  compile_al_query / run_al_query are kept.
- Select APIs opens one lookup over both API pages and API queries (new temp
  table "MCP API Object Buffer" + page "MCP API Object Lookup", populated by
  MCPConfigImplementation.LookupAPIObjects). The per-row Object Id lookup
  shares the same path.
- Configuration list shows read-only API Tools / Data Query Tools status
  columns instead of Dynamic Tool Mode / Discover Read-Only Objects.
- Permissions: registered the recently-added tables and the new buffer in
  "MCP - Objects" and granted tabledata on the persistent MCP Feature
  Activation (R/IMD) - these were missing and broke the feature for non-SUPER
  users.

Quality pass:
- Removed the now-orphaned per-type lookups (LookupAPIPageTools /
  LookupAPIQueryTools, pages "MCP API Config Tool Lookup" / "MCP Query Config
  Tool Lookup", their test-library wrappers and two tests) in favour of the
  unified lookup; one TestLookupAPIObjects smoke test replaces them.
- "MCP API Object Buffer" declared TableType = Temporary (matching sibling
  buffers); temp-record variable naming aligned to the LinterCop convention
  (locals Temp-prefixed, parameters not).

Design doc updated throughout (D33-D34, Appendix C #23-24, Appendix E, the AL
Query -> Data Query naming note, lookup page renumber 8360 -> 8376).

AB#631012

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

Stages the productionized versions of the mocked activation persistence + Data
Query Tools catalog next to each mock, so productionizing once BC-Platform PR
#44811 lands is "uncomment + delete the mock". #44811 adds
MCP Configuration.EnableApiTools (field 8, InitValue = true) + .EnableAlQueryTools
(field 9) and "MCP Utilities".GetSystemToolsInDataQuery().

- MCP Config Implementation: commented real versions of the four activation
  procedures (read/write the platform fields).
- MCP Data Query Tools Feature.LoadSystemTools: commented real version using
  GetSystemToolsInDataQuery().
- MCP Upgrade: commented EnableApiToolsOnExistingConfigurations (+ tag,
  registration, call) to set EnableApiTools := true on existing configurations
  (the field's InitValue only covers new ones).
- MCP Config Test: commented real-assertion versions of the four activation tests.
- MCP Config List: commented Rec.EnableApiTools / Rec.EnableAlQueryTools field
  bindings next to the function-sourced status columns; trimmed the redundant
  facade/card mock comments.

All pre-staged blocks are tagged // PLATFORM-PENDING (BC-Platform PR #44811).
Design doc Appendix E + D35 updated. UX keeps "Data Query Tools"; it maps onto
the platform's EnableAlQueryTools field.

AB#631012

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
BC-Platform PR #44811 landed (MCP Configuration.EnableApiTools field 8
InitValue = true, .EnableAlQueryTools field 9, and
"MCP Utilities".GetSystemToolsInDataQuery()), so this removes every mock and
wires the feature to the real platform members.

- MCP Config Implementation: the four activation procedures read/write the real
  EnableApiTools / EnableAlQueryTools fields (writes via LogConfigurationModified).
  Reads fall back to Init() for a not-yet-saved config so a new config reflects
  the InitValue default.
- MCP Data Query Tools Feature.LoadSystemTools: consumes GetSystemToolsInDataQuery().
- MCP Upgrade: EnableApiToolsOnExistingConfigurations turns API Tools on for
  existing configs on upgrade (InitValue only covers new ones).
- MCP Config List: API Tools / Data Query Tools status columns bind to the real fields.
- Deleted mock table 8356 "MCP Feature Activation" + its permission-set entries.

New-config fix: the card's Name.OnValidate persists the config (CurrPage.Update
when IsNullGuid(SystemId)) the moment it's named, so its Server Features can be
configured without first closing the card.

Export/Import: now carries enableApiTools / enableAlQueryTools, with round-trip
tests asserting both the JSON keys and the imported field values.

MCP Config Test: the four activation tests assert the real field state.
Design doc updated (Appendix E flipped to "completed"; decision log D36-D38).

AB#631012

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@onbuyuka onbuyuka changed the title [WIP][MCP] Server Features in MCP configuration: API Tools, Dynamic Tool Mode, AL Query Tools (Preview) [MCP] Server Features in MCP configuration: API Tools, Dynamic Tool Mode, Data Query Tools (Preview) Jun 4, 2026
@onbuyuka
onbuyuka marked this pull request as ready for review June 4, 2026 13:19
@onbuyuka
onbuyuka requested review from a team as code owners June 4, 2026 13:19
@github-actions

github-actions Bot commented Jun 8, 2026

Copy link
Copy Markdown
Contributor

$\textbf{🟡\ Medium\ Severity\ —\ Performance} \quad \color{gray}{\texttt{\small Iteration\ 1}}$

RefreshSubPages fires DB reads on every record navigation

RefreshSubPages() is called from OnAfterGetCurrRecord, which fires every time the user navigates to a different row on the configuration card. Each call invokes IsActive(ConfigId) for every feature enum value (currently 3 features), issuing at least 3 database reads per navigation. Users rapidly scrolling through configurations will trigger a burst of reads.

Recommendation:

  • Move the full RefreshSubPages reload out of OnAfterGetCurrRecord and keep it only in OnAfterGetRecord (triggered once per record load) plus the specific OnValidate handlers that actually change feature state, rather than on every cursor movement.
trigger OnAfterGetRecord()
begin
    IsDefault := MCPConfigImplementation.IsDefaultConfiguration(Rec);
    RefreshSubPages();
end;

trigger OnAfterGetCurrRecord()
begin
    // do not reload sub-pages here; already handled in OnAfterGetRecord and OnValidate triggers
end;

Line mapping was unavailable, so this was posted as an issue comment.

👍 useful · ❤️ especially valuable · 👎 wrong - reply with why

@github-actions

github-actions Bot commented Jun 8, 2026

Copy link
Copy Markdown
Contributor

$\textbf{🟠\ High\ Severity\ —\ Upgrade} \quad \color{gray}{\texttt{\small Iteration\ 1}}$

Import allows inconsistent enableApiTools=false + enableDynamicToolMode=true

During ImportConfiguration, both EnableApiTools and EnableDynamicToolMode are written directly to the record before Insert(), with no cross-field validation. A JSON payload containing enableApiTools: false and enableDynamicToolMode: true will produce a configuration that violates the new invariant—Dynamic Tool Mode requires API Tools—without raising any error.

Recommendation:

  • After reading all boolean flags from JSON and before MCPConfiguration.Insert(), add a consistency check: if EnableDynamicToolMode is true but EnableApiTools is false, either force EnableApiTools := true or throw an import error.
if MCPConfiguration.EnableDynamicToolMode and not MCPConfiguration.EnableApiTools then
    MCPConfiguration.EnableApiTools := true; // enforce prerequisite on import

Line mapping was unavailable, so this was posted as an issue comment.

👍 useful · ❤️ especially valuable · 👎 wrong - reply with why

@github-actions

github-actions Bot commented Jun 8, 2026

Copy link
Copy Markdown
Contributor

$\textbf{🟡\ Medium\ Severity\ —\ Upgrade} \quad \color{gray}{\texttt{\small Iteration\ 1}}$

Missing negative test for Dynamic Tool Mode + API Tools gate

The test TestEnableDynamicToolMode was updated to first enable API Tools before enabling Dynamic Tool Mode, ensuring the positive path succeeds. However, there is no test that verifies calling EnableDynamicToolMode(ConfigId, true) when API Tools is disabled raises APIToolsRequiredForDynamicErr. Without a negative test, a future regression removing or relocating the guard would go undetected.

Recommendation:

  • Add a test procedure (e.g., TestEnableDynamicToolModeRequiresAPITools) that calls MCPConfig.EnableDynamicToolMode(ConfigId, true) on a config where API Tools is disabled and asserts that the expected error is thrown.
[Test]
procedure TestEnableDynamicToolModeRequiresAPITools()
var
    ConfigId: Guid;
begin
    ConfigId := CreateMCPConfig(false, false, true, false);
    // API Tools is off by default on new config
    asserterror MCPConfig.EnableDynamicToolMode(ConfigId, true);
    Assert.ExpectedError('API Tools must be enabled');
end;

Line mapping was unavailable, so this was posted as an issue comment.

👍 useful · ❤️ especially valuable · 👎 wrong - reply with why

darjoo
darjoo previously approved these changes Jun 8, 2026
ankosiorek
ankosiorek previously approved these changes Jun 22, 2026
@github-actions

github-actions Bot commented Jul 6, 2026

Copy link
Copy Markdown
Contributor

$\textbf{🟡\ Medium\ Severity\ —\ Security} \quad \color{gray}{\texttt{\small Iteration\ 1}}$

ImportConfiguration assigns enableDynamicToolMode, discoverReadOnlyObjects, and enableApiTools directly from JSON and inserts the record without reusing the guard logic that enforces 'API Tools must be enabled before Dynamic Tool Mode'.

A crafted import file can therefore persist feature combinations that the interactive toggle flow rejects, weakening the configuration's access-control model. Validate imported feature flags through the same toggle procedures, or re-run the same invariants before insert, so imported configs cannot bypass those checks.

Agent judgement — not directly backed by a BCQuality knowledge article.

Line mapping was unavailable, so this was posted as an issue comment.

👍 useful · ❤️ especially valuable · 👎 wrong - reply with why

@github-actions

github-actions Bot commented Jul 6, 2026

Copy link
Copy Markdown
Contributor

Copilot PR Review

Iteration 3 · Outcome: completed

Knowledge source: https://github.com/microsoft/BCQuality@be1b92b624679f8c031061602e7d3a3b5f71a688

Findings by domain

Findings split into Knowledge-backed (cite a BCQuality article) and Agent (the agent's own judgement, no matching BCQuality rule).

Domain Findings Knowledge-backed Agent Inline Fallback
Other 1 1 0 0 1
Performance 1 1 0 0 0

Totals: 2 knowledge-backed · 0 agent findings.

Orchestrator pre-filter (16 file(s) excluded)

  • layer-disabled (knowledge) : 16 file(s)

Findings produced by the Copilot CLI agent against BCQuality at be1b92b624679f8c031061602e7d3a3b5f71a688. Reply 👎 on any inline comment to flag false positives.

…pp.json newline

- Add ToolTip to Description and Status columns on MCP Server Feature List
- Change 'tool' to 'API' in MCP Config Tool List tooltips to match 'Available APIs' caption
- Restore trailing newline in MCP app.json

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@onbuyuka
onbuyuka dismissed stale reviews from darjoo and ankosiorek via 70be5a9 July 6, 2026 07:38
@onbuyuka
onbuyuka enabled auto-merge July 6, 2026 07:39
nikolakukrika
nikolakukrika previously approved these changes Jul 9, 2026
@github-actions

Copy link
Copy Markdown
Contributor

$\textbf{🟡\ Medium\ Severity\ —\ Other} \quad \color{gray}{\texttt{\small Iteration\ 3}}$

ValidateAPIQueryTool only rejects Microsoft.API.V1 queries; beta query APIs still pass validation.

That means the new unified API-object lookup and Add APIs by API Group path can persist preview query endpoints even though the page flow explicitly filters beta APIs elsewhere. Reject beta query versions in query validation, and keep the selection filters aligned, so configurations cannot expose preview contracts unintentionally.

Line mapping was unavailable, so this was posted as an issue comment.

👍 useful · ❤️ especially valuable · 👎 wrong - reply with why

@gggdttt

gggdttt commented Jul 15, 2026

Copy link
Copy Markdown
Contributor

🟡 Medium Severity — Upgrade Iteration 1

Missing negative test for Dynamic Tool Mode + API Tools gate

The test TestEnableDynamicToolMode was updated to first enable API Tools before enabling Dynamic Tool Mode, ensuring the positive path succeeds. However, there is no test that verifies calling EnableDynamicToolMode(ConfigId, true) when API Tools is disabled raises APIToolsRequiredForDynamicErr. Without a negative test, a future regression removing or relocating the guard would go undetected.

Recommendation:

  • Add a test procedure (e.g., TestEnableDynamicToolModeRequiresAPITools) that calls MCPConfig.EnableDynamicToolMode(ConfigId, true) on a config where API Tools is disabled and asserts that the expected error is thrown.
[Test]
procedure TestEnableDynamicToolModeRequiresAPITools()
var
    ConfigId: Guid;
begin
    ConfigId := CreateMCPConfig(false, false, true, false);
    // API Tools is off by default on new config
    asserterror MCPConfig.EnableDynamicToolMode(ConfigId, true);
    Assert.ExpectedError('API Tools must be enabled');
end;

Line mapping was unavailable, so this was posted as an issue comment.

👍 useful · ❤️ especially valuable · 👎 wrong - reply with why

This one looks make sense. Should we consider it?

@JesperSchulz JesperSchulz added the Integration GitHub request for Integration area label Jul 16, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

AL: System Application Integration GitHub request for Integration area

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants