defaultToolCallbacks(ToolCallbackProvider) wires two real stdio MCP servers (the official filesystem server and git server) into ChatClient, contrasted with defaultTools(Object) for a local @Tool method. Every call -- MCP-sourced or local -- is logged through one Micrometer ObservationHandler<ToolCallingObservationContext>; a first version wired that handler two ways at once and every call logged twice, which is now a regression test. No real LLM is used anywhere: every test builds an AssistantMessage.ToolCall by hand and drives it through the real ToolCallingManager bean against real npx/uvx-launched MCP server processes. Co-Authored-By: Claude Sonnet 5 <[email protected]> Claude-Session: https://claude.ai/code/session_01FtpJvZfg4nvLvtzgJTDWpB
13 lines
780 B
Plaintext
13 lines
780 B
Plaintext
# What a 1ms requestTimeout actually throws on a real MCP handshake -- captured, not guessed
|
|
|
|
requestTimeout=1ms, initializationTimeout=30s -- set deliberately far apart to see which
|
|
one actually governs the initialize() handshake
|
|
|
|
client.initialize() threw:
|
|
[0] java.lang.RuntimeException: Client failed to initialize by explicit API call
|
|
[0] suppressed: java.lang.Exception: #block terminated with an error
|
|
[1] java.util.concurrent.TimeoutException: Did not observe any item or terminal signal within 1ms in 'source(MonoDeferContextual)' (and no fallback has been configured)
|
|
|
|
confirmed: the real timeout-carrying exception is java.util.concurrent.TimeoutException, a plain JDK type from Reactor's
|
|
Flux.timeout() operator -- not a dedicated MCP timeout exception class.
|