Skip to main content

CHANGELOG.md

# Changelog

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

The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

## [0.1.0] — 2026-06-13

Initial release. Targets MCP specification revision **2025-11-25**
(negotiates down to 2025-06-18; 2025-03-26 is deliberately unsupported —
it would require JSON-RPC batching, which later revisions removed).

### Server

- `use Noizu.MCP.Server` with declarative `tool` / `resource` /
  `resource_template` / `prompt` registration; capabilities derived
  automatically from what you register or implement.
- Hidden items: `hidden: true` on any tool/prompt/resource/resource-template
  definition or registration (`visible: false` is an alias for tools) omits
  it from list responses while leaving it callable by name; `include_hidden:`
  on the `Features.*.list_registered` helpers enables session-gated listings,
  and the built-in `Noizu.MCP.Server.Tools.Catalog` discovery tool exposes
  full definitions of unpublished items to agents.
- Toolkits: `use Noizu.MCP.Server.Toolkit` defines many tools in one module
  via `@mcp` function annotations (arity 0–2), with data-form input/output
  specs or raw JSON Schemas; registration opts
  (`hidden:`/`visible:`/`category:`) apply to the whole kit. All tool modules
  share one runtime protocol — `__mcp_tools__/0` returning normalized
  `Noizu.MCP.Server.Tool.Spec` descriptors.
- Category metadata: `category: "..."` on tools (toolkit default, per-`@mcp`,
  classic `use` option, or registration override) rides in `_meta.category`
  on the wire and is filterable through the catalog tool.
- Compile-time `input`/`output` field DSL compiling to JSON Schema
  (2020-12), validated with [JSV](https://hex.pm/packages/jsv); handlers
  receive atom-keyed, default-applied, enum-cast arguments. Raw JSON
  Schema escape hatch (`input_schema %{...}`), also accepted as raw JSON
  text decoded at compile time.
- Input-validation failures return `isError: true` tool results per
  SEP-1303 so models can self-correct.
- Resources with RFC 6570 templates, subscriptions and fan-out
  (`notify_resource_updated/1`), prompts with arguments, completion,
  pagination with opaque cursors, `logging/setLevel`, list-changed
  notifications (`notify_changed/1`).
- Behaviour-only escape hatch: every DSL-generated callback
  (`handle_list_tools/2`, `handle_call_tool/3`, …) can be hand-written.
- Handlers run in supervised Tasks — slow tools never block ping,
  cancellation, or progress; crashes are sanitized.
- `Noizu.MCP.Ctx`: progress, logging, cancellation checks, per-session
  state, and server-initiated `sample/2`, `elicit/3`, `list_roots/1`.

### Inspector

- `mix mcp.client` Mix task launching `Noizu.MCP.Inspector` — a native
  localhost-only HTML MCP client analogous to the official `mcp dev` tool.
  Supports three target modes: in-process `use Noizu.MCP.Server` module,
  stdio subprocess (with `--cd`/`--env`), and remote Streamable HTTP
  (`--url`/`--bearer`).
- Browser UI (vanilla ES modules, no build step) with tabs: Connection,
  Tools (JSON-Schema-generated forms, inline progress, cancel), Resources
  (read, subscribe, template expansion + completion), Prompts (args +
  completion, message preview), History (raw JSON-RPC frame log),
  Notifications, and Pending.
- Pending tab parks server-initiated sampling and elicitation requests for
  human-in-the-loop responses; tool calls run with infinite timeout while
  parked.
- REST + SSE bridge with per-session 500-event ring buffer (`Last-Event-ID`
  replay) and seven SSE event types: `frame`, `notification`, `progress`,
  `call_result`, `pending_request`, `pending_resolved`, `status`.
- Config export endpoint produces `claude_desktop`-style entries for the
  current target.
- Security: binds `127.0.0.1` only; random 256-bit bearer token per run
  required on every `/api` call; localhost `Origin` check on SSE; module
  targets resolve only already-loaded atoms.
- `Noizu.MCP.Inspector.start_link/1` for programmatic embedding.

### Client

- `Noizu.MCP.Client`: sync calls, async request handles with cancel,
  per-request timeouts, progress callbacks, automatic pagination.
- `Noizu.MCP.Client.Handler` behaviour answering server-initiated
  sampling, elicitation, and roots requests.

### Transports

- stdio (server and client) with automatic Logger-to-stderr diversion on
  the server side.
- Streamable HTTP server as a Plug (Phoenix-mountable or standalone on
  Bandit): sessions, adaptive JSON↔SSE responses, general GET stream,
  `Last-Event-ID` resumability backed by a bounded event store, origin
  validation, DELETE teardown.
- Streamable HTTP client on Req: ordered POSTs, SSE streaming, GET
  stream with reconnect/resume.
- In-memory `Noizu.MCP.Transport.Test` pair plus the `Noizu.MCP.Test`
  helper module (async-safe ExUnit testing).

### Authorization (OAuth 2.1)

- Resource-server enforcement: `Noizu.MCP.Auth.TokenVerifier` behaviour,
  `WWW-Authenticate` challenges, `insufficient_scope`, RFC 9728
  protected-resource metadata plug.
- Client strategies: `Noizu.MCP.Auth.Static` (bearer) and
  `Noizu.MCP.Auth.OAuth` (RFC 9728 + RFC 8414/OIDC discovery, PKCE S256,
  RFC 8707 resource indicators, refresh, scope step-up) with a
  host-app `authorize_user` callback for the browser leg.