-
Notifications
You must be signed in to change notification settings - Fork 679
Support creating an Stdio
client with options
#457
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
Support creating an Stdio
client with options
#457
Conversation
WalkthroughThe changes add a flexible options pattern to the stdio transport, enabling customization of subprocess command creation via a new Changes
📜 Recent review detailsConfiguration used: CodeRabbit UI 📒 Files selected for processing (1)
🚧 Files skipped from review as they are similar to previous changes (1)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. 🪧 TipsChatThere are 3 ways to chat with CodeRabbit:
SupportNeed help? Create a ticket on our support page for assistance with any issues or questions. Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments. CodeRabbit Commands (Invoked using PR comments)
Other keywords and placeholders
CodeRabbit Configuration File (
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thanks for this! Would you be able to add some documentation for this in the docs www/docs/pages
?
* NewStdioMCPClientWithOptions and NewStdioWithOptions: accept variadic options (pattern), which include a command func (WithCommandFunc) to handle creating and configuring the exec.Cmd for additional control. * Added unit tests
258e740
to
1aac597
Compare
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 1
🧹 Nitpick comments (3)
www/docs/pages/transports/stdio.mdx (3)
325-327
: Clarify the mysteriousnil
parameter.
NewStdioClient
’s second argument is the process environment. Dropping a literalnil
in the example works, but a short inline comment improves readability:- "go", nil, "run", "/path/to/server/main.go", + "go", nil /* inherit env */, "run", "/path/to/server/main.go",
379-386
: Section header reads well, but anchor is lost.Consider adding a Markdown heading (
###
) before the “If you need more control …” paragraph so that docs tooling can generate a TOC entry.
396-426
: Add required imports to the snippet.
exec
andsyscall
are referenced but not imported, leading to copy-paste friction.
Prepend the snippet with:import ( "context" "os/exec" "syscall" )
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (2)
client/transport/stdio_test.go
(2 hunks)www/docs/pages/transports/stdio.mdx
(2 hunks)
🚧 Files skipped from review as they are similar to previous changes (1)
- client/transport/stdio_test.go
🧰 Additional context used
🧠 Learnings (2)
📓 Common learnings
Learnt from: octo
PR: mark3labs/mcp-go#149
File: mcptest/mcptest.go:0-0
Timestamp: 2025-04-21T21:26:32.945Z
Learning: In the mcptest package, prefer returning errors from helper functions rather than calling t.Fatalf() directly, giving callers flexibility in how to handle errors.
www/docs/pages/transports/stdio.mdx (4)
Learnt from: ezynda3
PR: mark3labs/mcp-go#461
File: server/sampling.go:22-26
Timestamp: 2025-06-30T07:13:17.052Z
Learning: In the mark3labs/mcp-go project, the MCPServer.capabilities field is a struct value (serverCapabilities), not a pointer, so it cannot be nil and doesn't require nil checking. Only pointer fields within the capabilities struct should be checked for nil.
Learnt from: octo
PR: mark3labs/mcp-go#149
File: mcptest/mcptest.go:0-0
Timestamp: 2025-04-21T21:26:32.945Z
Learning: In the mcptest package, prefer returning errors from helper functions rather than calling t.Fatalf() directly, giving callers flexibility in how to handle errors.
Learnt from: davidleitw
PR: mark3labs/mcp-go#451
File: mcp/tools.go:1192-1217
Timestamp: 2025-06-26T09:38:18.629Z
Learning: In mcp-go project, the maintainer prefers keeping builder pattern APIs simple without excessive validation for edge cases. The WithOutput* functions are designed to assume correct usage rather than defensive programming, following the principle of API simplicity over comprehensive validation.
Learnt from: floatingIce91
PR: mark3labs/mcp-go#401
File: server/server.go:1082-1092
Timestamp: 2025-06-23T11:10:42.948Z
Learning: In Go MCP server, ServerTool.Tool field is only used for tool listing and indexing, not for tool execution or middleware. During handleToolCall, only the Handler field is used, so dynamic tools don't need the Tool field populated.
🔇 Additional comments (4)
www/docs/pages/transports/stdio.mdx (4)
316-317
: Import block now compiles – good catch.
time
is required for the timeout below; the added import prevents an undefined-identifier error.
333-335
: Timeout addition is correct but leaks on early returns.
cancel()
is deferred, yet subsequentlog.Fatal
calls exit the program before it runs.
It’s harmless here, but mentioning the nuance avoids copy-paste bugs elsewhere.
339-339
: 👍 Switched to the canonical protocol constant.Hard-coded strings were brittle; using
mcp.LATEST_PROTOCOL_VERSION
prevents skew.
388-391
: Argument slice vs. variadic args – example may not compile.
NewStdioMCPClientWithOptions
probably accepts variadicargs ...string
(mirrorsNewStdioClient
).
Passing[]string{...}
will fail to compile.- []string {"run", "/path/to/server/main.go"}, + "run", "/path/to/server/main.go",⛔ Skipped due to learnings
Learnt from: lariel-fernandes PR: mark3labs/mcp-go#428 File: www/docs/pages/servers/prompts.mdx:218-234 Timestamp: 2025-06-20T20:39:51.870Z Learning: In the mcp-go library, the GetPromptParams.Arguments field is of type map[string]string, not map[string]interface{}, so direct string access without type assertions is safe and correct.
Learnt from: ezynda3 PR: mark3labs/mcp-go#461 File: server/sampling.go:22-26 Timestamp: 2025-06-30T07:13:17.052Z Learning: In the mark3labs/mcp-go project, the MCPServer.capabilities field is a struct value (serverCapabilities), not a pointer, so it cannot be nil and doesn't require nil checking. Only pointer fields within the capabilities struct should be checked for nil.
Learnt from: davidleitw PR: mark3labs/mcp-go#451 File: mcp/tools.go:1192-1217 Timestamp: 2025-06-26T09:38:18.629Z Learning: In mcp-go project, the maintainer prefers keeping builder pattern APIs simple without excessive validation for edge cases. The WithOutput* functions are designed to assume correct usage rather than defensive programming, following the principle of API simplicity over comprehensive validation.
Learnt from: octo PR: mark3labs/mcp-go#149 File: mcptest/mcptest.go:0-0 Timestamp: 2025-04-21T21:26:32.945Z Learning: In the mcptest package, prefer returning errors from helper functions rather than calling t.Fatalf() directly, giving callers flexibility in how to handle errors.
Description
Currently it is not possible to control how a sub-process is created over supplying the command, args and env. The existing
spawnCommand
inclient/transport/stdio.go
always takes the currentos.Environ
and merges any supplied env vars into it.This PR adds
NewStdioMCPClientWithOptions
andNewStdioWithOptions
which are complimentary toNewStdioMCPClient
andNewStdio
.The new functions accept variadic options (following the options pattern), which include a command func/factory (named
WithCommandFunc
) which can handle creating and configuring theexec.Cmd
for additional control.Because of the existing function signatures (where variadic arguments are already present for
args
) it was not possible to simply add the options in situ, which may have been a cleaner change and would introduce no breaking changes, or additional exported functions.New unit tests have been added, as an example of how we now have more fine-grained control over sub-process creation please refer to
TestStdio_WithCommandFunc
.Type of Change
Checklist
Summary by CodeRabbit
New Features
Bug Fixes
Tests