Skip to content

feat(fetch): add tool annotations#3580

Open
nielskaspers wants to merge 7 commits intomodelcontextprotocol:mainfrom
nielskaspers:fix/issue-3572-fetch-tool-annotations
Open

feat(fetch): add tool annotations#3580
nielskaspers wants to merge 7 commits intomodelcontextprotocol:mainfrom
nielskaspers:fix/issue-3572-fetch-tool-annotations

Conversation

@nielskaspers
Copy link
Contributor

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

  • Import ToolAnnotations from mcp.types
  • Add annotations parameter to the Tool() declaration with readOnlyHint=True, destructiveHint=False, idempotentHint=True, openWorldHint=True

Testing

  • Metadata-only change; no behavioral impact
  • The openWorldHint=True annotation is particularly important as the fetch tool makes outbound HTTP requests to arbitrary URLs

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
Copy link
Member

@olaservo olaservo left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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).

anshul-garg27 and others added 6 commits March 15, 2026 18:46
…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
@nielskaspers nielskaspers force-pushed the fix/issue-3572-fetch-tool-annotations branch from b6ca574 to dd1e8a7 Compare March 15, 2026 16:46
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Add tool annotations to server-fetch (1 tool, 0 annotated)

5 participants