feat: Add configurable timeout for tool execution#1685
Open
dgenio wants to merge 4 commits intomodelcontextprotocol:mainfrom
Open
feat: Add configurable timeout for tool execution#1685dgenio wants to merge 4 commits intomodelcontextprotocol:mainfrom
dgenio wants to merge 4 commits intomodelcontextprotocol:mainfrom
Conversation
- Add REQUEST_TIMEOUT error code (-32001) to types.py - Add tool_timeout_seconds setting to FastMCP (default: 300s) - Wrap tool execution in anyio.fail_after() for timeout enforcement - Raise McpError with REQUEST_TIMEOUT code when timeout is exceeded - Add comprehensive tests for timeout behavior - Update README with timeout configuration documentation Implements baseline timeout behavior for MCP tool calls as described in the PR requirements. Server-side timeout is configurable via tool_timeout_seconds parameter or FASTMCP_TOOL_TIMEOUT_SECONDS env var. Client-side timeout behavior already exists in BaseSession.
- Add blank line after 'Best practices' heading in README.md per markdownlint - Wrap await example in async function to fix ruff F704/PLE1142 errors - Skip sync tool timeout test since blocking operations don't respect anyio timeouts
Contributor
|
Thanks for putting this together! A couple of notes: This PR doesn't close #1374 - that issue is about client-side request timeouts (how long the client waits for a response), which is what the spec's timeout section refers to. This PR adds server-side tool execution timeouts (how long the server lets a tool run), which is a different concern and not part of the spec. That said, server-side tool execution timeouts could be a useful defensive feature. We'll keep this in mind for V2 where we're planning some larger refactors. For now, leaving this open but not planning to merge in the near term. |
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
Implements baseline timeout behavior for MCP tool calls to prevent indefinite blocking.
Closes #1374
Changes
Server-Side Timeout
src/mcp/types.pyanyio.fail_after()to enforce timeoutsConfiguration
FastMCP(tool_timeout_seconds=60.0)FASTMCP_TOOL_TIMEOUT_SECONDS=120FastMCP(tool_timeout_seconds=None)Testing
test_tool_manager.py:Documentation
Design Decisions
Client-Side
Client-side timeout handling already exists in
BaseSession.send_request()and works correctly with the new server-side timeouts.Testing
All new tests pass:
Linting passes:
ruff check .Checklist