A living, event-driven MCP server: model context streams, shared task queue, and versioned protocols for context-aware agent fleets
Strong foundation with 18 well-named tools following verb_noun convention. All tools have descriptions (avg 180 chars, within 10-1024 baseline). Input schemas present with type definitions and parameter descriptions. However, output schemas are undocumented, responses are JSON-stringified text rather than structured objects. Error handling lacks recovery guidance and categorization. Some parameter constraints (e.g., blockMs max 25000, limit 1-1000) are documented in descriptions but not enforced via schema. Missing tool annotations (readOnlyHint, destructiveHint, idempotentHint) despite clear risk classifications.
Claim a specific task by id, or omit taskId to pop the highest-priority pending task. Claims are leases: call update_task_progress at least every leaseSeconds or the task is released back to the queue.
Persist your read position on a stream under a named cursor (per-agent, survives reconnects). Use after successfully processing events for at-least-once semantics.
Mark a claimed task completed, with an optional struct
Add a task to the shared work queue. Any connected agent can claim it. Priority 1 is highest, 3 lowest. Optionally reference a protocol the claimant should follow.
Define a named protocol (versioned instruction set) that agents can follow when claiming tasks.
Mark a claimed task failed with an error message.
Output schemas undocumented. All tools return json() wrapper with text content, not structured objects. LLMs cannot parse response fields or plan downstream calls. Violates pattern:response-shaper and mxe:strip-api-responses.
Error handling returns generic errorResult() with no recovery guidance or error categorization. Errors like 'session not initialized' or 'resource is not subscribable' do not tell LLM what to do next. Violates pattern:recovery-guide and pattern:error-classification.
Inferred effective spec: 2026-07-28+.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 68 | 2026-07-28+ | v2 |
Retrieve a named protocol by name and optional version.
Get details of a specific task by ID.
List this agent's saved stream cursors.
List all defined protocols with their latest versions.
List all registered context streams with metadata, event count, and latest entry id.
List tasks on the shared queue, optionally filtered by status.
List all registered wake webhooks.
Append an event to a named context stream. Creates the stream on first publish. Every agent subscribed to stream://{stream} is notified. Use dot-namespaced types like 'code.refactor.started' or 'finding.discovered'.
Read events from a stream. Use fromId (exclusive cursor from a previous read) to page forward, sinceMs for time-based replay, or neither for the most recent events. Set blockMs (max 25000) to long-poll for new events when your client does not support resource subscriptions. Alternatively pass cursor (a named durable cursor) to resume where you last committed — set commit=true to auto-advance it after this read.
Register a webhook URL to be called when a specific event type arrives on a stream. The server will POST a signed wake envelope to your URL; you can verify the signature and spawn a headless agent session.
Unregister a wake webhook by ID.
Record progress on a task you claimed. Doubles as the lease heartbeat — every call extends your lease by the original leaseSeconds.
Tool annotations missing. publish_event, commit_cursor, create_task, claim_task, update_task_progress, complete_task, fail_task, define_protocol, register_wake, unregister_wake are destructive (WRITE risk) but lack destructiveHint annotation. read_stream, list_* tools are read-only but lack readOnlyHint. Violates current MCP spec (2026-07-28) tool annotation requirement.
Parameter constraints documented in descriptions but not enforced in schema. blockMs 'max 25000', limit '1-1000', leaseSeconds '10-3600', instructions 'max 65536' are text hints, not JSON Schema constraints. LLMs cannot parse these reliably. Violates pattern:constrained-input.
Destructive operations (publish_event, complete_task, fail_task, unregister_wake) lack confirmation or dry-run support. Agents can irreversibly publish events or fail tasks without verification. Violates pattern:confirmation-request.