Skip to content

fix(time): use McpError for proper JSON-RPC error propagation - #4483

Closed
isheng-eqi wants to merge 2 commits into
modelcontextprotocol:mainfrom
isheng-eqi:fix/time-error-propagation
Closed

isheng-eqi wants to merge 2 commits into
modelcontextprotocol:mainfrom
isheng-eqi:fix/time-error-propagation

Conversation

@isheng-eqi

Copy link
Copy Markdown

Summary

Two fixes in the time server for proper MCP protocol error handling.

Problem

  1. call_tool handler raised ValueError instead of McpError (line 216). The MCP protocol requires errors to be sent as JSON-RPC error responses via McpError. A bare ValueError gets caught by the SDK as a generic internal error, losing the error code and context.

  2. get_zoneinfo caught all exceptions generically (line 56). ZoneInfo("invalid") raises KeyError while ZoneInfo(bad_object) raises TypeError — the function gave the same "Invalid timezone" message for both, making debugging harder.

Changes

  • src/time/src/mcp_server_time/server.py (+4/-2):
    • get_zoneinfo: separate KeyError (unknown timezone name) from generic exceptions (invalid format), with distinct messages
    • call_tool handler: ValueError → McpError(ErrorData(code=INVALID_PARAMS, ...)) for correct JSON-RPC error propagation

Two fixes in the time server:

1. call_tool handler (line 216): Was raising plain ValueError instead of
   McpError. The MCP protocol requires JSON-RPC errors via McpError with
   proper error codes. A ValueError propagates as a generic internal error
   to the client, losing the error context.

2. get_zoneinfo (line 56): Catch KeyError specifically for unknown
   timezones vs. generic exceptions for invalid timezone strings. Gives
   the client more precise error messages ('Unknown timezone' vs
   'Invalid timezone').
@cliffhall cliffhall added the closed-superseded-v2 Closed: fixed or made obsolete by the v2 / 2026-07-28 refactor (#4875) label Oct 20, 2026
@cliffhall

Copy link
Copy Markdown
Member

Thank you for this pull request, and apologies for the long wait for a response.

Since it was opened, the reference servers have been rebuilt for the 2026-07-28 MCP specification (#4857) and released as v2 (2.0.0 on npm for the TypeScript servers, 2026.10.19 on PyPI for the Python servers). The code this PR changes has been replaced, and the behavior it addresses has either been fixed in v2 or no longer exists in the same form.

This is not a judgment on the change or on you; it's a consequence of the code it targets having been replaced. If the problem still happens on v2, please open a fresh issue with the version you're running and steps to reproduce. Note that this repository now accepts contributions as issues rather than pull requests from anyone but its maintainers; see CONTRIBUTING.md.

This is part of the backlog triage in #4875.

@cliffhall cliffhall closed this Oct 20, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

closed-superseded-v2 Closed: fixed or made obsolete by the v2 / 2026-07-28 refactor (#4875)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants