A Plug implementing the MCP Streamable HTTP transport (revision 2025-11-25).
Mount it at a single endpoint path serving POST, GET and DELETE:
forward "/mcp", to: Urchin.Transport.StreamableHTTP, init_opts: [server: MyServer]or run it standalone via Urchin.start_link/2 / Urchin.Endpoint.
Options
:server(required) - a module implementingUrchin.Server:init_arg- argument passed toUrchin.Server.init/1once per session (defaultnil):allowed_origins-:all, a list of allowedOriginvalues, ornilto allow missing origins plus localhost (defaultnil):require_session- reject post-initialize requests without a session id (defaulttrue):enable_get- offer the GET SSE stream (defaulttrue):allow_delete- allow client session termination via DELETE (defaulttrue):min_log_level- default minimum log level for new sessions (default"info"):request_timeout- per-request handler timeout in ms (default60_000):validate_protocol_version- validate theMCP-Protocol-Versionheader (defaulttrue):auth- anUrchin.Auth(or keyword options) to require OAuth 2.1 bearer tokens on every request;nil(default) serves MCP unauthenticated. The metadata discovery endpoint is served byUrchin.Endpoint/Urchin.Auth.Metadata, not this plug.
The plug reads the raw request body itself, so mount it before any JSON body parser.