feat(fetch): add tool annotations#3580
Open
nielskaspers wants to merge 7 commits intomodelcontextprotocol:mainfrom
Open
feat(fetch): add tool annotations#3580nielskaspers wants to merge 7 commits intomodelcontextprotocol:mainfrom
nielskaspers wants to merge 7 commits intomodelcontextprotocol:mainfrom
Conversation
LLM clients (Claude Code, Augment.AI, etc.) intermittently send thoughtNumber, totalThoughts, and nextThoughtNeeded as strings instead of native JSON types. Using z.coerce gracefully handles both string and native inputs without breaking existing behavior. Fixes modelcontextprotocol#3428
olaservo
requested changes
Mar 15, 2026
Member
olaservo
left a comment
There was a problem hiding this comment.
The fetch tool annotations are correct — especially openWorldHint: true, which is the key distinction since fetch makes outbound HTTP requests to arbitrary user-supplied URLs.
However, this PR also modifies src/time/src/mcp_server_time/server.py with time server annotations that were already merged via PR #3581. Please rebase and remove the time server changes so this PR is scoped to the fetch server only.
After rebase, the remaining fetch changes look good to approve.
Reviewed with the assistance of Claude Code (claude-opus-4-6).
…ocol#3515) fix(fetch): handle malformed input without crashing Changes `raise_exceptions=True` to `raise_exceptions=False` in the fetch server's `Server.run()` call, preventing the server from crashing on malformed JSON-RPC input. This aligns with the SDK's intended default behavior and is consistent with other reference servers. Fixes modelcontextprotocol#3359
…#3534) feat(sequential-thinking): add tool annotations Adds MCP ToolAnnotations (readOnlyHint, destructiveHint, idempotentHint, openWorldHint) to the sequential-thinking tool, bringing it in line with the annotation pattern established by the filesystem server. Fixes modelcontextprotocol#3403
…modelcontextprotocol#3574) (modelcontextprotocol#3581) feat(time): add tool annotations Adds MCP ToolAnnotations to both time server tools (get_current_time, convert_time). Both are read-only, non-destructive, idempotent, and closed-world. Fixes modelcontextprotocol#3574
…te_branch, git_log, and git_branch (modelcontextprotocol#3545) fix(git): add missing argument injection guards Extends existing startswith("-") input validation to git_show, git_create_branch, git_log, and git_branch, preventing user-supplied values from being interpreted as CLI flags by GitPython's subprocess calls to git.
feat(git): add tool annotations Adds MCP ToolAnnotations to all 12 git server tools, marking read-only operations (status, diff, log, show, branch) and distinguishing destructive (reset) from non-destructive write operations (add, commit, create_branch, checkout). Fixes modelcontextprotocol#3573
b6ca574 to
dd1e8a7
Compare
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.
Summary
Adds MCP ToolAnnotations to the fetch tool, marking it as read-only, non-destructive, idempotent, and open-world — matching the annotation coverage already present in server-filesystem.
Issue
Fixes #3572
Changes
ToolAnnotationsfrommcp.typesannotationsparameter to theTool()declaration withreadOnlyHint=True,destructiveHint=False,idempotentHint=True,openWorldHint=TrueTesting
openWorldHint=Trueannotation is particularly important as the fetch tool makes outbound HTTP requests to arbitrary URLs