authorclover caruso <git@paperclover.net> 2026-10-06 23:11:12-07:00
committerclover caruso <git@paperclover.net> 2026-10-09 11:21:14-07:00
log2547169c7c14c468d646a4529194116b1adfb1ee
tree4e5289d7272390afa2421cd922f79340795b93c6
parent4e0a77820c14a4949c590a7beacb75a31502e9cf
signature Signed by SSH key SHA256:52mNGHRsVFBDED9IAX5pe+LRWUefqTbxEReunq21QvU (~clover)

Disable shared caching of account-specific MCP tool lists


4 files changed, 15 insertions(+), 7 deletions(-)

dashboard/src/observability.rs+4-3
......@@ -2,8 +2,9 @@ use crate::*;
22use rmcp::{
33 ErrorData, RoleServer, ServerHandler,
44 model::{
5 CallToolRequestParams, CallToolResponse, CallToolResult, ContentBlock, ListToolsResult,
6 PaginatedRequestParams, ServerCapabilities, ServerConfig, Tool, ToolAnnotations,
5 CacheScope, CallToolRequestParams, CallToolResponse, CallToolResult, ContentBlock,
6 ListToolsResult, PaginatedRequestParams, ServerCapabilities, ServerConfig, Tool,
7 ToolAnnotations,
78 },
89 service::RequestContext,
910};
......@@ -27,7 +28,7 @@ impl ServerHandler for Observability {
2728 let mut properties = json!({"service":{"type":"string"},"q":{"type":"string"},"limit":{"type":"integer","minimum":1,"maximum":500}});
2829 let required = if name=="get_trace" { properties=json!({"service":{"type":"string"},"trace_id":{"type":"string"}}); json!(["service","trace_id"]) } else {json!(["service"])};
2930 Tool::new(name, description, json!({"type":"object","properties":properties,"required":required,"additionalProperties":false}).as_object().unwrap().clone()).with_annotations(ToolAnnotations::new().read_only(true))
30 }).collect(), ..Default::default() })
31 }).collect(), ttl_ms: Some(0), cache_scope: Some(CacheScope::Private), ..Default::default() })
3132 }
3233 async fn call_tool(
3334 &self,
dashboard/src/relay.rs+5-2
......@@ -5,8 +5,9 @@ use mcp::{delete, get, hash, list, put, secret};
55use rmcp::{
66 ErrorData, RoleServer, ServerHandler,
77 model::{
8 CallToolRequestParams, CallToolResponse, CallToolResult, ContentBlock, ListToolsResult,
9 PaginatedRequestParams, ServerCapabilities, ServerConfig, Tool, ToolAnnotations,
8 CacheScope, CallToolRequestParams, CallToolResponse, CallToolResult, ContentBlock,
9 ListToolsResult, PaginatedRequestParams, ServerCapabilities, ServerConfig, Tool,
10 ToolAnnotations,
1011 },
1112 service::RequestContext,
1213};
......@@ -681,6 +682,8 @@ impl ServerHandler for Agents {
681682 }).collect();
682683 Ok(ListToolsResult {
683684 tools,
685 ttl_ms: Some(0),
686 cache_scope: Some(CacheScope::Private),
684687 ..Default::default()
685688 })
686689 }
tools/dashboard-mcp-test.py+3-1
......@@ -133,7 +133,9 @@ def main():
133133 http("/oauth/token", "POST", form, form=True, status=400)
134134 token = tokens["access_token"]
135135 assert rpc(token, "initialize", {"protocolVersion": "2025-11-25", "capabilities": {}, "clientInfo": {"name": marker, "version": "1"}})["capabilities"]["tools"] == {}
136 tools = rpc(token, "tools/list")["tools"]
136 listed = rpc(token, "tools/list")
137 assert listed["ttlMs"] == 0 and listed["cacheScope"] == "private", listed
138 tools = listed["tools"]
137139 assert {tool["name"] for tool in tools} == {"get_logs", "get_traces", "get_trace"}
138140 assert all(tool["annotations"]["readOnlyHint"] for tool in tools)
139141 refused = rpc(token, "tools/call", {"name": "get_logs", "arguments": {"service": denied}})
tools/dashboard-relay-test.py+3-1
......@@ -252,7 +252,9 @@ def main():
252252 assert a1.machine == first["id"] and a2.machine == second["id"]
253253 init = rpc(control["key"], "initialize", {"protocolVersion": "2025-11-25", "capabilities": {}, "clientInfo": {"name": marker, "version": "1"}})
254254 assert init["capabilities"]["tools"] == {}
255 tools = rpc(control["key"], "tools/list")["tools"]
255 listed = rpc(control["key"], "tools/list")
256 assert listed["ttlMs"] == 0 and listed["cacheScope"] == "private", listed
257 tools = listed["tools"]
256258 assert len(tools) == 7
257259 assert next(t for t in tools if t["name"] == "send_message")["annotations"]["readOnlyHint"] is False
258260 call(control["key"], "send_message", {"provider": "codex", "thread_id": str(uuid.uuid4()), "message": "ambiguous fixture"}, error=True)