Files
servers-modelcontextprotocol-1/src/everything/docs/structure.md
cliffhall 1b8f376b90 Demonstrate registration of tools conditioned upon client capability support. Also, obviated need for clientConnected callback to pass sessionId because we defer initial fetching of roots happens when you run the get-roots-list tool.
* In how-it-works.md,
  - added a section on conditional tool registration

* In server/index.ts
  - import registerConditionalTools
  - in an oninitialized handler for the server, call registerConditionalTools
  - removed clientConnected from ServerFactoryResponse and all mentions in docs

* In tools/index.ts
  - export a registerConditionalTools function
  - refactor/move calls to registerGetRootsListTool, registerTriggerElicitationRequestTool, and registerTriggerSamplingRequestTool out of registerTools and into registerConditionalTools

* In server/roots.ts
  - only act if client supports roots
  - remove setInterval from call to requestRoots. It isn't happening during the initialze handshake anymore, so it doesn't interfere with that process if called immediaately

* In get-roots-list.ts, trigger-elicitation-request.ts, and trigger-sampling-request.ts,
  - only register tool if client supports capability

* Throughout the rest of the files, removing all references to `clientConnected`
2025-12-15 17:51:30 -05:00

9.5 KiB
Raw Blame History

Everything Server - Project Structure

Architecture | Project Structure | Startup Process | Server Features | Extension Points | How It Works

src/everything
     ├── index.ts
     ├── AGENTS.md
     ├── package.json
     ├── docs
     │   ├── architecture.md
     │   ├── extension.md
     │   ├── features.md
     │   ├── how-it-works.md
     │   ├── instructions.md
     │   ├── startup.md
     │   └── structure.md
     ├── prompts
     │   ├── index.ts
     │   ├── args.ts
     │   ├── completions.ts
     │   ├── simple.ts
     │   └── resource.ts
     ├── resources
     │   ├── index.ts
     │   ├── files.ts
     │   ├── session.ts
     │   ├── subscriptions.ts
     │   └── templates.ts
     ├── server
     │   ├── index.ts
     │   ├── logging.ts
     │   └── roots.ts
     ├── tools
     │   ├── index.ts
     │   ├── echo.ts
     │   ├── get-annotated-message.ts
     │   ├── get-env.ts
     │   ├── get-resource-links.ts
     │   ├── get-resource-reference.ts
     │   ├── get-roots-list.ts
     │   ├── get-structured-content.ts
     │   ├── get-sum.ts
     │   ├── get-tiny-image.ts
     │   ├── gzip-file-as-resource.ts
     │   ├── toggle-simulated-logging.ts
     │   ├── toggle-subscriber-updates.ts
     │   ├── trigger-elicitation-request.ts
     │   ├── trigger-long-running-operation.ts
     │   └── trigger-sampling-request.ts
     └── transports
         ├── sse.ts
         ├── stdio.ts
         └── streamableHttp.ts

Project Contents

src/everything:

index.ts

  • CLI entry point that selects and runs a specific transport module based on the first CLI argument: stdio, sse, or streamableHttp.

AGENTS.md

  • Directions for Agents/LLMs explaining coding guidelines and how to appropriately extend the server.

package.json

  • Package metadata and scripts:
    • build: TypeScript compile to dist/, copies docs/ into dist/ and marks the compiled entry scripts as executable.
    • start:stdio, start:sse, start:streamableHttp: Run built transports from dist/.
  • Declares dependencies on @modelcontextprotocol/sdk, express, cors, zod, etc.

docs/

  • architecture.md
    • This document.
  • server-instructions.md
    • Humanreadable instructions intended to be passed to the client/LLM as for guidance on server use. Loaded by the server at startup and returned in the "initialize" exchange.

prompts/

  • index.ts
    • registerPrompts(server) orchestrator; delegates to prompt factory/registration methods from in individual prompt files.
  • simple.ts
    • Registers simple-prompt: a prompt with no arguments that returns a single user message.
  • args.ts
    • Registers args-prompt: a prompt with two arguments (city required, state optional) used to compose a message.
  • completions.ts
    • Registers completable-prompt: a prompt whose arguments support server-driven completions using the SDKs completable(...) helper (e.g., completing department and context-aware name).
  • resource.ts
    • Exposes registerEmbeddedResourcePrompt(server) which registers resource-prompt — a prompt that accepts resourceType ("Text" or "Blob") and resourceId (integer), and embeds a dynamically generated resource of the requested type within the returned messages. Internally reuses helpers from resources/templates.ts.

resources/

  • index.ts
    • registerResources(server) orchestrator; delegates to resource factory/registration methods from individual resource files.
  • templates.ts
    • Registers two dynamic, templatedriven resources using ResourceTemplate:
      • Text: demo://resource/dynamic/text/{index} (MIME: text/plain)
      • Blob: demo://resource/dynamic/blob/{index} (MIME: application/octet-stream, Base64 payload)
    • The {index} path variable must be a finite positive integer. Content is generated on demand with a timestamp.
    • Exposes helpers textResource(uri, index), textResourceUri(index), blobResource(uri, index), and blobResourceUri(index) so other modules can construct and embed dynamic resources directly (e.g., from prompts).
  • files.ts
    • Registers static file-based resources for each file in the docs/ folder.
    • URIs follow the pattern: demo://resource/static/document/<filename>.
    • Serves markdown files as text/markdown, .txt as text/plain, .json as application/json, others default to text/plain.

server/

  • index.ts
    • Server factory that creates an McpServer with declared capabilities, loads server instructions, and registers tools, prompts, and resources.
    • Sets resource subscription handlers via setSubscriptionHandlers(server).
    • Exposes { server, cleanup } to the chosen transport. Cleanup stops any running intervals in the server when the transport disconnects.
  • logging.ts
    • Implements simulated logging. Periodically sends randomized log messages at various levels to the connected client session. Started/stopped on demand via a dedicated tool.

tools/

  • index.ts
    • registerTools(server) orchestrator; delegates to tool factory/registration methods in individual tool files.
  • echo.ts
    • Registers an echo tool that takes a message and returns Echo: {message}.
  • get-annotated-message.ts
    • Registers an annotated-message tool which demonstrates annotated content items by emitting a primary text message with annotations that vary by messageType ("error" | "success" | "debug"), and optionally includes an annotated image (tiny PNG) when includeImage is true.
  • get-env.ts
    • Registers a get-env tool that returns the current process environment variables as formatted JSON text; useful for debugging configuration.
  • get-resource-links.ts
    • Registers a get-resource-links tool that returns an intro text block followed by multiple resource_link items.
  • get-resource-reference.ts
    • Registers a get-resource-reference tool that returns a reference for a selected dynamic resource.
  • get-roots-list.ts
    • Registers a get-roots-list tool that returns the last list of roots sent by the client.
  • gzip-file-as-resource.ts
    • Registers a gzip-file-as-resource tool that fetches content from a URL or data URI, compresses it, and then either:
      • returns a resource_link to a session-scoped resource (default), or
      • returns an inline resource with the gzipped data. The resource will be still discoverable for the duration of the session via resources/list.
    • Uses resources/session.ts to register the gzipped blob as a per-session resource at a URI like demo://resource/session/<name> with mimeType: application/gzip.
    • Environment controls:
      • GZIP_MAX_FETCH_SIZE (bytes, default 10 MiB)
      • GZIP_MAX_FETCH_TIME_MILLIS (ms, default 30000)
      • GZIP_ALLOWED_DOMAINS (comma-separated allowlist; empty means all domains allowed)
  • trigger-elicitation-request.ts
    • Registers a trigger-elicitation-request tool that sends an elicitation/create request to the client/LLM and returns the elicitation result.
  • trigger-sampling-request.ts
    • Registers a trigger-sampling-request tool that sends a sampling/createMessage request to the client/LLM and returns the sampling result.
  • get-structured-content.ts
    • Registers a get-structured-content tool that demonstrates structuredContent block responses.
  • get-sum.ts
    • Registers an get-sum tool with a Zod input schema that sums two numbers a and b and returns the result.
  • get-tiny-image.ts
    • Registers a get-tiny-image tool, which returns a tiny PNG MCP logo as an image content item, along with surrounding descriptive text items.
  • trigger-long-running-operation.ts
    • Registers a long-running-operation tool that simulates a long-running task over a specified duration (seconds) and number of steps; emits notifications/progress updates when the client supplies a progressToken.
  • toggle-simulated-logging.ts
    • Registers a toggle-simulated-logging tool, which starts or stops simulated logging for the invoking session.
  • toggle-subscriber-updates.ts
    • Registers a toggle-subscriber-updates tool, which starts or stops simulated resource subscription update checks for the invoking session.

transports/

  • stdio.ts
    • Starts a StdioServerTransport, created the server via createServer(), and connects it.
    • Handles SIGINT to close cleanly and calls cleanup() to remove any live intervals.
  • sse.ts
    • Express server exposing:
      • GET /sse to establish an SSE connection per session.
      • POST /message for client messages.
    • Manages multiple connected clients via a transport map.
    • Starts an SSEServerTransport, created the server via createServer(), and connects it to a new transport.
    • On server disconnect, calls cleanup() to remove any live intervals.
  • streamableHttp.ts
    • Express server exposing a single /mcp endpoint for POST (JSONRPC), GET (SSE stream), and DELETE (session termination) using StreamableHTTPServerTransport.
    • Uses an InMemoryEventStore for resumable sessions and tracks transports by sessionId.
    • Connects a fresh server instance on initialization POST and reuses the transport for subsequent requests.