Skip to content

Add timeout parameter to Client.send method (#35) #72

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Conversation

Yu-Haikuo
Copy link

Summary of Changes

  • Add requestTimedOut error in MCPError
  • Set default timeout duration to 10 seconds
  • Add timeoutTask to remove a request if it is still pending after timeout duration
  • Modify Client.ping to adopt to parameter change in Client.send
  • Add related test cases

Motivation and Context

This PR implements feature requested in #35.

How Has This Been Tested?

I ran and passed all existing test cases plus my newly created ones.

Breaking Changes

There are no breaking changes to the Client.send method, only adding a default timeout of 10 seconds.

Types of changes

  • Bug fix (non-breaking change which fixes an issue)
  • New feature (non-breaking change which adds functionality)
  • Breaking change (fix or feature that would cause existing functionality to change)
  • Documentation update

Checklist

  • I have read the MCP Documentation
  • My code follows the repository's style guidelines
  • New and existing tests pass locally
  • I have added appropriate error handling
  • I have added or updated documentation as needed

Additional context

  • I am not too sure if 10 seconds would be a good default timeout value. Please feel freel to suggest a good new one :)

* Add requestTimedOut error in MCPError

* Set default timeout duration to 10 seconds

* Add timeoutTask to remove a request if it is still pending after timeout duration

* Modify Client.ping to adopt to parameter change in Client.send

* Add related test cases
@mattt
Copy link
Contributor

mattt commented Apr 27, 2025

Hi @Yu-Haikuo. Thank you so much for opening this PR. Sorry for not responding directly sooner.

I've been thinking about how best to implement this, and opened #74 with an alternative solution.

I like the simplicity of including a timeout parameter in client calls, however I don't think this solution can scale. Adding a timeout parameter to the low-level send method creates an asymmetry with the higher-level method-specific convenience methods. I think it'd feel bad to require API consumers to drop down to the lower-level API just for timeouts. But I also think it'd add too much duplication to add timeout parameters to each of the higher-level methods, too.

It's also unclear whether timeout is sufficient on its own. For example, consider the complete signature of this package, which includes tolerance, clocks, and actor isolation.

public func deadline<C, R>(
  until instant: C.Instant,
  tolerance: C.Instant.Duration? = nil,
  clock: C,
  isolation: isolated (any Actor)? = #isolation,
  operation: @Sendable () async throws -> R
) async throws -> R where C: Clock, R: Sendable { ... }

Adding all of this would to all high-level client methods would almost certainly be overkill.

For now, I think the best solution would be to document how to configure timeouts for operations in the README. Longer-term, I'm considering something closer to what's described in #74 (comment).

@mattt mattt closed this Apr 27, 2025
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.

2 participants