The MCP specification deprecated the Roots feature as of spec version 2026-07-28 (SEP-2577), and the ModelContextProtocol C# SDK now marks its Roots types obsolete (MCP9005 warnings).
Roots is still the contract our stdio MCP server's file sandbox enforces: McpPlanPathPolicy (src/PlanViewer.Cli/ReplSurface/McpPlanPathPolicy.cs) resolves the client's advertised roots via Repl.Mcp's IMcpClientRoots and denies plan_open outside them (including symlink escapes and empty-roots clients). McpSmokeTests.cs is the regression coverage for that guard, and its client-side Roots setup is what trips MCP9005 — suppressed there with a comment referencing this issue as of the 2026-09 maintenance pass.
What eventually needs to happen:
- Decide the replacement mechanism for scoping which plan files the server may open once Roots is removed from the spec/SDK (whatever SEP-2577 points to, or an explicit allowlist argument at serve time).
- This also depends on Repl.Mcp: the IMcpClientRoots abstraction comes from the Repl packages, so their migration path matters.
- When migrated, remove the pragma warning disable MCP9005 from tests/PlanViewer.Core.Tests/McpSmokeTests.cs and re-point the smoke tests at the new mechanism.
No urgency until the SDK actually removes the feature, but a future ModelContextProtocol bump may force the decision. Found during the 2026-09 quarterly maintenance pass.
The MCP specification deprecated the Roots feature as of spec version 2026-07-28 (SEP-2577), and the ModelContextProtocol C# SDK now marks its Roots types obsolete (MCP9005 warnings).
Roots is still the contract our stdio MCP server's file sandbox enforces: McpPlanPathPolicy (src/PlanViewer.Cli/ReplSurface/McpPlanPathPolicy.cs) resolves the client's advertised roots via Repl.Mcp's IMcpClientRoots and denies plan_open outside them (including symlink escapes and empty-roots clients). McpSmokeTests.cs is the regression coverage for that guard, and its client-side Roots setup is what trips MCP9005 — suppressed there with a comment referencing this issue as of the 2026-09 maintenance pass.
What eventually needs to happen:
No urgency until the SDK actually removes the feature, but a future ModelContextProtocol bump may force the decision. Found during the 2026-09 quarterly maintenance pass.