From 5a490debb2d02396a641d2128d0a2291afecd242 Mon Sep 17 00:00:00 2001 From: Lakshya Singh Date: Tue, 24 Mar 2026 20:09:57 +0530 Subject: [PATCH] add readOnly annotation hints for mcp consumers Signed-off-by: Lakshya Singh --- src/server.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/server.py b/src/server.py index ff4c7bd..0ac8be4 100755 --- a/src/server.py +++ b/src/server.py @@ -110,7 +110,7 @@ def requires_approval(func, params): def _register_tools(self): """Register read-only tools (always available)""" - @self.mcp.tool(tags=["read", "server"]) + @self.mcp.tool(tags=["read", "server"], annotations={"readOnlyHint": True}) async def query_server( action: Annotated[Literal["server_info", "current_user"], Field( description="Get server info or current user information" @@ -123,7 +123,7 @@ async def query_server( self.process_tool_logs("query_server", result, ctx) return result - @self.mcp.tool(tags=["read", "workspaces"], enabled="workspaces" in self.toolsets) + @self.mcp.tool(tags=["read", "workspaces"], enabled="workspaces" in self.toolsets, annotations={"readOnlyHint": True}) async def query_workspaces( action: Annotated[Literal["list", "get", "type", "status"], Field( description="Workspace query action" @@ -157,7 +157,7 @@ async def query_workspaces( self.process_tool_logs("query_workspaces", result, ctx) return result - @self.mcp.tool(tags=["read", "files"], enabled="files" in self.toolsets) + @self.mcp.tool(tags=["read", "files"], enabled="files" in self.toolsets, annotations={"readOnlyHint": True}) async def query_files( action: Annotated[Literal["content", "history", "info", "metadata", "diff", "annotations"], Field( description="File query action, metadata includes extra information like optional attributes and file size" @@ -195,7 +195,7 @@ async def query_files( self.process_tool_logs("query_files", result, ctx) return result - @self.mcp.tool(tags=["read", "changelists"], enabled="changelists" in self.toolsets) + @self.mcp.tool(tags=["read", "changelists"], enabled="changelists" in self.toolsets, annotations={"readOnlyHint": True}) async def query_changelists( action: Annotated[Literal["get", "list"], Field( description="Changelist query action" @@ -246,7 +246,7 @@ async def query_changelists( self.process_tool_logs("query_changelists", result, ctx) return result - @self.mcp.tool(tags=["read", "shelves"], enabled="shelves" in self.toolsets) + @self.mcp.tool(tags=["read", "shelves"], enabled="shelves" in self.toolsets, annotations={"readOnlyHint": True}) async def query_shelves( action: Annotated[Literal["list", "diff", "files"], Field( description="Shelve query action" @@ -280,7 +280,7 @@ async def query_shelves( self.process_tool_logs("query_shelves", result, ctx) return result - @self.mcp.tool(tags=["read", "jobs"], enabled="jobs" in self.toolsets) + @self.mcp.tool(tags=["read", "jobs"], enabled="jobs" in self.toolsets, annotations={"readOnlyHint": True}) async def query_jobs( action: Annotated[Literal["list_jobs", "get_job"], Field( description="Job query action" @@ -314,7 +314,7 @@ async def query_jobs( self.process_tool_logs("query_jobs", result, ctx) return result - @self.mcp.tool(tags=["read", "reviews"], enabled="reviews" in self.toolsets) + @self.mcp.tool(tags=["read", "reviews"], enabled="reviews" in self.toolsets, annotations={"readOnlyHint": True}) async def query_reviews( action: Annotated[Literal["list", "dashboard", "get", "transitions", "files_readby", "files", "comments", "activity"], Field( description="Review query action: list all reviews, dashboard for current user, get specific review, transitions, files_readby, files, comments, activity"