Hermes.Server.Transport.SSE.Plug (hermes_mcp v0.9.0)
A Plug implementation for the SSE (Server-Sent Events) transport.
This plug handles the MCP HTTP+SSE protocol as specified in MCP 2024-11-05. It provides two separate endpoints:
- SSE endpoint: Opens an SSE stream and sends "endpoint" event
- POST endpoint: Handles JSON-RPC messages from client to server
SSE Streaming Architecture
This Plug delegates SSE streaming to Hermes.SSE.Streaming
which keeps
the request process alive and handles the streaming loop.
Usage in Phoenix Router
pipeline :mcp do
plug :accepts, ["json", "event-stream"]
end
scope "/mcp" do
pipe_through :mcp
# SSE endpoint
get "/sse", Hermes.Server.Transport.SSE.Plug,
server: :your_server_name, mode: :sse
# POST endpoint
post "/messages", Hermes.Server.Transport.SSE.Plug,
server: :your_server_name, mode: :post
end
Usage in Plug Router (Standalone)
# When using in a standalone Plug.Router app
plug Hermes.Server.Transport.SSE.Plug,
server: :your_server_name,
mode: :sse,
at: "/sse",
method_whitelist: ["GET"]
plug Hermes.Server.Transport.SSE.Plug,
server: :your_server_name,
mode: :post,
at: "/messages",
method_whitelist: ["POST"]
Configuration Options
:server
- The server process name (required):mode
- Either:sse
or:post
to determine endpoint behavior (required):timeout
- Request timeout in milliseconds (default: 30000)
Security Features
- Origin header validation for DNS rebinding protection
- Session-based request validation
- Automatic session cleanup on connection loss
HTTP Response Codes
- 200: Successful request or SSE stream established
- 202: Accepted (for notifications)
- 400: Bad request (malformed JSON-RPC)
- 405: Method not allowed
- 500: Internal server error