You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
feat(ext-tasks): example pair + docs riders (slice C)
examples/ext-tasks-server (port 8645, server + client bins, both
live-verified):
- crunch: 2s long-runner — declared client gets a task handle and
task_wait polls at the server's pollIntervalMs to the result;
undeclared client blocks ~2s for the synchronous answer (progressive
enhancement contrast in one walkthrough)
- deploy: mid-task elicited approval — input_required → tasks/update →
'deployed billing-api ✅'; the tool body is byte-identical MRTR code
that works under both execution models
EXAMPLES.md: pairing row + feature row + counts (54 active; count-vs-
rows sweep green). Gate/CI step builds the example; fixed the step's
cargo invocation (--bins cannot repeat — single trailing flag covers
all selected packages; caught by the gate run itself).
Full ci-gates.sh all green.
Copy file name to clipboardExpand all lines: CHANGELOG.md
+1Lines changed: 1 addition & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -20,6 +20,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
20
20
21
21
### Added
22
22
23
+
-**`ext-tasks-server` example pair (2026-06-12, SEP-2663 — slice C).** Task-electing server (port 8645: `crunch` long-runner + `deploy` with mid-task elicited approval) and a client walkthrough bin driving the full lifecycle — task handle → `task_wait` polling at the server's `pollIntervalMs` → `input_required` → `tasks/update` → completed, plus the progressive-enhancement contrast (the same tool blocks ~2s and answers synchronously for an undeclared client). Live-verified end to end; EXAMPLES.md pairing row + counts (54 active); built by the client-using-examples gate step.
23
24
- **Tasks-extension client surface (2026-06-12, SEP-2663 — slice B).** New opt-in `ext-tasks` feature on `turul-mcp-client`: `declared_capabilities.ext_tasks = true` declares `io.modelcontextprotocol/tasks` in every 2026 request's `_meta` `clientCapabilities.extensions`; `call_tool_or_task(name, args)` returns `ToolCallOutcome::Completed | Task` (the server is the sole decider — the typed union replaces guessing); `task_get`/`task_update`/`task_cancel` bind the lifecycle methods; `task_wait` polls to a terminal status honoring the server's `pollIntervalMs` (clamped 50ms–30s). The strict BP-1 parser is untouched — plain `call_tool` still rejects unknown `resultType`s; only the ext-aware path accepts `"task"`. 4 real-server e2e tests (`ext_tasks_e2e_2026.rs`, gates + CI): task→poll→completed, sync fallback for undeclared clients, `task_update` resuming an `input_required` task, cancel-to-cancelled; revert-and-fail recorded (suppressing the capability emission fails the task-outcome test with a sync result).
24
25
- **Tasks-extension server runtime (2026-06-12, SEP-2663 — closes driver gap G1).** New opt-in `ext-tasks` feature on `turul-mcp-server` (off by default per SEP-2133): `.with_ext_tasks(store)` advertises `io.modelcontextprotocol/tasks` in `server/discover`'s `capabilities.extensions` and registers `tasks/get`/`tasks/update`/`tasks/cancel`; `.ext_task_tool(tool)` / `.ext_task_tool_required(tool)` mark tools for task election — a request whose per-request `_meta` `clientCapabilities.extensions` declares the extension gets a durable `CreateTaskResult` (UUIDv4 bearer-grade id, store written BEFORE the response) with a spawned worker; undeclared requests run synchronously (progressive enhancement) or, for `_required` tools, get `-32003` with the upstream `data.requiredCapabilities.extensions` shape. **MRTR bridge**: a task tool returning `McpError::InputRequired` parks its task in `input_required`; `tasks/update` validates response keys against outstanding requests (partial delivery keeps it parked) and resumes the worker with the responses injected through the same session-extension keys as the sync retry leg — tool code is identical under both execution models. `tasks/cancel` is cooperative (aborts the worker, drops input waiters, acks terminal tasks). `notifications/tasks` rides `subscriptions/listen`: the transport honors a `taskIds` filter iff the extension is advertised (keyed off the capability map — no transport dependency on the ext crate), echoes it in the ack, and delivers per-taskId. `turul-mcp-ext-tasks` gains the `TaskStore` trait + `TaskState` + `InMemoryTaskStore` (no tokio in the public API). 9 wire e2e tests (`ext_tasks_2026.rs`, wired into gates + CI); revert-and-fail recorded. Dispatcher design recorded in ADR-028 (2026-06-12 entry).
25
26
-**`turul-mcp-ext-apps` 0.1.0 scaffold (2026-06-12, SEP-1865).** Spec-neutral extension crate binding the MCP-side Apps surface: extension identifier `io.modelcontextprotocol/ui` (the ADR-028 table's `/apps` guess corrected against upstream), client capability (`UiClientCapabilities.mimeTypes` + the `text/html;profile=mcp-app` HTML-views gate), tool `_meta.ui` (`UiToolMeta`: `resourceUri`, `visibility` model/app), and UI-resource `_meta.ui` (`UiResourceMeta`: CSP domain lists, sandbox permissions, dedicated origin, `prefersBorder`). The host↔view iframe protocol is deliberately not bound (app/host SDK scope). Vendored spec pinned at `modelcontextprotocol/ext-apps@ca1d2989`; 5 wire-shape compliance tests.
Copy file name to clipboardExpand all lines: EXAMPLES.md
+7-5Lines changed: 7 additions & 5 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -1,6 +1,6 @@
1
1
# MCP Framework Examples
2
2
3
-
This document provides a comprehensive overview of all **53 active examples** in the MCP Framework (plus `examples/archived/` — grown by 5 in the 2026-06-12 archive slice, see `docs/plans/2026-07-28-examples-review.md`), organized by learning progression from basic concepts to advanced implementations.
3
+
This document provides a comprehensive overview of all **54 active examples** in the MCP Framework (plus `examples/archived/` — grown by 5 in the 2026-06-12 archive slice, see `docs/plans/2026-07-28-examples-review.md`), organized by learning progression from basic concepts to advanced implementations.
4
4
5
5
**✅ All active examples compile under their lane's CI gates** (2026-07-28 default lane
6
6
+ per-manifest 2025-11-25 pins). Per-example functional re-verification against the
@@ -17,6 +17,7 @@ lane** — run the server first, then point the client at it.
17
17
|---|---|---|---|
18
18
|`streamable-http-client`|**2026-07-28**|`minimal-server` (port 8641); point at `notification-server` (port 8005) for live subscription deliveries | The canonical 2026 stateless pair: `connect()` negotiation, discover retention, `call_tool`, request-scoped progress, and the ack-first `subscriptions_listen` stream |
19
19
|`mrtr-elicitation-client` (in `mrtr-elicitation-server`) |**2026-07-28**|`mrtr-elicitation-server` (port 8642) | The MRTR round trip: `input_required` → answer → `call_tool_with_input_responses`|
-**Session & State** - stateful-server + session-aware-resource-server (2025-pinned) and the storage-backend trio
195
197
-**Client Examples** - see the pairs table above (9 pairing rows)
@@ -210,7 +212,7 @@ re-verified its six examples live on the wire.
210
212
-**Live-verified**: migrated and new examples were verified by running them and executing their own printed commands
211
213
212
214
### 📊 **Statistics**
213
-
-**Total Examples**: 53 active (29 archived in `examples/archived/`)
215
+
-**Total Examples**: 54 active (29 archived in `examples/archived/`)
214
216
-**Session state (2025-pinned lane)**: stateful-server, session-aware-resource-server, and the logging/session test fixtures demonstrate cross-request session state on the opt-in lane; 2026-default examples use request-scoped context or app-owned storage instead
215
217
-**Client-Server Pairs**: 9 pairing-table rows validating communication patterns
0 commit comments