All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
[1.1.0] - 2026-07-12
Added
handler_optsrequest-identity seam onMCP.Transport.StreamableHTTP.Plug. A new public Plug option threads request-scoped options into each session's handlerinit/1, so an authenticated Streamable-HTTP MCP server can bind a pipeline-established identity into handler state without forking the Plug. Two forms:- Static —
handler_opts: keyword(), passed verbatim toHandler.init/1. - Factory —
handler_opts: (Plug.Conn.t() -> keyword()), evaluated once per session at theinitializerequest against that request'sconn(e.g. readingconn.assignsset by an upstream auth Plug), then bound for the session's lifetime.
- Static —
- Validated against EMFA's consumer acceptance criteria (AC1–AC8) in the test suite, and by an external consumer running the seam in production against real Jira.
Security
- Identity is established server-side by the authenticated Plug pipeline and bound at the
initializetrust boundary — it is delivered to the handler viainit/1opts and read from handler state, never supplied by the model as a tool-call argument (which is model-controlled and spoofable). Theconnis never leaked intohandle_call_tool/3,4, keeping handlers transport-agnostic. A factory that raises or returns a non-keyword fails the session cleanly atinitialize(HTTP 500 / JSON-RPC -32603) with no session started and no server-side detail leaked to the client.
Changed
- Backward-compatible: with no
handler_opts(the default[]), behaviour is identical to prior releases — existing consumers are unaffected. - Docs: clarified that the public Plug option is
server_mod:(not the internalMCP.Serverhandler:key); documented the required client handshake ordering (initialize → notifications/initialized → tools/call; the per-session server stays:waitinguntilnotifications/initialized); fixed the stale Examples link.
[1.0.2] - 2026-07-07
Changed
- Documentation only — no code changes. Updated
docs/prd.md,docs/architecture.md,docs/implementation-plan.md, anddocs/onboarding.mdheaders to reflect themcp_elixir_sdkpackage name and current version (they still referred to the pre-renameMCP Ex/ v0.2.1). Directory paths (/workspace/elixir_code/mcp_ex/) are intentionally left unchanged.
1.0.1 - 2026-04-16
Changed
- Renamed package from
mcp_extomcp_elixir_sdk(themcp_exhex name was previously taken by another client-only library). The new name follows the official MCP SDK naming convention (mcp-go-sdk,mcp-python-sdk,mcp-ruby-sdk,mcp-typescript-sdk). - Top-level OTP application module renamed from
McpEx.ApplicationtoMCPElixirSDK.Application(internal, not part of the public API). - Default
client_info/server_infoname updated tomcp_elixir_sdk.
Note
Public module names under the MCP.* namespace (e.g. MCP.Client, MCP.Server, MCP.Server.Handler, MCP.Transport.*) are unchanged, so existing code using these modules continues to work — only the dependency declaration needs updating.
1.0.0 - 2026-04-16
Added
- First stable release (never published to hex — superseded by 1.0.1 due to package rename)
- 100% MCP conformance (Tier 1, 30/30 scenarios, 40/40 checks)
- Full hex package metadata, documentation, and usage rules for AI agents
0.2.3 - 2025-02-17
Changed
- Updated documentation paths after workspace reorganization
0.2.2 - 2025-02-11
Added
- Documented sampling timeout behavior over HTTP transport
- Added link to mcp_ex_examples repo in README
0.2.1 - 2025-02-11
Changed
- Rewrote README with accurate usage examples
0.2.0 - 2025-02-09
Added
- 100% MCP conformance (Tier 1) — 30/30 scenarios, 40/40 checks
- Async tool execution with
handle_call_tool/4andToolContext - SSE streaming for intermediate messages during tool execution
- Client features: sampling, roots, elicitation callbacks
- Integration tests covering full client-server workflows
Changed
- Phase 7 completion: conformance suite integration
0.1.0 - 2025-02-08
Added
- Initial release
- MCP Client GenServer with full protocol API
- MCP Server GenServer with Handler behaviour
- Stdio transport (newline-delimited JSON-RPC)
- Streamable HTTP transport (POST + SSE) with Plug and Bandit
- Core protocol types, JSON-RPC 2.0 messages, capability negotiation
- Initialization handshake and capability auto-detection
- Pagination support for list operations
- Tools, resources, prompts, completions, and logging features