[WIP] Refactor everything server to be more modular and use recommended APIs.

Adding Trigger Elicitation Request and Get Roots List tools

* Updated architecture.md

* Added roots.ts
  - tracks roots by sessionId
  - setRootsListChangedHandler
    - listens for roots changed notification from the client
      - updates the roots map by sessionId
      - sends log notification or error to the client

* In server/index.ts
  - import setRootsListChangedHandler
  - in clientConnected callback
    - call setRootsListChangedHandler passing server and sessionId

* In sse.ts, stdio.ts, and streamableHttp.ts
  - receive clientConnected from server factory
  - call clientConnected when server is connected to transport
* Added get-roots-list.ts
  - registerGetRootsListTool
    - Registers the 'get-roots-list' tool with the given MCP server.

* Added trigger-elicitation-request.ts
  - registerTriggerElicitationRequestTool
    - registered tool sends an elicitation request that exercises all supported field types

* In tools/index.ts
  - imports registerTriggerElicitationRequestTool and registerGetRootsListTool
  - in registerTools
    - call registerTriggerElicitationRequestTool and registerGetRootsListTool, passing server
This commit is contained in:
cliffhall
2025-12-11 20:25:37 -05:00
parent ea6fe271cd
commit 18ef6aa69b
8 changed files with 229 additions and 68 deletions

View File

@@ -21,7 +21,7 @@ const transports: Map<string, SSEServerTransport> = new Map<
app.get("/sse", async (req, res) => {
let transport: SSEServerTransport;
const { server, cleanup } = createServer();
const { server, clientConnected, cleanup } = createServer();
if (req?.query?.sessionId) {
const sessionId = req?.query?.sessionId as string;
@@ -38,6 +38,8 @@ app.get("/sse", async (req, res) => {
// Connect server to transport
await server.connect(transport);
const sessionId = transport.sessionId;
clientConnected(sessionId);
console.error("Client Connected: ", sessionId);
// Handle close of connection