From 2547169c7c14c468d646a4529194116b1adfb1ee Mon Sep 17 00:00:00 2001 From: clover caruso Date: Tue, 6 Oct 2026 23:11:12 -0700 Subject: [PATCH] Disable shared caching of account-specific MCP tool lists --- dashboard/src/observability.rs | 7 ++++--- dashboard/src/relay.rs | 7 +++++-- tools/dashboard-mcp-test.py | 4 +++- tools/dashboard-relay-test.py | 4 +++- 4 files changed, 15 insertions(+), 7 deletions(-) diff --git a/dashboard/src/observability.rs b/dashboard/src/observability.rs index 8d3849a311c886ed7c67a9cf84cd0ffb608c64f6..0350ded0e7afeecdc968874d9544b79fc52de44b 100644 --- a/dashboard/src/observability.rs +++ b/dashboard/src/observability.rs @@ -2,8 +2,9 @@ use crate::*; use rmcp::{ ErrorData, RoleServer, ServerHandler, model::{ - CallToolRequestParams, CallToolResponse, CallToolResult, ContentBlock, ListToolsResult, - PaginatedRequestParams, ServerCapabilities, ServerConfig, Tool, ToolAnnotations, + CacheScope, CallToolRequestParams, CallToolResponse, CallToolResult, ContentBlock, + ListToolsResult, PaginatedRequestParams, ServerCapabilities, ServerConfig, Tool, + ToolAnnotations, }, service::RequestContext, }; @@ -27,7 +28,7 @@ impl ServerHandler for Observability { let mut properties = json!({"service":{"type":"string"},"q":{"type":"string"},"limit":{"type":"integer","minimum":1,"maximum":500}}); let required = if name=="get_trace" { properties=json!({"service":{"type":"string"},"trace_id":{"type":"string"}}); json!(["service","trace_id"]) } else {json!(["service"])}; Tool::new(name, description, json!({"type":"object","properties":properties,"required":required,"additionalProperties":false}).as_object().unwrap().clone()).with_annotations(ToolAnnotations::new().read_only(true)) - }).collect(), ..Default::default() }) + }).collect(), ttl_ms: Some(0), cache_scope: Some(CacheScope::Private), ..Default::default() }) } async fn call_tool( &self, diff --git a/dashboard/src/relay.rs b/dashboard/src/relay.rs index 3e2e36d489938fe857bc5bf732241f278eb1fabe..1e69e578e3e73839a2fa53415ab7677dd8097b63 100644 --- a/dashboard/src/relay.rs +++ b/dashboard/src/relay.rs @@ -5,8 +5,9 @@ use mcp::{delete, get, hash, list, put, secret}; use rmcp::{ ErrorData, RoleServer, ServerHandler, model::{ - CallToolRequestParams, CallToolResponse, CallToolResult, ContentBlock, ListToolsResult, - PaginatedRequestParams, ServerCapabilities, ServerConfig, Tool, ToolAnnotations, + CacheScope, CallToolRequestParams, CallToolResponse, CallToolResult, ContentBlock, + ListToolsResult, PaginatedRequestParams, ServerCapabilities, ServerConfig, Tool, + ToolAnnotations, }, service::RequestContext, }; @@ -681,6 +682,8 @@ impl ServerHandler for Agents { }).collect(); Ok(ListToolsResult { tools, + ttl_ms: Some(0), + cache_scope: Some(CacheScope::Private), ..Default::default() }) } diff --git a/tools/dashboard-mcp-test.py b/tools/dashboard-mcp-test.py index ae7f5626f58f0f46f75c6e642807b383c6493b42..bbb2cefe937c86f12fe403c78ceea6f4345d4036 100644 --- a/tools/dashboard-mcp-test.py +++ b/tools/dashboard-mcp-test.py @@ -133,7 +133,9 @@ def main(): http("/oauth/token", "POST", form, form=True, status=400) token = tokens["access_token"] assert rpc(token, "initialize", {"protocolVersion": "2025-11-25", "capabilities": {}, "clientInfo": {"name": marker, "version": "1"}})["capabilities"]["tools"] == {} - tools = rpc(token, "tools/list")["tools"] + listed = rpc(token, "tools/list") + assert listed["ttlMs"] == 0 and listed["cacheScope"] == "private", listed + tools = listed["tools"] assert {tool["name"] for tool in tools} == {"get_logs", "get_traces", "get_trace"} assert all(tool["annotations"]["readOnlyHint"] for tool in tools) refused = rpc(token, "tools/call", {"name": "get_logs", "arguments": {"service": denied}}) diff --git a/tools/dashboard-relay-test.py b/tools/dashboard-relay-test.py index 04f2036e3b5d0487b7b7ebc95c52106c78ab5fe0..4d8ee58a7271fd00c30bed57dcbb9dc1d0ebc12e 100644 --- a/tools/dashboard-relay-test.py +++ b/tools/dashboard-relay-test.py @@ -252,7 +252,9 @@ def main(): assert a1.machine == first["id"] and a2.machine == second["id"] init = rpc(control["key"], "initialize", {"protocolVersion": "2025-11-25", "capabilities": {}, "clientInfo": {"name": marker, "version": "1"}}) assert init["capabilities"]["tools"] == {} - tools = rpc(control["key"], "tools/list")["tools"] + listed = rpc(control["key"], "tools/list") + assert listed["ttlMs"] == 0 and listed["cacheScope"] == "private", listed + tools = listed["tools"] assert len(tools) == 7 assert next(t for t in tools if t["name"] == "send_message")["annotations"]["readOnlyHint"] is False call(control["key"], "send_message", {"provider": "codex", "thread_id": str(uuid.uuid4()), "message": "ambiguous fixture"}, error=True) -- 2.54.0