diff --git a/.gitignore b/.gitignore
index a6beb0bc..c3e66b78 100644
--- a/.gitignore
+++ b/.gitignore
@@ -301,3 +301,4 @@ cython_debug/
# and can be added to the global gitignore or merged into this file. For a more nuclear
# option (not recommended) you can uncomment the following to ignore the entire idea folder.
#.idea/
+.claude/settings.local.json
diff --git a/README.md b/README.md
index 24eb81f8..5ca87ea5 100644
--- a/README.md
+++ b/README.md
@@ -243,6 +243,7 @@ Official integrations are maintained by companies building production ready MCP
-
**[Hunter](https://github.com/hunter-io/hunter-mcp)** - Interact with the [Hunter API](https://hunter.io) to get B2B data using natural language.
-
**[Hyperbolic](https://github.com/HyperbolicLabs/hyperbolic-mcp)** - Interact with Hyperbolic's GPU cloud, enabling agents and LLMs to view and rent available GPUs, SSH into them, and run GPU-powered workloads for you.
-
**[Hyperbrowser](https://github.com/hyperbrowserai/mcp)** - [Hyperbrowser](https://www.hyperbrowser.ai/) is the next-generation platform empowering AI agents and enabling effortless, scalable browser automation.
+- **[IBM watsonx.data intelligence](https://github.com/IBM/data-intelligence-mcp-server)** - Find, understand, and work with your data in the watsonx.data intelligence governance & catalog, data quality, data lineage, and data product hub
- **[IBM wxflows](https://github.com/IBM/wxflows/tree/main/examples/mcp/javascript)** - Tool platform by IBM to build, test and deploy tools for any data source
-
**[Improve Digital Publisher MCP](https://github.com/azerion/improvedigital-publisher-mcp-server)** - An MCP server that enables publishers to integrate [Improve Digital’s](https://improvedigital.com/) inventory management system with their AI tools or agents.
-
**[Inbox Zero](https://github.com/elie222/inbox-zero/tree/main/apps/mcp-server)** - AI personal assistant for email [Inbox Zero](https://www.getinboxzero.com)
@@ -353,6 +354,7 @@ Official integrations are maintained by companies building production ready MCP
-
**[Oracle](https://docs.oracle.com/en/database/oracle/sql-developer-command-line/25.2/sqcug/starting-and-managing-sqlcl-mcp-server.html#GUID-5F916B5D-8670-42BD-9F8B-D3D2424EC47E)** - Official [Oracle Database: SQLcl ](https://www.oracle.com/database/sqldeveloper/technologies/sqlcl/download/) MCP server enabling all access to any Oracle Database via native MCP support directly in SQLcl.
-
**[Orshot](https://github.com/rishimohan/orshot-mcp-server)** - Official [Orshot](https://orshot.com) MCP server to dynamically generate images from custom design templates.
-
**[Oxylabs](https://github.com/oxylabs/oxylabs-mcp)** - Scrape websites with Oxylabs Web API, supporting dynamic rendering and parsing for structured data extraction.
+-
**[PandaDoc](https://developers.pandadoc.com/docs/use-pandadoc-mcp-server)** - Configure AI development tools to connect to PandaDoc's Model Context Protocol server and leverage AI-powered PandaDoc integrations.
-
**[Paddle](https://github.com/PaddleHQ/paddle-mcp-server)** - Interact with the Paddle API. Manage product catalog, billing and subscriptions, and reports.
- **[PaddleOCR](https://paddlepaddle.github.io/PaddleOCR/latest/en/version3.x/deployment/mcp_server.html)** - An MCP server that brings enterprise-grade OCR and document parsing capabilities to AI applications.
-
**[PagerDuty](https://github.com/PagerDuty/pagerduty-mcp-server)** - Interact with your PagerDuty account, allowing you to manage incidents, services, schedules, and more directly from your MCP-enabled client.
@@ -614,6 +616,7 @@ A growing set of community-developed and maintained servers demonstrates various
- **[Chroma](https://github.com/privetin/chroma)** - Vector database server for semantic document search and metadata filtering, built on Chroma
- **[Chrome history](https://github.com/vincent-pli/chrome-history-mcp)** - Talk with AI about your browser history, get fun ^_^
- **[CIViC](https://github.com/QuentinCody/civic-mcp-server)** - MCP server for the Clinical Interpretation of Variants in Cancer (CIViC) database, providing access to clinical variant interpretations and genomic evidence for cancer research.
+- **[claude-faf-mcp](https://github.com/Wolfe-Jam/claude-faf-mcp)** - MCP server for .faf format. Context scoring engine with project context management.
- **[Claude Thread Continuity](https://github.com/peless/claude-thread-continuity)** - Persistent memory system enabling Claude Desktop conversations to resume with full context across sessions. Maintains conversation history, project states, and user preferences for seamless multi-session workflows.
- **[ClaudePost](https://github.com/ZilongXue/claude-post)** - ClaudePost enables seamless email management for Gmail, offering secure features like email search, reading, and sending.
- **[CLDGeminiPDF Analyzer](https://github.com/tfll37/CLDGeminiPDF-Analyzer)** - MCP server tool enabling sharing large PDF files to Google LLMs via API for further/additional analysis and response retrieval to Claude Desktop.
@@ -933,6 +936,7 @@ A growing set of community-developed and maintained servers demonstrates various
- **[MCP Create](https://github.com/tesla0225/mcp-create)** - A dynamic MCP server management service that creates, runs, and manages Model Context Protocol servers on-the-fly.
- **[MCP Documentation Server](https://github.com/andrea9293/mcp-documentation-server)** - Server that provides local-first document management and semantic search via embeddings or Gemini AI (recommended). Optimized for performance with disk persistence, an in-memory index, and caching.
- **[MCP Installer](https://github.com/anaisbetts/mcp-installer)** - This server is a server that installs other MCP servers for you.
+- **[MCP on Android TV](https://github.com/MiddlePoint-Solutions/mcp-on-android-tv)** - A Model Context Protocol (MCP) server running directly on your Android TV with bundeld access to ADB on-device.
- **[MCP ProjectManage OpenProject](https://github.com/boma086/mcp-projectmanage-openproject)** - This server provides the MCP service for project weekly reports, with project management information supplied by OpenProject.
- **[MCP Proxy Server](https://github.com/TBXark/mcp-proxy)** - An MCP proxy server that aggregates and serves multiple MCP resource servers through a single HTTP server.
- **[MCP Server Creator](https://github.com/GongRzhe/MCP-Server-Creator)** - A powerful Model Context Protocol (MCP) server that creates other MCP servers! This meta-server provides tools for dynamically generating FastMCP server configurations and Python code.
@@ -989,6 +993,7 @@ A growing set of community-developed and maintained servers demonstrates various
- **[Mikrotik](https://github.com/jeff-nasseri/mikrotik-mcp)** - Mikrotik MCP server which cover networking operations (IP, DHCP, Firewall, etc)
- **[Mindmap](https://github.com/YuChenSSR/mindmap-mcp-server)** (by YuChenSSR) - A server that generates mindmaps from input containing markdown code.
- **[Minima](https://github.com/dmayboroda/minima)** - MCP server for RAG on local files
+- **[MLflow](https://github.com/kkruglik/mlflow-mcp)** - MLflow MCP server for ML experiment tracking with advanced querying, run comparison, artifact access, and model registry.
- **[Modao Proto MCP](https://github.com/modao-dev/modao-proto-mcp)** - AI-powered HTML prototype generation server that converts natural language descriptions into complete HTML code with modern design and responsive layouts. Supports design description expansion and seamless integration with Modao workspace.
- **[Mobile MCP](https://github.com/mobile-next/mobile-mcp)** (by Mobile Next) - MCP server for Mobile(iOS/Android) automation, app scraping and development using physical devices or simulators/emulators.
- **[Monday.com (unofficial)](https://github.com/sakce/mcp-server-monday)** - MCP Server to interact with Monday.com boards and items.
diff --git a/package-lock.json b/package-lock.json
index 0f706418..e7395e8a 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1222,13 +1222,300 @@
}
},
"node_modules/@modelcontextprotocol/sdk": {
- "version": "0.5.0",
- "resolved": "https://registry.npmjs.org/@modelcontextprotocol/sdk/-/sdk-0.5.0.tgz",
- "integrity": "sha512-RXgulUX6ewvxjAG0kOpLMEdXXWkzWgaoCGaA2CwNW7cQCIphjpJhjpHSiaPdVCnisjRF/0Cm9KWHUuIoeiAblQ==",
+ "version": "1.19.1",
+ "resolved": "https://registry.npmjs.org/@modelcontextprotocol/sdk/-/sdk-1.19.1.tgz",
+ "integrity": "sha512-3Y2h3MZKjec1eAqSTBclATlX+AbC6n1LgfVzRMJLt3v6w0RCYgwLrjbxPDbhsYHt6Wdqc/aCceNJYgj448ELQQ==",
+ "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.3",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz",
+ "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==",
+ "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/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/@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",
- "raw-body": "^3.0.0",
- "zod": "^3.23.8"
+ "media-typer": "^1.1.0",
+ "mime-types": "^3.0.0"
+ },
+ "engines": {
+ "node": ">= 0.6"
}
},
"node_modules/@modelcontextprotocol/server-everything": {
@@ -2799,6 +3086,19 @@
"node": ">= 0.4"
}
},
+ "node_modules/get-stream": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
+ "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/glob": {
"version": "7.2.3",
"resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
@@ -3263,19 +3563,6 @@
"url": "https://github.com/sindresorhus/execa?sponsor=1"
}
},
- "node_modules/jest-changed-files/node_modules/get-stream": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
- "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
"node_modules/jest-changed-files/node_modules/human-signals": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz",
@@ -4211,6 +4498,12 @@
"dev": true,
"license": "MIT"
},
+ "node_modules/lru-cache": {
+ "version": "10.4.3",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz",
+ "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==",
+ "license": "ISC"
+ },
"node_modules/make-dir": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz",
@@ -4577,12 +4870,6 @@
"url": "https://github.com/sponsors/isaacs"
}
},
- "node_modules/path-scurry/node_modules/lru-cache": {
- "version": "10.4.3",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz",
- "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==",
- "license": "ISC"
- },
"node_modules/path-to-regexp": {
"version": "0.1.12",
"resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz",
@@ -4618,6 +4905,15 @@
"node": ">= 6"
}
},
+ "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/pkg-dir": {
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz",
@@ -4852,9 +5148,9 @@
}
},
"node_modules/router/node_modules/debug": {
- "version": "4.4.0",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz",
- "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==",
+ "version": "4.4.3",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz",
+ "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==",
"license": "MIT",
"dependencies": {
"ms": "^2.1.3"
@@ -4875,12 +5171,13 @@
"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==",
+ "version": "8.3.0",
+ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.3.0.tgz",
+ "integrity": "sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==",
"license": "MIT",
- "engines": {
- "node": ">=16"
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
}
},
"node_modules/safe-buffer": {
@@ -5741,13 +6038,23 @@
}
},
"node_modules/zod": {
- "version": "3.23.8",
- "resolved": "https://registry.npmjs.org/zod/-/zod-3.23.8.tgz",
- "integrity": "sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==",
+ "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"
+ }
+ },
"src/aws-kb-retrieval-server": {
"name": "@modelcontextprotocol/server-aws-kb-retrieval",
"version": "0.6.2",
@@ -5828,7 +6135,7 @@
"version": "0.6.2",
"license": "MIT",
"dependencies": {
- "@modelcontextprotocol/sdk": "^1.18.0",
+ "@modelcontextprotocol/sdk": "^1.19.1",
"cors": "^2.8.5",
"express": "^4.21.1",
"zod": "^3.23.8",
@@ -5844,336 +6151,12 @@
"typescript": "^5.6.2"
}
},
- "src/everything/node_modules/@modelcontextprotocol/sdk": {
- "version": "1.18.0",
- "resolved": "https://registry.npmjs.org/@modelcontextprotocol/sdk/-/sdk-1.18.0.tgz",
- "integrity": "sha512-JvKyB6YwS3quM+88JPR0axeRgvdDu3Pv6mdZUy+w4qVkCzGgumb9bXG/TmtDRQv+671yaofVfXSQmFLlWU5qPQ==",
- "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"
- }
- },
- "src/everything/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"
- }
- },
- "src/everything/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"
- }
- },
- "src/everything/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"
- }
- },
- "src/everything/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"
- }
- },
- "src/everything/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"
- }
- },
- "src/everything/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
- }
- }
- },
- "src/everything/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"
- }
- },
- "src/everything/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"
- }
- },
- "src/everything/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"
- }
- },
- "src/everything/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"
- }
- },
- "src/everything/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"
- }
- },
- "src/everything/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"
- }
- },
- "src/everything/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"
- }
- },
- "src/everything/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"
- },
- "src/everything/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"
- }
- },
- "src/everything/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"
- }
- },
- "src/everything/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"
- }
- },
- "src/everything/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"
- }
- },
- "src/everything/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"
- }
- },
- "src/everything/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"
- }
- },
- "src/everything/node_modules/zod": {
- "version": "3.25.64",
- "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.64.tgz",
- "integrity": "sha512-hbP9FpSZf7pkS7hRVUrOjhwKJNyampPgtXKc3AN6DsWtoHsg2Sb4SQaS4Tcay380zSwd2VPo9G9180emBACp5g==",
- "license": "MIT",
- "funding": {
- "url": "https://github.com/sponsors/colinhacks"
- }
- },
- "src/everything/node_modules/zod-to-json-schema": {
- "version": "3.24.5",
- "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.24.5.tgz",
- "integrity": "sha512-/AuWwMP+YqiPbsJx5D6TfgRTc4kTLjsh5SOcd4bLsfUg2RcEXrFMJl1DGgdHy2aCfsIA/cr/1JM0xcB2GZji8g==",
- "license": "ISC",
- "peerDependencies": {
- "zod": "^3.24.1"
- }
- },
"src/filesystem": {
"name": "@modelcontextprotocol/server-filesystem",
"version": "0.6.3",
"license": "MIT",
"dependencies": {
- "@modelcontextprotocol/sdk": "^1.17.0",
+ "@modelcontextprotocol/sdk": "^1.19.1",
"diff": "^5.1.0",
"glob": "^10.3.10",
"minimatch": "^10.0.1",
@@ -6195,62 +6178,6 @@
"typescript": "^5.8.2"
}
},
- "src/filesystem/node_modules/@modelcontextprotocol/sdk": {
- "version": "1.17.0",
- "resolved": "https://registry.npmjs.org/@modelcontextprotocol/sdk/-/sdk-1.17.0.tgz",
- "integrity": "sha512-qFfbWFA7r1Sd8D697L7GkTd36yqDuTkvz0KfOGkgXR8EUhQn3/EDNIR/qUdQNMT8IjmasBvHWuXeisxtXTQT2g==",
- "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"
- }
- },
- "src/filesystem/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"
- }
- },
- "src/filesystem/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"
- }
- },
"src/filesystem/node_modules/brace-expansion": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz",
@@ -6260,112 +6187,6 @@
"balanced-match": "^1.0.0"
}
},
- "src/filesystem/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"
- }
- },
- "src/filesystem/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"
- }
- },
- "src/filesystem/node_modules/debug": {
- "version": "4.4.0",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz",
- "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==",
- "license": "MIT",
- "dependencies": {
- "ms": "^2.1.3"
- },
- "engines": {
- "node": ">=6.0"
- },
- "peerDependenciesMeta": {
- "supports-color": {
- "optional": true
- }
- }
- },
- "src/filesystem/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"
- }
- },
- "src/filesystem/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"
- }
- },
- "src/filesystem/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"
- }
- },
"src/filesystem/node_modules/glob": {
"version": "10.4.5",
"resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz",
@@ -6401,60 +6222,6 @@
"url": "https://github.com/sponsors/isaacs"
}
},
- "src/filesystem/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"
- }
- },
- "src/filesystem/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"
- }
- },
- "src/filesystem/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"
- }
- },
- "src/filesystem/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"
- }
- },
- "src/filesystem/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"
- }
- },
"src/filesystem/node_modules/minimatch": {
"version": "10.0.1",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.0.1.tgz",
@@ -6470,114 +6237,6 @@
"url": "https://github.com/sponsors/isaacs"
}
},
- "src/filesystem/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"
- },
- "src/filesystem/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"
- }
- },
- "src/filesystem/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"
- }
- },
- "src/filesystem/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"
- }
- },
- "src/filesystem/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"
- }
- },
- "src/filesystem/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"
- }
- },
- "src/filesystem/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"
- }
- },
- "src/filesystem/node_modules/zod": {
- "version": "3.24.2",
- "resolved": "https://registry.npmjs.org/zod/-/zod-3.24.2.tgz",
- "integrity": "sha512-lY7CDW43ECgW9u1TcT3IoXHflywfVqDYze4waEz812jR/bZ8FHDsl7pFQoSZTz5N+2NqRXs8GBwnAwo3ZNxqhQ==",
- "license": "MIT",
- "funding": {
- "url": "https://github.com/sponsors/colinhacks"
- }
- },
- "src/filesystem/node_modules/zod-to-json-schema": {
- "version": "3.24.5",
- "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.24.5.tgz",
- "integrity": "sha512-/AuWwMP+YqiPbsJx5D6TfgRTc4kTLjsh5SOcd4bLsfUg2RcEXrFMJl1DGgdHy2aCfsIA/cr/1JM0xcB2GZji8g==",
- "license": "ISC",
- "peerDependencies": {
- "zod": "^3.24.1"
- }
- },
"src/gdrive": {
"name": "@modelcontextprotocol/server-gdrive",
"version": "0.6.2",
@@ -6661,7 +6320,7 @@
"version": "0.6.3",
"license": "MIT",
"dependencies": {
- "@modelcontextprotocol/sdk": "1.0.1"
+ "@modelcontextprotocol/sdk": "^1.19.1"
},
"bin": {
"mcp-server-memory": "dist/index.js"
@@ -6672,16 +6331,6 @@
"typescript": "^5.6.2"
}
},
- "src/memory/node_modules/@modelcontextprotocol/sdk": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/@modelcontextprotocol/sdk/-/sdk-1.0.1.tgz",
- "integrity": "sha512-slLdFaxQJ9AlRg+hw28iiTtGvShAOgOKXcD0F91nUcRYiOMuS9ZBYjcdNZRXW9G5JQ511GRTdUy1zQVZDpJ+4w==",
- "dependencies": {
- "content-type": "^1.0.5",
- "raw-body": "^3.0.0",
- "zod": "^3.23.8"
- }
- },
"src/postgres": {
"name": "@modelcontextprotocol/server-postgres",
"version": "0.6.2",
@@ -6741,7 +6390,7 @@
"version": "0.6.2",
"license": "MIT",
"dependencies": {
- "@modelcontextprotocol/sdk": "0.5.0",
+ "@modelcontextprotocol/sdk": "^1.19.1",
"chalk": "^5.3.0",
"yargs": "^17.7.2"
},
@@ -6749,9 +6398,14 @@
"mcp-server-sequential-thinking": "dist/index.js"
},
"devDependencies": {
+ "@jest/globals": "^29.7.0",
+ "@types/jest": "^29.5.14",
"@types/node": "^22",
"@types/yargs": "^17.0.32",
+ "jest": "^29.7.0",
"shx": "^0.3.4",
+ "ts-jest": "^29.1.1",
+ "ts-node": "^10.9.2",
"typescript": "^5.3.3"
}
},
diff --git a/src/everything/everything.ts b/src/everything/everything.ts
index 67b4cb9e..bc39b1ba 100644
--- a/src/everything/everything.ts
+++ b/src/everything/everything.ts
@@ -6,7 +6,6 @@ import {
CompleteRequestSchema,
CreateMessageRequest,
CreateMessageResultSchema,
- ElicitRequest,
ElicitResultSchema,
GetPromptRequestSchema,
ListPromptsRequestSchema,
@@ -264,22 +263,6 @@ export const createServer = () => {
};
- const requestElicitation = async (
- message: string,
- requestedSchema: any,
- sendRequest: SendRequest
- ) => {
- const request: ElicitRequest = {
- method: 'elicitation/create',
- params: {
- message,
- requestedSchema,
- },
- };
-
- return await sendRequest(request, ElicitResultSchema);
- };
-
const ALL_RESOURCES: Resource[] = Array.from({ length: 100 }, (_, i) => {
const uri = `test://static/resource/${i + 1}`;
if (i % 2 === 0) {
@@ -557,7 +540,7 @@ export const createServer = () => {
});
if (clientCapabilities!.elicitation) tools.push ({
name: ToolName.ELICITATION,
- description: "Demonstrates the Elicitation feature by asking the user to provide information about their favorite color, number, and pets.",
+ description: "Elicitation test tool that demonstrates how to request user input with various field types (string, boolean, email, uri, date, integer, number, enum)",
inputSchema: zodToJsonSchema(ElicitationSchema) as ToolInput,
});
@@ -752,27 +735,75 @@ export const createServer = () => {
if (name === ToolName.ELICITATION) {
ElicitationSchema.parse(args);
- const elicitationResult = await requestElicitation(
- 'What are your favorite things?',
- {
- type: 'object',
- properties: {
- color: { type: 'string', description: 'Favorite color' },
- number: {
- type: 'integer',
- description: 'Favorite number',
- minimum: 1,
- maximum: 100,
- },
- pets: {
- type: 'string',
- enum: ['cats', 'dogs', 'birds', 'fish', 'reptiles'],
- description: 'Favorite pets',
+ const elicitationResult = await extra.sendRequest({
+ method: 'elicitation/create',
+ params: {
+ message: 'Please provide inputs for the following fields:',
+ requestedSchema: {
+ type: 'object',
+ properties: {
+ name: {
+ title: 'Full Name',
+ type: 'string',
+ description: 'Your full, legal name',
+ },
+ check: {
+ title: 'Agree to terms',
+ type: 'boolean',
+ description: 'A boolean check',
+ },
+ color: {
+ title: 'Favorite Color',
+ type: 'string',
+ description: 'Favorite color (open text)',
+ default: 'blue',
+ },
+ email: {
+ title: 'Email Address',
+ type: 'string',
+ format: 'email',
+ description: 'Your email address (will be verified, and never shared with anyone else)',
+ },
+ homepage: {
+ type: 'string',
+ format: 'uri',
+ description: 'Homepage / personal site',
+ },
+ birthdate: {
+ title: 'Birthdate',
+ type: 'string',
+ format: 'date',
+ description: 'Your date of birth (will never be shared with anyone else)',
+ },
+ integer: {
+ title: 'Favorite Integer',
+ type: 'integer',
+ description: 'Your favorite integer (do not give us your phone number, pin, or other sensitive info)',
+ minimum: 1,
+ maximum: 100,
+ default: 42,
+ },
+ number: {
+ title: 'Favorite Number',
+ type: 'number',
+ description: 'Favorite number (there are no wrong answers)',
+ minimum: 0,
+ maximum: 1000,
+ default: 3.14,
+ },
+ petType: {
+ title: 'Pet type',
+ type: 'string',
+ enum: ['cats', 'dogs', 'birds', 'fish', 'reptiles'],
+ enumNames: ['Cats', 'Dogs', 'Birds', 'Fish', 'Reptiles'],
+ default: 'dogs',
+ description: 'Your favorite pet type',
+ },
},
+ required: ['name'],
},
},
- extra.sendRequest
- );
+ }, ElicitResultSchema, { timeout: 10 * 60 * 1000 /* 10 minutes */ });
// Handle different response actions
const content = [];
@@ -780,19 +811,30 @@ export const createServer = () => {
if (elicitationResult.action === 'accept' && elicitationResult.content) {
content.push({
type: "text",
- text: `✅ User provided their favorite things!`,
+ text: `✅ User provided the requested information!`,
});
// Only access elicitationResult.content when action is accept
- const { color, number, pets } = elicitationResult.content;
+ const userData = elicitationResult.content;
+ const lines = [];
+ if (userData.name) lines.push(`- Name: ${userData.name}`);
+ if (userData.check !== undefined) lines.push(`- Agreed to terms: ${userData.check}`);
+ if (userData.color) lines.push(`- Favorite Color: ${userData.color}`);
+ if (userData.email) lines.push(`- Email: ${userData.email}`);
+ if (userData.homepage) lines.push(`- Homepage: ${userData.homepage}`);
+ if (userData.birthdate) lines.push(`- Birthdate: ${userData.birthdate}`);
+ if (userData.integer !== undefined) lines.push(`- Favorite Integer: ${userData.integer}`);
+ if (userData.number !== undefined) lines.push(`- Favorite Number: ${userData.number}`);
+ if (userData.petType) lines.push(`- Pet Type: ${userData.petType}`);
+
content.push({
type: "text",
- text: `Their favorites are:\n- Color: ${color || 'not specified'}\n- Number: ${number || 'not specified'}\n- Pets: ${pets || 'not specified'}`,
+ text: `User inputs:\n${lines.join('\n')}`,
});
} else if (elicitationResult.action === 'decline') {
content.push({
type: "text",
- text: `❌ User declined to provide their favorite things.`,
+ text: `❌ User declined to provide the requested information.`,
});
} else if (elicitationResult.action === 'cancel') {
content.push({
diff --git a/src/everything/package.json b/src/everything/package.json
index e388922d..8a1f98b6 100644
--- a/src/everything/package.json
+++ b/src/everything/package.json
@@ -22,7 +22,7 @@
"start:streamableHttp": "node dist/streamableHttp.js"
},
"dependencies": {
- "@modelcontextprotocol/sdk": "^1.18.0",
+ "@modelcontextprotocol/sdk": "^1.19.1",
"cors": "^2.8.5",
"express": "^4.21.1",
"zod": "^3.23.8",
diff --git a/src/filesystem/package.json b/src/filesystem/package.json
index faeefa54..2eaf7913 100644
--- a/src/filesystem/package.json
+++ b/src/filesystem/package.json
@@ -20,7 +20,7 @@
"test": "jest --config=jest.config.cjs --coverage"
},
"dependencies": {
- "@modelcontextprotocol/sdk": "^1.17.0",
+ "@modelcontextprotocol/sdk": "^1.19.1",
"diff": "^5.1.0",
"glob": "^10.3.10",
"minimatch": "^10.0.1",
diff --git a/src/memory/README.md b/src/memory/README.md
index 3fd59bbd..f6e0bb89 100644
--- a/src/memory/README.md
+++ b/src/memory/README.md
@@ -173,14 +173,14 @@ The server can be configured using the following environment variables:
"@modelcontextprotocol/server-memory"
],
"env": {
- "MEMORY_FILE_PATH": "/path/to/custom/memory.json"
+ "MEMORY_FILE_PATH": "/path/to/custom/memory.jsonl"
}
}
}
}
```
-- `MEMORY_FILE_PATH`: Path to the memory storage JSON file (default: `memory.json` in the server directory)
+- `MEMORY_FILE_PATH`: Path to the memory storage JSONL file (default: `memory.jsonl` in the server directory)
# VS Code Installation Instructions
diff --git a/src/memory/index.ts b/src/memory/index.ts
index 982c617b..204968f5 100644
--- a/src/memory/index.ts
+++ b/src/memory/index.ts
@@ -11,14 +11,43 @@ import path from 'path';
import { fileURLToPath } from 'url';
// Define memory file path using environment variable with fallback
-const defaultMemoryPath = path.join(path.dirname(fileURLToPath(import.meta.url)), 'memory.json');
+const defaultMemoryPath = path.join(path.dirname(fileURLToPath(import.meta.url)), 'memory.jsonl');
-// If MEMORY_FILE_PATH is just a filename, put it in the same directory as the script
-const MEMORY_FILE_PATH = process.env.MEMORY_FILE_PATH
- ? path.isAbsolute(process.env.MEMORY_FILE_PATH)
- ? process.env.MEMORY_FILE_PATH
- : path.join(path.dirname(fileURLToPath(import.meta.url)), process.env.MEMORY_FILE_PATH)
- : defaultMemoryPath;
+// Handle backward compatibility: migrate memory.json to memory.jsonl if needed
+async function ensureMemoryFilePath(): Promise {
+ if (process.env.MEMORY_FILE_PATH) {
+ // Custom path provided, use it as-is (with absolute path resolution)
+ return path.isAbsolute(process.env.MEMORY_FILE_PATH)
+ ? process.env.MEMORY_FILE_PATH
+ : path.join(path.dirname(fileURLToPath(import.meta.url)), process.env.MEMORY_FILE_PATH);
+ }
+
+ // No custom path set, check for backward compatibility migration
+ const oldMemoryPath = path.join(path.dirname(fileURLToPath(import.meta.url)), 'memory.json');
+ const newMemoryPath = defaultMemoryPath;
+
+ try {
+ // Check if old file exists and new file doesn't
+ await fs.access(oldMemoryPath);
+ try {
+ await fs.access(newMemoryPath);
+ // Both files exist, use new one (no migration needed)
+ return newMemoryPath;
+ } catch {
+ // Old file exists, new file doesn't - migrate
+ console.error('DETECTED: Found legacy memory.json file, migrating to memory.jsonl for JSONL format compatibility');
+ await fs.rename(oldMemoryPath, newMemoryPath);
+ console.error('COMPLETED: Successfully migrated memory.json to memory.jsonl');
+ return newMemoryPath;
+ }
+ } catch {
+ // Old file doesn't exist, use new path
+ return newMemoryPath;
+ }
+}
+
+// Initialize memory file path (will be set during startup)
+let MEMORY_FILE_PATH: string;
// We are storing our memory using entities, relations, and observations in a graph structure
interface Entity {
@@ -434,6 +463,9 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
});
async function main() {
+ // Initialize memory file path with backward compatibility
+ MEMORY_FILE_PATH = await ensureMemoryFilePath();
+
const transport = new StdioServerTransport();
await server.connect(transport);
console.error("Knowledge Graph MCP Server running on stdio");
diff --git a/src/memory/package.json b/src/memory/package.json
index b64cf3b6..bb133ce2 100644
--- a/src/memory/package.json
+++ b/src/memory/package.json
@@ -19,7 +19,7 @@
"watch": "tsc --watch"
},
"dependencies": {
- "@modelcontextprotocol/sdk": "1.0.1"
+ "@modelcontextprotocol/sdk": "^1.19.1"
},
"devDependencies": {
"@types/node": "^22",
diff --git a/src/sequentialthinking/__tests__/lib.test.ts b/src/sequentialthinking/__tests__/lib.test.ts
new file mode 100644
index 00000000..ada2820d
--- /dev/null
+++ b/src/sequentialthinking/__tests__/lib.test.ts
@@ -0,0 +1,440 @@
+import { describe, it, expect, beforeEach, jest } from '@jest/globals';
+import { SequentialThinkingServer, ThoughtData } from '../lib.js';
+
+// Mock chalk to avoid ESM issues in Jest
+jest.mock('chalk', () => {
+ const chalkMock = {
+ yellow: (str: string) => str,
+ green: (str: string) => str,
+ blue: (str: string) => str,
+ };
+ return {
+ default: chalkMock,
+ __esModule: true,
+ };
+});
+
+describe('SequentialThinkingServer', () => {
+ let server: SequentialThinkingServer;
+
+ beforeEach(() => {
+ // Disable thought logging for tests
+ process.env.DISABLE_THOUGHT_LOGGING = 'true';
+ server = new SequentialThinkingServer();
+ });
+
+ describe('processThought - validation', () => {
+ it('should reject input with missing thought', () => {
+ const input = {
+ thoughtNumber: 1,
+ totalThoughts: 3,
+ nextThoughtNeeded: true
+ };
+
+ const result = server.processThought(input);
+ expect(result.isError).toBe(true);
+ expect(result.content[0].text).toContain('Invalid thought');
+ });
+
+ it('should reject input with non-string thought', () => {
+ const input = {
+ thought: 123,
+ thoughtNumber: 1,
+ totalThoughts: 3,
+ nextThoughtNeeded: true
+ };
+
+ const result = server.processThought(input);
+ expect(result.isError).toBe(true);
+ expect(result.content[0].text).toContain('Invalid thought');
+ });
+
+ it('should reject input with missing thoughtNumber', () => {
+ const input = {
+ thought: 'Test thought',
+ totalThoughts: 3,
+ nextThoughtNeeded: true
+ };
+
+ const result = server.processThought(input);
+ expect(result.isError).toBe(true);
+ expect(result.content[0].text).toContain('Invalid thoughtNumber');
+ });
+
+ it('should reject input with non-number thoughtNumber', () => {
+ const input = {
+ thought: 'Test thought',
+ thoughtNumber: '1',
+ totalThoughts: 3,
+ nextThoughtNeeded: true
+ };
+
+ const result = server.processThought(input);
+ expect(result.isError).toBe(true);
+ expect(result.content[0].text).toContain('Invalid thoughtNumber');
+ });
+
+ it('should reject input with missing totalThoughts', () => {
+ const input = {
+ thought: 'Test thought',
+ thoughtNumber: 1,
+ nextThoughtNeeded: true
+ };
+
+ const result = server.processThought(input);
+ expect(result.isError).toBe(true);
+ expect(result.content[0].text).toContain('Invalid totalThoughts');
+ });
+
+ it('should reject input with non-number totalThoughts', () => {
+ const input = {
+ thought: 'Test thought',
+ thoughtNumber: 1,
+ totalThoughts: '3',
+ nextThoughtNeeded: true
+ };
+
+ const result = server.processThought(input);
+ expect(result.isError).toBe(true);
+ expect(result.content[0].text).toContain('Invalid totalThoughts');
+ });
+
+ it('should reject input with missing nextThoughtNeeded', () => {
+ const input = {
+ thought: 'Test thought',
+ thoughtNumber: 1,
+ totalThoughts: 3
+ };
+
+ const result = server.processThought(input);
+ expect(result.isError).toBe(true);
+ expect(result.content[0].text).toContain('Invalid nextThoughtNeeded');
+ });
+
+ it('should reject input with non-boolean nextThoughtNeeded', () => {
+ const input = {
+ thought: 'Test thought',
+ thoughtNumber: 1,
+ totalThoughts: 3,
+ nextThoughtNeeded: 'true'
+ };
+
+ const result = server.processThought(input);
+ expect(result.isError).toBe(true);
+ expect(result.content[0].text).toContain('Invalid nextThoughtNeeded');
+ });
+ });
+
+ describe('processThought - valid inputs', () => {
+ it('should accept valid basic thought', () => {
+ const input = {
+ thought: 'This is my first thought',
+ thoughtNumber: 1,
+ totalThoughts: 3,
+ nextThoughtNeeded: true
+ };
+
+ const result = server.processThought(input);
+ expect(result.isError).toBeUndefined();
+
+ const data = JSON.parse(result.content[0].text);
+ expect(data.thoughtNumber).toBe(1);
+ expect(data.totalThoughts).toBe(3);
+ expect(data.nextThoughtNeeded).toBe(true);
+ expect(data.thoughtHistoryLength).toBe(1);
+ });
+
+ it('should accept thought with optional fields', () => {
+ const input = {
+ thought: 'Revising my earlier idea',
+ thoughtNumber: 2,
+ totalThoughts: 3,
+ nextThoughtNeeded: true,
+ isRevision: true,
+ revisesThought: 1,
+ needsMoreThoughts: false
+ };
+
+ const result = server.processThought(input);
+ expect(result.isError).toBeUndefined();
+
+ const data = JSON.parse(result.content[0].text);
+ expect(data.thoughtNumber).toBe(2);
+ expect(data.thoughtHistoryLength).toBe(1);
+ });
+
+ it('should track multiple thoughts in history', () => {
+ const input1 = {
+ thought: 'First thought',
+ thoughtNumber: 1,
+ totalThoughts: 3,
+ nextThoughtNeeded: true
+ };
+
+ const input2 = {
+ thought: 'Second thought',
+ thoughtNumber: 2,
+ totalThoughts: 3,
+ nextThoughtNeeded: true
+ };
+
+ const input3 = {
+ thought: 'Final thought',
+ thoughtNumber: 3,
+ totalThoughts: 3,
+ nextThoughtNeeded: false
+ };
+
+ server.processThought(input1);
+ server.processThought(input2);
+ const result = server.processThought(input3);
+
+ const data = JSON.parse(result.content[0].text);
+ expect(data.thoughtHistoryLength).toBe(3);
+ expect(data.nextThoughtNeeded).toBe(false);
+ });
+
+ it('should auto-adjust totalThoughts if thoughtNumber exceeds it', () => {
+ const input = {
+ thought: 'Thought 5',
+ thoughtNumber: 5,
+ totalThoughts: 3,
+ nextThoughtNeeded: true
+ };
+
+ const result = server.processThought(input);
+ const data = JSON.parse(result.content[0].text);
+
+ expect(data.totalThoughts).toBe(5);
+ });
+ });
+
+ describe('processThought - branching', () => {
+ it('should track branches correctly', () => {
+ const input1 = {
+ thought: 'Main thought',
+ thoughtNumber: 1,
+ totalThoughts: 3,
+ nextThoughtNeeded: true
+ };
+
+ const input2 = {
+ thought: 'Branch A thought',
+ thoughtNumber: 2,
+ totalThoughts: 3,
+ nextThoughtNeeded: true,
+ branchFromThought: 1,
+ branchId: 'branch-a'
+ };
+
+ const input3 = {
+ thought: 'Branch B thought',
+ thoughtNumber: 2,
+ totalThoughts: 3,
+ nextThoughtNeeded: false,
+ branchFromThought: 1,
+ branchId: 'branch-b'
+ };
+
+ server.processThought(input1);
+ server.processThought(input2);
+ const result = server.processThought(input3);
+
+ const data = JSON.parse(result.content[0].text);
+ expect(data.branches).toContain('branch-a');
+ expect(data.branches).toContain('branch-b');
+ expect(data.branches.length).toBe(2);
+ expect(data.thoughtHistoryLength).toBe(3);
+ });
+
+ it('should allow multiple thoughts in same branch', () => {
+ const input1 = {
+ thought: 'Branch thought 1',
+ thoughtNumber: 1,
+ totalThoughts: 2,
+ nextThoughtNeeded: true,
+ branchFromThought: 1,
+ branchId: 'branch-a'
+ };
+
+ const input2 = {
+ thought: 'Branch thought 2',
+ thoughtNumber: 2,
+ totalThoughts: 2,
+ nextThoughtNeeded: false,
+ branchFromThought: 1,
+ branchId: 'branch-a'
+ };
+
+ server.processThought(input1);
+ const result = server.processThought(input2);
+
+ const data = JSON.parse(result.content[0].text);
+ expect(data.branches).toContain('branch-a');
+ expect(data.branches.length).toBe(1);
+ });
+ });
+
+ describe('processThought - edge cases', () => {
+ it('should reject empty thought string', () => {
+ const input = {
+ thought: '',
+ thoughtNumber: 1,
+ totalThoughts: 1,
+ nextThoughtNeeded: false
+ };
+
+ const result = server.processThought(input);
+ expect(result.isError).toBe(true);
+ expect(result.content[0].text).toContain('Invalid thought');
+ });
+
+ it('should handle very long thought strings', () => {
+ const input = {
+ thought: 'a'.repeat(10000),
+ thoughtNumber: 1,
+ totalThoughts: 1,
+ nextThoughtNeeded: false
+ };
+
+ const result = server.processThought(input);
+ expect(result.isError).toBeUndefined();
+ });
+
+ it('should handle thoughtNumber = 1, totalThoughts = 1', () => {
+ const input = {
+ thought: 'Only thought',
+ thoughtNumber: 1,
+ totalThoughts: 1,
+ nextThoughtNeeded: false
+ };
+
+ const result = server.processThought(input);
+ expect(result.isError).toBeUndefined();
+
+ const data = JSON.parse(result.content[0].text);
+ expect(data.thoughtNumber).toBe(1);
+ expect(data.totalThoughts).toBe(1);
+ });
+
+ it('should handle nextThoughtNeeded = false', () => {
+ const input = {
+ thought: 'Final thought',
+ thoughtNumber: 3,
+ totalThoughts: 3,
+ nextThoughtNeeded: false
+ };
+
+ const result = server.processThought(input);
+ const data = JSON.parse(result.content[0].text);
+
+ expect(data.nextThoughtNeeded).toBe(false);
+ });
+ });
+
+ describe('processThought - response format', () => {
+ it('should return correct response structure on success', () => {
+ const input = {
+ thought: 'Test thought',
+ thoughtNumber: 1,
+ totalThoughts: 1,
+ nextThoughtNeeded: false
+ };
+
+ const result = server.processThought(input);
+
+ expect(result).toHaveProperty('content');
+ expect(Array.isArray(result.content)).toBe(true);
+ expect(result.content.length).toBe(1);
+ expect(result.content[0]).toHaveProperty('type', 'text');
+ expect(result.content[0]).toHaveProperty('text');
+ });
+
+ it('should return correct error structure on failure', () => {
+ const input = {
+ thought: 'Test',
+ thoughtNumber: 1,
+ totalThoughts: 1
+ // missing nextThoughtNeeded
+ };
+
+ const result = server.processThought(input);
+
+ expect(result).toHaveProperty('isError', true);
+ expect(result).toHaveProperty('content');
+ expect(Array.isArray(result.content)).toBe(true);
+
+ const errorData = JSON.parse(result.content[0].text);
+ expect(errorData).toHaveProperty('error');
+ expect(errorData).toHaveProperty('status', 'failed');
+ });
+
+ it('should return valid JSON in response', () => {
+ const input = {
+ thought: 'Test thought',
+ thoughtNumber: 1,
+ totalThoughts: 1,
+ nextThoughtNeeded: false
+ };
+
+ const result = server.processThought(input);
+
+ expect(() => JSON.parse(result.content[0].text)).not.toThrow();
+ });
+ });
+
+ describe('processThought - with logging enabled', () => {
+ let serverWithLogging: SequentialThinkingServer;
+
+ beforeEach(() => {
+ // Enable thought logging for these tests
+ delete process.env.DISABLE_THOUGHT_LOGGING;
+ serverWithLogging = new SequentialThinkingServer();
+ });
+
+ afterEach(() => {
+ // Reset to disabled for other tests
+ process.env.DISABLE_THOUGHT_LOGGING = 'true';
+ });
+
+ it('should format and log regular thoughts', () => {
+ const input = {
+ thought: 'Test thought with logging',
+ thoughtNumber: 1,
+ totalThoughts: 3,
+ nextThoughtNeeded: true
+ };
+
+ const result = serverWithLogging.processThought(input);
+ expect(result.isError).toBeUndefined();
+ });
+
+ it('should format and log revision thoughts', () => {
+ const input = {
+ thought: 'Revised thought',
+ thoughtNumber: 2,
+ totalThoughts: 3,
+ nextThoughtNeeded: true,
+ isRevision: true,
+ revisesThought: 1
+ };
+
+ const result = serverWithLogging.processThought(input);
+ expect(result.isError).toBeUndefined();
+ });
+
+ it('should format and log branch thoughts', () => {
+ const input = {
+ thought: 'Branch thought',
+ thoughtNumber: 2,
+ totalThoughts: 3,
+ nextThoughtNeeded: false,
+ branchFromThought: 1,
+ branchId: 'branch-a'
+ };
+
+ const result = serverWithLogging.processThought(input);
+ expect(result.isError).toBeUndefined();
+ });
+ });
+});
diff --git a/src/sequentialthinking/index.ts b/src/sequentialthinking/index.ts
index 34986971..6b747206 100644
--- a/src/sequentialthinking/index.ts
+++ b/src/sequentialthinking/index.ts
@@ -7,135 +7,7 @@ import {
ListToolsRequestSchema,
Tool,
} from "@modelcontextprotocol/sdk/types.js";
-// Fixed chalk import for ESM
-import chalk from 'chalk';
-
-interface ThoughtData {
- thought: string;
- thoughtNumber: number;
- totalThoughts: number;
- isRevision?: boolean;
- revisesThought?: number;
- branchFromThought?: number;
- branchId?: string;
- needsMoreThoughts?: boolean;
- nextThoughtNeeded: boolean;
-}
-
-class SequentialThinkingServer {
- private thoughtHistory: ThoughtData[] = [];
- private branches: Record = {};
- private disableThoughtLogging: boolean;
-
- constructor() {
- this.disableThoughtLogging = (process.env.DISABLE_THOUGHT_LOGGING || "").toLowerCase() === "true";
- }
-
- private validateThoughtData(input: unknown): ThoughtData {
- const data = input as Record;
-
- if (!data.thought || typeof data.thought !== 'string') {
- throw new Error('Invalid thought: must be a string');
- }
- if (!data.thoughtNumber || typeof data.thoughtNumber !== 'number') {
- throw new Error('Invalid thoughtNumber: must be a number');
- }
- if (!data.totalThoughts || typeof data.totalThoughts !== 'number') {
- throw new Error('Invalid totalThoughts: must be a number');
- }
- if (typeof data.nextThoughtNeeded !== 'boolean') {
- throw new Error('Invalid nextThoughtNeeded: must be a boolean');
- }
-
- return {
- thought: data.thought,
- thoughtNumber: data.thoughtNumber,
- totalThoughts: data.totalThoughts,
- nextThoughtNeeded: data.nextThoughtNeeded,
- isRevision: data.isRevision as boolean | undefined,
- revisesThought: data.revisesThought as number | undefined,
- branchFromThought: data.branchFromThought as number | undefined,
- branchId: data.branchId as string | undefined,
- needsMoreThoughts: data.needsMoreThoughts as boolean | undefined,
- };
- }
-
- private formatThought(thoughtData: ThoughtData): string {
- const { thoughtNumber, totalThoughts, thought, isRevision, revisesThought, branchFromThought, branchId } = thoughtData;
-
- let prefix = '';
- let context = '';
-
- if (isRevision) {
- prefix = chalk.yellow('🔄 Revision');
- context = ` (revising thought ${revisesThought})`;
- } else if (branchFromThought) {
- prefix = chalk.green('🌿 Branch');
- context = ` (from thought ${branchFromThought}, ID: ${branchId})`;
- } else {
- prefix = chalk.blue('💭 Thought');
- context = '';
- }
-
- const header = `${prefix} ${thoughtNumber}/${totalThoughts}${context}`;
- const border = '─'.repeat(Math.max(header.length, thought.length) + 4);
-
- return `
-┌${border}┐
-│ ${header} │
-├${border}┤
-│ ${thought.padEnd(border.length - 2)} │
-└${border}┘`;
- }
-
- public processThought(input: unknown): { content: Array<{ type: string; text: string }>; isError?: boolean } {
- try {
- const validatedInput = this.validateThoughtData(input);
-
- if (validatedInput.thoughtNumber > validatedInput.totalThoughts) {
- validatedInput.totalThoughts = validatedInput.thoughtNumber;
- }
-
- this.thoughtHistory.push(validatedInput);
-
- if (validatedInput.branchFromThought && validatedInput.branchId) {
- if (!this.branches[validatedInput.branchId]) {
- this.branches[validatedInput.branchId] = [];
- }
- this.branches[validatedInput.branchId].push(validatedInput);
- }
-
- if (!this.disableThoughtLogging) {
- const formattedThought = this.formatThought(validatedInput);
- console.error(formattedThought);
- }
-
- return {
- content: [{
- type: "text",
- text: JSON.stringify({
- thoughtNumber: validatedInput.thoughtNumber,
- totalThoughts: validatedInput.totalThoughts,
- nextThoughtNeeded: validatedInput.nextThoughtNeeded,
- branches: Object.keys(this.branches),
- thoughtHistoryLength: this.thoughtHistory.length
- }, null, 2)
- }]
- };
- } catch (error) {
- return {
- content: [{
- type: "text",
- text: JSON.stringify({
- error: error instanceof Error ? error.message : String(error),
- status: 'failed'
- }, null, 2)
- }],
- isError: true
- };
- }
- }
-}
+import { SequentialThinkingServer } from './lib.js';
const SEQUENTIAL_THINKING_TOOL: Tool = {
name: "sequentialthinking",
diff --git a/src/sequentialthinking/jest.config.cjs b/src/sequentialthinking/jest.config.cjs
new file mode 100644
index 00000000..d9690b2d
--- /dev/null
+++ b/src/sequentialthinking/jest.config.cjs
@@ -0,0 +1,26 @@
+/** @type {import('ts-jest').JestConfigWithTsJest} */
+module.exports = {
+ preset: 'ts-jest',
+ testEnvironment: 'node',
+ extensionsToTreatAsEsm: ['.ts'],
+ moduleNameMapper: {
+ '^(\\.{1,2}/.*)\\.js$': '$1',
+ },
+ transform: {
+ '^.+\\.tsx?$': [
+ 'ts-jest',
+ {
+ useESM: true,
+ },
+ ],
+ },
+ transformIgnorePatterns: [
+ 'node_modules/(?!(chalk)/)',
+ ],
+ testMatch: ['**/__tests__/**/*.test.ts'],
+ collectCoverageFrom: [
+ '**/*.ts',
+ '!**/__tests__/**',
+ '!**/dist/**',
+ ],
+}
diff --git a/src/sequentialthinking/lib.ts b/src/sequentialthinking/lib.ts
new file mode 100644
index 00000000..c5ee9cad
--- /dev/null
+++ b/src/sequentialthinking/lib.ts
@@ -0,0 +1,128 @@
+import chalk from 'chalk';
+
+export interface ThoughtData {
+ thought: string;
+ thoughtNumber: number;
+ totalThoughts: number;
+ isRevision?: boolean;
+ revisesThought?: number;
+ branchFromThought?: number;
+ branchId?: string;
+ needsMoreThoughts?: boolean;
+ nextThoughtNeeded: boolean;
+}
+
+export class SequentialThinkingServer {
+ private thoughtHistory: ThoughtData[] = [];
+ private branches: Record = {};
+ private disableThoughtLogging: boolean;
+
+ constructor() {
+ this.disableThoughtLogging = (process.env.DISABLE_THOUGHT_LOGGING || "").toLowerCase() === "true";
+ }
+
+ private validateThoughtData(input: unknown): ThoughtData {
+ const data = input as Record;
+
+ if (!data.thought || typeof data.thought !== 'string') {
+ throw new Error('Invalid thought: must be a string');
+ }
+ if (!data.thoughtNumber || typeof data.thoughtNumber !== 'number') {
+ throw new Error('Invalid thoughtNumber: must be a number');
+ }
+ if (!data.totalThoughts || typeof data.totalThoughts !== 'number') {
+ throw new Error('Invalid totalThoughts: must be a number');
+ }
+ if (typeof data.nextThoughtNeeded !== 'boolean') {
+ throw new Error('Invalid nextThoughtNeeded: must be a boolean');
+ }
+
+ return {
+ thought: data.thought,
+ thoughtNumber: data.thoughtNumber,
+ totalThoughts: data.totalThoughts,
+ nextThoughtNeeded: data.nextThoughtNeeded,
+ isRevision: data.isRevision as boolean | undefined,
+ revisesThought: data.revisesThought as number | undefined,
+ branchFromThought: data.branchFromThought as number | undefined,
+ branchId: data.branchId as string | undefined,
+ needsMoreThoughts: data.needsMoreThoughts as boolean | undefined,
+ };
+ }
+
+ private formatThought(thoughtData: ThoughtData): string {
+ const { thoughtNumber, totalThoughts, thought, isRevision, revisesThought, branchFromThought, branchId } = thoughtData;
+
+ let prefix = '';
+ let context = '';
+
+ if (isRevision) {
+ prefix = chalk.yellow('🔄 Revision');
+ context = ` (revising thought ${revisesThought})`;
+ } else if (branchFromThought) {
+ prefix = chalk.green('🌿 Branch');
+ context = ` (from thought ${branchFromThought}, ID: ${branchId})`;
+ } else {
+ prefix = chalk.blue('💭 Thought');
+ context = '';
+ }
+
+ const header = `${prefix} ${thoughtNumber}/${totalThoughts}${context}`;
+ const border = '─'.repeat(Math.max(header.length, thought.length) + 4);
+
+ return `
+┌${border}┐
+│ ${header} │
+├${border}┤
+│ ${thought.padEnd(border.length - 2)} │
+└${border}┘`;
+ }
+
+ public processThought(input: unknown): { content: Array<{ type: string; text: string }>; isError?: boolean } {
+ try {
+ const validatedInput = this.validateThoughtData(input);
+
+ if (validatedInput.thoughtNumber > validatedInput.totalThoughts) {
+ validatedInput.totalThoughts = validatedInput.thoughtNumber;
+ }
+
+ this.thoughtHistory.push(validatedInput);
+
+ if (validatedInput.branchFromThought && validatedInput.branchId) {
+ if (!this.branches[validatedInput.branchId]) {
+ this.branches[validatedInput.branchId] = [];
+ }
+ this.branches[validatedInput.branchId].push(validatedInput);
+ }
+
+ if (!this.disableThoughtLogging) {
+ const formattedThought = this.formatThought(validatedInput);
+ console.error(formattedThought);
+ }
+
+ return {
+ content: [{
+ type: "text",
+ text: JSON.stringify({
+ thoughtNumber: validatedInput.thoughtNumber,
+ totalThoughts: validatedInput.totalThoughts,
+ nextThoughtNeeded: validatedInput.nextThoughtNeeded,
+ branches: Object.keys(this.branches),
+ thoughtHistoryLength: this.thoughtHistory.length
+ }, null, 2)
+ }]
+ };
+ } catch (error) {
+ return {
+ content: [{
+ type: "text",
+ text: JSON.stringify({
+ error: error instanceof Error ? error.message : String(error),
+ status: 'failed'
+ }, null, 2)
+ }],
+ isError: true
+ };
+ }
+ }
+}
diff --git a/src/sequentialthinking/package.json b/src/sequentialthinking/package.json
index 89205d30..2b187897 100644
--- a/src/sequentialthinking/package.json
+++ b/src/sequentialthinking/package.json
@@ -16,17 +16,23 @@
"scripts": {
"build": "tsc && shx chmod +x dist/*.js",
"prepare": "npm run build",
- "watch": "tsc --watch"
+ "watch": "tsc --watch",
+ "test": "jest --config=jest.config.cjs --coverage"
},
"dependencies": {
- "@modelcontextprotocol/sdk": "0.5.0",
+ "@modelcontextprotocol/sdk": "^1.19.1",
"chalk": "^5.3.0",
"yargs": "^17.7.2"
},
"devDependencies": {
+ "@jest/globals": "^29.7.0",
+ "@types/jest": "^29.5.14",
"@types/node": "^22",
"@types/yargs": "^17.0.32",
+ "jest": "^29.7.0",
"shx": "^0.3.4",
+ "ts-jest": "^29.1.1",
+ "ts-node": "^10.9.2",
"typescript": "^5.3.3"
}
}
\ No newline at end of file