"Everything Server crashes when multiple clients reconnect" * In index.ts - added a variable to hold the initialize timeout - store the timeout in the oninitialized handler - clear the timeout in the cleanup callback * In roots.ts - In the catch block of syncRoots, log the error to the console via .error rather than attempting to send to the client because the most probable case here is that we don't have a connection. * In simulate-research-query.ts - remove redundant local variable in getTask * Everywhere else, prettier.
8.6 KiB
Everything Server - Features
Architecture | Project Structure | Startup Process | Server Features | Extension Points | How It Works
Tools
echo(tools/echo.ts): Echoes the providedmessage: string. Uses Zod to validate inputs.get-annotated-message(tools/get-annotated-message.ts): Returns atextmessage annotated withpriorityandaudiencebased onmessageType(error,success, ordebug); can optionally include an annotatedimage.get-env(tools/get-env.ts): Returns all environment variables from the running process as pretty-printed JSON text.get-resource-links(tools/get-resource-links.ts): Returns an introtextblock followed by multipleresource_linkitems. For a requestedcount(1–10), alternates between dynamic Text and Blob resources using URIs fromresources/templates.ts.get-resource-reference(tools/get-resource-reference.ts): AcceptsresourceType(textorblob) andresourceId(positive integer). Returns a concreteresourcecontent block (with itsuri,mimeType, and data) with surrounding explanatorytext.get-roots-list(tools/get-roots-list.ts): Returns the last list of roots sent by the client.gzip-file-as-resource(tools/gzip-file-as-resource.ts): Accepts anameanddata(URL or data URI), fetches the data subject to size/time/domain constraints, compresses it, registers it as a session resource atdemo://resource/session/<name>withmimeType: application/gzip, and returns either aresource_link(default) or an inlineresourcedepending onoutputType.get-structured-content(tools/get-structured-content.ts): Demonstrates structured responses. Acceptslocationinput and returns both backward‑compatiblecontent(atextblock containing JSON) andstructuredContentvalidated by anoutputSchema(temperature, conditions, humidity).get-sum(tools/get-sum.ts): For two numbersaandbcalculates and returns their sum. Uses Zod to validate inputs.get-tiny-image(tools/get-tiny-image.ts): Returns a tiny PNG MCP logo as animagecontent item with brief descriptive text before and after.trigger-long-running-operation(tools/trigger-trigger-long-running-operation.ts): Simulates a multi-step operation over a givendurationand number ofsteps; reports progress vianotifications/progresswhen aprogressTokenis provided by the client.toggle-simulated-logging(tools/toggle-simulated-logging.ts): Starts or stops simulated, random‑leveled logging for the invoking session. Respects the client’s selected minimum logging level.toggle-subscriber-updates(tools/toggle-subscriber-updates.ts): Starts or stops simulated resource update notifications for URIs the invoking session has subscribed to.trigger-sampling-request(tools/trigger-sampling-request.ts): Issues asampling/createMessagerequest to the client/LLM using providedpromptand optional generation controls; returns the LLM's response payload.simulate-research-query(tools/simulate-research-query.ts): Demonstrates MCP Tasks (SEP-1686) with a simulated multi-stage research operation. Acceptstopicandambiguousparameters. Returns a task that progresses through stages with status updates. Ifambiguousis true and client supports elicitation, sends an elicitation request directly to gather clarification before completing.trigger-sampling-request-async(tools/trigger-sampling-request-async.ts): Demonstrates bidirectional tasks where the server sends a sampling request that the client executes as a background task. Server polls for status and retrieves the LLM result when complete. Requires client to supporttasks.requests.sampling.createMessage.trigger-elicitation-request-async(tools/trigger-elicitation-request-async.ts): Demonstrates bidirectional tasks where the server sends an elicitation request that the client executes as a background task. Server polls while waiting for user input. Requires client to supporttasks.requests.elicitation.create.
Prompts
simple-prompt(prompts/simple.ts): No-argument prompt that returns a static user message.args-prompt(prompts/args.ts): Two-argument prompt withcity(required) andstate(optional) used to compose a question.completable-prompt(prompts/completions.ts): Demonstrates argument auto-completions with the SDK’scompletablehelper;departmentcompletions drive context-awarenamesuggestions.resource-prompt(prompts/resource.ts): AcceptsresourceType("Text" or "Blob") andresourceId(string convertible to integer) and returns messages that include an embedded dynamic resource of the selected type generated viaresources/templates.ts.
Resources
- Dynamic Text:
demo://resource/dynamic/text/{index}(content generated on the fly) - Dynamic Blob:
demo://resource/dynamic/blob/{index}(base64 payload generated on the fly) - Static Documents:
demo://resource/static/document/<filename>(serves files fromsrc/everything/docs/as static file-based resources) - Session Scoped:
demo://resource/session/<name>(per-session resources registered dynamically; available only for the lifetime of the session)
Resource Subscriptions and Notifications
- Simulated update notifications are opt‑in and off by default.
- Clients may subscribe/unsubscribe to resource URIs using the MCP
resources/subscribeandresources/unsubscriberequests. - Use the
toggle-subscriber-updatestool to start/stop a per‑session interval that emitsnotifications/resources/updated { uri }only for URIs that session has subscribed to. - Multiple concurrent clients are supported; each client’s subscriptions are tracked per session and notifications are delivered independently via the server instance associated with that session.
Simulated Logging
- Simulated logging is available but off by default.
- Use the
toggle-simulated-loggingtool to start/stop periodic log messages of varying levels (debug, info, notice, warning, error, critical, alert, emergency) per session. - Clients can control the minimum level they receive via the standard MCP
logging/setLevelrequest.
Tasks (SEP-1686)
The server advertises support for MCP Tasks, enabling long-running operations with status tracking:
- Capabilities advertised:
tasks.list,tasks.cancel,tasks.requests.tools.call - Task Store: Uses
InMemoryTaskStorefrom SDK experimental for task lifecycle management - Message Queue: Uses
InMemoryTaskMessageQueuefor task-related messaging
Task Lifecycle
- Client calls
tools/callwithtask: trueparameter - Server returns
CreateTaskResultwithtaskIdinstead of immediate result - Client polls
tasks/getto check status and receivestatusMessageupdates - When status is
completed, client callstasks/resultto retrieve the final result
Task Statuses
working: Task is actively processinginput_required: Task needs additional input (server sends elicitation request directly)completed: Task finished successfullyfailed: Task encountered an errorcancelled: Task was cancelled by client
Demo Tools
Server-side tasks (client calls server):
Use the simulate-research-query tool to exercise the full task lifecycle. Set ambiguous: true to trigger elicitation - the server will send an elicitation/create request directly and await the response before completing.
Client-side tasks (server calls client):
Use trigger-sampling-request-async or trigger-elicitation-request-async to demonstrate bidirectional tasks where the server sends requests that the client executes as background tasks. These require the client to advertise tasks.requests.sampling.createMessage or tasks.requests.elicitation.create capabilities respectively.
Bidirectional Task Flow
MCP Tasks are bidirectional - both server and client can be task executors:
| Direction | Request Type | Task Executor | Demo Tool |
|---|---|---|---|
| Client -> Server | tools/call |
Server | simulate-research-query |
| Server -> Client | sampling/createMessage |
Client | trigger-sampling-request-async |
| Server -> Client | elicitation/create |
Client | trigger-elicitation-request-async |
For client-side tasks:
- Server sends request with task metadata (e.g.,
params.task.ttl) - Client creates task and returns
CreateTaskResultwithtaskId - Server polls
tasks/getfor status updates - When complete, server calls
tasks/resultto retrieve the result