From 8a60ba2b28589428cfb09b629f7594807e54dabe Mon Sep 17 00:00:00 2001 From: chris Date: Mon, 18 Aug 2025 23:33:55 +0000 Subject: [PATCH 1/5] first commit --- 03-GettingStarted/10-elicitation/README.md | 1 + .../10-elicitation/code/python/server.py | 56 +++++++++++++++++++ .../code/typescript/src/index.ts | 1 + 3 files changed, 58 insertions(+) create mode 100644 03-GettingStarted/10-elicitation/README.md create mode 100644 03-GettingStarted/10-elicitation/code/python/server.py create mode 100644 03-GettingStarted/10-elicitation/code/typescript/src/index.ts diff --git a/03-GettingStarted/10-elicitation/README.md b/03-GettingStarted/10-elicitation/README.md new file mode 100644 index 000000000..16cfe57f6 --- /dev/null +++ b/03-GettingStarted/10-elicitation/README.md @@ -0,0 +1 @@ +# Elicitation \ No newline at end of file diff --git a/03-GettingStarted/10-elicitation/code/python/server.py b/03-GettingStarted/10-elicitation/code/python/server.py new file mode 100644 index 000000000..ba089ad61 --- /dev/null +++ b/03-GettingStarted/10-elicitation/code/python/server.py @@ -0,0 +1,56 @@ +from pydantic import BaseModel, Field + +from mcp.server.fastmcp import Context, FastMCP +from mcp.server.session import ServerSession + +from starlette.applications import Starlette +from starlette.routing import Mount, Host +from mcp.server.fastmcp import FastMCP + +mcp = FastMCP(name="Elicitation Example") + +# todo: elicitation example, turn it into sse + +class BookingPreferences(BaseModel): + """Schema for collecting user preferences.""" + + checkAlternative: bool = Field(description="Would you like to check another date?") + alternativeDate: str = Field( + default="2024-12-26", + description="Alternative date (YYYY-MM-DD)", + ) + +def not_available_date(date: str) -> bool: + # Simulate date availability check + return date != "2024-12-25" + + +@mcp.tool() +async def book_trip(date: str, ctx: Context[ServerSession, None]) -> str: + """Book a trip with date availability check.""" + # Check if date is available + if not_available_date(date): + # Date unavailable - ask user for alternative + result = await ctx.elicit( + message=(f"No trips available on {date}. Would you like to try another date?"), + schema=BookingPreferences, + ) + + if result.action == "accept" and result.data: + if result.data.checkAlternative: + return f"[SUCCESS] Booked for {result.data.alternativeDate}" + return "[CANCELLED] No booking made" + return "[CANCELLED] Booking cancelled" + + # Date available + return f"[SUCCESS] Booked for {date}" + +app = Starlette( + routes=[ + Mount('/', app=mcp.sse_app()), + ] +) + +if __name__ == "__main__": + print("Starting Elicitation Example MCP Server...") + mcp.run() \ No newline at end of file diff --git a/03-GettingStarted/10-elicitation/code/typescript/src/index.ts b/03-GettingStarted/10-elicitation/code/typescript/src/index.ts new file mode 100644 index 000000000..14c7758b0 --- /dev/null +++ b/03-GettingStarted/10-elicitation/code/typescript/src/index.ts @@ -0,0 +1 @@ + // server for elicitation \ No newline at end of file From 811e9f4676f8536ec62851bb14c94d818ff3f0b8 Mon Sep 17 00:00:00 2001 From: Lee Stott Date: Tue, 19 Aug 2025 12:54:01 +0100 Subject: [PATCH 2/5] Update 03-GettingStarted/10-elicitation/code/python/server.py Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- 03-GettingStarted/10-elicitation/code/python/server.py | 1 - 1 file changed, 1 deletion(-) diff --git a/03-GettingStarted/10-elicitation/code/python/server.py b/03-GettingStarted/10-elicitation/code/python/server.py index ba089ad61..6347cc2bf 100644 --- a/03-GettingStarted/10-elicitation/code/python/server.py +++ b/03-GettingStarted/10-elicitation/code/python/server.py @@ -5,7 +5,6 @@ from starlette.applications import Starlette from starlette.routing import Mount, Host -from mcp.server.fastmcp import FastMCP mcp = FastMCP(name="Elicitation Example") From 99b63e7e8c7c277c76b3184dc329d3bc90074dfd Mon Sep 17 00:00:00 2001 From: chris Date: Tue, 19 Aug 2025 21:09:35 +0000 Subject: [PATCH 3/5] adding typescript pivot + asset --- .../10-elicitation/assets/elicitation.png | Bin 0 -> 99869 bytes .../code/typescript/package-lock.json | 1481 +++++++++++++++++ .../code/typescript/package.json | 27 + .../code/typescript/src/index.ts | 128 +- .../code/typescript/tsconfig.json | 16 + 5 files changed, 1651 insertions(+), 1 deletion(-) create mode 100644 03-GettingStarted/10-elicitation/assets/elicitation.png create mode 100644 03-GettingStarted/10-elicitation/code/typescript/package-lock.json create mode 100644 03-GettingStarted/10-elicitation/code/typescript/package.json create mode 100644 03-GettingStarted/10-elicitation/code/typescript/tsconfig.json diff --git a/03-GettingStarted/10-elicitation/assets/elicitation.png b/03-GettingStarted/10-elicitation/assets/elicitation.png new file mode 100644 index 0000000000000000000000000000000000000000..18911a3b642e7205ea988eb1aa264a1347046412 GIT binary patch literal 99869 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 U@$mf(IN(Q0OzvI9+YbT%2V&io3IG5A literal 0 HcmV?d00001 diff --git a/03-GettingStarted/10-elicitation/code/typescript/package-lock.json b/03-GettingStarted/10-elicitation/code/typescript/package-lock.json new file mode 100644 index 000000000..b0ac63b29 --- /dev/null +++ b/03-GettingStarted/10-elicitation/code/typescript/package-lock.json @@ -0,0 +1,1481 @@ +{ + "name": "typescript", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "dependencies": { + "@modelcontextprotocol/sdk": "^1.8.0", + "express": "^4.21.2", + "type": "^2.7.3", + "uuid": "^11.1.0", + "zod": "^3.24.2" + }, + "bin": { + "weather": "build/index.js" + }, + "devDependencies": { + "@types/node": "^20.11.24", + "@types/uuid": "^10.0.0", + "typescript": "^5.3.3" + } + }, + "node_modules/@modelcontextprotocol/sdk": { + "version": "1.17.3", + "resolved": "https://registry.npmjs.org/@modelcontextprotocol/sdk/-/sdk-1.17.3.tgz", + "integrity": "sha512-JPwUKWSsbzx+DLFznf/QZ32Qa+ptfbUlHhRLrBQBAFu9iI1iYvizM4p+zhhRDceSsPutXp4z+R/HPVphlIiclg==", + "license": "MIT", + "dependencies": { + "ajv": "^6.12.6", + "content-type": "^1.0.5", + "cors": "^2.8.5", + "cross-spawn": "^7.0.5", + "eventsource": "^3.0.2", + "eventsource-parser": "^3.0.0", + "express": "^5.0.1", + "express-rate-limit": "^7.5.0", + "pkce-challenge": "^5.0.0", + "raw-body": "^3.0.0", + "zod": "^3.23.8", + "zod-to-json-schema": "^3.24.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/accepts": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", + "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", + "license": "MIT", + "dependencies": { + "mime-types": "^3.0.0", + "negotiator": "^1.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/body-parser": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.0.tgz", + "integrity": "sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg==", + "license": "MIT", + "dependencies": { + "bytes": "^3.1.2", + "content-type": "^1.0.5", + "debug": "^4.4.0", + "http-errors": "^2.0.0", + "iconv-lite": "^0.6.3", + "on-finished": "^2.4.1", + "qs": "^6.14.0", + "raw-body": "^3.0.0", + "type-is": "^2.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/content-disposition": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.0.tgz", + "integrity": "sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg==", + "license": "MIT", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/cookie-signature": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", + "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", + "license": "MIT", + "engines": { + "node": ">=6.6.0" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/debug": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/express": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/express/-/express-5.1.0.tgz", + "integrity": "sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==", + "license": "MIT", + "dependencies": { + "accepts": "^2.0.0", + "body-parser": "^2.2.0", + "content-disposition": "^1.0.0", + "content-type": "^1.0.5", + "cookie": "^0.7.1", + "cookie-signature": "^1.2.1", + "debug": "^4.4.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "finalhandler": "^2.1.0", + "fresh": "^2.0.0", + "http-errors": "^2.0.0", + "merge-descriptors": "^2.0.0", + "mime-types": "^3.0.0", + "on-finished": "^2.4.1", + "once": "^1.4.0", + "parseurl": "^1.3.3", + "proxy-addr": "^2.0.7", + "qs": "^6.14.0", + "range-parser": "^1.2.1", + "router": "^2.2.0", + "send": "^1.1.0", + "serve-static": "^2.2.0", + "statuses": "^2.0.1", + "type-is": "^2.0.1", + "vary": "^1.1.2" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/finalhandler": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.0.tgz", + "integrity": "sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==", + "license": "MIT", + "dependencies": { + "debug": "^4.4.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "on-finished": "^2.4.1", + "parseurl": "^1.3.3", + "statuses": "^2.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", + "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/media-typer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", + "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/merge-descriptors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz", + "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/mime-types": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz", + "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==", + "license": "MIT", + "dependencies": { + "mime-db": "^1.54.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/negotiator": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", + "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/qs": { + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", + "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/send": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/send/-/send-1.2.0.tgz", + "integrity": "sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==", + "license": "MIT", + "dependencies": { + "debug": "^4.3.5", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "fresh": "^2.0.0", + "http-errors": "^2.0.0", + "mime-types": "^3.0.1", + "ms": "^2.1.3", + "on-finished": "^2.4.1", + "range-parser": "^1.2.1", + "statuses": "^2.0.1" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/serve-static": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.0.tgz", + "integrity": "sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==", + "license": "MIT", + "dependencies": { + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "parseurl": "^1.3.3", + "send": "^1.2.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/type-is": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz", + "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==", + "license": "MIT", + "dependencies": { + "content-type": "^1.0.5", + "media-typer": "^1.1.0", + "mime-types": "^3.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/@types/node": { + "version": "20.19.11", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.11.tgz", + "integrity": "sha512-uug3FEEGv0r+jrecvUUpbY8lLisvIjg6AAic6a2bSP5OEOLeJsDSnvhCDov7ipFFMXS3orMpzlmi0ZcuGkBbow==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "node_modules/@types/uuid": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-10.0.0.tgz", + "integrity": "sha512-7gqG38EyHgyP1S+7+xomFtL+ZNHcKv6DwNaCZmJmo1vgMugyF3TCnXVg4t1uk89mLNwnLtnY3TpOpCOyp1/xHQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "license": "MIT", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "license": "MIT" + }, + "node_modules/body-parser": { + "version": "1.20.3", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", + "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.13.0", + "raw-body": "2.5.2", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/body-parser/node_modules/raw-body": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "license": "MIT", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", + "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", + "license": "MIT" + }, + "node_modules/cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "license": "MIT", + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "license": "MIT", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "license": "MIT" + }, + "node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "license": "MIT" + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/eventsource": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-3.0.7.tgz", + "integrity": "sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA==", + "license": "MIT", + "dependencies": { + "eventsource-parser": "^3.0.1" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/eventsource-parser": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.0.5.tgz", + "integrity": "sha512-bSRG85ZrMdmWtm7qkF9He9TNRzc/Bm99gEJMaQoHJ9E6Kv9QBbsldh2oMj7iXmYNEAVvNgvv5vPorG6W+XtBhQ==", + "license": "MIT", + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/express": { + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz", + "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==", + "license": "MIT", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.3", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.7.1", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.3.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.3", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.12", + "proxy-addr": "~2.0.7", + "qs": "6.13.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.19.0", + "serve-static": "1.16.2", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/express-rate-limit": { + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-7.5.1.tgz", + "integrity": "sha512-7iN8iPMDzOMHPUYllBEsQdWVB6fPDMPqwjBaFrgr4Jgr/+okjvzAy+UHlYYL/Vs0OsOrMkwS6PJDkFlJwoxUnw==", + "license": "MIT", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://github.com/sponsors/express-rate-limit" + }, + "peerDependencies": { + "express": ">= 4.11" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "license": "MIT" + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "license": "MIT" + }, + "node_modules/finalhandler": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", + "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "license": "MIT", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-promise": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", + "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", + "license": "MIT" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "license": "ISC" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "license": "MIT" + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-to-regexp": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", + "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", + "license": "MIT" + }, + "node_modules/pkce-challenge": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/pkce-challenge/-/pkce-challenge-5.0.0.tgz", + "integrity": "sha512-ueGLflrrnvwB3xuo/uGob5pd5FN7l0MsLf0Z87o/UQmRtwjvfylfc9MurIxRAWywCYTgrvpXBcqjV4OfCYGCIQ==", + "license": "MIT", + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "license": "MIT", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/qs": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.0.6" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.0.tgz", + "integrity": "sha512-RmkhL8CAyCRPXCE28MMH0z2PNWQBNk2Q09ZdxM9IOOXwxwZbN+qbWaatPkdkWIKL2ZVDImrN/pK5HTRz2PcS4g==", + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.6.3", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/router": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz", + "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==", + "license": "MIT", + "dependencies": { + "debug": "^4.4.0", + "depd": "^2.0.0", + "is-promise": "^4.0.0", + "parseurl": "^1.3.3", + "path-to-regexp": "^8.0.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/router/node_modules/debug": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/router/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/router/node_modules/path-to-regexp": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.2.0.tgz", + "integrity": "sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==", + "license": "MIT", + "engines": { + "node": ">=16" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "license": "MIT" + }, + "node_modules/send": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", + "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/serve-static": { + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", + "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", + "license": "MIT", + "dependencies": { + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.19.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "license": "ISC" + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/type": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/type/-/type-2.7.3.tgz", + "integrity": "sha512-8j+1QmAbPvLZow5Qpi6NCaN8FB60p/6x8/vfNqOk/hC+HuvFZhL4+WfekuhQLiqFZXOgQdrs3B+XxEmCc6b3FQ==", + "license": "ISC" + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "license": "MIT", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typescript": { + "version": "5.9.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.2.tgz", + "integrity": "sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/uuid": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.1.0.tgz", + "integrity": "sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist/esm/bin/uuid" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "license": "ISC" + }, + "node_modules/zod": { + "version": "3.25.76", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", + "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/zod-to-json-schema": { + "version": "3.24.6", + "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.24.6.tgz", + "integrity": "sha512-h/z3PKvcTcTetyjl1fkj79MHNEjm+HpD6NXheWjzOekY7kV+lwDYnHw+ivHkijnCSMz1yJaWBD9vu/Fcmk+vEg==", + "license": "ISC", + "peerDependencies": { + "zod": "^3.24.1" + } + } + } +} diff --git a/03-GettingStarted/10-elicitation/code/typescript/package.json b/03-GettingStarted/10-elicitation/code/typescript/package.json new file mode 100644 index 000000000..0e541156a --- /dev/null +++ b/03-GettingStarted/10-elicitation/code/typescript/package.json @@ -0,0 +1,27 @@ +{ + "type": "module", + "bin": { + "weather": "./build/index.js" + }, + "scripts": { + "start": "node ./build/index.js", + "build": "tsc", + "client": "tsc && node ./build/client.js", + "inspector": "npx @modelcontextprotocol/inspector node build/index.js" + }, + "files": [ + "build" + ], + "dependencies": { + "@modelcontextprotocol/sdk": "^1.8.0", + "express": "^4.21.2", + "type": "^2.7.3", + "uuid": "^11.1.0", + "zod": "^3.24.2" + }, + "devDependencies": { + "@types/node": "^20.11.24", + "@types/uuid": "^10.0.0", + "typescript": "^5.3.3" + } +} diff --git a/03-GettingStarted/10-elicitation/code/typescript/src/index.ts b/03-GettingStarted/10-elicitation/code/typescript/src/index.ts index 14c7758b0..2330e68b4 100644 --- a/03-GettingStarted/10-elicitation/code/typescript/src/index.ts +++ b/03-GettingStarted/10-elicitation/code/typescript/src/index.ts @@ -1 +1,127 @@ - // server for elicitation \ No newline at end of file +import { McpServer, ResourceTemplate } from "@modelcontextprotocol/sdk/server/mcp.js"; +import { SSEServerTransport } from "@modelcontextprotocol/sdk/server/sse.js"; +import { z } from "zod"; +import express from "express"; + +// Create an MCP server +const server = new McpServer({ + name: "Demo", + version: "1.0.0" +}, +{ + "capabilities": { + "elicitation": {} + } +}); + +function checkAvailability(date: string): Promise { + // Simulate checking availability + return Promise.resolve(date === "2025-01-01"); +} + + server.tool( + "book-trip", + { + date: z.string() + }, + async ({ date }) => { + // 1. Check availability + const available = await checkAvailability(date); + + if (!available) { + // 2. Ask user if they want to try alternative dates + const result = await server.server.elicitInput({ + message: `No trip available at on ${date}. Would you like to check alternative dates?`, + requestedSchema: { + type: "object", + properties: { + checkAlternatives: { + type: "boolean", + title: "Alternate date", + description: "Fill in other date" + }, + newDate: { + type: "string", + title: "New Date", + description: "Please provide a new date" + } + }, + required: ["checkAlternatives"] + } + }); + + // 3. Check if user provided a new date + if (result.action === "accept" && result.content?.checkAlternatives) { + let ok = await checkAvailability(result.content?.newDate as string); + if(ok) { + return { + content: [ + { + type: "text", + text: `Trip booked on alternate date: ${result.content?.newDate}` + } + ] + }; + } else { + // 3b. No trip available on new date + return { + content: [ + { + type: "text", + text: `No trip available on ${result.content?.newDate}.` + } + ] + }; + } + } + // 4. User didn't provide a new date + return { + content: [{ + type: "text", + text: "No booking made. Original date not available." + }] + }; + } else { + // 1b. available, confirm booking + return { + content: [{ + type: "text", + text: `Booked trip on ${date}` + }] + }; + } + } +); + +const app = express(); +app.use(express.json()); + +// Store transports for each session type +const transports = { + sse: {} as Record +}; + +app.get('/sse', async (req, res) => { + // Create SSE transport for legacy clients + const transport = new SSEServerTransport('/messages', res); + transports.sse[transport.sessionId] = transport; + + res.on("close", () => { + delete transports.sse[transport.sessionId]; + }); + + await server.connect(transport); +}); + +// Legacy message endpoint for older clients +app.post('/messages', async (req, res) => { + const sessionId = req.query.sessionId as string; + const transport = transports.sse[sessionId]; + if (transport) { + await transport.handlePostMessage(req, res, req.body); + } else { + res.status(400).send('No transport found for sessionId'); + } +}); + +app.listen(3000); \ No newline at end of file diff --git a/03-GettingStarted/10-elicitation/code/typescript/tsconfig.json b/03-GettingStarted/10-elicitation/code/typescript/tsconfig.json new file mode 100644 index 000000000..ce7b85bcb --- /dev/null +++ b/03-GettingStarted/10-elicitation/code/typescript/tsconfig.json @@ -0,0 +1,16 @@ +{ + "compilerOptions": { + "target": "ES2022", + "module": "Node16", + "moduleResolution": "Node16", + "outDir": "./build", + "rootDir": "./src", + "strict": true, + "esModuleInterop": true, + "skipLibCheck": true, + "forceConsistentCasingInFileNames": true, + "noImplicitAny": false + }, + "include": ["src/**/*"], + "exclude": ["node_modules"] + } \ No newline at end of file From 7709868b1d3e32912281f6c19262408a94c75a81 Mon Sep 17 00:00:00 2001 From: chris Date: Tue, 19 Aug 2025 21:54:50 +0000 Subject: [PATCH 4/5] completed typescript vertical in code directory --- .../10-elicitation/code/python/client.py | 1 + .../10-elicitation/code/typescript/README.md | 86 +++++++++++++++++++ .../code/typescript/package.json | 2 +- .../code/typescript/src/client.ts | 55 ++++++++++++ 4 files changed, 143 insertions(+), 1 deletion(-) create mode 100644 03-GettingStarted/10-elicitation/code/python/client.py create mode 100644 03-GettingStarted/10-elicitation/code/typescript/README.md create mode 100644 03-GettingStarted/10-elicitation/code/typescript/src/client.ts diff --git a/03-GettingStarted/10-elicitation/code/python/client.py b/03-GettingStarted/10-elicitation/code/python/client.py new file mode 100644 index 000000000..628a3da7c --- /dev/null +++ b/03-GettingStarted/10-elicitation/code/python/client.py @@ -0,0 +1 @@ +# TODO add python client \ No newline at end of file diff --git a/03-GettingStarted/10-elicitation/code/typescript/README.md b/03-GettingStarted/10-elicitation/code/typescript/README.md new file mode 100644 index 000000000..ff4eabab5 --- /dev/null +++ b/03-GettingStarted/10-elicitation/code/typescript/README.md @@ -0,0 +1,86 @@ +# Run sample + +Here's how to run this Elicitation sample. + +## Install dependencies + +```sh +npm install +``` + +## Run + +Compile and run the server + +```sh +npm run build +npm start +``` + +That should start a server on `http://localhost:3000`. + +### Run via Visual Studio Code + +Create an entry in `mcp.json` like so: + +```json +"server-elicitation": { + "type": "sse", + "url": "http://localhost:3000/sse" + +} +``` + +Run a prompt like so: + +```text +Make a booking on the "2025-01-02" +``` + +You should see this trigger an elicitation as "2025-01-01" is the only available date. When you're asked for input select "true" and fill in "2025-01-01" this should state that a booking has been made on "2025-01-01". + +![Elicitation in Visual Studio Code](../../assets/elicitation.png) + +### Run the client + +In a separate terminal, run the client + +```sh +npm run client +``` + +```text +No trip available at on 2025-01-02. Would you like to check alternative dates? + +Provide the following information: +[INPUT]: 'checkAlternatives' of type boolean +[INPUT]: 'newDate' of type string +Tool result: { + content: [ + { type: 'text', text: 'Trip booked on alternate date: 2025-01-01' } + ] +} +``` + +NOTE: the client is hard coding a response to the server's eliciation and provide an "accept" message with a filled in date on "2025-01-01", you're recommended to change this code to ask the user for input. Look for this code to change it in *client.ts*: + +```typescript +client.setRequestHandler(ElicitRequestSchema, (params) => { + console.log(`${params.params.message}`); + console.log("\nProvide the following information:"); + let schema = params.params.requestedSchema.properties; + for (let key in schema) { + console.log(`[INPUT]: '${key}' of type ${schema[key].type}`); + } + + // TODO, ask for this input instead of faking the response like below + + return { + action: "accept", + content: { + checkAlternatives: true, + newDate: "2025-01-01" + }, + }; +}); +``` \ No newline at end of file diff --git a/03-GettingStarted/10-elicitation/code/typescript/package.json b/03-GettingStarted/10-elicitation/code/typescript/package.json index 0e541156a..feaf18f6b 100644 --- a/03-GettingStarted/10-elicitation/code/typescript/package.json +++ b/03-GettingStarted/10-elicitation/code/typescript/package.json @@ -6,7 +6,7 @@ "scripts": { "start": "node ./build/index.js", "build": "tsc", - "client": "tsc && node ./build/client.js", + "client": "node ./build/client.js", "inspector": "npx @modelcontextprotocol/inspector node build/index.js" }, "files": [ diff --git a/03-GettingStarted/10-elicitation/code/typescript/src/client.ts b/03-GettingStarted/10-elicitation/code/typescript/src/client.ts new file mode 100644 index 000000000..2cdc67c6e --- /dev/null +++ b/03-GettingStarted/10-elicitation/code/typescript/src/client.ts @@ -0,0 +1,55 @@ +import { Client } from "@modelcontextprotocol/sdk/client/index.js"; +import { SSEClientTransport } from "@modelcontextprotocol/sdk/client/sse.js"; +import { ElicitRequestSchema } from "@modelcontextprotocol/sdk/types.js" +import { mainModule } from "process"; + + +const client = new Client( + { + name: "test client", + version: "1.0", + }, + { + capabilities: { + elicitation: {}, + }, + }, + ); + +let baseUrl = new URL("http://localhost:3000/sse"); + +const sseTransport = new SSEClientTransport(baseUrl); + +client.setRequestHandler(ElicitRequestSchema, (params) => { + console.log(`${params.params.message}`); + console.log("\nProvide the following information:"); + let schema = params.params.requestedSchema.properties; + for (let key in schema) { + console.log(`[INPUT]: '${key}' of type ${schema[key].type}`); + } + + // TODO, ask for this input instead of faking the response like below + + return { + action: "accept", + content: { + checkAlternatives: true, + newDate: "2025-01-01" + }, + }; +}); + +async function main() { + await client.connect(sseTransport); + const result = await client.callTool({ + name: "book-trip", + arguments: { + date: "2025-01-02" + } + }); + + console.log("Tool result: ", result); +} + +main(); + From 602781b7cf2e9abf9e04237ae947c120aeeb9b7c Mon Sep 17 00:00:00 2001 From: chris Date: Thu, 21 Aug 2025 20:43:45 +0000 Subject: [PATCH 5/5] adding complete code pivots, assignment is just scaffolded thogh --- 03-GettingStarted/10-elicitation/README.md | 18 +++- .../10-elicitation/code/README.md | 4 + .../10-elicitation/code/python/README.md | 93 +++++++++++++++++++ .../10-elicitation/code/python/client.py | 58 +++++++++++- .../10-elicitation/solution/README.md | 4 + .../10-elicitation/solution/python/README.md | 1 + .../solution/typescript/README.md | 1 + 7 files changed, 177 insertions(+), 2 deletions(-) create mode 100644 03-GettingStarted/10-elicitation/code/README.md create mode 100644 03-GettingStarted/10-elicitation/code/python/README.md create mode 100644 03-GettingStarted/10-elicitation/solution/README.md create mode 100644 03-GettingStarted/10-elicitation/solution/python/README.md create mode 100644 03-GettingStarted/10-elicitation/solution/typescript/README.md diff --git a/03-GettingStarted/10-elicitation/README.md b/03-GettingStarted/10-elicitation/README.md index 16cfe57f6..6f5c9ede7 100644 --- a/03-GettingStarted/10-elicitation/README.md +++ b/03-GettingStarted/10-elicitation/README.md @@ -1 +1,17 @@ -# Elicitation \ No newline at end of file +# Elicitation + +Elicitation is a feature in MCP were you ask the user for more context. This is a powerful features as sometimes you don't have all the information from the start or sometimes a choice the user makes completely changes what should happen next. There's all kinds of scenarios where this is useful from booking scenarios to general workflows + +## Scenarios + +## Messages + +## Server implementation + +## Client implementation + +## Assignment + +## Quiz + +## Summary \ No newline at end of file diff --git a/03-GettingStarted/10-elicitation/code/README.md b/03-GettingStarted/10-elicitation/code/README.md new file mode 100644 index 000000000..33256b90b --- /dev/null +++ b/03-GettingStarted/10-elicitation/code/README.md @@ -0,0 +1,4 @@ +Please select runtime to run the code: + +- [TypeScript](./typescript/README.md) +- [Python](./python/README.md) \ No newline at end of file diff --git a/03-GettingStarted/10-elicitation/code/python/README.md b/03-GettingStarted/10-elicitation/code/python/README.md new file mode 100644 index 000000000..11ec2b63b --- /dev/null +++ b/03-GettingStarted/10-elicitation/code/python/README.md @@ -0,0 +1,93 @@ +# Run the code + +This sample demonstrates the use of Elicitation + +## Set up environment + +```sh +python -m venv venv +source ./venv/bin/activate +``` + +## Run server + +```sh +uvicorn server:app +``` + +You should see: + +```text +INFO: Started server process [5016] +INFO: Waiting for application startup. +INFO: Application startup complete. +INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) +``` + +This should start a server on port 8000. + +## Test out the server in VS Code + +Add an entry like so to *mcp.json*: + +``` +"server": { + "type": "sse", + "url": "http://localhost:8000/sse" + +} +``` + +and start the server. Now try typing the following prompt in the chat: + +```text +Book trip on 2025-02-01 +``` + +This prompt should trigger an Elicitation scenario where you're asked for more input. Typing "2025-01-01" should lead to a successful booking: + +![Elicitation example VS Code](../../assets/elicitation.png) + +## Run client + +Run the following command: + +```sh +python client.py +``` + +It should start the client and you should see the following output: + +```text +Available tools: ['book_trip'] +[CLIENT] Received elicitation data: No trips available on 2025-01-02. Would you like to try another date? +[CLIENT]: Selecting alternative date: 2025-01-01 +Result: [SUCCESS] Booked for 2025-01-01 +``` + +Let's highlight a piece of code, the client handler for elicitation as we're hardcoding the responses back to the server: + +```python +async def elicitation_callback_handler(context: RequestContext[ClientSession, None], params: ElicitRequestParams): + print(f"[CLIENT] Received elicitation data: {params.message}") + + # 1. refuses no select other date + # return ElicitResult(action="accept", content={ + # "checkAlternative": False + # }) # should say no booking made, WORKS + + # 2. cancels booking + # return ElicitResult(action="decline"), WORKS + + print("[CLIENT]: Selecting alternative date: 2025-01-01") + + # 3. opts to select another date, 2025-01-01 which leads to a booking + return ElicitResult(action="accept", content={ + "checkAlternative": True, + "alternativeDate": "2025-01-01" + }) # should book 1 jan instead of initial 2nd Jan +``` + +Here we are hardcoding back an "accept" response with a prefilled alternate date that the server will accept. We have also provided other response types like 1) User refuses to select a date which should lead to a response saying no booking has been made. 2) This response is more like the user dismisses the whole dialogue and also this leads to no booking taking place. + +You're encouraged to improve this code by making this user-driven instead of hardcoded and also to try out the different responses to see the difference. diff --git a/03-GettingStarted/10-elicitation/code/python/client.py b/03-GettingStarted/10-elicitation/code/python/client.py index 628a3da7c..7b24bdde2 100644 --- a/03-GettingStarted/10-elicitation/code/python/client.py +++ b/03-GettingStarted/10-elicitation/code/python/client.py @@ -1 +1,57 @@ -# TODO add python client \ No newline at end of file +# TODO add python client + +import asyncio + +from mcp import ClientSession +from mcp.client.sse import sse_client +from mcp.types import ElicitRequestParams, ElicitResult, TextContent +from mcp.shared.context import RequestContext + +async def elicitation_callback_handler(context: RequestContext[ClientSession, None], params: ElicitRequestParams): + print(f"[CLIENT] Received elicitation data: {params.message}") + + # 1. refuses no select other date + # return ElicitResult(action="accept", content={ + # "checkAlternative": False + # }) # should say no booking made, WORKS + + # 2. cancels booking + # return ElicitResult(action="decline"), WORKS + + print("[CLIENT]: Selecting alternative date: 2025-01-01") + + # 3. opts to select another date, 2025-01-01 which leads to a booking + return ElicitResult(action="accept", content={ + "checkAlternative": True, + "alternativeDate": "2025-01-01" + }) # should book 1 jan instead of initial 2nd Jan + + + + +async def main(): + # Connect to a Server-Sent Events (SSE) server + async with sse_client(url="http://localhost:8000/sse") as ( + read_stream, + write_stream + ): + # Create a session using the client streams + async with ClientSession( + read_stream, + write_stream, + elicitation_callback=elicitation_callback_handler) as session: + # Initialize the connection + await session.initialize() + # List available tools + tools = await session.list_tools() + print(f"Available tools: {[tool.name for tool in tools.tools]}") + + # call tool + result = await session.call_tool("book_trip", { + "date": "2025-01-02" + }) + print("Result: ", result.content[0].text) + + +if __name__ == "__main__": + asyncio.run(main()) \ No newline at end of file diff --git a/03-GettingStarted/10-elicitation/solution/README.md b/03-GettingStarted/10-elicitation/solution/README.md new file mode 100644 index 000000000..3320292c7 --- /dev/null +++ b/03-GettingStarted/10-elicitation/solution/README.md @@ -0,0 +1,4 @@ +Choose your runtime + +- [TypeScript]() +- [Python]() \ No newline at end of file diff --git a/03-GettingStarted/10-elicitation/solution/python/README.md b/03-GettingStarted/10-elicitation/solution/python/README.md new file mode 100644 index 000000000..ba4ed54ee --- /dev/null +++ b/03-GettingStarted/10-elicitation/solution/python/README.md @@ -0,0 +1 @@ +# How to run this sample \ No newline at end of file diff --git a/03-GettingStarted/10-elicitation/solution/typescript/README.md b/03-GettingStarted/10-elicitation/solution/typescript/README.md new file mode 100644 index 000000000..ba4ed54ee --- /dev/null +++ b/03-GettingStarted/10-elicitation/solution/typescript/README.md @@ -0,0 +1 @@ +# How to run this sample \ No newline at end of file