Repository navigation
MCP: the four entry tools are marked alwaysLoad (#3898 D10) - #4113
Merged
Merged
Conversation
list_servers, get_fleet_overview, analyze_server and get_tool_guide now carry _meta["anthropic/alwaysLoad"] = true in tools/list, set through a small allow-list in WithGeminiCompatibleTools so Claude Code keeps them loaded when it defers the rest. Lite has no get_fleet_overview, so it gets the other three. Pinned with a new test class on each product. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01QQh8LczP1HGLXQYAx4oTZC
…e per registration A JsonNode is mutable and belongs to one parent, so each McpServerTool now gets its own JsonObject from the singleton factory instead of sharing one instance across every service provider that builds the tool. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01QQh8LczP1HGLXQYAx4oTZC
erikdarlingdata
marked this pull request as ready for review
September 24, 2026 03:16
erikdarlingdata
enabled auto-merge (squash)
September 24, 2026 03:16
…ider schema options McpSchemaCompat.cs conflicted with #4110 (#4075). Both sides stay: the alwaysLoad name set and Meta, and SchemaOptionsFor(services) in place of the shared GeminiCompatSchemaOptions. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01NUU29PuGg9TUFBsACgZg2K
erikdarlingdata
added a commit
that referenced
this pull request
Sep 24, 2026
* Add 48 buffered CHANGELOG entries in one splice Adds 48 entries and 48 link refs (#4057, #4077, #4079, #4081, #4082, #4083, #4084, #4085, #4086, #4087, #4088, #4089, #4090, #4091, #4092, #4093, #4095, #4096, #4099, #4100, #4101, #4103, #4105, #4106, #4107, #4108, #4109, #4110, #4111, #4113, #4114, #4115, #4116, #4117, #4118, #4119, #4120, #4121, #4122, #4123, #4124, #4125, #4126, #4127, #4131, #4133, #4136, #4141). Each PR's entry was buffered, and this lands every entry whose PR was merged on origin/dev when it ran. Entries found under a bare section line (none unless the old script ran again) move into the matching ### section, below the new entries. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01QQh8LczP1HGLXQYAx4oTZC * Changelog splice: add #4137's entry, which merged before the splice but was missed #4137 (pg_plan_capture reads csvlog) merged at 05:57Z with a CHANGELOG entry section in its body. It was neither spliced nor listed as needing no entry. Its entry goes under Fixed, right after #4136's, and #4136's last sentence now points to it instead of saying plan capture is unchanged. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01NUU29PuGg9TUFBsACgZg2K --------- Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Refs #3898.
Why
This is Erik's ruling D10 on #3898. It says to mark exactly four MCP entry tools with
anthropic/alwaysLoadin their_meta, on each product that has them. Claude Code then keeps these tools loaded when it defers the rest of the tool surface.What changes
https://code.claude.com/docs/en/mcp.md), section "Exempt a server from deferral". The exact doc line: "An MCP server can also mark individual tools as always-loaded by including"anthropic/alwaysLoad": truein the tool's_metaobject, which has the same effect for that tool only."McpServerToolCreateOptions.Metais aSystem.Text.Json.Nodes.JsonObject. Its own XML doc says it "is used to seed theTool.Metaproperty".Tool.Metais aJsonObjecttoo, confirmed by reflection on the installed package.AlwaysLoadedToolNames) insideWithGeminiCompatibleToolsinPerformanceMonitor.Common/Mcp/McpSchemaCompat.cs. For a tool whose registered name is in the list, the registration now setsoptions.Meta = new JsonObject { ["anthropic/alwaysLoad"] = true }. No tool class was hand-edited.list_servers,get_fleet_overview,analyze_server, andget_tool_guide. Darling registers all four tool classes that declare these names, so Darling serves all four with the meta key. Lite has noget_fleet_overview. That read is central-store-only, Darling only. So Lite serves the other three:list_servers,analyze_server,get_tool_guide.McpToolsListBudgetTests(Darling and Lite) andMcpSchemaCompatTests(Lite) still pass unmodified. Adding_metato four tools' served payload left the per-class budget files and the Gemini-schema golden tests alone. No file needed a fix.Test plan
There is a new test class on each product,
McpAlwaysLoadedToolsTests. It builds the real served tool list through the sameWithGeminiCompatibleToolsregistration path the host uses, with no running server needed. It asserts the_meta["anthropic/alwaysLoad"] = truekey is present on exactly the expected names, and on no other tool.PerformanceMonitor.Commonbuilds with 0 warnings.Lite.Testsbuilds with 0 warnings.McpAlwaysLoadedToolsTestson Lite: 2 tests pass.McpToolsListBudgetTestsplusMcpSchemaCompatTestson Lite: 8 tests pass.Darling.Testsbuilds with 0 warnings.McpAlwaysLoadedToolsTestson Darling: 2 tests pass.McpToolsListBudgetTestson Darling: 5 tests pass.Lite.Testssuite: 5268 total, 0 errors, 0 failed, 0 skipped.Darling.Testssuite: 13326 total, 0 errors, 2 failed, 636 skipped. The skips are the live-Postgres and live-runtime classes. This lane did not stand up that rig. The 2 failures are the twoDarlingInstallLocationTeststhat fail on a non-elevated run until DarlingInstallLocationTests: the #4052 checks pass when run non-elevated #4111 merges (it has since merged):ThePreLockWritableExtractionCheck_TrustsTheAccountTheLockItselfGranted_OnAnAlreadyLockedTreeandTheInstallTreeLock_ClosesTheInheritedGrant_KeepsProtectedFiles_AndReportsWhatItCannotClose. Neither touches MCP registration or this diff.Coordinator verification
"anthropic/alwaysLoad": truein the tool's_metaobject, which has the same effect for that tool only." I checked the live page._metaJsonObject was built once per tool at registration and shared by every service provider that built the tool. A JsonNode is mutable and belongs to one parent, so the singleton factory now builds a fresh one for each tool it creates.McpSchemaCompat.csconflicted with dev in two places. I kept both sides. TheAlwaysLoadedToolNamesset and the per-toolMetastay, and tool creation now uses dev'sSchemaOptionsFor(services)instead of the sharedGeminiCompatSchemaOptions. After the merge, both builds have 0 warnings. I ran the targeted classes:McpAlwaysLoadedToolsTests, the schema-compat and Lite budget test sometimes sees get_alert_history's dataService parameter in a full run #4075 race tests, the budget, unknown-argument and inventory pins, andMcpToolGuide*. Darling ran 147 tests and Lite 73, with 0 failed.Handoff
Nothing open. The coordinator moved the changelog entry into the buffer as
4113-reported.txtand reworded it to name the Darling-only tool.🤖 Generated with Claude Code
https://claude.ai/code/session_01QQh8LczP1HGLXQYAx4oTZC