Merge upstream modelcontextprotocol/ruby-sdk main
Resolves conflicts in lib/mcp/server/transports/streamable_http_transport.rb between the DNS rebinding protection merged upstream (allowed_origins, allowed_hosts, dns_rebinding_protection keywords) and this branch's session retention hardening (session_idle_timeout default and max_sessions keyword) by combining both sets of keyword arguments and constructor logic.
This commit is contained in:
commit
dfdd4efc24
1 changed files with 715 additions and 7 deletions
24
README.md
24
README.md
|
|
@ -102,6 +102,8 @@ transport = MCP::Server::Transports::StdioTransport.new(server)
|
|||
transport.open
|
||||
```
|
||||
|
||||
`StdioTransport.new` accepts an optional `max_line_bytes:` keyword that caps the byte length of a single newline-delimited request frame. A frame that reaches this limit without a newline is rejected and the connection is closed, preventing unbounded memory growth from a peer that never emits a newline. It defaults to `4 * 1024 * 1024` (4 MiB).
|
||||
|
||||
You can run this script and then type in requests to the server at the command line.
|
||||
|
||||
```console
|
||||
|
|
@ -128,6 +130,27 @@ The following examples show two common integration styles in Rails.
|
|||
>
|
||||
> Stateless mode (`stateless: true`) does not use sessions and works with any server configuration.
|
||||
|
||||
> [!IMPORTANT]
|
||||
> Per MCP 2025-11-25, `StreamableHTTPTransport` validates the `Host` and `Origin` headers by default to
|
||||
> prevent DNS rebinding attacks against locally bound servers, rejecting unauthorized values with HTTP 403.
|
||||
> `Host` is allowed for the loopback defaults (`127.0.0.1`, `::1`, `localhost`), and an `Origin` header,
|
||||
> when present, must be same-origin or explicitly allow-listed. Non-browser clients that send no `Origin`
|
||||
> header are unaffected.
|
||||
>
|
||||
> Deployments behind a reverse proxy or bound to a non-loopback interface must widen the allow lists:
|
||||
>
|
||||
> ```ruby
|
||||
> transport = MCP::Server::Transports::StreamableHTTPTransport.new(
|
||||
> server,
|
||||
> allowed_hosts: ["mcp.example.com"],
|
||||
> allowed_origins: ["https://app.example.com"],
|
||||
> )
|
||||
> ```
|
||||
>
|
||||
> An `allowed_hosts:` entry matches either the bare host name (any port) or the full `host:port` value,
|
||||
> so both `"mcp.example.com"` and `"mcp.example.com:8443"` work. Pass `dns_rebinding_protection: false`
|
||||
> to disable the check entirely (e.g., when an upstream proxy or middleware already validates `Host`/`Origin`).
|
||||
|
||||
##### Rails (mount)
|
||||
|
||||
`StreamableHTTPTransport` is a Rack app that can be mounted directly in Rails routes:
|
||||
|
|
@ -1967,6 +1990,7 @@ Use the `MCP::Client::Stdio` transport to interact with MCP servers running as s
|
|||
| `args:` | No | An array of arguments passed to the command. Defaults to `[]`. |
|
||||
| `env:` | No | A hash of environment variables to set for the server process. Defaults to `nil`. |
|
||||
| `read_timeout:` | No | Timeout in seconds for waiting for a server response. Defaults to `nil` (no timeout). |
|
||||
| `max_line_bytes:` | No | Maximum byte length of a single newline-delimited response frame. A frame that reaches this limit without a newline is rejected as a transport error, preventing unbounded memory growth from a server that never emits a newline. Defaults to `4 * 1024 * 1024` (4 MiB). |
|
||||
|
||||
Example usage:
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue