All notable changes to this project will be documented in this file.

[2.0.0] - 2026-07-30

Implements the MCP 2026-07-28 protocol with a stateless transport.

GenMCP.Transport.StreamableHTTP now targets the 2026-07-28 protocol. There is no session process, no Mcp-Session-Id header and no cluster configuration. Each request is handled by its own worker process, spawned when the request arrives and stopped once the request is answered.

Clients using the 2025-06-18 and 2025-11-25 protocols are handled by a separate plug, GenMCP.Transport.StreamableHTTP.V2511, mounted on the route those clients already call. Their requests and responses are unchanged, so clients can be migrated one at a time.

Upgrade guide: https://gen-mcp.hexdocs.pm/090-upgrading-to-v2.html

Can I upgrade?

  • Your clients need no changes. Keep them on their current route and mount the 2025 plug there.
  • The 2025 plug handles tool calls. It implements initialize, notifications/initialized, ping, logging/setLevel, tools/list, tools/call and the GET notification stream. Any other method returns a JSON-RPC -32601. Check this first if your 2025 clients read resources or prompts.
  • You still need Phoenix. Both plugs read the encryption key from the Phoenix.Endpoint on the conn, and :phoenix remains a regular dependency. A plain Plug.Router mount raises on the first request that mints a token: a 2025 session id, a pagination cursor, or the requestState of an input-required result.
  • Your tool modules need edits. The entity namespace, the call/3 return tuples and the async API all changed. Two of the three changes only produce a compiler warning and fail at the first tool call, so compile the upgrade with mix compile --warnings-as-errors and read the guide.
  • Browser clients need an origin allowlist. :allowed_origins defaults to [] and rejects unlisted origins with 403. Requests with no Origin header are always accepted, so a test suite passes either way.

What's new

  • Tools can block. Each request has its own worker process, so slow work runs inline in GenMCP.Suite.Tool.call/3. The {:async, {tag, task}, channel} return and the continue/3 callback are removed. Tools driven by messages from another process return {:stream, state} and handle each message in GenMCP.Suite.Tool.handle_message/4.
  • DNS rebinding protection on both plugs, through the :allowed_origins mount option.
  • GenMCP.SessionController.Token, the default session controller for the 2025 plug, uses an encrypted session token as the session id. Nothing is stored server-side and a session minted on one node is readable on any node sharing the secret_key_base.
  • GenMCP.Mux.Channel.send_notification/2 replaces send_message/2 and takes a notification struct or map instead of an encoded binary.
  • Telemetry events follow the per-request architecture: [:gen_mcp, :server, :init], [:gen_mcp, :server, :start_error], [:gen_mcp, :transport, :request_rejected], [:gen_mcp, :transport, :server_crashed] and [:gen_mcp, :transport, :version_rejected] replace the [:gen_mcp, :session, ...] and [:gen_mcp, :cluster, ...] events.

1.x maintenance

1.x will only receive security fixes and dependency compatibility updates. It implements the 2025 protocols and will not get new features or protocol work.

๐Ÿš€ Features

  • [breaking] Stateless MCP 2026-07-28 core with 2025 compatibility transport

[1.0.0] - 2026-07-29

Freeze the stateful 2025 protocol line.

gen_mcp 1.0.0 is the 0.10.x codebase promoted to a stable major. It speaks the stateful MCP protocol (2025-06-18 / 2025-11-25), and nothing about how it works changes with this release. If you are running gen_mcp today, {:gen_mcp, "~> 1.0"} keeps you exactly where you are, on a lane that stays supported.

The 1.x branch takes security fixes and dependency-compatibility fixes only. No features and no protocol work: the 2025 protocol is frozen here.

Version 2 is a hard fork onto the stateless 2026-07-28 protocol, which removes session handling from the core. Staying on 1.x is not the only way to keep your current clients working โ€” v2 ships a compatibility transport that serves 2025 clients from the same application, on their existing route, so upgrading does not mean migrating every client at once.

One API removal since 0.10.0: the GenMCP.MCP.RequestMeta entity is gone, dropped by the MCP schema codegen refactor. The rest of the public surface is unchanged.

โš™๏ธ Miscellaneous Tasks

  • Refactor MCP schemas codegen
  • (doc) Generate docs in :docs env

[0.10.0] - 2026-05-25

๐Ÿš€ Features

  • Added :jsv_build_opts to customize Suite.Tool input schema validation
  • Support returning structured content without mirrored text content from tools

[0.9.1] - 2026-05-13

๐Ÿ› Bug Fixes

  • Allow atom casting in compile-time tool schemas

[0.9.0] - 2026-05-10

๐Ÿš€ Features

  • Upgrade to JSV 0.19 new cast system, support Decimal 3

[0.8.0] - 2026-03-30

๐Ÿš€ Features

  • Added support for logging capabilities

๐Ÿšœ Refactor

  • [breaking] Channel.send_progress/3 will not return :ok instead of {:ok, channel}

[0.7.0] - 2026-03-16

๐Ÿš€ Features

  • Use a global registry to support restoring sessions on any node
  • [breaking] Default protocol version is now 2025-11-25

[0.6.0] - 2026-03-16

๐Ÿ› Bug Fixes

  • Return HTTP 200 codes for RPC-level errors

[0.5.2] - 2026-01-26

๐Ÿ› Bug Fixes

  • Fixed callback check macros for Elixir 1.20

[0.5.1] - 2026-01-06

๐Ÿ› Bug Fixes

  • Use self-contained JSON Schemas when listing tools

[0.5.0] - 2025-12-19

๐Ÿš€ Features

  • Added support for tools/list _meta in Suite
  • Channels are now created by the HTTP client directly
  • Added session controller support in suite
  • Prepare channel struct for status indicator
  • Pass listener channel to the session controller
  • [breaking] Session controller channel assigns are not merged in all requests anymore

๐Ÿšœ Refactor

  • Do not handle file write errors in DevSessionStore

๐Ÿ“š Documentation

  • Document need for constant node_id for DevSessionStore

[0.4.2] - 2025-11-29

๐Ÿ“š Documentation

  • Improvements on user guides

[0.4.1] - 2025-11-29

๐Ÿ› Bug Fixes

  • Fixed server name/title that was hardcoded with test values

[0.4.0] - 2025-11-28

๐Ÿš€ Features

  • Updated MCP schemas generation to skip content blocks types in structs
  • Removed logger calls, using telemetry instead

[0.3.1] - 2025-11-26

๐Ÿ“š Documentation

  • Updated getting started doc for example tool to work (#6)

[0.3.0] - 2025-11-26

๐Ÿš€ Features

  • Extract module based schemas for tool describe
  • Make all RPC request objects serialize as valid requests

๐Ÿ› Bug Fixes

  • Change error code for unsupported protocol version

๐Ÿ“š Documentation

  • Started to document some modules
  • Added bare documentation for some behaviours
  • Added example implementations in behaviours

โš™๏ธ Miscellaneous Tasks

  • Handle formatter variations accross Elixir versions
  • Handle formatter variations accross Elixir versions 2
  • Added LICENSE
  • Remove .tool-versions
  • Prevent dialyzer to start on localcluster
  • Using Quokka formatter

[0.2.0] - 2025-11-17

๐Ÿš€ Features

  • Node ID prototype
  • Added the mcp-validator test suite
  • Generated schemas for protocol entities
  • Ensure keepalive for streams
  • Store async tool state in parent state
  • New http connection implementation with multiplexing
  • New, simpler server implementation and behaviour
  • Added support for resources and URI templates
  • Added support for async Tasks in tools
  • Added support for prompts and arguments
  • Added support for authorization layer
  • Added Tool using macros and fixed session node retrieval
  • Encode unknown method errors
  • Session termination and timeout
  • Session initialization failure handling
  • Added helpers to create MCP entities
  • Support extensions in Suite init phases
  • Allow invalid_params tuples from tool and prompt calls
  • Support node ID configuration
  • Accept and ignore cancelled notification
  • Accept and ignore roots notification

๐Ÿ› Bug Fixes

  • Capabilities rendering when no tool is there
  • Declare capabilities based on suite components

๐Ÿšœ Refactor

  • Node disconnect cleanup
  • Use session ID as salt for pagination tokens
  • Moved MCP entities to the MCP namespace
  • Inline JSON serializers for MCP structs

๐Ÿงช Testing

  • Initialized tests for the statful server
  • Fix warnings on module delegations
  • Ensure resource and prompt repos receive channel assigns
  • Added tests to fix ResourceRepo behaviour

โš™๏ธ Miscellaneous Tasks

  • Move test namespace
  • Rename plug derivation to defplug
  • Setup mcp jest tool for later
  • Tools shoud be initializable
  • Tool storage using map
  • Renaming namespaces
  • Wrap node sync in its own supervisor
  • Credo and dialyzer fixes