From 664462a6597bd25ef6835569aa60ec77e48f5645 Mon Sep 17 00:00:00 2001 From: Reading Plus AI Date: Tue, 10 Dec 2024 08:07:25 -0800 Subject: [PATCH 01/58] Update README.md to add mcp-server-data-exploration --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index f511bb2c..aa718e80 100644 --- a/README.md +++ b/README.md @@ -75,6 +75,7 @@ A growing set of community-developed and maintained servers demonstrates various - **[OpenAPI](https://github.com/snaggle-ai/openapi-mcp-server)** - Interact with [OpenAPI](https://www.openapis.org/) APIs. - **[Pandoc](https://github.com/vivekVells/mcp-pandoc)** - MCP server for seamless document format conversion using Pandoc, supporting Markdown, HTML, and plain text, with other formats like PDF, csv and docx in development. - **[HuggingFace Spaces](https://github.com/evalstate/mcp-hfspace)** - Server for using HuggingFace Spaces, supporting Open Source Image, Audio, Text Models and more. Claude Desktop mode for easy integration. +- **[Data Exploration](https://github.com/reading-plus-ai/mcp-server-data-exploration)** - MCP server for autonomous data exploration on .csv-based datasets, providing intelligent insights with minimal effort. NOTE: Will execute arbitrary Python code on your machine, please use with caution! ## πŸ“š Resources From 90662680bf3fabba7cce756b97e5056487043a32 Mon Sep 17 00:00:00 2001 From: Tadas Antanavicius <3900899+tadasant@users.noreply.github.com> Date: Tue, 10 Dec 2024 18:22:42 -0800 Subject: [PATCH 02/58] Add PulseMCP to Resources --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index f511bb2c..d4ff5f17 100644 --- a/README.md +++ b/README.md @@ -87,6 +87,7 @@ Additional resources on MCP. - **[mcp-get](https://mcp-get.com)** - Command line tool for installing and managing MCP servers by **[Michael Latman](https://github.com/michaellatman)** - **[mcp-cli](https://github.com/wong2/mcp-cli)** - A CLI inspector for the Model Context Protocol by **[wong2](https://github.com/wong2)** - **[r/mcp](https://www.reddit.com/r/mcp)** – A Reddit community dedicated to MCP by **[Frank Fiegel](https://github.com/punkpeye)** +- **[PulseMCP](https://www.pulsemcp.com/)** - An aggregated, searchable directory of MCP servers and other resources by **[Tadas Antanavicius](https://github.com/tadasant)**, **[Mike Coughlin](https://github.com/macoughl)**, and **[Ravina Patel](https://github.com/ravinahp)** ## πŸš€ Getting Started From 27ea64da93410cfef714ada9f7183b631fe56b2c Mon Sep 17 00:00:00 2001 From: Tadas Antanavicius <3900899+tadasant@users.noreply.github.com> Date: Tue, 10 Dec 2024 19:08:45 -0800 Subject: [PATCH 03/58] Remove trailing slash --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index d4ff5f17..6f31d307 100644 --- a/README.md +++ b/README.md @@ -87,7 +87,7 @@ Additional resources on MCP. - **[mcp-get](https://mcp-get.com)** - Command line tool for installing and managing MCP servers by **[Michael Latman](https://github.com/michaellatman)** - **[mcp-cli](https://github.com/wong2/mcp-cli)** - A CLI inspector for the Model Context Protocol by **[wong2](https://github.com/wong2)** - **[r/mcp](https://www.reddit.com/r/mcp)** – A Reddit community dedicated to MCP by **[Frank Fiegel](https://github.com/punkpeye)** -- **[PulseMCP](https://www.pulsemcp.com/)** - An aggregated, searchable directory of MCP servers and other resources by **[Tadas Antanavicius](https://github.com/tadasant)**, **[Mike Coughlin](https://github.com/macoughl)**, and **[Ravina Patel](https://github.com/ravinahp)** +- **[PulseMCP](https://www.pulsemcp.com)** - An aggregated, searchable directory of MCP servers and other resources by **[Tadas Antanavicius](https://github.com/tadasant)**, **[Mike Coughlin](https://github.com/macoughl)**, and **[Ravina Patel](https://github.com/ravinahp)** ## πŸš€ Getting Started From c9c2edb68fa97600b6160e28db41ccee88946e7e Mon Sep 17 00:00:00 2001 From: longman Date: Sun, 15 Dec 2024 01:30:33 +0800 Subject: [PATCH 04/58] Update README.md add a Model Context Protocol server that provides access to cryptocurrency data --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 43bebb7e..a0367a9f 100644 --- a/README.md +++ b/README.md @@ -89,6 +89,8 @@ A growing set of community-developed and maintained servers demonstrates various - **[RAG Web Browser](https://github.com/apify/mcp-server-rag-web-browser)** An MCP server for Apify's RAG Web Browser Actor to perform web searches, scrape URLs, and return content in Markdown. - **[XMind](https://github.com/apeyroux/mcp-xmind)** - Read and search through your XMind directory containing XMind files. - **[oatpp-mcp](https://github.com/oatpp/oatpp-mcp)** - C++ MCP integration for Oat++. Use [Oat++](https://oatpp.io) to build MCP servers. +- **[coin_api_mcp](https://github.com/longmans/coin_api_mcp)** - A Model Context Protocol server that provides access to cryptocurrency data. + ## πŸ“š Resources From 5e56fefeb14310c5a208f11473abadd49ac60e65 Mon Sep 17 00:00:00 2001 From: Jan Heimes Date: Sun, 15 Dec 2024 15:33:25 +0100 Subject: [PATCH 05/58] feat: add needle to mcp --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 43bebb7e..444605f4 100644 --- a/README.md +++ b/README.md @@ -89,6 +89,7 @@ A growing set of community-developed and maintained servers demonstrates various - **[RAG Web Browser](https://github.com/apify/mcp-server-rag-web-browser)** An MCP server for Apify's RAG Web Browser Actor to perform web searches, scrape URLs, and return content in Markdown. - **[XMind](https://github.com/apeyroux/mcp-xmind)** - Read and search through your XMind directory containing XMind files. - **[oatpp-mcp](https://github.com/oatpp/oatpp-mcp)** - C++ MCP integration for Oat++. Use [Oat++](https://oatpp.io) to build MCP servers. +- **[Needle](https://github.com/JANHMS/needle-mcp-server)** - Production-ready RAG out of the box to search and retrieve data from your own documents. ## πŸ“š Resources From ce7ea23f739cb27a18dcfbef0c54b4c3051fc447 Mon Sep 17 00:00:00 2001 From: Jan Heimes Date: Tue, 17 Dec 2024 12:14:57 +0100 Subject: [PATCH 06/58] feat: needle mcp integration --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 444605f4..82d89448 100644 --- a/README.md +++ b/README.md @@ -89,7 +89,7 @@ A growing set of community-developed and maintained servers demonstrates various - **[RAG Web Browser](https://github.com/apify/mcp-server-rag-web-browser)** An MCP server for Apify's RAG Web Browser Actor to perform web searches, scrape URLs, and return content in Markdown. - **[XMind](https://github.com/apeyroux/mcp-xmind)** - Read and search through your XMind directory containing XMind files. - **[oatpp-mcp](https://github.com/oatpp/oatpp-mcp)** - C++ MCP integration for Oat++. Use [Oat++](https://oatpp.io) to build MCP servers. -- **[Needle](https://github.com/JANHMS/needle-mcp-server)** - Production-ready RAG out of the box to search and retrieve data from your own documents. +- **[Needle](https://github.com/JANHMS/needle-mcp)** - Production-ready RAG out of the box to search and retrieve data from your own documents. ## πŸ“š Resources From 0a5c01365563ea137c6eb4117bc91cf6e05efa1b Mon Sep 17 00:00:00 2001 From: Jan Heimes <45521680+JANHMS@users.noreply.github.com> Date: Tue, 17 Dec 2024 12:46:28 +0100 Subject: [PATCH 07/58] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 6874f19c..0074f1d3 100644 --- a/README.md +++ b/README.md @@ -44,6 +44,7 @@ Official integrations are maintained by companies building production ready MCP - E2B Logo **[E2B](https://github.com/e2b-dev/mcp-server)** - Run code in secure sandboxes hosted by [E2B](https://e2b.dev) - Exa Logo **[Exa](https://github.com/exa-labs/exa-mcp-server)** - Search Engine made for AIs by [Exa](https://exa.ai) - **[JetBrains](https://github.com/JetBrains/mcp-jetbrains)** – Work on your code with JetBrains IDEs +- **[Needle](https://github.com/JANHMS/needle-mcp)** - Production-ready RAG out of the box to search and retrieve data from your own documents. - **[Neon](https://github.com/neondatabase/mcp-server-neon)** - Interact with the Neon serverless Postgres platform - Neo4j Logo **[Neo4j](https://github.com/neo4j-contrib/mcp-neo4j/)** - Neo4j graph database server (schema + read/write-cypher) and separate graph database backed memory - Tinybird Logo **[Tinybird](https://github.com/tinybirdco/mcp-tinybird)** - Interact with Tinybird serverless ClickHouse platform @@ -92,7 +93,6 @@ A growing set of community-developed and maintained servers demonstrates various - **[RAG Web Browser](https://github.com/apify/mcp-server-rag-web-browser)** An MCP server for Apify's RAG Web Browser Actor to perform web searches, scrape URLs, and return content in Markdown. - **[XMind](https://github.com/apeyroux/mcp-xmind)** - Read and search through your XMind directory containing XMind files. - **[oatpp-mcp](https://github.com/oatpp/oatpp-mcp)** - C++ MCP integration for Oat++. Use [Oat++](https://oatpp.io) to build MCP servers. -- **[Needle](https://github.com/JANHMS/needle-mcp)** - Production-ready RAG out of the box to search and retrieve data from your own documents. - **[cognee-mcp](https://github.com/topoteretes/cognee-mcp-server)** - GraphRAG memory server with customizable ingestion, data processing and search - **[Airtable](https://github.com/domdomegg/airtable-mcp-server)** - Read and write access to [Airtable](https://airtable.com/) databases, with schema inspection. - **[mcp-k8s-go](https://github.com/strowk/mcp-k8s-go)** - Golang-based Kubernetes server for MCP to browse pods and their logs, events, namespaces and more. Built to be extensible. From 9a5250b73722f22e7bbee029012cc44ba5dbfa3f Mon Sep 17 00:00:00 2001 From: Jan Heimes <45521680+JANHMS@users.noreply.github.com> Date: Tue, 17 Dec 2024 12:47:17 +0100 Subject: [PATCH 08/58] refactor: white line --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 0074f1d3..ae20babc 100644 --- a/README.md +++ b/README.md @@ -52,6 +52,7 @@ Official integrations are maintained by companies building production ready MCP - **[Qdrant](https://github.com/qdrant/mcp-server-qdrant/)** - Implement semantic memory layer on top of the Qdrant vector search engine - **[Metoro](https://github.com/metoro-io/metoro-mcp-server)** - Query and interact with kubernetes environments monitored by Metoro + ### 🌎 Community Servers A growing set of community-developed and maintained servers demonstrates various applications of MCP across different domains. From 3ba8a0e923969a60527b5fe3acc7df39c2be20a2 Mon Sep 17 00:00:00 2001 From: Zach Caceres Date: Tue, 17 Dec 2024 14:53:44 -0700 Subject: [PATCH 09/58] Update README.md Add a Google Tasks API MCP integration to the list of community MCPs. --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 916e2d5d..60f63885 100644 --- a/README.md +++ b/README.md @@ -103,6 +103,7 @@ A growing set of community-developed and maintained servers demonstrates various - **[TMDB](https://github.com/Laksh-star/mcp-server-tmdb)** - This MCP server integrates with The Movie Database (TMDB) API to provide movie information, search capabilities, and recommendations. - **[MongoDB](https://github.com/kiliczsh/mcp-mongo-server)** - A Model Context Protocol Server for MongoDB. - **[Airtable](https://github.com/felores/airtable-mcp)** - Airtable Model Context Protocol Server. +- **[Google Tasks](https://github.com/zcaceres/gtasks-mcp)** - Google Tasks API Model Context Protocol Server. ## πŸ“š Resources From f5c198e294578d1f1b3212af0019facbd5256857 Mon Sep 17 00:00:00 2001 From: Hyeonsoo Lee <32061883+sooperset@users.noreply.github.com> Date: Thu, 19 Dec 2024 15:43:21 +0900 Subject: [PATCH 10/58] Update README.md --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 916e2d5d..5405f9e9 100644 --- a/README.md +++ b/README.md @@ -103,6 +103,8 @@ A growing set of community-developed and maintained servers demonstrates various - **[TMDB](https://github.com/Laksh-star/mcp-server-tmdb)** - This MCP server integrates with The Movie Database (TMDB) API to provide movie information, search capabilities, and recommendations. - **[MongoDB](https://github.com/kiliczsh/mcp-mongo-server)** - A Model Context Protocol Server for MongoDB. - **[Airtable](https://github.com/felores/airtable-mcp)** - Airtable Model Context Protocol Server. +- **[Atlassian](https://github.com/sooperset/mcp-atlassian)** - Interact with Atlassian Cloud products (Confluence and Jira) including searching/reading Confluence spaces/pages, accessing Jira issues, and project metadata. + ## πŸ“š Resources From 368e3b23ca08c629a500c63e9bbe1233012a1f9a Mon Sep 17 00:00:00 2001 From: Jim Clark Date: Tue, 10 Dec 2024 11:56:46 -0800 Subject: [PATCH 11/58] Add Dockerfiles for the 17 sample MCP servers * add Dockerfiles and update README.md definitions --- package-lock.json | 22 +++++------ src/aws-kb-retrieval-server/Dockerfile | 18 +++++++++ src/aws-kb-retrieval-server/README.md | 26 ++++++++++++ src/aws-kb-retrieval-server/package.json | 4 +- src/brave-search/Dockerfile | 19 +++++++++ src/brave-search/README.md | 34 ++++++++++++++++ src/brave-search/package.json | 2 +- src/everart/Dockerfile | 18 +++++++++ src/everart/README.md | 25 ++++++++++++ src/everart/package.json | 2 +- src/everything/Dockerfile | 18 +++++++++ src/fetch/Dockerfile | 29 ++++++++++++++ src/filesystem/Dockerfile | 18 +++++++++ src/filesystem/README.md | 36 ++++++++++++++++- src/filesystem/package.json | 4 +- src/gdrive/Dockerfile | 18 +++++++++ src/gdrive/README.md | 15 +++++++ src/gdrive/package.json | 2 +- src/git/Dockerfile | 31 +++++++++++++++ src/git/README.md | 50 ++++++++++++++++++++---- src/github/Dockerfile | 19 +++++++++ src/github/README.md | 38 ++++++++++++++++-- src/github/package.json | 2 +- src/gitlab/Dockerfile | 18 +++++++++ src/gitlab/README.md | 50 +++++++++++++++++++++--- src/google-maps/Dockerfile | 19 +++++++++ src/google-maps/README.md | 33 ++++++++++++++++ src/memory/Dockerfile | 18 +++++++++ src/memory/README.md | 26 +++++++++++- src/memory/package.json | 2 +- src/postgres/Dockerfile | 18 +++++++++ src/postgres/README.md | 25 +++++++++++- src/puppeteer/Dockerfile | 27 +++++++++++++ src/puppeteer/README.md | 23 +++++++++++ src/puppeteer/index.ts | 2 +- src/sentry/Dockerfile | 29 ++++++++++++++ src/sequentialthinking/Dockerfile | 18 +++++++++ src/sequentialthinking/README.md | 28 +++++++++++++ src/sequentialthinking/package.json | 2 +- src/slack/Dockerfile | 19 +++++++++ src/slack/README.md | 36 +++++++++++++++++ src/slack/package.json | 2 +- src/sqlite/Dockerfile | 29 ++++++++++++++ src/sqlite/README.md | 31 +++++++++++++++ src/time/Dockerfile | 29 ++++++++++++++ src/time/README.md | 22 +++++++++++ 46 files changed, 913 insertions(+), 43 deletions(-) create mode 100644 src/aws-kb-retrieval-server/Dockerfile create mode 100644 src/brave-search/Dockerfile create mode 100644 src/everart/Dockerfile create mode 100644 src/everything/Dockerfile create mode 100644 src/fetch/Dockerfile create mode 100644 src/filesystem/Dockerfile create mode 100644 src/gdrive/Dockerfile create mode 100644 src/git/Dockerfile create mode 100644 src/github/Dockerfile create mode 100644 src/gitlab/Dockerfile create mode 100644 src/google-maps/Dockerfile create mode 100644 src/memory/Dockerfile create mode 100644 src/postgres/Dockerfile create mode 100644 src/puppeteer/Dockerfile create mode 100644 src/sentry/Dockerfile create mode 100644 src/sequentialthinking/Dockerfile create mode 100644 src/slack/Dockerfile create mode 100644 src/sqlite/Dockerfile create mode 100644 src/time/Dockerfile diff --git a/package-lock.json b/package-lock.json index 34253af3..140b5ca3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5015,7 +5015,7 @@ "mcp-server-aws-kb-retrieval": "dist/index.js" }, "devDependencies": { - "@types/node": "^20.10.0", + "@types/node": "^22", "shx": "^0.3.4", "typescript": "^5.6.2" } @@ -5040,7 +5040,7 @@ "mcp-server-brave-search": "dist/index.js" }, "devDependencies": { - "@types/node": "^20.10.0", + "@types/node": "^22", "shx": "^0.3.4", "typescript": "^5.6.2" } @@ -5080,7 +5080,7 @@ }, "devDependencies": { "@types/jsdom": "^21.1.6", - "@types/node": "^20.10.0", + "@types/node": "^22", "shx": "^0.3.4", "typescript": "^5.6.2" } @@ -5099,7 +5099,7 @@ "mcp-server-everart": "dist/index.js" }, "devDependencies": { - "@types/node": "^20.11.0", + "@types/node": "^22", "shx": "^0.3.4", "typescript": "^5.3.3" } @@ -5201,7 +5201,7 @@ "devDependencies": { "@types/diff": "^5.0.9", "@types/minimatch": "^5.1.2", - "@types/node": "^20.11.0", + "@types/node": "^22", "shx": "^0.3.4", "typescript": "^5.3.3" } @@ -5298,7 +5298,7 @@ "mcp-server-gdrive": "dist/index.js" }, "devDependencies": { - "@types/node": "^22.9.3", + "@types/node": "^22", "shx": "^0.3.4", "typescript": "^5.6.2" } @@ -5328,7 +5328,7 @@ "license": "MIT", "dependencies": { "@modelcontextprotocol/sdk": "1.0.1", - "@types/node": "^20.11.0", + "@types/node": "^22", "@types/node-fetch": "^2.6.12", "node-fetch": "^3.3.2", "zod": "^3.22.4", @@ -5501,7 +5501,7 @@ "mcp-server-memory": "dist/index.js" }, "devDependencies": { - "@types/node": "^22.9.3", + "@types/node": "^22", "shx": "^0.3.4", "typescript": "^5.6.2" } @@ -5591,7 +5591,7 @@ "mcp-server-sequential-thinking": "dist/index.js" }, "devDependencies": { - "@types/node": "^20.11.0", + "@types/node": "^22", "@types/yargs": "^17.0.32", "shx": "^0.3.4", "typescript": "^5.3.3" @@ -5617,7 +5617,7 @@ "mcp-server-slack": "dist/index.js" }, "devDependencies": { - "@types/node": "^22.9.3", + "@types/node": "^22", "shx": "^0.3.4", "typescript": "^5.6.2" } @@ -5642,4 +5642,4 @@ } } } -} +} \ No newline at end of file diff --git a/src/aws-kb-retrieval-server/Dockerfile b/src/aws-kb-retrieval-server/Dockerfile new file mode 100644 index 00000000..88f3906d --- /dev/null +++ b/src/aws-kb-retrieval-server/Dockerfile @@ -0,0 +1,18 @@ +FROM node:22.12-alpine as builder + +COPY src/aws-kb-retrieval-server /app +COPY tsconfig.json /tsconfig.json + +WORKDIR /app + +RUN --mount=type=cache,target=/root/.npm npm install + +FROM node:22-alpine AS release + +COPY --from=builder /app/dist /app + +ENV NODE_ENV=production + +WORKDIR /app + +CMD ["node", "dist/index.js"] \ No newline at end of file diff --git a/src/aws-kb-retrieval-server/README.md b/src/aws-kb-retrieval-server/README.md index ac2bdb43..ed19f1ee 100644 --- a/src/aws-kb-retrieval-server/README.md +++ b/src/aws-kb-retrieval-server/README.md @@ -27,6 +27,24 @@ An MCP server implementation for retrieving information from the AWS Knowledge B Add this to your `claude_desktop_config.json`: +#### Docker + +```json +{ + "mcpServers": { + "aws-kb-retrieval": { + "command": "docker", + "args": [ "run", "-i", "--rm", "-e", "AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID", "-e", "AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY", "-e", "AWS_REGION=$AWS_REGION", "ai/mcp-aws-kb-retrieval-server" ], + "env": { + "AWS_ACCESS_KEY_ID": "YOUR_ACCESS_KEY_HERE", + "AWS_SECRET_ACCESS_KEY": "YOUR_SECRET_ACCESS_KEY_HERE", + "AWS_REGION": "YOUR_AWS_REGION_HERE" + } + } + } +} +``` + ```json { "mcpServers": { @@ -46,6 +64,14 @@ Add this to your `claude_desktop_config.json`: } ``` +## Building + +Docker: + +```sh +docker build -t ai/mcp-aws-kb-retrieval -f src/aws-kb-retrieval-server/Dockerfile . +``` + ## License This MCP server is licensed under the MIT License. This means you are free to use, modify, and distribute the software, subject to the terms and conditions of the MIT License. For more details, please see the LICENSE file in the project repository. diff --git a/src/aws-kb-retrieval-server/package.json b/src/aws-kb-retrieval-server/package.json index fdad1a69..072fee11 100644 --- a/src/aws-kb-retrieval-server/package.json +++ b/src/aws-kb-retrieval-server/package.json @@ -23,8 +23,8 @@ "@aws-sdk/client-bedrock-agent-runtime": "^3.0.0" }, "devDependencies": { - "@types/node": "^20.10.0", + "@types/node": "^22", "shx": "^0.3.4", "typescript": "^5.6.2" } -} +} \ No newline at end of file diff --git a/src/brave-search/Dockerfile b/src/brave-search/Dockerfile new file mode 100644 index 00000000..ed129551 --- /dev/null +++ b/src/brave-search/Dockerfile @@ -0,0 +1,19 @@ +FROM node:22.12-alpine as builder + +# Must be entire project because `prepare` script is run during `npm install` and requires all files. +COPY src/brave-search /app +COPY tsconfig.json /tsconfig.json + +WORKDIR /app + +RUN --mount=type=cache,target=/root/.npm npm install + +FROM node:22-alpine AS release + +COPY --from=builder /app/dist /app + +ENV NODE_ENV=production + +WORKDIR /app + +CMD ["node", "dist/index.js"] \ No newline at end of file diff --git a/src/brave-search/README.md b/src/brave-search/README.md index 2d5ae0df..d94ecdf1 100644 --- a/src/brave-search/README.md +++ b/src/brave-search/README.md @@ -36,6 +36,31 @@ An MCP server implementation that integrates the Brave Search API, providing bot ### Usage with Claude Desktop Add this to your `claude_desktop_config.json`: +### Docker + +```json +{ + "mcpServers": { + "brave-search": { + "command": "docker", + "args": [ + "run", + "-i", + "--rm", + "-e", + "BRAVE_API_KEY=$BRAVE_API_KEY", + "ai/mcp-brave-search" + ], + "env": { + "BRAVE_API_KEY": "YOUR_API_KEY_HERE" + } + } + } +} +``` + +### NPX + ```json { "mcpServers": { @@ -53,6 +78,15 @@ Add this to your `claude_desktop_config.json`: } ``` + +## Build + +Docker build: + +```bash +docker build -t vonwig/brave-search:mcp -f src/brave-search/Dockerfile . +``` + ## License This MCP server is licensed under the MIT License. This means you are free to use, modify, and distribute the software, subject to the terms and conditions of the MIT License. For more details, please see the LICENSE file in the project repository. diff --git a/src/brave-search/package.json b/src/brave-search/package.json index 70ce9d00..163e5afc 100644 --- a/src/brave-search/package.json +++ b/src/brave-search/package.json @@ -22,7 +22,7 @@ "@modelcontextprotocol/sdk": "1.0.1" }, "devDependencies": { - "@types/node": "^20.10.0", + "@types/node": "^22", "shx": "^0.3.4", "typescript": "^5.6.2" } diff --git a/src/everart/Dockerfile b/src/everart/Dockerfile new file mode 100644 index 00000000..385c08dd --- /dev/null +++ b/src/everart/Dockerfile @@ -0,0 +1,18 @@ +FROM node:22.12-alpine as builder + +COPY src/everart /app +COPY tsconfig.json /tsconfig.json + +WORKDIR /app + +RUN --mount=type=cache,target=/root/.npm npm install + +FROM node:22-alpine AS release + +COPY --from=builder /app/dist /app + +ENV NODE_ENV=production + +WORKDIR /app + +CMD ["node", "dist/index.js"] \ No newline at end of file diff --git a/src/everart/README.md b/src/everart/README.md index 545f5dfa..04b07578 100644 --- a/src/everart/README.md +++ b/src/everart/README.md @@ -10,6 +10,25 @@ export EVERART_API_KEY=your_key_here ## Config Add to Claude Desktop config: + +### Docker +```json +{ + "mcpServers": { + "everart": { + "command": "docker", + "args": ["run", "-i", "--rm", "-e", "EVERART_API_KEY=$EVERART_API_KEY", "ai/mcp-everart"], + "env": { + "EVERART_API_KEY": "your_key_here" + } + }, + + } +} +``` + +### NPX + ```json { "mcpServers": { @@ -71,3 +90,9 @@ Generation details: You can also click the URL above to view the image again. ``` + +## Building w/ Docker + +```sh +docker build -t ai/mcp-everart -f src/everart/Dockerfile . +``` diff --git a/src/everart/package.json b/src/everart/package.json index 189ca650..653c654b 100644 --- a/src/everart/package.json +++ b/src/everart/package.json @@ -25,7 +25,7 @@ "open": "^9.1.0" }, "devDependencies": { - "@types/node": "^20.11.0", + "@types/node": "^22", "shx": "^0.3.4", "typescript": "^5.3.3" } diff --git a/src/everything/Dockerfile b/src/everything/Dockerfile new file mode 100644 index 00000000..7a6482c4 --- /dev/null +++ b/src/everything/Dockerfile @@ -0,0 +1,18 @@ +FROM node:22.12-alpine as builder + +COPY src/everything /app +COPY tsconfig.json /tsconfig.json + +WORKDIR /app + +RUN --mount=type=cache,target=/root/.npm npm install + +FROM node:22-alpine AS release + +COPY --from=builder /app/dist /app + +ENV NODE_ENV=production + +WORKDIR /app + +CMD ["node", "dist/index.js"] \ No newline at end of file diff --git a/src/fetch/Dockerfile b/src/fetch/Dockerfile new file mode 100644 index 00000000..fae262d1 --- /dev/null +++ b/src/fetch/Dockerfile @@ -0,0 +1,29 @@ +# Use a Python image with uv pre-installed +FROM ghcr.io/astral-sh/uv:python3.12-bookworm-slim + +# Install the project into `/app` +WORKDIR /app + +# Enable bytecode compilation +ENV UV_COMPILE_BYTECODE=1 + +# Copy from the cache instead of linking since it's a mounted volume +ENV UV_LINK_MODE=copy + +# Install the project's dependencies using the lockfile and settings +RUN --mount=type=cache,target=/root/.cache/uv \ + --mount=type=bind,source=uv.lock,target=uv.lock \ + --mount=type=bind,source=pyproject.toml,target=pyproject.toml \ + uv sync --frozen --no-install-project --no-dev + +# Then, add the rest of the project source code and install it +# Installing separately from its dependencies allows optimal layer caching +ADD . /app +RUN --mount=type=cache,target=/root/.cache/uv \ + uv sync --frozen --no-dev + +# Place executables in the environment at the front of the path +ENV PATH="/app/.venv/bin:$PATH" + +# when running the container, add --db-path and a bind mount to the host's db file +ENTRYPOINT ["uvx" , "mcp-server-fetch"] diff --git a/src/filesystem/Dockerfile b/src/filesystem/Dockerfile new file mode 100644 index 00000000..2addb6db --- /dev/null +++ b/src/filesystem/Dockerfile @@ -0,0 +1,18 @@ +FROM node:22.12-alpine as builder + +WORKDIR /app + +COPY src/filesystem /app +COPY tsconfig.json /tsconfig.json + +RUN --mount=type=cache,target=/root/.npm npm install + +FROM node:22-alpine AS release + +COPY --from=builder /app/dist /app + +ENV NODE_ENV=production + +WORKDIR /app + +CMD ["node", "dist/index.js"] \ No newline at end of file diff --git a/src/filesystem/README.md b/src/filesystem/README.md index 79c2b0f3..b9286511 100644 --- a/src/filesystem/README.md +++ b/src/filesystem/README.md @@ -105,6 +105,32 @@ Node.js server implementing Model Context Protocol (MCP) for filesystem operatio ## Usage with Claude Desktop Add this to your `claude_desktop_config.json`: + +Note: you can provide sandboxed directories to the server by mounting them to `/projects`. Adding the `ro` flag will make the directory readonly by the server. + +### Docker + +```json +{ + "mcpServers": { + "filesystem": { + "command": "docker", + "args": [ + "run", + "-i", + "--rm", + "--mount", "type=bind,src=/Users/username/Desktop,dst=/projects/Desktop", + "--mount", "type=bind,src=/path/to/other/allowed/dir,dst=/projects/other/allowed/dir,ro", + "--mount", "type=bind,src=/path/to/file.txt,dst=/projects/path/to/file.txt", + "ai/mcp-filesystem" + ] + } + } +} +``` + +### NPX + ```json { "mcpServers": { @@ -121,6 +147,14 @@ Add this to your `claude_desktop_config.json`: } ``` +## Build + +Docker build: + +```bash +docker build -t ai/mcp-filesystem -f src/filesystem/Dockerfile . +``` + ## License -This MCP server is licensed under the MIT License. This means you are free to use, modify, and distribute the software, subject to the terms and conditions of the MIT License. For more details, please see the LICENSE file in the project repository. \ No newline at end of file +This MCP server is licensed under the MIT License. This means you are free to use, modify, and distribute the software, subject to the terms and conditions of the MIT License. For more details, please see the LICENSE file in the project repository. diff --git a/src/filesystem/package.json b/src/filesystem/package.json index 6f0b223d..6aca648f 100644 --- a/src/filesystem/package.json +++ b/src/filesystem/package.json @@ -28,8 +28,8 @@ "devDependencies": { "@types/diff": "^5.0.9", "@types/minimatch": "^5.1.2", - "@types/node": "^20.11.0", + "@types/node": "^22", "shx": "^0.3.4", "typescript": "^5.3.3" } -} +} \ No newline at end of file diff --git a/src/gdrive/Dockerfile b/src/gdrive/Dockerfile new file mode 100644 index 00000000..43840db7 --- /dev/null +++ b/src/gdrive/Dockerfile @@ -0,0 +1,18 @@ +FROM node:22.12-alpine as builder + +COPY src/gdrive /app +COPY tsconfig.json /tsconfig.json + +WORKDIR /app + +RUN --mount=type=cache,target=/root/.npm npm install + +FROM node:22-alpine AS release + +COPY --from=builder /app/dist /app + +ENV NODE_ENV=production + +WORKDIR /app + +CMD ["node", "dist/index.js"] \ No newline at end of file diff --git a/src/gdrive/README.md b/src/gdrive/README.md index 9a795f0c..016b592d 100644 --- a/src/gdrive/README.md +++ b/src/gdrive/README.md @@ -49,6 +49,21 @@ To authenticate and save credentials: To integrate this server with the desktop app, add the following to your app's server configuration: +#### Docker + +```json +{ + "mcpServers": { + "gdrive": { + "command": "docker", + "args": ["run", "-i", "--rm", "ai/mcp-gdrive"] + } + } +} +``` + +#### NPX + ```json { "mcpServers": { diff --git a/src/gdrive/package.json b/src/gdrive/package.json index 26e2bfe5..a2d4be37 100644 --- a/src/gdrive/package.json +++ b/src/gdrive/package.json @@ -24,7 +24,7 @@ "googleapis": "^144.0.0" }, "devDependencies": { - "@types/node": "^22.9.3", + "@types/node": "^22", "shx": "^0.3.4", "typescript": "^5.6.2" } diff --git a/src/git/Dockerfile b/src/git/Dockerfile new file mode 100644 index 00000000..264962ed --- /dev/null +++ b/src/git/Dockerfile @@ -0,0 +1,31 @@ +# Use a Python image with uv pre-installed +FROM ghcr.io/astral-sh/uv:python3.12-bookworm-slim + +# Install the project into `/app` +WORKDIR /app + +# Enable bytecode compilation +ENV UV_COMPILE_BYTECODE=1 + +# Copy from the cache instead of linking since it's a mounted volume +ENV UV_LINK_MODE=copy + +RUN apt-get update && apt-get install -y git && rm -rf /var/lib/apt/lists/* + +# Install the project's dependencies using the lockfile and settings +RUN --mount=type=cache,target=/root/.cache/uv \ + --mount=type=bind,source=uv.lock,target=uv.lock \ + --mount=type=bind,source=pyproject.toml,target=pyproject.toml \ + uv sync --frozen --no-install-project --no-dev + +# Then, add the rest of the project source code and install it +# Installing separately from its dependencies allows optimal layer caching +ADD . /app +RUN --mount=type=cache,target=/root/.cache/uv \ + uv sync --frozen --no-dev + +# Place executables in the environment at the front of the path +ENV PATH="/app/.venv/bin:$PATH" + +# when running the container, add --db-path and a bind mount to the host's db file +ENTRYPOINT ["uv" , "run" , "--directory", ".", "mcp-server-git"] diff --git a/src/git/README.md b/src/git/README.md index 8f3afdc7..d62ddd61 100644 --- a/src/git/README.md +++ b/src/git/README.md @@ -193,18 +193,52 @@ If you are doing local development, there are two ways to test your changes: 2. Test using the Claude desktop app. Add the following to your `claude_desktop_config.json`: +### Docker + ```json -"git": { - "command": "uv", - "args": [ - "--directory", - "//mcp-servers/src/git", - "run", - "mcp-server-git" - ] +{ + "mcpServers": { + "brave-search": { + "command": "docker", + "args": [ + "run", + "--rm", + "-i", + "--mount", "type=bind,src=/Users/username/Desktop,dst=/projects/Desktop", + "--mount", "type=bind,src=/path/to/other/allowed/dir,dst=/projects/other/allowed/dir,ro", + "--mount", "type=bind,src=/path/to/file.txt,dst=/projects/path/to/file.txt", + "ai/mcp-git" + ] + } + } } ``` +### UVX +```json +{ +"mcpServers": { + "git": { + "command": "uv", + "args": [ + "--directory", + "//mcp-servers/src/git", + "run", + "mcp-server-git" + ] + } +} +``` + +## Build + +Docker build: + +```bash +cd src/git +docker build -t ai/mcp-git . +``` + ## License This MCP server is licensed under the MIT License. This means you are free to use, modify, and distribute the software, subject to the terms and conditions of the MIT License. For more details, please see the LICENSE file in the project repository. diff --git a/src/github/Dockerfile b/src/github/Dockerfile new file mode 100644 index 00000000..a94abccc --- /dev/null +++ b/src/github/Dockerfile @@ -0,0 +1,19 @@ +FROM node:22.12-alpine as builder + +# Must be entire project because `prepare` script is run during `npm install` and requires all files. +COPY src/github /app +COPY tsconfig.json /tsconfig.json + +WORKDIR /app + +RUN --mount=type=cache,target=/root/.npm npm install + +FROM node:22-alpine AS release + +COPY --from=builder /app/dist /app + +ENV NODE_ENV=production + +WORKDIR /app + +CMD ["node", "dist/index.js"] \ No newline at end of file diff --git a/src/github/README.md b/src/github/README.md index 1898f9e1..d20ba9cc 100644 --- a/src/github/README.md +++ b/src/github/README.md @@ -225,14 +225,19 @@ For detailed search syntax, see [GitHub's searching documentation](https://docs. ### Usage with Claude Desktop To use this with Claude Desktop, add the following to your `claude_desktop_config.json`: +#### Docker ```json { "mcpServers": { "github": { - "command": "npx", + "command": "docker", "args": [ - "-y", - "@modelcontextprotocol/server-github" + "run", + "-i", + "--rm", + "-e", + "GITHUB_PERSONAL_ACCESS_TOKEN=$GITHUB_PERSONAL_ACCESS_TOKEN", + "ai/mcp-github" ], "env": { "GITHUB_PERSONAL_ACCESS_TOKEN": "" @@ -242,6 +247,33 @@ To use this with Claude Desktop, add the following to your `claude_desktop_confi } ``` +### NPX + +```json +{ + "mcpServers": { + "github": { + "command": "npx", + "args": [ + "-y", + "@modelcontextprotocol/server-github" + ] + }, + "env": { + "GITHUB_PERSONAL_ACCESS_TOKEN": "" + } + } +} +``` + +## Build + +Docker build: + +```bash +docker build -t ai/mcp-github -f src/github/Dockerfile . +``` + ## License This MCP server is licensed under the MIT License. This means you are free to use, modify, and distribute the software, subject to the terms and conditions of the MIT License. For more details, please see the LICENSE file in the project repository. diff --git a/src/github/package.json b/src/github/package.json index 0fc2aaeb..46d24ccd 100644 --- a/src/github/package.json +++ b/src/github/package.json @@ -20,7 +20,7 @@ }, "dependencies": { "@modelcontextprotocol/sdk": "1.0.1", - "@types/node": "^20.11.0", + "@types/node": "^22", "@types/node-fetch": "^2.6.12", "node-fetch": "^3.3.2", "zod": "^3.22.4", diff --git a/src/gitlab/Dockerfile b/src/gitlab/Dockerfile new file mode 100644 index 00000000..79caaef0 --- /dev/null +++ b/src/gitlab/Dockerfile @@ -0,0 +1,18 @@ +FROM node:22.12-alpine as builder + +COPY src/gitlab /app +COPY tsconfig.json /tsconfig.json + +WORKDIR /app + +RUN --mount=type=cache,target=/root/.npm npm install + +FROM node:22-alpine AS release + +COPY --from=builder /app/dist /app + +ENV NODE_ENV=production + +WORKDIR /app + +CMD ["node", "dist/index.js"] \ No newline at end of file diff --git a/src/gitlab/README.md b/src/gitlab/README.md index fdf82552..7feb06b4 100644 --- a/src/gitlab/README.md +++ b/src/gitlab/README.md @@ -109,19 +109,57 @@ MCP Server for the GitLab API, enabling project management, file operations, and ### Usage with Claude Desktop Add the following to your `claude_desktop_config.json`: +#### Docker ```json { - "gitlab": { - "command": "npx", - "args": ["-y", "@modelcontextprotocol/server-gitlab"], - "env": { - "GITLAB_PERSONAL_ACCESS_TOKEN": "", - "GITLAB_API_URL": "https://gitlab.com/api/v4" // Optional, for self-hosted instances + "mcpServers": { + "gitlab": { + "command": "docker", + "args": [ + "run", + "-e", + "GITLAB_PERSONAL_ACCESS_TOKEN=$GITLAB_PERSONAL_ACCESS_TOKEN", + "-e", + "GITLAB_API_URL=$GITLAB_API_URL", + "ai/mcp-gitlab" + ], + "env": { + "GITLAB_PERSONAL_ACCESS_TOKEN": "", + "GITLAB_API_URL": "https://gitlab.com/api/v4" // Optional, for self-hosted instances + } } } } ``` +### NPX + +```json +{ + "mcpServers": { + "gitlab": { + "command": "npx", + "args": [ + "-y", + "@modelcontextprotocol/server-gitlab" + ], + "env": { + "GITLAB_PERSONAL_ACCESS_TOKEN": "", + "GITLAB_API_URL": "https://gitlab.com/api/v4" // Optional, for self-hosted instances + } + } + } +} +``` + +## Build + +Docker build: + +```bash +docker build -t vonwig/gitlab:mcp -f src/gitlab/Dockerfile . +``` + ## Environment Variables - `GITLAB_PERSONAL_ACCESS_TOKEN`: Your GitLab personal access token (required) diff --git a/src/google-maps/Dockerfile b/src/google-maps/Dockerfile new file mode 100644 index 00000000..ca8a7dd5 --- /dev/null +++ b/src/google-maps/Dockerfile @@ -0,0 +1,19 @@ +FROM node:22.12-alpine as builder + +# Must be entire project because `prepare` script is run during `npm install` and requires all files. +COPY src/google-maps /app +COPY tsconfig.json /tsconfig.json + +WORKDIR /app + +RUN --mount=type=cache,target=/root/.npm npm install + +FROM node:22-alpine AS release + +COPY --from=builder /app/dist /app + +ENV NODE_ENV=production + +WORKDIR /app + +CMD ["node", "dist/index.js"] \ No newline at end of file diff --git a/src/google-maps/README.md b/src/google-maps/README.md index 51a1b9e5..46a55c72 100644 --- a/src/google-maps/README.md +++ b/src/google-maps/README.md @@ -59,6 +59,31 @@ Get a Google Maps API key by following the instructions [here](https://developer Add the following to your `claude_desktop_config.json`: +#### Docker + +```json +{ + "mcpServers": { + "google-maps": { + "command": "docker", + "args": [ + "run", + "-i", + "--rm", + "-e", + "GOOGLE_MAPS_API_KEY=$GOOGLE_MAPS_API_KEY", + "ai/mcp-google-maps" + ], + "env": { + "GOOGLE_MAPS_API_KEY": "" + } + } + } +} +``` + +### NPX + ```json { "mcpServers": { @@ -76,6 +101,14 @@ Add the following to your `claude_desktop_config.json`: } ``` +## Build + +Docker build: + +```bash +docker build -t vonwig/google-maps:mcp -f src/google-maps/Dockerfile . +``` + ## License This MCP server is licensed under the MIT License. This means you are free to use, modify, and distribute the software, subject to the terms and conditions of the MIT License. For more details, please see the LICENSE file in the project repository. diff --git a/src/memory/Dockerfile b/src/memory/Dockerfile new file mode 100644 index 00000000..0bbfa8ef --- /dev/null +++ b/src/memory/Dockerfile @@ -0,0 +1,18 @@ +FROM node:22.12-alpine as builder + +COPY src/memory /app +COPY tsconfig.json /tsconfig.json + +WORKDIR /app + +RUN --mount=type=cache,target=/root/.npm npm install + +FROM node:22-alpine AS release + +COPY --from=builder /app/dist /app + +ENV NODE_ENV=production + +WORKDIR /app + +CMD ["node", "dist/index.js"] \ No newline at end of file diff --git a/src/memory/README.md b/src/memory/README.md index 66bdbb41..37f47094 100644 --- a/src/memory/README.md +++ b/src/memory/README.md @@ -127,7 +127,23 @@ Example: # Usage with Claude Desktop ### Setup + Add this to your claude_desktop_config.json: + +#### Docker + +```json +{ + "mcpServers": { + "memory": { + "command": "docker", + "args": ["run", "-i", "--rm", "ai/mcp-memory"] + } + } +} +``` + +#### NPX ```json { "mcpServers": { @@ -174,6 +190,14 @@ Follow these steps for each interaction: b) Store facts about them as observations ``` +## Building + +Docker: + +```sh +docker build -t ai/mcp-memory -f src/memory/Dockerfile . +``` + ## License -This MCP server is licensed under the MIT License. This means you are free to use, modify, and distribute the software, subject to the terms and conditions of the MIT License. For more details, please see the LICENSE file in the project repository. +This MCP server is licensed under the MIT License. This means you are free to use, modify, and distribute the software, subject to the terms and conditions of the MIT License. For more details, please see the LICENSE file in the project repository. \ No newline at end of file diff --git a/src/memory/package.json b/src/memory/package.json index 49cbc92e..741244b1 100644 --- a/src/memory/package.json +++ b/src/memory/package.json @@ -22,7 +22,7 @@ "@modelcontextprotocol/sdk": "1.0.1" }, "devDependencies": { - "@types/node": "^22.9.3", + "@types/node": "^22", "shx": "^0.3.4", "typescript": "^5.6.2" } diff --git a/src/postgres/Dockerfile b/src/postgres/Dockerfile new file mode 100644 index 00000000..70fec576 --- /dev/null +++ b/src/postgres/Dockerfile @@ -0,0 +1,18 @@ +FROM node:22.12-alpine as builder + +COPY src/postgres /app +COPY tsconfig.json /tsconfig.json + +WORKDIR /app + +RUN --mount=type=cache,target=/root/.npm npm install + +FROM node:22-alpine AS release + +COPY --from=builder /app/dist /app + +ENV NODE_ENV=production + +WORKDIR /app + +CMD ["node", "dist/index.js"] \ No newline at end of file diff --git a/src/postgres/README.md b/src/postgres/README.md index 9a16af77..f5e7b3a1 100644 --- a/src/postgres/README.md +++ b/src/postgres/README.md @@ -24,6 +24,21 @@ The server provides schema information for each table in the database: To use this server with the Claude Desktop app, add the following configuration to the "mcpServers" section of your `claude_desktop_config.json`: +### Docker + +```json +{ + "mcpServers": { + "postgres": { + "command": "docker", + "args": ["run", "-i", "--rm", "ai/mcp-postgres", "host.docker.internal:5432/mydb"] + } + } +} +``` + +### NPX + ```json { "mcpServers": { @@ -41,6 +56,14 @@ To use this server with the Claude Desktop app, add the following configuration Replace `/mydb` with your database name. +## Building + +Docker: + +```sh +docker build -t ai/mcp-postgres -f src/postgres/Dockerfile . +``` + ## License -This MCP server is licensed under the MIT License. This means you are free to use, modify, and distribute the software, subject to the terms and conditions of the MIT License. For more details, please see the LICENSE file in the project repository. +This MCP server is licensed under the MIT License. This means you are free to use, modify, and distribute the software, subject to the terms and conditions of the MIT License. For more details, please see the LICENSE file in the project repository. \ No newline at end of file diff --git a/src/puppeteer/Dockerfile b/src/puppeteer/Dockerfile new file mode 100644 index 00000000..d3b250b1 --- /dev/null +++ b/src/puppeteer/Dockerfile @@ -0,0 +1,27 @@ +FROM node:22-bullseye-slim + +ENV DEBIAN_FRONTEND noninteractive + +# for arm64 support we need to install chromium provided by debian +# npm ERR! The chromium binary is not available for arm64. +# https://github.com/puppeteer/puppeteer/issues/7740 + +ENV PUPPETEER_SKIP_CHROMIUM_DOWNLOAD true +ENV PUPPETEER_EXECUTABLE_PATH=/usr/bin/chromium + +RUN apt-get update && \ + apt-get install -y wget gnupg && \ + apt-get install -y fonts-ipafont-gothic fonts-wqy-zenhei fonts-thai-tlwg fonts-kacst fonts-freefont-ttf libxss1 \ + libgtk2.0-0 libnss3 libatk-bridge2.0-0 libdrm2 libxkbcommon0 libgbm1 libasound2 && \ + apt-get install -y chromium && \ + apt-get clean + +COPY src/puppeteer /project +COPY tsconfig.json /tsconfig.json + +WORKDIR /project + +RUN npm install + +CMD ["node", "dist/index.js"] + diff --git a/src/puppeteer/README.md b/src/puppeteer/README.md index a951a9a3..715f9d0a 100644 --- a/src/puppeteer/README.md +++ b/src/puppeteer/README.md @@ -65,6 +65,21 @@ The server provides access to two types of resources: ## Configuration to use Puppeteer Server Here's the Claude Desktop configuration to use the Puppeter server: +### Docker + +```json +{ + "mcpServers": { + "puppeteer": { + "command": "docker", + "args": ["run", "-i", "--rm", "--init", "ai/mcp-puppeteer"] + } + } +} +``` + +### NPX + ```json { "mcpServers": { @@ -76,6 +91,14 @@ Here's the Claude Desktop configuration to use the Puppeter server: } ``` +## Build + +Docker build: + +```bash +docker build -t ai/mcp-puppeteer -f src/puppeteer/Dockerfile . +``` + ## License This MCP server is licensed under the MIT License. This means you are free to use, modify, and distribute the software, subject to the terms and conditions of the MIT License. For more details, please see the LICENSE file in the project repository. diff --git a/src/puppeteer/index.ts b/src/puppeteer/index.ts index 5cae2eb0..2dc98371 100644 --- a/src/puppeteer/index.ts +++ b/src/puppeteer/index.ts @@ -108,7 +108,7 @@ const screenshots = new Map(); async function ensureBrowser() { if (!browser) { - browser = await puppeteer.launch({ headless: false }); + browser = await puppeteer.launch({ headless: true, args: ["--no-sandbox"] }); const pages = await browser.pages(); page = pages[0]; diff --git a/src/sentry/Dockerfile b/src/sentry/Dockerfile new file mode 100644 index 00000000..5cd6f220 --- /dev/null +++ b/src/sentry/Dockerfile @@ -0,0 +1,29 @@ +# Use a Python image with uv pre-installed +FROM ghcr.io/astral-sh/uv:python3.12-bookworm-slim + +# Install the project into `/app` +WORKDIR /app + +# Enable bytecode compilation +ENV UV_COMPILE_BYTECODE=1 + +# Copy from the cache instead of linking since it's a mounted volume +ENV UV_LINK_MODE=copy + +# Install the project's dependencies using the lockfile and settings +RUN --mount=type=cache,target=/root/.cache/uv \ + --mount=type=bind,source=uv.lock,target=uv.lock \ + --mount=type=bind,source=pyproject.toml,target=pyproject.toml \ + uv sync --frozen --no-install-project --no-dev + +# Then, add the rest of the project source code and install it +# Installing separately from its dependencies allows optimal layer caching +ADD . /app +RUN --mount=type=cache,target=/root/.cache/uv \ + uv sync --frozen --no-dev + +# Place executables in the environment at the front of the path +ENV PATH="/app/.venv/bin:$PATH" + +# when running the container, add --db-path and a bind mount to the host's db file +ENTRYPOINT ["uv" , "run" , "--directory", ".", "mcp-server-sentry"] diff --git a/src/sequentialthinking/Dockerfile b/src/sequentialthinking/Dockerfile new file mode 100644 index 00000000..3f35b543 --- /dev/null +++ b/src/sequentialthinking/Dockerfile @@ -0,0 +1,18 @@ +FROM node:22.12-alpine as builder + +COPY src/sequentialthinking /app +COPY tsconfig.json /tsconfig.json + +WORKDIR /app + +RUN --mount=type=cache,target=/root/.npm npm install + +FROM node:22-alpine AS release + +COPY --from=builder /app/dist /app + +ENV NODE_ENV=production + +WORKDIR /app + +CMD ["node", "dist/index.js"] diff --git a/src/sequentialthinking/README.md b/src/sequentialthinking/README.md index 0b299c3f..15586b39 100644 --- a/src/sequentialthinking/README.md +++ b/src/sequentialthinking/README.md @@ -44,6 +44,8 @@ The Sequential Thinking tool is designed for: Add this to your `claude_desktop_config.json`: +#### npx + ```json { "mcpServers": { @@ -58,6 +60,32 @@ Add this to your `claude_desktop_config.json`: } ``` +#### docker + +```json +{ + "mcpServers": { + "sequentialthinking": { + "command": "docker", + "args": [ + "run", + "--rm", + "-i", + "ai/mcp-sequentialthinking" + ] + } + } +} +``` + +## Building + +Docker: + +```bash +docker build -t ai/mcp-sequentialthinking -f sequentialthinking/Dockerfile . +``` + ## License This MCP server is licensed under the MIT License. This means you are free to use, modify, and distribute the software, subject to the terms and conditions of the MIT License. For more details, please see the LICENSE file in the project repository. diff --git a/src/sequentialthinking/package.json b/src/sequentialthinking/package.json index d696695e..89205d30 100644 --- a/src/sequentialthinking/package.json +++ b/src/sequentialthinking/package.json @@ -24,7 +24,7 @@ "yargs": "^17.7.2" }, "devDependencies": { - "@types/node": "^20.11.0", + "@types/node": "^22", "@types/yargs": "^17.0.32", "shx": "^0.3.4", "typescript": "^5.3.3" diff --git a/src/slack/Dockerfile b/src/slack/Dockerfile new file mode 100644 index 00000000..aed894ef --- /dev/null +++ b/src/slack/Dockerfile @@ -0,0 +1,19 @@ +FROM node:22.12-alpine as builder + +# Must be entire project because `prepare` script is run during `npm install` and requires all files. +COPY src/slack /app +COPY tsconfig.json /tsconfig.json + +WORKDIR /app + +RUN --mount=type=cache,target=/root/.npm npm install + +FROM node:22-alpine AS release + +COPY --from=builder /app/dist /app + +ENV NODE_ENV=production + +WORKDIR /app + +CMD ["node", "dist/index.js"] diff --git a/src/slack/README.md b/src/slack/README.md index b3d80a21..b0523ee3 100644 --- a/src/slack/README.md +++ b/src/slack/README.md @@ -89,6 +89,8 @@ MCP Server for the Slack API, enabling Claude to interact with Slack workspaces. Add the following to your `claude_desktop_config.json`: +#### npx + ```json { "mcpServers": { @@ -107,6 +109,32 @@ Add the following to your `claude_desktop_config.json`: } ``` +#### docker + +```json +{ + "mcpServers": { + "slack": { + "command": "docker", + "args": [ + "run", + "-i", + "--rm", + "-e", + "SLACK_BOT_TOKEN=$SLACK_BOT_TOKEN", + "-e", + "SLACK_TEAM_ID=$SLACK_TEAM_ID", + "ai/mcp-slack" + ], + "env": { + "SLACK_BOT_TOKEN": "xoxb-your-bot-token", + "SLACK_TEAM_ID": "T01234567" + } + } + } +} +``` + ### Troubleshooting If you encounter permission errors, verify that: @@ -115,6 +143,14 @@ If you encounter permission errors, verify that: 3. The tokens and workspace ID are correctly copied to your configuration 4. The app has been added to the channels it needs to access +## Build + +Docker build: + +```bash +docker build -t ai/mcp-slack -f src/slack/Dockerfile . +``` + ## License This MCP server is licensed under the MIT License. This means you are free to use, modify, and distribute the software, subject to the terms and conditions of the MIT License. For more details, please see the LICENSE file in the project repository. diff --git a/src/slack/package.json b/src/slack/package.json index 10e18594..337b9db0 100644 --- a/src/slack/package.json +++ b/src/slack/package.json @@ -22,7 +22,7 @@ "@modelcontextprotocol/sdk": "1.0.1" }, "devDependencies": { - "@types/node": "^22.9.3", + "@types/node": "^22", "shx": "^0.3.4", "typescript": "^5.6.2" } diff --git a/src/sqlite/Dockerfile b/src/sqlite/Dockerfile new file mode 100644 index 00000000..8189a3d6 --- /dev/null +++ b/src/sqlite/Dockerfile @@ -0,0 +1,29 @@ +# Use a Python image with uv pre-installed +FROM ghcr.io/astral-sh/uv:python3.12-bookworm-slim + +# Install the project into `/app` +WORKDIR /app + +# Enable bytecode compilation +ENV UV_COMPILE_BYTECODE=1 + +# Copy from the cache instead of linking since it's a mounted volume +ENV UV_LINK_MODE=copy + +# Install the project's dependencies using the lockfile and settings +RUN --mount=type=cache,target=/root/.cache/uv \ + --mount=type=bind,source=uv.lock,target=uv.lock \ + --mount=type=bind,source=pyproject.toml,target=pyproject.toml \ + uv sync --frozen --no-install-project --no-dev + +# Then, add the rest of the project source code and install it +# Installing separately from its dependencies allows optimal layer caching +ADD . /app +RUN --mount=type=cache,target=/root/.cache/uv \ + uv sync --frozen --no-dev + +# Place executables in the environment at the front of the path +ENV PATH="/app/.venv/bin:$PATH" + +# when running the container, add --db-path and a bind mount to the host's db file +ENTRYPOINT ["uv" , "run" , "--directory", ".", "mcp-server-sqlite"] diff --git a/src/sqlite/README.md b/src/sqlite/README.md index 2b2bea80..517b6e47 100644 --- a/src/sqlite/README.md +++ b/src/sqlite/README.md @@ -63,6 +63,8 @@ The server offers six core tools: ## Usage with Claude Desktop +### uv + ```bash # Add the server to your claude_desktop_config.json "mcpServers": { @@ -80,6 +82,35 @@ The server offers six core tools: } ``` +### Docker + +```json +# Add the server to your claude_desktop_config.json +"mcpServers": { + "sqlite": { + "command": "docker", + "args": [ + "run", + "--rm", + "-i", + "-v", + "mcp-test:/mcp", + "ai/mcp-sqlite", + "--db-path", + "/mcp/test.db" + ] + } +} +``` + +## Building + +Docker: + +```bash +docker build -t ai/mcp-sqlite . +``` + ## License This MCP server is licensed under the MIT License. This means you are free to use, modify, and distribute the software, subject to the terms and conditions of the MIT License. For more details, please see the LICENSE file in the project repository. diff --git a/src/time/Dockerfile b/src/time/Dockerfile new file mode 100644 index 00000000..b45b389d --- /dev/null +++ b/src/time/Dockerfile @@ -0,0 +1,29 @@ +# Use a Python image with uv pre-installed +FROM ghcr.io/astral-sh/uv:python3.12-bookworm-slim + +# Install the project into `/app` +WORKDIR /app + +# Enable bytecode compilation +ENV UV_COMPILE_BYTECODE=1 + +# Copy from the cache instead of linking since it's a mounted volume +ENV UV_LINK_MODE=copy + +# Install the project's dependencies using the lockfile and settings +RUN --mount=type=cache,target=/root/.cache/uv \ + --mount=type=bind,source=uv.lock,target=uv.lock \ + --mount=type=bind,source=pyproject.toml,target=pyproject.toml \ + uv sync --frozen --no-install-project --no-dev + +# Then, add the rest of the project source code and install it +# Installing separately from its dependencies allows optimal layer caching +ADD . /app +RUN --mount=type=cache,target=/root/.cache/uv \ + uv sync --frozen --no-dev + +# Place executables in the environment at the front of the path +ENV PATH="/app/.venv/bin:$PATH" + +# when running the container, add --db-path and a bind mount to the host's db file +ENTRYPOINT ["uv" , "run" , "--directory", ".", "mcp-server-time"] diff --git a/src/time/README.md b/src/time/README.md index 8f80e415..f40dc19d 100644 --- a/src/time/README.md +++ b/src/time/README.md @@ -54,6 +54,19 @@ Add to your Claude settings: ``` +
+Using docker + +```json +"mcpServers": { + "time": { + "command": "docker", + "args": ["run", "-i", "--rm", "ai/mcp-time"] + } +} +``` +
+
Using pip installation @@ -179,6 +192,15 @@ npx @modelcontextprotocol/inspector uv run mcp-server-time 3. "When it's 4 PM in New York, what time is it in London?" 4. "Convert 9:30 AM Tokyo time to New York time" +## Build + +Docker build: + +```bash +cd src/time +docker build -t ai/mcp-time . +``` + ## Contributing We encourage contributions to help expand and improve mcp-server-time. Whether you want to add new time-related tools, enhance existing functionality, or improve documentation, your input is valuable. From 9ff603aef587059aa1aca79f42b23f998b089279 Mon Sep 17 00:00:00 2001 From: colinmcneil Date: Tue, 17 Dec 2024 13:15:58 -0500 Subject: [PATCH 12/58] Update dockerfiles for npx versions, gdrive env credential paths --- src/filesystem/Dockerfile | 7 +++++-- src/gdrive/Dockerfile | 11 +++++++---- src/gdrive/README.md | 2 +- src/gdrive/index.ts | 8 ++++---- src/github/Dockerfile | 3 +++ src/gitlab/Dockerfile | 3 +++ src/google-maps/Dockerfile | 3 +++ src/memory/Dockerfile | 3 +++ src/postgres/Dockerfile | 4 +++- src/sequentialthinking/Dockerfile | 3 +++ src/slack/Dockerfile | 3 +++ 11 files changed, 38 insertions(+), 12 deletions(-) diff --git a/src/filesystem/Dockerfile b/src/filesystem/Dockerfile index 2addb6db..00b4cb49 100644 --- a/src/filesystem/Dockerfile +++ b/src/filesystem/Dockerfile @@ -6,11 +6,14 @@ COPY src/filesystem /app COPY tsconfig.json /tsconfig.json RUN --mount=type=cache,target=/root/.npm npm install - + +RUN --mount=type=cache,target=/root/.npm-production npm ci --ignore-scripts --omit-dev + + FROM node:22-alpine AS release COPY --from=builder /app/dist /app - +COPY --from=builder /app/node_modules /app/node_modules ENV NODE_ENV=production WORKDIR /app diff --git a/src/gdrive/Dockerfile b/src/gdrive/Dockerfile index 43840db7..edc223c4 100644 --- a/src/gdrive/Dockerfile +++ b/src/gdrive/Dockerfile @@ -7,12 +7,15 @@ WORKDIR /app RUN --mount=type=cache,target=/root/.npm npm install +RUN --mount=type=cache,target=/root/.npm-production npm ci --ignore-scripts --omit-dev + FROM node:22-alpine AS release -COPY --from=builder /app/dist /app - -ENV NODE_ENV=production - WORKDIR /app +COPY --from=builder /app/dist /app/dist +COPY --from=builder /app/node_modules /app/node_modules + +ENV NODE_ENV=production + CMD ["node", "dist/index.js"] \ No newline at end of file diff --git a/src/gdrive/README.md b/src/gdrive/README.md index 016b592d..1ef88b67 100644 --- a/src/gdrive/README.md +++ b/src/gdrive/README.md @@ -56,7 +56,7 @@ To integrate this server with the desktop app, add the following to your app's s "mcpServers": { "gdrive": { "command": "docker", - "args": ["run", "-i", "--rm", "ai/mcp-gdrive"] + "args": ["run", "-i", "--rm", "--mount", "type=bind,source=/Users/colinmcneil/Desktop/gcp-oauth.keys.json,target=/gcp-oauth.keys.json", "-v", "mcp-gdrive:/gdrive-server", "-e", "GDRIVE_OAUTH_PATH=/gcp-oauth.keys.json", "-e", "GDRIVE_CREDENTIALS_PATH=/gdrive-server/credentials.json", "ai/mcp-gdrive"] } } } diff --git a/src/gdrive/index.ts b/src/gdrive/index.ts index b9c6d910..deb8ec06 100644 --- a/src/gdrive/index.ts +++ b/src/gdrive/index.ts @@ -152,13 +152,13 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => { const userQuery = request.params.arguments?.query as string; const escapedQuery = userQuery.replace(/\\/g, "\\\\").replace(/'/g, "\\'"); const formattedQuery = `fullText contains '${escapedQuery}'`; - + const res = await drive.files.list({ q: formattedQuery, pageSize: 10, fields: "files(id, name, mimeType, modifiedTime, size)", }); - + const fileList = res.data.files ?.map((file: any) => `${file.name} (${file.mimeType})`) .join("\n"); @@ -175,7 +175,7 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => { throw new Error("Tool not found"); }); -const credentialsPath = path.join( +const credentialsPath = process.env.GDRIVE_CREDENTIALS_PATH || path.join( path.dirname(new URL(import.meta.url).pathname), "../../../.gdrive-server-credentials.json", ); @@ -185,7 +185,7 @@ async function authenticateAndSaveCredentials() { const auth = await authenticate({ keyfilePath: path.join( path.dirname(new URL(import.meta.url).pathname), - "../../../gcp-oauth.keys.json", + process.env.GDRIVE_OAUTH_PATH || "../../../gcp-oauth.keys.json", ), scopes: ["https://www.googleapis.com/auth/drive.readonly"], }); diff --git a/src/github/Dockerfile b/src/github/Dockerfile index a94abccc..20f4ff38 100644 --- a/src/github/Dockerfile +++ b/src/github/Dockerfile @@ -8,9 +8,12 @@ WORKDIR /app RUN --mount=type=cache,target=/root/.npm npm install +RUN --mount=type=cache,target=/root/.npm-production npm ci --ignore-scripts --omit-dev + FROM node:22-alpine AS release COPY --from=builder /app/dist /app +COPY --from=builder /app/node_modules /app/node_modules ENV NODE_ENV=production diff --git a/src/gitlab/Dockerfile b/src/gitlab/Dockerfile index 79caaef0..83e470b6 100644 --- a/src/gitlab/Dockerfile +++ b/src/gitlab/Dockerfile @@ -7,9 +7,12 @@ WORKDIR /app RUN --mount=type=cache,target=/root/.npm npm install +RUN --mount=type=cache,target=/root/.npm-production npm ci --ignore-scripts --omit-dev + FROM node:22-alpine AS release COPY --from=builder /app/dist /app +COPY --from=builder /app/node_modules /app/node_modules ENV NODE_ENV=production diff --git a/src/google-maps/Dockerfile b/src/google-maps/Dockerfile index ca8a7dd5..24598a6d 100644 --- a/src/google-maps/Dockerfile +++ b/src/google-maps/Dockerfile @@ -8,9 +8,12 @@ WORKDIR /app RUN --mount=type=cache,target=/root/.npm npm install +RUN --mount=type=cache,target=/root/.npm-production npm ci --ignore-scripts --omit-dev + FROM node:22-alpine AS release COPY --from=builder /app/dist /app +COPY --from=builder /app/node_modules /app/node_modules ENV NODE_ENV=production diff --git a/src/memory/Dockerfile b/src/memory/Dockerfile index 0bbfa8ef..23f9304d 100644 --- a/src/memory/Dockerfile +++ b/src/memory/Dockerfile @@ -7,9 +7,12 @@ WORKDIR /app RUN --mount=type=cache,target=/root/.npm npm install +RUN --mount=type=cache,target=/root/.npm-production npm ci --ignore-scripts --omit-dev + FROM node:22-alpine AS release COPY --from=builder /app/dist /app +COPY --from=builder /app/node_modules /app/node_modules ENV NODE_ENV=production diff --git a/src/postgres/Dockerfile b/src/postgres/Dockerfile index 70fec576..d9f8d0c7 100644 --- a/src/postgres/Dockerfile +++ b/src/postgres/Dockerfile @@ -7,10 +7,12 @@ WORKDIR /app RUN --mount=type=cache,target=/root/.npm npm install +RUN --mount=type=cache,target=/root/.npm-production npm ci --ignore-scripts --omit-dev + FROM node:22-alpine AS release COPY --from=builder /app/dist /app - +COPY --from=builder /app/node_modules /app/node_modules ENV NODE_ENV=production WORKDIR /app diff --git a/src/sequentialthinking/Dockerfile b/src/sequentialthinking/Dockerfile index 3f35b543..38c742c1 100644 --- a/src/sequentialthinking/Dockerfile +++ b/src/sequentialthinking/Dockerfile @@ -7,9 +7,12 @@ WORKDIR /app RUN --mount=type=cache,target=/root/.npm npm install +RUN --mount=type=cache,target=/root/.npm-production npm ci --ignore-scripts --omit-dev + FROM node:22-alpine AS release COPY --from=builder /app/dist /app +COPY --from=builder /app/node_modules /app/node_modules ENV NODE_ENV=production diff --git a/src/slack/Dockerfile b/src/slack/Dockerfile index aed894ef..103579f6 100644 --- a/src/slack/Dockerfile +++ b/src/slack/Dockerfile @@ -8,9 +8,12 @@ WORKDIR /app RUN --mount=type=cache,target=/root/.npm npm install +RUN --mount=type=cache,target=/root/.npm-production npm ci --ignore-scripts --omit-dev + FROM node:22-alpine AS release COPY --from=builder /app/dist /app +COPY --from=builder /app/node_modules /app/node_modules ENV NODE_ENV=production From 4e8a8d270a980cd4de03fb49c9099f051fc26347 Mon Sep 17 00:00:00 2001 From: colinmcneil Date: Tue, 17 Dec 2024 14:56:25 -0500 Subject: [PATCH 13/58] Split production node_modules --- src/aws-kb-retrieval-server/Dockerfile | 10 +++++++--- src/brave-search/Dockerfile | 10 +++++++--- src/everart/Dockerfile | 10 ++++++++-- src/everything/Dockerfile | 8 ++++++-- src/filesystem/Dockerfile | 14 +++++++++----- src/gdrive/Dockerfile | 7 +++++-- src/gdrive/index.ts | 4 ++-- src/github/Dockerfile | 13 +++++++------ src/gitlab/Dockerfile | 17 ++++++++++------- src/google-maps/Dockerfile | 9 ++++++--- src/memory/Dockerfile | 9 ++++++--- src/postgres/Dockerfile | 10 +++++++--- src/sequentialthinking/Dockerfile | 9 ++++++--- src/slack/Dockerfile | 9 ++++++--- 14 files changed, 92 insertions(+), 47 deletions(-) diff --git a/src/aws-kb-retrieval-server/Dockerfile b/src/aws-kb-retrieval-server/Dockerfile index 88f3906d..a173a606 100644 --- a/src/aws-kb-retrieval-server/Dockerfile +++ b/src/aws-kb-retrieval-server/Dockerfile @@ -9,10 +9,14 @@ RUN --mount=type=cache,target=/root/.npm npm install FROM node:22-alpine AS release -COPY --from=builder /app/dist /app +WORKDIR /app + +COPY --from=builder /app/dist /app/dist +COPY --from=builder /app/package.json /app/package.json +COPY --from=builder /app/package-lock.json /app/package-lock.json ENV NODE_ENV=production -WORKDIR /app +RUN npm ci --ignore-scripts --omit-dev -CMD ["node", "dist/index.js"] \ No newline at end of file +ENTRYPOINT ["node", "dist/index.js"] \ No newline at end of file diff --git a/src/brave-search/Dockerfile b/src/brave-search/Dockerfile index ed129551..fefeca68 100644 --- a/src/brave-search/Dockerfile +++ b/src/brave-search/Dockerfile @@ -10,10 +10,14 @@ RUN --mount=type=cache,target=/root/.npm npm install FROM node:22-alpine AS release -COPY --from=builder /app/dist /app +WORKDIR /app + +COPY --from=builder /app/dist /app/dist +COPY --from=builder /app/package.json /app/package.json +COPY --from=builder /app/package-lock.json /app/package-lock.json ENV NODE_ENV=production -WORKDIR /app +RUN npm ci --ignore-scripts --omit-dev -CMD ["node", "dist/index.js"] \ No newline at end of file +ENTRYPOINT ["node", "dist/index.js"] \ No newline at end of file diff --git a/src/everart/Dockerfile b/src/everart/Dockerfile index 385c08dd..c27f9542 100644 --- a/src/everart/Dockerfile +++ b/src/everart/Dockerfile @@ -9,10 +9,16 @@ RUN --mount=type=cache,target=/root/.npm npm install FROM node:22-alpine AS release -COPY --from=builder /app/dist /app +WORKDIR /app + +COPY --from=builder /app/dist /app/dist +COPY --from=builder /app/package.json /app/package.json +COPY --from=builder /app/package-lock.json /app/package-lock.json ENV NODE_ENV=production -WORKDIR /app +RUN npm ci --ignore-scripts --omit-dev + +ENTRYPOINT ["node", "dist/index.js"] CMD ["node", "dist/index.js"] \ No newline at end of file diff --git a/src/everything/Dockerfile b/src/everything/Dockerfile index 7a6482c4..56267937 100644 --- a/src/everything/Dockerfile +++ b/src/everything/Dockerfile @@ -9,10 +9,14 @@ RUN --mount=type=cache,target=/root/.npm npm install FROM node:22-alpine AS release -COPY --from=builder /app/dist /app +WORKDIR /app + +COPY --from=builder /app/dist /app/dist +COPY --from=builder /app/package.json /app/package.json +COPY --from=builder /app/package-lock.json /app/package-lock.json ENV NODE_ENV=production -WORKDIR /app +RUN npm ci --ignore-scripts --omit-dev CMD ["node", "dist/index.js"] \ No newline at end of file diff --git a/src/filesystem/Dockerfile b/src/filesystem/Dockerfile index 00b4cb49..d762d39e 100644 --- a/src/filesystem/Dockerfile +++ b/src/filesystem/Dockerfile @@ -12,10 +12,14 @@ RUN --mount=type=cache,target=/root/.npm-production npm ci --ignore-scripts --om FROM node:22-alpine AS release -COPY --from=builder /app/dist /app -COPY --from=builder /app/node_modules /app/node_modules -ENV NODE_ENV=production - WORKDIR /app -CMD ["node", "dist/index.js"] \ No newline at end of file +COPY --from=builder /app/dist /app/dist +COPY --from=builder /app/package.json /app/package.json +COPY --from=builder /app/package-lock.json /app/package-lock.json + +ENV NODE_ENV=production + +RUN npm ci --ignore-scripts --omit-dev + +ENTRYPOINT ["node", "dist/index.js"] \ No newline at end of file diff --git a/src/gdrive/Dockerfile b/src/gdrive/Dockerfile index edc223c4..b7bb2a76 100644 --- a/src/gdrive/Dockerfile +++ b/src/gdrive/Dockerfile @@ -14,8 +14,11 @@ FROM node:22-alpine AS release WORKDIR /app COPY --from=builder /app/dist /app/dist -COPY --from=builder /app/node_modules /app/node_modules +COPY --from=builder /app/package.json /app/package.json +COPY --from=builder /app/package-lock.json /app/package-lock.json ENV NODE_ENV=production -CMD ["node", "dist/index.js"] \ No newline at end of file +RUN npm ci --ignore-scripts --omit-dev + +ENTRYPOINT ["node", "dist/index.js"] \ No newline at end of file diff --git a/src/gdrive/index.ts b/src/gdrive/index.ts index deb8ec06..4a8e954c 100644 --- a/src/gdrive/index.ts +++ b/src/gdrive/index.ts @@ -183,9 +183,9 @@ const credentialsPath = process.env.GDRIVE_CREDENTIALS_PATH || path.join( async function authenticateAndSaveCredentials() { console.log("Launching auth flow…"); const auth = await authenticate({ - keyfilePath: path.join( + keyfilePath: process.env.GDRIVE_OAUTH_PATH || path.join( path.dirname(new URL(import.meta.url).pathname), - process.env.GDRIVE_OAUTH_PATH || "../../../gcp-oauth.keys.json", + "../../../gcp-oauth.keys.json", ), scopes: ["https://www.googleapis.com/auth/drive.readonly"], }); diff --git a/src/github/Dockerfile b/src/github/Dockerfile index 20f4ff38..4a054d65 100644 --- a/src/github/Dockerfile +++ b/src/github/Dockerfile @@ -8,15 +8,16 @@ WORKDIR /app RUN --mount=type=cache,target=/root/.npm npm install -RUN --mount=type=cache,target=/root/.npm-production npm ci --ignore-scripts --omit-dev +FROM node:22.12-alpine AS release -FROM node:22-alpine AS release - -COPY --from=builder /app/dist /app -COPY --from=builder /app/node_modules /app/node_modules +COPY --from=builder /app/dist /app/dist +COPY --from=builder /app/package.json /app/package.json +COPY --from=builder /app/package-lock.json /app/package-lock.json ENV NODE_ENV=production WORKDIR /app -CMD ["node", "dist/index.js"] \ No newline at end of file +RUN npm ci --ignore-scripts --omit-dev + +ENTRYPOINT ["node", "dist/index.js"] \ No newline at end of file diff --git a/src/gitlab/Dockerfile b/src/gitlab/Dockerfile index 83e470b6..ce8823ca 100644 --- a/src/gitlab/Dockerfile +++ b/src/gitlab/Dockerfile @@ -9,13 +9,16 @@ RUN --mount=type=cache,target=/root/.npm npm install RUN --mount=type=cache,target=/root/.npm-production npm ci --ignore-scripts --omit-dev -FROM node:22-alpine AS release - -COPY --from=builder /app/dist /app -COPY --from=builder /app/node_modules /app/node_modules - -ENV NODE_ENV=production +FROM node:22.12-alpine AS release WORKDIR /app -CMD ["node", "dist/index.js"] \ No newline at end of file +COPY --from=builder /app/dist /app/dist +COPY --from=builder /app/package.json /app/package.json +COPY --from=builder /app/package-lock.json /app/package-lock.json + +ENV NODE_ENV=production + +RUN npm ci --ignore-scripts --omit-dev + +ENTRYPOINT ["node", "dist/index.js"] \ No newline at end of file diff --git a/src/google-maps/Dockerfile b/src/google-maps/Dockerfile index 24598a6d..62949680 100644 --- a/src/google-maps/Dockerfile +++ b/src/google-maps/Dockerfile @@ -12,11 +12,14 @@ RUN --mount=type=cache,target=/root/.npm-production npm ci --ignore-scripts --om FROM node:22-alpine AS release -COPY --from=builder /app/dist /app -COPY --from=builder /app/node_modules /app/node_modules +COPY --from=builder /app/dist /app/dist +COPY --from=builder /app/package.json /app/package.json +COPY --from=builder /app/package-lock.json /app/package-lock.json ENV NODE_ENV=production WORKDIR /app -CMD ["node", "dist/index.js"] \ No newline at end of file +RUN npm ci --ignore-scripts --omit-dev + +ENTRYPOINT ["node", "dist/index.js"] \ No newline at end of file diff --git a/src/memory/Dockerfile b/src/memory/Dockerfile index 23f9304d..d5af8471 100644 --- a/src/memory/Dockerfile +++ b/src/memory/Dockerfile @@ -11,11 +11,14 @@ RUN --mount=type=cache,target=/root/.npm-production npm ci --ignore-scripts --om FROM node:22-alpine AS release -COPY --from=builder /app/dist /app -COPY --from=builder /app/node_modules /app/node_modules +COPY --from=builder /app/dist /app/dist +COPY --from=builder /app/package.json /app/package.json +COPY --from=builder /app/package-lock.json /app/package-lock.json ENV NODE_ENV=production WORKDIR /app -CMD ["node", "dist/index.js"] \ No newline at end of file +RUN npm ci --ignore-scripts --omit-dev + +ENTRYPOINT ["node", "dist/index.js"] \ No newline at end of file diff --git a/src/postgres/Dockerfile b/src/postgres/Dockerfile index d9f8d0c7..f390ec0e 100644 --- a/src/postgres/Dockerfile +++ b/src/postgres/Dockerfile @@ -11,10 +11,14 @@ RUN --mount=type=cache,target=/root/.npm-production npm ci --ignore-scripts --om FROM node:22-alpine AS release -COPY --from=builder /app/dist /app -COPY --from=builder /app/node_modules /app/node_modules +COPY --from=builder /app/dist /app/dist +COPY --from=builder /app/package.json /app/package.json +COPY --from=builder /app/package-lock.json /app/package-lock.json + ENV NODE_ENV=production WORKDIR /app -CMD ["node", "dist/index.js"] \ No newline at end of file +RUN npm ci --ignore-scripts --omit-dev + +ENTRYPOINT ["node", "dist/index.js"] \ No newline at end of file diff --git a/src/sequentialthinking/Dockerfile b/src/sequentialthinking/Dockerfile index 38c742c1..08a4282a 100644 --- a/src/sequentialthinking/Dockerfile +++ b/src/sequentialthinking/Dockerfile @@ -11,11 +11,14 @@ RUN --mount=type=cache,target=/root/.npm-production npm ci --ignore-scripts --om FROM node:22-alpine AS release -COPY --from=builder /app/dist /app -COPY --from=builder /app/node_modules /app/node_modules +COPY --from=builder /app/dist /app/dist +COPY --from=builder /app/package.json /app/package.json +COPY --from=builder /app/package-lock.json /app/package-lock.json ENV NODE_ENV=production WORKDIR /app -CMD ["node", "dist/index.js"] +RUN npm ci --ignore-scripts --omit-dev + +ENTRYPOINT ["node", "dist/index.js"] diff --git a/src/slack/Dockerfile b/src/slack/Dockerfile index 103579f6..6df0be52 100644 --- a/src/slack/Dockerfile +++ b/src/slack/Dockerfile @@ -12,11 +12,14 @@ RUN --mount=type=cache,target=/root/.npm-production npm ci --ignore-scripts --om FROM node:22-alpine AS release -COPY --from=builder /app/dist /app -COPY --from=builder /app/node_modules /app/node_modules +COPY --from=builder /app/dist /app/dist +COPY --from=builder /app/package.json /app/package.json +COPY --from=builder /app/package-lock.json /app/package-lock.json ENV NODE_ENV=production WORKDIR /app -CMD ["node", "dist/index.js"] +RUN npm ci --ignore-scripts --omit-dev + +ENTRYPOINT ["node", "dist/index.js"] From bb0adaafd8c3c5b93715709e3108a4b18f987886 Mon Sep 17 00:00:00 2001 From: colinmcneil Date: Tue, 17 Dec 2024 15:20:48 -0500 Subject: [PATCH 14/58] Allow filesystem to accept `DOCKER_ROOT_WORKSPACE` --- src/filesystem/README.md | 1 + src/filesystem/index.ts | 24 ++++++++++++++++-------- 2 files changed, 17 insertions(+), 8 deletions(-) diff --git a/src/filesystem/README.md b/src/filesystem/README.md index b9286511..d7e1fdc9 100644 --- a/src/filesystem/README.md +++ b/src/filesystem/README.md @@ -122,6 +122,7 @@ Note: you can provide sandboxed directories to the server by mounting them to `/ "--mount", "type=bind,src=/Users/username/Desktop,dst=/projects/Desktop", "--mount", "type=bind,src=/path/to/other/allowed/dir,dst=/projects/other/allowed/dir,ro", "--mount", "type=bind,src=/path/to/file.txt,dst=/projects/path/to/file.txt", + "--env", "DOCKER_ROOT_WORKSPACE=/projects", "ai/mcp-filesystem" ] } diff --git a/src/filesystem/index.ts b/src/filesystem/index.ts index b4d5c419..e67887e7 100644 --- a/src/filesystem/index.ts +++ b/src/filesystem/index.ts @@ -17,9 +17,20 @@ import { minimatch } from 'minimatch'; // Command line argument parsing const args = process.argv.slice(2); -if (args.length === 0) { - console.error("Usage: mcp-server-filesystem [additional-directories...]"); - process.exit(1); + +let allowedDirectories: string[] = []; + +if (process.env.DOCKER_ROOT_WORKSPACE) { + allowedDirectories = await fs.readdir(process.env.DOCKER_ROOT_WORKSPACE); +} +else { + if (args.length === 0) { + console.error("Usage: mcp-server-filesystem [additional-directories...]"); + process.exit(1); + } + allowedDirectories = args.map(dir => + normalizePath(path.resolve(expandHome(dir))) + ); } // Normalize all paths consistently @@ -35,12 +46,9 @@ function expandHome(filepath: string): string { } // Store allowed directories in normalized form -const allowedDirectories = args.map(dir => - normalizePath(path.resolve(expandHome(dir))) -); // Validate that all directories exist and are accessible -await Promise.all(args.map(async (dir) => { +await Promise.all(allowedDirectories.map(async (dir) => { try { const stats = await fs.stat(dir); if (!stats.isDirectory()) { @@ -644,4 +652,4 @@ async function runServer() { runServer().catch((error) => { console.error("Fatal error running server:", error); process.exit(1); -}); +}); \ No newline at end of file From 308b71c698123c5c6684b9c79de04b20dd9fb422 Mon Sep 17 00:00:00 2001 From: Jim Clark Date: Tue, 17 Dec 2024 17:49:04 -0800 Subject: [PATCH 15/58] Remove env from postgres server * interpolation of env into command args is not supported --- src/postgres/README.md | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/postgres/README.md b/src/postgres/README.md index f5e7b3a1..f5ace34c 100644 --- a/src/postgres/README.md +++ b/src/postgres/README.md @@ -26,12 +26,20 @@ To use this server with the Claude Desktop app, add the following configuration ### Docker +* when running docker on macos, use host.docker.internal if the server is running on the host network (eg localhost) +* username/password can be added to the postgresql url with `postgresql://user:password@host:port/db-name` + ```json { "mcpServers": { "postgres": { "command": "docker", - "args": ["run", "-i", "--rm", "ai/mcp-postgres", "host.docker.internal:5432/mydb"] + "args": [ + "run", + "-i", + "--rm", + "ai/mcp-postgres", + "postgresql://host.docker.internal:5432/mydb"] } } } @@ -66,4 +74,4 @@ docker build -t ai/mcp-postgres -f src/postgres/Dockerfile . ## License -This MCP server is licensed under the MIT License. This means you are free to use, modify, and distribute the software, subject to the terms and conditions of the MIT License. For more details, please see the LICENSE file in the project repository. \ No newline at end of file +This MCP server is licensed under the MIT License. This means you are free to use, modify, and distribute the software, subject to the terms and conditions of the MIT License. For more details, please see the LICENSE file in the project repository. From c64f8de15f5c38a5c1eb5a4841397b2dfdafff09 Mon Sep 17 00:00:00 2001 From: colinmcneil Date: Wed, 18 Dec 2024 11:00:11 -0500 Subject: [PATCH 16/58] Config tweaks for docker - Remove `$` interpolation for env - Allow puppeteer to work headless in docker, headful with npx --- src/aws-kb-retrieval-server/README.md | 2 +- src/brave-search/README.md | 2 +- src/everart/README.md | 2 +- src/filesystem/Dockerfile | 4 +- src/filesystem/README.md | 2 +- src/filesystem/index.ts | 113 ++++++++++++++------------ src/github/README.md | 2 +- src/gitlab/README.md | 4 +- src/google-maps/README.md | 2 +- src/puppeteer/README.md | 2 +- src/puppeteer/index.ts | 4 +- src/slack/README.md | 4 +- 12 files changed, 78 insertions(+), 65 deletions(-) diff --git a/src/aws-kb-retrieval-server/README.md b/src/aws-kb-retrieval-server/README.md index ed19f1ee..84855568 100644 --- a/src/aws-kb-retrieval-server/README.md +++ b/src/aws-kb-retrieval-server/README.md @@ -34,7 +34,7 @@ Add this to your `claude_desktop_config.json`: "mcpServers": { "aws-kb-retrieval": { "command": "docker", - "args": [ "run", "-i", "--rm", "-e", "AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID", "-e", "AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY", "-e", "AWS_REGION=$AWS_REGION", "ai/mcp-aws-kb-retrieval-server" ], + "args": [ "run", "-i", "--rm", "-e", "AWS_ACCESS_KEY_ID", "-e", "AWS_SECRET_ACCESS_KEY", "-e", "AWS_REGION", "ai/mcp-aws-kb-retrieval-server" ], "env": { "AWS_ACCESS_KEY_ID": "YOUR_ACCESS_KEY_HERE", "AWS_SECRET_ACCESS_KEY": "YOUR_SECRET_ACCESS_KEY_HERE", diff --git a/src/brave-search/README.md b/src/brave-search/README.md index d94ecdf1..1907fc9c 100644 --- a/src/brave-search/README.md +++ b/src/brave-search/README.md @@ -48,7 +48,7 @@ Add this to your `claude_desktop_config.json`: "-i", "--rm", "-e", - "BRAVE_API_KEY=$BRAVE_API_KEY", + "BRAVE_API_KEY", "ai/mcp-brave-search" ], "env": { diff --git a/src/everart/README.md b/src/everart/README.md index 04b07578..94c0e33b 100644 --- a/src/everart/README.md +++ b/src/everart/README.md @@ -17,7 +17,7 @@ Add to Claude Desktop config: "mcpServers": { "everart": { "command": "docker", - "args": ["run", "-i", "--rm", "-e", "EVERART_API_KEY=$EVERART_API_KEY", "ai/mcp-everart"], + "args": ["run", "-i", "--rm", "-e", "EVERART_API_KEY", "ai/mcp-everart"], "env": { "EVERART_API_KEY": "your_key_here" } diff --git a/src/filesystem/Dockerfile b/src/filesystem/Dockerfile index d762d39e..0cfa3718 100644 --- a/src/filesystem/Dockerfile +++ b/src/filesystem/Dockerfile @@ -22,4 +22,6 @@ ENV NODE_ENV=production RUN npm ci --ignore-scripts --omit-dev -ENTRYPOINT ["node", "dist/index.js"] \ No newline at end of file +WORKDIR /projects + +ENTRYPOINT ["node", "/app/dist/index.js"] \ No newline at end of file diff --git a/src/filesystem/README.md b/src/filesystem/README.md index d7e1fdc9..74b83593 100644 --- a/src/filesystem/README.md +++ b/src/filesystem/README.md @@ -109,6 +109,7 @@ Add this to your `claude_desktop_config.json`: Note: you can provide sandboxed directories to the server by mounting them to `/projects`. Adding the `ro` flag will make the directory readonly by the server. ### Docker +Note: all directories must be mounted to `/projects` by default. ```json { @@ -122,7 +123,6 @@ Note: you can provide sandboxed directories to the server by mounting them to `/ "--mount", "type=bind,src=/Users/username/Desktop,dst=/projects/Desktop", "--mount", "type=bind,src=/path/to/other/allowed/dir,dst=/projects/other/allowed/dir,ro", "--mount", "type=bind,src=/path/to/file.txt,dst=/projects/path/to/file.txt", - "--env", "DOCKER_ROOT_WORKSPACE=/projects", "ai/mcp-filesystem" ] } diff --git a/src/filesystem/index.ts b/src/filesystem/index.ts index e67887e7..f073a83e 100644 --- a/src/filesystem/index.ts +++ b/src/filesystem/index.ts @@ -20,8 +20,15 @@ const args = process.argv.slice(2); let allowedDirectories: string[] = []; -if (process.env.DOCKER_ROOT_WORKSPACE) { - allowedDirectories = await fs.readdir(process.env.DOCKER_ROOT_WORKSPACE); +let hasProjectsDirectory = false; + +// If the projects directory has contents, use it as the root workspace +const projectsContents = await fs.readdir('/projects'); +if (projectsContents.length > 0) { + hasProjectsDirectory = true; + allowedDirectories = projectsContents.map(dir => + normalizePath(path.resolve(expandHome(dir))) + ); } else { if (args.length === 0) { @@ -51,7 +58,7 @@ function expandHome(filepath: string): string { await Promise.all(allowedDirectories.map(async (dir) => { try { const stats = await fs.stat(dir); - if (!stats.isDirectory()) { + if (!stats.isDirectory() && !hasProjectsDirectory) { console.error(`Error: ${dir} is not a directory`); process.exit(1); } @@ -262,7 +269,7 @@ function createUnifiedDiff(originalContent: string, newContent: string, filepath async function applyFileEdits( filePath: string, - edits: Array<{oldText: string, newText: string}>, + edits: Array<{ oldText: string, newText: string }>, dryRun = false ): Promise { // Read file content and normalize line endings @@ -398,10 +405,10 @@ server.setRequestHandler(ListToolsRequestSchema, async () => { { name: "directory_tree", description: - "Get a recursive tree view of files and directories as a JSON structure. " + - "Each entry includes 'name', 'type' (file/directory), and 'children' for directories. " + - "Files have no children array, while directories always have a children array (which may be empty). " + - "The output is formatted with 2-space indentation for readability. Only works within allowed directories.", + "Get a recursive tree view of files and directories as a JSON structure. " + + "Each entry includes 'name', 'type' (file/directory), and 'children' for directories. " + + "Files have no children array, while directories always have a children array (which may be empty). " + + "The output is formatted with 2-space indentation for readability. Only works within allowed directories.", inputSchema: zodToJsonSchema(DirectoryTreeArgsSchema) as ToolInput, }, { @@ -538,49 +545,49 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => { }; } - case "directory_tree": { - const parsed = DirectoryTreeArgsSchema.safeParse(args); - if (!parsed.success) { - throw new Error(`Invalid arguments for directory_tree: ${parsed.error}`); - } - - interface TreeEntry { - name: string; - type: 'file' | 'directory'; - children?: TreeEntry[]; - } - - async function buildTree(currentPath: string): Promise { - const validPath = await validatePath(currentPath); - const entries = await fs.readdir(validPath, {withFileTypes: true}); - const result: TreeEntry[] = []; - - for (const entry of entries) { - const entryData: TreeEntry = { - name: entry.name, - type: entry.isDirectory() ? 'directory' : 'file' - }; - - if (entry.isDirectory()) { - const subPath = path.join(currentPath, entry.name); - entryData.children = await buildTree(subPath); - } - - result.push(entryData); - } - - return result; - } - - const treeData = await buildTree(parsed.data.path); - return { - content: [{ - type: "text", - text: JSON.stringify(treeData, null, 2) - }], - }; + case "directory_tree": { + const parsed = DirectoryTreeArgsSchema.safeParse(args); + if (!parsed.success) { + throw new Error(`Invalid arguments for directory_tree: ${parsed.error}`); } + interface TreeEntry { + name: string; + type: 'file' | 'directory'; + children?: TreeEntry[]; + } + + async function buildTree(currentPath: string): Promise { + const validPath = await validatePath(currentPath); + const entries = await fs.readdir(validPath, { withFileTypes: true }); + const result: TreeEntry[] = []; + + for (const entry of entries) { + const entryData: TreeEntry = { + name: entry.name, + type: entry.isDirectory() ? 'directory' : 'file' + }; + + if (entry.isDirectory()) { + const subPath = path.join(currentPath, entry.name); + entryData.children = await buildTree(subPath); + } + + result.push(entryData); + } + + return result; + } + + const treeData = await buildTree(parsed.data.path); + return { + content: [{ + type: "text", + text: JSON.stringify(treeData, null, 2) + }], + }; + } + case "move_file": { const parsed = MoveFileArgsSchema.safeParse(args); if (!parsed.success) { @@ -614,9 +621,11 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => { const validPath = await validatePath(parsed.data.path); const info = await getFileStats(validPath); return { - content: [{ type: "text", text: Object.entries(info) - .map(([key, value]) => `${key}: ${value}`) - .join("\n") }], + content: [{ + type: "text", text: Object.entries(info) + .map(([key, value]) => `${key}: ${value}`) + .join("\n") + }], }; } diff --git a/src/github/README.md b/src/github/README.md index d20ba9cc..a63e803b 100644 --- a/src/github/README.md +++ b/src/github/README.md @@ -236,7 +236,7 @@ To use this with Claude Desktop, add the following to your `claude_desktop_confi "-i", "--rm", "-e", - "GITHUB_PERSONAL_ACCESS_TOKEN=$GITHUB_PERSONAL_ACCESS_TOKEN", + "GITHUB_PERSONAL_ACCESS_TOKEN", "ai/mcp-github" ], "env": { diff --git a/src/gitlab/README.md b/src/gitlab/README.md index 7feb06b4..d2dff023 100644 --- a/src/gitlab/README.md +++ b/src/gitlab/README.md @@ -118,9 +118,9 @@ Add the following to your `claude_desktop_config.json`: "args": [ "run", "-e", - "GITLAB_PERSONAL_ACCESS_TOKEN=$GITLAB_PERSONAL_ACCESS_TOKEN", + "GITLAB_PERSONAL_ACCESS_TOKEN", "-e", - "GITLAB_API_URL=$GITLAB_API_URL", + "GITLAB_API_URL", "ai/mcp-gitlab" ], "env": { diff --git a/src/google-maps/README.md b/src/google-maps/README.md index 46a55c72..867aa2f5 100644 --- a/src/google-maps/README.md +++ b/src/google-maps/README.md @@ -71,7 +71,7 @@ Add the following to your `claude_desktop_config.json`: "-i", "--rm", "-e", - "GOOGLE_MAPS_API_KEY=$GOOGLE_MAPS_API_KEY", + "GOOGLE_MAPS_API_KEY", "ai/mcp-google-maps" ], "env": { diff --git a/src/puppeteer/README.md b/src/puppeteer/README.md index 715f9d0a..d13ef2a5 100644 --- a/src/puppeteer/README.md +++ b/src/puppeteer/README.md @@ -72,7 +72,7 @@ Here's the Claude Desktop configuration to use the Puppeter server: "mcpServers": { "puppeteer": { "command": "docker", - "args": ["run", "-i", "--rm", "--init", "ai/mcp-puppeteer"] + "args": ["run", "-i", "--rm", "--init", "-e", "DOCKER_CONTAINER=true", "ai/mcp-puppeteer"] } } } diff --git a/src/puppeteer/index.ts b/src/puppeteer/index.ts index 2dc98371..b82c653a 100644 --- a/src/puppeteer/index.ts +++ b/src/puppeteer/index.ts @@ -108,7 +108,9 @@ const screenshots = new Map(); async function ensureBrowser() { if (!browser) { - browser = await puppeteer.launch({ headless: true, args: ["--no-sandbox"] }); + const npx_args = { headless: false } + const docker_args = { headless: true, args: ["--no-sandbox", "--single-process", "--no-zygote"] } + browser = await puppeteer.launch(process.env.DOCKER_CONTAINER ? docker_args : npx_args); const pages = await browser.pages(); page = pages[0]; diff --git a/src/slack/README.md b/src/slack/README.md index b0523ee3..74d3dada 100644 --- a/src/slack/README.md +++ b/src/slack/README.md @@ -121,9 +121,9 @@ Add the following to your `claude_desktop_config.json`: "-i", "--rm", "-e", - "SLACK_BOT_TOKEN=$SLACK_BOT_TOKEN", + "SLACK_BOT_TOKEN", "-e", - "SLACK_TEAM_ID=$SLACK_TEAM_ID", + "SLACK_TEAM_ID", "ai/mcp-slack" ], "env": { From 5865afb07a83fe376144321bb518e4cc60e545a1 Mon Sep 17 00:00:00 2001 From: colinmcneil Date: Thu, 19 Dec 2024 11:19:09 -0500 Subject: [PATCH 17/58] Fix puppeteer docker container hanging --- src/puppeteer/Dockerfile | 3 +-- src/puppeteer/index.ts | 5 +++++ 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/puppeteer/Dockerfile b/src/puppeteer/Dockerfile index d3b250b1..082b250d 100644 --- a/src/puppeteer/Dockerfile +++ b/src/puppeteer/Dockerfile @@ -23,5 +23,4 @@ WORKDIR /project RUN npm install -CMD ["node", "dist/index.js"] - +ENTRYPOINT ["node", "dist/index.js"] \ No newline at end of file diff --git a/src/puppeteer/index.ts b/src/puppeteer/index.ts index b82c653a..713f7626 100644 --- a/src/puppeteer/index.ts +++ b/src/puppeteer/index.ts @@ -401,3 +401,8 @@ async function runServer() { } runServer().catch(console.error); + +process.stdin.on("close", () => { + console.error("Puppeteer MCP Server closed"); + process.exit(1); +}); From 4034df774ed6d59074a8edc9bb3e422947e30fdd Mon Sep 17 00:00:00 2001 From: colinmcneil Date: Thu, 19 Dec 2024 13:05:15 -0500 Subject: [PATCH 18/58] Switch puppeteer stdin close from `process.exit` to `server.close` --- src/puppeteer/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/puppeteer/index.ts b/src/puppeteer/index.ts index 713f7626..fda97164 100644 --- a/src/puppeteer/index.ts +++ b/src/puppeteer/index.ts @@ -404,5 +404,5 @@ runServer().catch(console.error); process.stdin.on("close", () => { console.error("Puppeteer MCP Server closed"); - process.exit(1); + server.close(); }); From 0b36cb4b54852a06430d5d678a6095f790485425 Mon Sep 17 00:00:00 2001 From: colinmcneil Date: Thu, 19 Dec 2024 13:19:08 -0500 Subject: [PATCH 19/58] Revert filesystem back to original cli arg sandboxing --- src/filesystem/index.ts | 127 +++++++++++++++++----------------------- 1 file changed, 55 insertions(+), 72 deletions(-) diff --git a/src/filesystem/index.ts b/src/filesystem/index.ts index f073a83e..b4d5c419 100644 --- a/src/filesystem/index.ts +++ b/src/filesystem/index.ts @@ -17,27 +17,9 @@ import { minimatch } from 'minimatch'; // Command line argument parsing const args = process.argv.slice(2); - -let allowedDirectories: string[] = []; - -let hasProjectsDirectory = false; - -// If the projects directory has contents, use it as the root workspace -const projectsContents = await fs.readdir('/projects'); -if (projectsContents.length > 0) { - hasProjectsDirectory = true; - allowedDirectories = projectsContents.map(dir => - normalizePath(path.resolve(expandHome(dir))) - ); -} -else { - if (args.length === 0) { - console.error("Usage: mcp-server-filesystem [additional-directories...]"); - process.exit(1); - } - allowedDirectories = args.map(dir => - normalizePath(path.resolve(expandHome(dir))) - ); +if (args.length === 0) { + console.error("Usage: mcp-server-filesystem [additional-directories...]"); + process.exit(1); } // Normalize all paths consistently @@ -53,12 +35,15 @@ function expandHome(filepath: string): string { } // Store allowed directories in normalized form +const allowedDirectories = args.map(dir => + normalizePath(path.resolve(expandHome(dir))) +); // Validate that all directories exist and are accessible -await Promise.all(allowedDirectories.map(async (dir) => { +await Promise.all(args.map(async (dir) => { try { const stats = await fs.stat(dir); - if (!stats.isDirectory() && !hasProjectsDirectory) { + if (!stats.isDirectory()) { console.error(`Error: ${dir} is not a directory`); process.exit(1); } @@ -269,7 +254,7 @@ function createUnifiedDiff(originalContent: string, newContent: string, filepath async function applyFileEdits( filePath: string, - edits: Array<{ oldText: string, newText: string }>, + edits: Array<{oldText: string, newText: string}>, dryRun = false ): Promise { // Read file content and normalize line endings @@ -405,10 +390,10 @@ server.setRequestHandler(ListToolsRequestSchema, async () => { { name: "directory_tree", description: - "Get a recursive tree view of files and directories as a JSON structure. " + - "Each entry includes 'name', 'type' (file/directory), and 'children' for directories. " + - "Files have no children array, while directories always have a children array (which may be empty). " + - "The output is formatted with 2-space indentation for readability. Only works within allowed directories.", + "Get a recursive tree view of files and directories as a JSON structure. " + + "Each entry includes 'name', 'type' (file/directory), and 'children' for directories. " + + "Files have no children array, while directories always have a children array (which may be empty). " + + "The output is formatted with 2-space indentation for readability. Only works within allowed directories.", inputSchema: zodToJsonSchema(DirectoryTreeArgsSchema) as ToolInput, }, { @@ -545,49 +530,49 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => { }; } - case "directory_tree": { - const parsed = DirectoryTreeArgsSchema.safeParse(args); - if (!parsed.success) { - throw new Error(`Invalid arguments for directory_tree: ${parsed.error}`); - } - - interface TreeEntry { - name: string; - type: 'file' | 'directory'; - children?: TreeEntry[]; - } - - async function buildTree(currentPath: string): Promise { - const validPath = await validatePath(currentPath); - const entries = await fs.readdir(validPath, { withFileTypes: true }); - const result: TreeEntry[] = []; - - for (const entry of entries) { - const entryData: TreeEntry = { - name: entry.name, - type: entry.isDirectory() ? 'directory' : 'file' - }; - - if (entry.isDirectory()) { - const subPath = path.join(currentPath, entry.name); - entryData.children = await buildTree(subPath); + case "directory_tree": { + const parsed = DirectoryTreeArgsSchema.safeParse(args); + if (!parsed.success) { + throw new Error(`Invalid arguments for directory_tree: ${parsed.error}`); } - result.push(entryData); - } + interface TreeEntry { + name: string; + type: 'file' | 'directory'; + children?: TreeEntry[]; + } - return result; + async function buildTree(currentPath: string): Promise { + const validPath = await validatePath(currentPath); + const entries = await fs.readdir(validPath, {withFileTypes: true}); + const result: TreeEntry[] = []; + + for (const entry of entries) { + const entryData: TreeEntry = { + name: entry.name, + type: entry.isDirectory() ? 'directory' : 'file' + }; + + if (entry.isDirectory()) { + const subPath = path.join(currentPath, entry.name); + entryData.children = await buildTree(subPath); + } + + result.push(entryData); + } + + return result; + } + + const treeData = await buildTree(parsed.data.path); + return { + content: [{ + type: "text", + text: JSON.stringify(treeData, null, 2) + }], + }; } - const treeData = await buildTree(parsed.data.path); - return { - content: [{ - type: "text", - text: JSON.stringify(treeData, null, 2) - }], - }; - } - case "move_file": { const parsed = MoveFileArgsSchema.safeParse(args); if (!parsed.success) { @@ -621,11 +606,9 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => { const validPath = await validatePath(parsed.data.path); const info = await getFileStats(validPath); return { - content: [{ - type: "text", text: Object.entries(info) - .map(([key, value]) => `${key}: ${value}`) - .join("\n") - }], + content: [{ type: "text", text: Object.entries(info) + .map(([key, value]) => `${key}: ${value}`) + .join("\n") }], }; } @@ -661,4 +644,4 @@ async function runServer() { runServer().catch((error) => { console.error("Fatal error running server:", error); process.exit(1); -}); \ No newline at end of file +}); From 545103386f6fb284a217d2d7338cff1878e5c74e Mon Sep 17 00:00:00 2001 From: colinmcneil Date: Thu, 19 Dec 2024 13:19:34 -0500 Subject: [PATCH 20/58] Update filesystem config for Docker --- src/filesystem/Dockerfile | 2 -- src/filesystem/README.md | 3 ++- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src/filesystem/Dockerfile b/src/filesystem/Dockerfile index 0cfa3718..12e5bcf4 100644 --- a/src/filesystem/Dockerfile +++ b/src/filesystem/Dockerfile @@ -22,6 +22,4 @@ ENV NODE_ENV=production RUN npm ci --ignore-scripts --omit-dev -WORKDIR /projects - ENTRYPOINT ["node", "/app/dist/index.js"] \ No newline at end of file diff --git a/src/filesystem/README.md b/src/filesystem/README.md index 74b83593..50d8c347 100644 --- a/src/filesystem/README.md +++ b/src/filesystem/README.md @@ -123,7 +123,8 @@ Note: all directories must be mounted to `/projects` by default. "--mount", "type=bind,src=/Users/username/Desktop,dst=/projects/Desktop", "--mount", "type=bind,src=/path/to/other/allowed/dir,dst=/projects/other/allowed/dir,ro", "--mount", "type=bind,src=/path/to/file.txt,dst=/projects/path/to/file.txt", - "ai/mcp-filesystem" + "ai/mcp-filesystem", + "/projects", ] } } From 49044156e32f393e8f322314703f650d1f8ca734 Mon Sep 17 00:00:00 2001 From: colinmcneil Date: Thu, 19 Dec 2024 15:56:30 -0500 Subject: [PATCH 21/58] Update readmes to use new `mcp` namespace --- README.md | 4 ++-- src/aws-kb-retrieval-server/README.md | 4 ++-- src/brave-search/README.md | 2 +- src/everart/README.md | 4 ++-- src/filesystem/README.md | 4 ++-- src/gdrive/README.md | 2 +- src/git/README.md | 4 ++-- src/github/README.md | 4 ++-- src/gitlab/README.md | 2 +- src/google-maps/README.md | 2 +- src/memory/README.md | 4 ++-- src/postgres/README.md | 4 ++-- src/puppeteer/README.md | 4 ++-- src/sequentialthinking/README.md | 4 ++-- src/slack/README.md | 4 ++-- src/sqlite/README.md | 4 ++-- src/time/README.md | 4 ++-- 17 files changed, 30 insertions(+), 30 deletions(-) diff --git a/README.md b/README.md index 7d828c06..2606a795 100644 --- a/README.md +++ b/README.md @@ -86,7 +86,7 @@ A growing set of community-developed and maintained servers demonstrates various - **[Pinecone](https://github.com/sirmews/mcp-pinecone)** - MCP server for searching and uploading records to Pinecone. Allows for simple RAG features, leveraging Pinecone's Inference API. - **[HuggingFace Spaces](https://github.com/evalstate/mcp-hfspace)** - Server for using HuggingFace Spaces, supporting Open Source Image, Audio, Text Models and more. Claude Desktop mode for easy integration. - **[ChatSum](https://github.com/chatmcp/mcp-server-chatsum)** - Query and Summarize chat messages with LLM. by [mcpso](https://mcp.so) -- **[Rememberizer AI](https://github.com/skydeckai/mcp-server-rememberizer)** - An MCP server designed for interacting with the Rememberizer data source, facilitating enhanced knowledge retrieval. +- **[Rememberizer AI](https://github.com/skydeckmcp/server-rememberizer)** - An MCP server designed for interacting with the Rememberizer data source, facilitating enhanced knowledge retrieval. - **[FlightRadar24](https://github.com/sunsetcoder/flightradar24-mcp-server)** - A Claude Desktop MCP server that helps you track flights in real-time using Flightradar24 data. - **[X (Twitter)](https://github.com/vidhupv/x-mcp)** (by vidhupv) - Create, manage and publish X/Twitter posts directly through Claude chat. - **[X (Twitter)](https://github.com/EnesCinr/twitter-mcp)** (by EnesCinr) - Interact with twitter API. Post tweets and search for tweets by query. @@ -119,7 +119,7 @@ Additional resources on MCP. - **[mcp-cli](https://github.com/wong2/mcp-cli)** - A CLI inspector for the Model Context Protocol by **[wong2](https://github.com/wong2)** - **[r/mcp](https://www.reddit.com/r/mcp)** – A Reddit community dedicated to MCP by **[Frank Fiegel](https://github.com/punkpeye)** - **[MCP X Community](https://x.com/i/communities/1861891349609603310)** – A X community for MCP by **[Xiaoyi](https://x.com/chxy)** -- **[mcp-manager](https://github.com/zueai/mcp-manager)** - Simple Web UI to install and manage MCP servers for Claude Desktop by **[Zue](https://github.com/zueai)** +- **[mcp-manager](https://github.com/zuemcp/manager)** - Simple Web UI to install and manage MCP servers for Claude Desktop by **[Zue](https://github.com/zueai)** - **[MCPHub](https://github.com/Jeamee/MCPHub-Desktop)** – An Open Source MacOS & Windows GUI Desktop app for discovering, installing and managing MCP servers by **[Jeamee](https://github.com/jeamee)** ## πŸš€ Getting Started diff --git a/src/aws-kb-retrieval-server/README.md b/src/aws-kb-retrieval-server/README.md index 84855568..bcd9fc2f 100644 --- a/src/aws-kb-retrieval-server/README.md +++ b/src/aws-kb-retrieval-server/README.md @@ -34,7 +34,7 @@ Add this to your `claude_desktop_config.json`: "mcpServers": { "aws-kb-retrieval": { "command": "docker", - "args": [ "run", "-i", "--rm", "-e", "AWS_ACCESS_KEY_ID", "-e", "AWS_SECRET_ACCESS_KEY", "-e", "AWS_REGION", "ai/mcp-aws-kb-retrieval-server" ], + "args": [ "run", "-i", "--rm", "-e", "AWS_ACCESS_KEY_ID", "-e", "AWS_SECRET_ACCESS_KEY", "-e", "AWS_REGION", "mcp/aws-kb-retrieval-server" ], "env": { "AWS_ACCESS_KEY_ID": "YOUR_ACCESS_KEY_HERE", "AWS_SECRET_ACCESS_KEY": "YOUR_SECRET_ACCESS_KEY_HERE", @@ -69,7 +69,7 @@ Add this to your `claude_desktop_config.json`: Docker: ```sh -docker build -t ai/mcp-aws-kb-retrieval -f src/aws-kb-retrieval-server/Dockerfile . +docker build -t mcp/aws-kb-retrieval -f src/aws-kb-retrieval-server/Dockerfile . ``` ## License diff --git a/src/brave-search/README.md b/src/brave-search/README.md index 1907fc9c..a7c1b47c 100644 --- a/src/brave-search/README.md +++ b/src/brave-search/README.md @@ -49,7 +49,7 @@ Add this to your `claude_desktop_config.json`: "--rm", "-e", "BRAVE_API_KEY", - "ai/mcp-brave-search" + "mcp/brave-search" ], "env": { "BRAVE_API_KEY": "YOUR_API_KEY_HERE" diff --git a/src/everart/README.md b/src/everart/README.md index 94c0e33b..bccd5942 100644 --- a/src/everart/README.md +++ b/src/everart/README.md @@ -17,7 +17,7 @@ Add to Claude Desktop config: "mcpServers": { "everart": { "command": "docker", - "args": ["run", "-i", "--rm", "-e", "EVERART_API_KEY", "ai/mcp-everart"], + "args": ["run", "-i", "--rm", "-e", "EVERART_API_KEY", "mcp/everart"], "env": { "EVERART_API_KEY": "your_key_here" } @@ -94,5 +94,5 @@ You can also click the URL above to view the image again. ## Building w/ Docker ```sh -docker build -t ai/mcp-everart -f src/everart/Dockerfile . +docker build -t mcp/everart -f src/everart/Dockerfile . ``` diff --git a/src/filesystem/README.md b/src/filesystem/README.md index 50d8c347..05c915ad 100644 --- a/src/filesystem/README.md +++ b/src/filesystem/README.md @@ -123,7 +123,7 @@ Note: all directories must be mounted to `/projects` by default. "--mount", "type=bind,src=/Users/username/Desktop,dst=/projects/Desktop", "--mount", "type=bind,src=/path/to/other/allowed/dir,dst=/projects/other/allowed/dir,ro", "--mount", "type=bind,src=/path/to/file.txt,dst=/projects/path/to/file.txt", - "ai/mcp-filesystem", + "mcp/filesystem", "/projects", ] } @@ -154,7 +154,7 @@ Note: all directories must be mounted to `/projects` by default. Docker build: ```bash -docker build -t ai/mcp-filesystem -f src/filesystem/Dockerfile . +docker build -t mcp/filesystem -f src/filesystem/Dockerfile . ``` ## License diff --git a/src/gdrive/README.md b/src/gdrive/README.md index 1ef88b67..56e8cfbe 100644 --- a/src/gdrive/README.md +++ b/src/gdrive/README.md @@ -56,7 +56,7 @@ To integrate this server with the desktop app, add the following to your app's s "mcpServers": { "gdrive": { "command": "docker", - "args": ["run", "-i", "--rm", "--mount", "type=bind,source=/Users/colinmcneil/Desktop/gcp-oauth.keys.json,target=/gcp-oauth.keys.json", "-v", "mcp-gdrive:/gdrive-server", "-e", "GDRIVE_OAUTH_PATH=/gcp-oauth.keys.json", "-e", "GDRIVE_CREDENTIALS_PATH=/gdrive-server/credentials.json", "ai/mcp-gdrive"] + "args": ["run", "-i", "--rm", "--mount", "type=bind,source=/Users/colinmcneil/Desktop/gcp-oauth.keys.json,target=/gcp-oauth.keys.json", "-v", "mcp-gdrive:/gdrive-server", "-e", "GDRIVE_OAUTH_PATH=/gcp-oauth.keys.json", "-e", "GDRIVE_CREDENTIALS_PATH=/gdrive-server/credentials.json", "mcp/gdrive"] } } } diff --git a/src/git/README.md b/src/git/README.md index d62ddd61..d838dd9c 100644 --- a/src/git/README.md +++ b/src/git/README.md @@ -207,7 +207,7 @@ If you are doing local development, there are two ways to test your changes: "--mount", "type=bind,src=/Users/username/Desktop,dst=/projects/Desktop", "--mount", "type=bind,src=/path/to/other/allowed/dir,dst=/projects/other/allowed/dir,ro", "--mount", "type=bind,src=/path/to/file.txt,dst=/projects/path/to/file.txt", - "ai/mcp-git" + "mcp/git" ] } } @@ -236,7 +236,7 @@ Docker build: ```bash cd src/git -docker build -t ai/mcp-git . +docker build -t mcp/git . ``` ## License diff --git a/src/github/README.md b/src/github/README.md index a63e803b..14bab491 100644 --- a/src/github/README.md +++ b/src/github/README.md @@ -237,7 +237,7 @@ To use this with Claude Desktop, add the following to your `claude_desktop_confi "--rm", "-e", "GITHUB_PERSONAL_ACCESS_TOKEN", - "ai/mcp-github" + "mcp/github" ], "env": { "GITHUB_PERSONAL_ACCESS_TOKEN": "" @@ -271,7 +271,7 @@ To use this with Claude Desktop, add the following to your `claude_desktop_confi Docker build: ```bash -docker build -t ai/mcp-github -f src/github/Dockerfile . +docker build -t mcp/github -f src/github/Dockerfile . ``` ## License diff --git a/src/gitlab/README.md b/src/gitlab/README.md index d2dff023..e2b16fe1 100644 --- a/src/gitlab/README.md +++ b/src/gitlab/README.md @@ -121,7 +121,7 @@ Add the following to your `claude_desktop_config.json`: "GITLAB_PERSONAL_ACCESS_TOKEN", "-e", "GITLAB_API_URL", - "ai/mcp-gitlab" + "mcp/gitlab" ], "env": { "GITLAB_PERSONAL_ACCESS_TOKEN": "", diff --git a/src/google-maps/README.md b/src/google-maps/README.md index 867aa2f5..c0fd576e 100644 --- a/src/google-maps/README.md +++ b/src/google-maps/README.md @@ -72,7 +72,7 @@ Add the following to your `claude_desktop_config.json`: "--rm", "-e", "GOOGLE_MAPS_API_KEY", - "ai/mcp-google-maps" + "mcp/google-maps" ], "env": { "GOOGLE_MAPS_API_KEY": "" diff --git a/src/memory/README.md b/src/memory/README.md index 37f47094..e405a0d4 100644 --- a/src/memory/README.md +++ b/src/memory/README.md @@ -137,7 +137,7 @@ Add this to your claude_desktop_config.json: "mcpServers": { "memory": { "command": "docker", - "args": ["run", "-i", "--rm", "ai/mcp-memory"] + "args": ["run", "-i", "--rm", "mcp/memory"] } } } @@ -195,7 +195,7 @@ Follow these steps for each interaction: Docker: ```sh -docker build -t ai/mcp-memory -f src/memory/Dockerfile . +docker build -t mcp/memory -f src/memory/Dockerfile . ``` ## License diff --git a/src/postgres/README.md b/src/postgres/README.md index f5ace34c..aaace581 100644 --- a/src/postgres/README.md +++ b/src/postgres/README.md @@ -38,7 +38,7 @@ To use this server with the Claude Desktop app, add the following configuration "run", "-i", "--rm", - "ai/mcp-postgres", + "mcp/postgres", "postgresql://host.docker.internal:5432/mydb"] } } @@ -69,7 +69,7 @@ Replace `/mydb` with your database name. Docker: ```sh -docker build -t ai/mcp-postgres -f src/postgres/Dockerfile . +docker build -t mcp/postgres -f src/postgres/Dockerfile . ``` ## License diff --git a/src/puppeteer/README.md b/src/puppeteer/README.md index d13ef2a5..375b27cd 100644 --- a/src/puppeteer/README.md +++ b/src/puppeteer/README.md @@ -72,7 +72,7 @@ Here's the Claude Desktop configuration to use the Puppeter server: "mcpServers": { "puppeteer": { "command": "docker", - "args": ["run", "-i", "--rm", "--init", "-e", "DOCKER_CONTAINER=true", "ai/mcp-puppeteer"] + "args": ["run", "-i", "--rm", "--init", "-e", "DOCKER_CONTAINER=true", "mcp/puppeteer"] } } } @@ -96,7 +96,7 @@ Here's the Claude Desktop configuration to use the Puppeter server: Docker build: ```bash -docker build -t ai/mcp-puppeteer -f src/puppeteer/Dockerfile . +docker build -t mcp/puppeteer -f src/puppeteer/Dockerfile . ``` ## License diff --git a/src/sequentialthinking/README.md b/src/sequentialthinking/README.md index 15586b39..77ccb454 100644 --- a/src/sequentialthinking/README.md +++ b/src/sequentialthinking/README.md @@ -71,7 +71,7 @@ Add this to your `claude_desktop_config.json`: "run", "--rm", "-i", - "ai/mcp-sequentialthinking" + "mcp/sequentialthinking" ] } } @@ -83,7 +83,7 @@ Add this to your `claude_desktop_config.json`: Docker: ```bash -docker build -t ai/mcp-sequentialthinking -f sequentialthinking/Dockerfile . +docker build -t mcp/sequentialthinking -f sequentialthinking/Dockerfile . ``` ## License diff --git a/src/slack/README.md b/src/slack/README.md index 74d3dada..970cba66 100644 --- a/src/slack/README.md +++ b/src/slack/README.md @@ -124,7 +124,7 @@ Add the following to your `claude_desktop_config.json`: "SLACK_BOT_TOKEN", "-e", "SLACK_TEAM_ID", - "ai/mcp-slack" + "mcp/slack" ], "env": { "SLACK_BOT_TOKEN": "xoxb-your-bot-token", @@ -148,7 +148,7 @@ If you encounter permission errors, verify that: Docker build: ```bash -docker build -t ai/mcp-slack -f src/slack/Dockerfile . +docker build -t mcp/slack -f src/slack/Dockerfile . ``` ## License diff --git a/src/sqlite/README.md b/src/sqlite/README.md index 517b6e47..e194c6bf 100644 --- a/src/sqlite/README.md +++ b/src/sqlite/README.md @@ -95,7 +95,7 @@ The server offers six core tools: "-i", "-v", "mcp-test:/mcp", - "ai/mcp-sqlite", + "mcp/sqlite", "--db-path", "/mcp/test.db" ] @@ -108,7 +108,7 @@ The server offers six core tools: Docker: ```bash -docker build -t ai/mcp-sqlite . +docker build -t mcp/sqlite . ``` ## License diff --git a/src/time/README.md b/src/time/README.md index f40dc19d..eed504bb 100644 --- a/src/time/README.md +++ b/src/time/README.md @@ -61,7 +61,7 @@ Add to your Claude settings: "mcpServers": { "time": { "command": "docker", - "args": ["run", "-i", "--rm", "ai/mcp-time"] + "args": ["run", "-i", "--rm", "mcp/time"] } } ``` @@ -198,7 +198,7 @@ Docker build: ```bash cd src/time -docker build -t ai/mcp-time . +docker build -t mcp/time . ``` ## Contributing From 70e19c466d3b99c7505e43a485aa7dc22e1da838 Mon Sep 17 00:00:00 2001 From: Jim Clark Date: Thu, 19 Dec 2024 12:40:49 -0800 Subject: [PATCH 22/58] Migrate python servers to mcp namespace --- README.md | 4 ++-- src/fetch/README.md | 13 +++++++++++++ src/git/README.md | 13 +++++++++++++ src/sentry/README.md | 16 ++++++++++++++++ 4 files changed, 44 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 2606a795..7d828c06 100644 --- a/README.md +++ b/README.md @@ -86,7 +86,7 @@ A growing set of community-developed and maintained servers demonstrates various - **[Pinecone](https://github.com/sirmews/mcp-pinecone)** - MCP server for searching and uploading records to Pinecone. Allows for simple RAG features, leveraging Pinecone's Inference API. - **[HuggingFace Spaces](https://github.com/evalstate/mcp-hfspace)** - Server for using HuggingFace Spaces, supporting Open Source Image, Audio, Text Models and more. Claude Desktop mode for easy integration. - **[ChatSum](https://github.com/chatmcp/mcp-server-chatsum)** - Query and Summarize chat messages with LLM. by [mcpso](https://mcp.so) -- **[Rememberizer AI](https://github.com/skydeckmcp/server-rememberizer)** - An MCP server designed for interacting with the Rememberizer data source, facilitating enhanced knowledge retrieval. +- **[Rememberizer AI](https://github.com/skydeckai/mcp-server-rememberizer)** - An MCP server designed for interacting with the Rememberizer data source, facilitating enhanced knowledge retrieval. - **[FlightRadar24](https://github.com/sunsetcoder/flightradar24-mcp-server)** - A Claude Desktop MCP server that helps you track flights in real-time using Flightradar24 data. - **[X (Twitter)](https://github.com/vidhupv/x-mcp)** (by vidhupv) - Create, manage and publish X/Twitter posts directly through Claude chat. - **[X (Twitter)](https://github.com/EnesCinr/twitter-mcp)** (by EnesCinr) - Interact with twitter API. Post tweets and search for tweets by query. @@ -119,7 +119,7 @@ Additional resources on MCP. - **[mcp-cli](https://github.com/wong2/mcp-cli)** - A CLI inspector for the Model Context Protocol by **[wong2](https://github.com/wong2)** - **[r/mcp](https://www.reddit.com/r/mcp)** – A Reddit community dedicated to MCP by **[Frank Fiegel](https://github.com/punkpeye)** - **[MCP X Community](https://x.com/i/communities/1861891349609603310)** – A X community for MCP by **[Xiaoyi](https://x.com/chxy)** -- **[mcp-manager](https://github.com/zuemcp/manager)** - Simple Web UI to install and manage MCP servers for Claude Desktop by **[Zue](https://github.com/zueai)** +- **[mcp-manager](https://github.com/zueai/mcp-manager)** - Simple Web UI to install and manage MCP servers for Claude Desktop by **[Zue](https://github.com/zueai)** - **[MCPHub](https://github.com/Jeamee/MCPHub-Desktop)** – An Open Source MacOS & Windows GUI Desktop app for discovering, installing and managing MCP servers by **[Jeamee](https://github.com/jeamee)** ## πŸš€ Getting Started diff --git a/src/fetch/README.md b/src/fetch/README.md index bc8f0f61..0e58b3de 100644 --- a/src/fetch/README.md +++ b/src/fetch/README.md @@ -61,6 +61,19 @@ Add to your Claude settings: ```
+
+Using docker + +```json +"mcpServers": { + "fetch": { + "command": "docker", + "args": ["run", "-i", "--rm", "mcp/fetch"] + } +} +``` +
+
Using pip installation diff --git a/src/git/README.md b/src/git/README.md index d838dd9c..6fc905f1 100644 --- a/src/git/README.md +++ b/src/git/README.md @@ -120,6 +120,19 @@ Add this to your `claude_desktop_config.json`: ```
+
+Using docker + +```json +"mcpServers": { + "git": { + "command": "docker", + "args": ["run", "--rm", "-i", "type=bind,src=/Users/slim,dst=/projects", "mcp/git"] + } +} +``` +
+
Using pip installation diff --git a/src/sentry/README.md b/src/sentry/README.md index aae44568..4f02bb58 100644 --- a/src/sentry/README.md +++ b/src/sentry/README.md @@ -69,6 +69,22 @@ Add this to your `claude_desktop_config.json`:
+ +
+Using docker + +```json +"mcpServers": { + "sentry": { + "command": "docker", + "args": ["run", "-i", "--rm", "mcp/sentry", "--auth-token", "YOUR_SENTRY_TOKEN"] + } +} +``` +
+ +
+ Using pip installation ```json From 066426c3fdff00530b4ebbd2149cac9614f18bc4 Mon Sep 17 00:00:00 2001 From: Jim Clark Date: Thu, 19 Dec 2024 14:00:30 -0800 Subject: [PATCH 23/58] Fix git and brave-search typos in README.md --- src/brave-search/README.md | 2 +- src/git/README.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/brave-search/README.md b/src/brave-search/README.md index a7c1b47c..39f73535 100644 --- a/src/brave-search/README.md +++ b/src/brave-search/README.md @@ -84,7 +84,7 @@ Add this to your `claude_desktop_config.json`: Docker build: ```bash -docker build -t vonwig/brave-search:mcp -f src/brave-search/Dockerfile . +docker build -t mcp/brave-search:latest -f src/brave-search/Dockerfile . ``` ## License diff --git a/src/git/README.md b/src/git/README.md index 6fc905f1..5bd893cc 100644 --- a/src/git/README.md +++ b/src/git/README.md @@ -127,7 +127,7 @@ Add this to your `claude_desktop_config.json`: "mcpServers": { "git": { "command": "docker", - "args": ["run", "--rm", "-i", "type=bind,src=/Users/slim,dst=/projects", "mcp/git"] + "args": ["run", "--rm", "-i", "--mount", "type=bind,src=/Users/username,dst=/projects", "mcp/git"] } } ``` From e4ef637f954dba86f9b47ed83ede9e9eb6ed5567 Mon Sep 17 00:00:00 2001 From: Jim Clark Date: Thu, 19 Dec 2024 14:21:14 -0800 Subject: [PATCH 24/58] fix indentation --- src/everart/README.md | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/everart/README.md b/src/everart/README.md index bccd5942..57dab4d0 100644 --- a/src/everart/README.md +++ b/src/everart/README.md @@ -18,11 +18,10 @@ Add to Claude Desktop config: "everart": { "command": "docker", "args": ["run", "-i", "--rm", "-e", "EVERART_API_KEY", "mcp/everart"], - "env": { - "EVERART_API_KEY": "your_key_here" + "env": { + "EVERART_API_KEY": "your_key_here" + } } - }, - } } ``` From 2b0b8afa260c4f75241fed265f8a25aa49f5cb98 Mon Sep 17 00:00:00 2001 From: Jim Clark Date: Thu, 19 Dec 2024 14:34:05 -0800 Subject: [PATCH 25/58] Update src/puppeteer/README.md Co-authored-by: David Soria Parra <167242713+dsp-ant@users.noreply.github.com> --- src/puppeteer/README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/puppeteer/README.md b/src/puppeteer/README.md index 375b27cd..7c7e8160 100644 --- a/src/puppeteer/README.md +++ b/src/puppeteer/README.md @@ -67,6 +67,8 @@ Here's the Claude Desktop configuration to use the Puppeter server: ### Docker +**NOTE** The docker implementation will use headless chromium, where as the NPX version will open a browser window. + ```json { "mcpServers": { From 38c88d9ac35c1b2db51b9de98be124d0a0baedd1 Mon Sep 17 00:00:00 2001 From: colinmcneil Date: Thu, 19 Dec 2024 17:54:38 -0500 Subject: [PATCH 26/58] Bump puppeteer bullseye to bookworm --- src/puppeteer/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/puppeteer/Dockerfile b/src/puppeteer/Dockerfile index 082b250d..d0f58a3a 100644 --- a/src/puppeteer/Dockerfile +++ b/src/puppeteer/Dockerfile @@ -1,4 +1,4 @@ -FROM node:22-bullseye-slim +FROM node:22-bookworm-slim ENV DEBIAN_FRONTEND noninteractive From f63029468d8c14bb0272f37fa254c605edca15cd Mon Sep 17 00:00:00 2001 From: colinmcneil Date: Thu, 19 Dec 2024 18:24:35 -0500 Subject: [PATCH 27/58] Get gdrive working in Docker --- src/gdrive/Dockerfile | 5 +++++ src/gdrive/README.md | 19 ++++++++++++++++--- src/gdrive/replace_open.sh | 5 +++++ 3 files changed, 26 insertions(+), 3 deletions(-) create mode 100644 src/gdrive/replace_open.sh diff --git a/src/gdrive/Dockerfile b/src/gdrive/Dockerfile index b7bb2a76..8a3458f4 100644 --- a/src/gdrive/Dockerfile +++ b/src/gdrive/Dockerfile @@ -16,9 +16,14 @@ WORKDIR /app COPY --from=builder /app/dist /app/dist COPY --from=builder /app/package.json /app/package.json COPY --from=builder /app/package-lock.json /app/package-lock.json +COPY src/gdrive/replace_open.sh /replace_open.sh ENV NODE_ENV=production RUN npm ci --ignore-scripts --omit-dev +RUN sh /replace_open.sh + +RUN rm /replace_open.sh + ENTRYPOINT ["node", "dist/index.js"] \ No newline at end of file diff --git a/src/gdrive/README.md b/src/gdrive/README.md index 56e8cfbe..bb200dd4 100644 --- a/src/gdrive/README.md +++ b/src/gdrive/README.md @@ -31,8 +31,9 @@ The server provides access to Google Drive files: 3. [Configure an OAuth consent screen](https://console.cloud.google.com/apis/credentials/consent) ("internal" is fine for testing) 4. Add OAuth scope `https://www.googleapis.com/auth/drive.readonly` 5. [Create an OAuth Client ID](https://console.cloud.google.com/apis/credentials/oauthclient) for application type "Desktop App" -6. Download the JSON file of your client's OAuth keys -7. Rename the key file to `gcp-oauth.keys.json` and place into the root of this repo (i.e. `servers/gcp-oauth.keys.json`) +6. Add http://localhost:3000/oauth2callback as a redirect URI +7. Download the JSON file of your client's OAuth keys +8. Rename the key file to `gcp-oauth.keys.json` and place into the root of this repo (i.e. `servers/gcp-oauth.keys.json`) Make sure to build the server with either `npm run build` or `npm run watch`. @@ -51,12 +52,24 @@ To integrate this server with the desktop app, add the following to your app's s #### Docker +Authentication: + +Assuming you have completed setting up the OAuth application on Google Cloud, you can now auth the server with the following command, replacing `/path/to/gcp-oauth.keys.json` with the path to your OAuth keys file: + +```bash +docker run -i --rm --mount type=bind,source=/path/to/gcp-oauth.keys.json,target=/gcp-oauth.keys.json -v mcp-gdrive:/gdrive-server -e GDRIVE_OAUTH_PATH=/gcp-oauth.keys.json -e "GDRIVE_CREDENTIALS_PATH=/gdrive-server/credentials.json" -p 3000:3000 mcp/gdrive auth +``` + +The command will print the URL to open in your browser. Open this URL in your browser and complete the authentication process. The credentials will be saved in the `mcp-gdrive` volume. + +Once authenticated, you can use the server in your app's server configuration: + ```json { "mcpServers": { "gdrive": { "command": "docker", - "args": ["run", "-i", "--rm", "--mount", "type=bind,source=/Users/colinmcneil/Desktop/gcp-oauth.keys.json,target=/gcp-oauth.keys.json", "-v", "mcp-gdrive:/gdrive-server", "-e", "GDRIVE_OAUTH_PATH=/gcp-oauth.keys.json", "-e", "GDRIVE_CREDENTIALS_PATH=/gdrive-server/credentials.json", "mcp/gdrive"] + "args": ["run", "-i", "--rm", "-v", "mcp-gdrive:/gdrive-server", "-e", "GDRIVE_CREDENTIALS_PATH=/gdrive-server/credentials.json", "mcp/gdrive"] } } } diff --git a/src/gdrive/replace_open.sh b/src/gdrive/replace_open.sh new file mode 100644 index 00000000..6727854b --- /dev/null +++ b/src/gdrive/replace_open.sh @@ -0,0 +1,5 @@ +#! /bin/bash + +# Basic script to replace opn(authorizeUrl, { wait: false }).then(cp => cp.unref()); with process.stdout.write(`Open this URL in your browser: ${authorizeUrl}`); + +sed -i 's/opn(authorizeUrl, { wait: false }).then(cp => cp.unref());/process.stderr.write(`Open this URL in your browser: ${authorizeUrl}\n`);/' node_modules/@google-cloud/local-auth/build/src/index.js From 4fa1c47b0a1c4435dc9a0800a87394e21f15b652 Mon Sep 17 00:00:00 2001 From: Jim Clark Date: Thu, 19 Dec 2024 16:04:57 -0800 Subject: [PATCH 28/58] Update fetch Docker to not have ux in final stage --- src/fetch/Dockerfile | 15 +++++++++++---- src/git/README.md | 4 +++- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/src/fetch/Dockerfile b/src/fetch/Dockerfile index fae262d1..7e8824c4 100644 --- a/src/fetch/Dockerfile +++ b/src/fetch/Dockerfile @@ -1,5 +1,5 @@ # Use a Python image with uv pre-installed -FROM ghcr.io/astral-sh/uv:python3.12-bookworm-slim +FROM ghcr.io/astral-sh/uv:python3.12-bookworm-slim AS uv # Install the project into `/app` WORKDIR /app @@ -14,16 +14,23 @@ ENV UV_LINK_MODE=copy RUN --mount=type=cache,target=/root/.cache/uv \ --mount=type=bind,source=uv.lock,target=uv.lock \ --mount=type=bind,source=pyproject.toml,target=pyproject.toml \ - uv sync --frozen --no-install-project --no-dev + uv sync --frozen --no-install-project --no-dev --no-editable # Then, add the rest of the project source code and install it # Installing separately from its dependencies allows optimal layer caching ADD . /app RUN --mount=type=cache,target=/root/.cache/uv \ - uv sync --frozen --no-dev + uv sync --frozen --no-dev --no-editable + +FROM python:3.12-slim-bookworm + +WORKDIR /app + +COPY --from=uv /root/.local /root/.local +COPY --from=uv --chown=app:app /app/.venv /app/.venv # Place executables in the environment at the front of the path ENV PATH="/app/.venv/bin:$PATH" # when running the container, add --db-path and a bind mount to the host's db file -ENTRYPOINT ["uvx" , "mcp-server-fetch"] +ENTRYPOINT ["mcp-server-fetch"] diff --git a/src/git/README.md b/src/git/README.md index 5bd893cc..cb22629e 100644 --- a/src/git/README.md +++ b/src/git/README.md @@ -123,11 +123,13 @@ Add this to your `claude_desktop_config.json`:
Using docker +* Note: replace '/Users/username' with the a path that you want to be accessible by this tool + ```json "mcpServers": { "git": { "command": "docker", - "args": ["run", "--rm", "-i", "--mount", "type=bind,src=/Users/username,dst=/projects", "mcp/git"] + "args": ["run", "--rm", "-i", "--mount", "type=bind,src=/Users/username,dst=/Users/username", "mcp/git"] } } ``` From 621919a9548cab4a83436ccc25ed502bf780fcf8 Mon Sep 17 00:00:00 2001 From: Jim Clark Date: Thu, 19 Dec 2024 17:13:21 -0800 Subject: [PATCH 29/58] Switch to uv-less final stages --- src/git/Dockerfile | 19 +++++++++++++------ src/sentry/Dockerfile | 16 ++++++++++++---- src/sqlite/Dockerfile | 16 ++++++++++++---- src/time/Dockerfile | 15 +++++++++++---- 4 files changed, 48 insertions(+), 18 deletions(-) diff --git a/src/git/Dockerfile b/src/git/Dockerfile index 264962ed..2746d634 100644 --- a/src/git/Dockerfile +++ b/src/git/Dockerfile @@ -1,5 +1,5 @@ # Use a Python image with uv pre-installed -FROM ghcr.io/astral-sh/uv:python3.12-bookworm-slim +FROM ghcr.io/astral-sh/uv:python3.12-bookworm-slim AS uv # Install the project into `/app` WORKDIR /app @@ -10,22 +10,29 @@ ENV UV_COMPILE_BYTECODE=1 # Copy from the cache instead of linking since it's a mounted volume ENV UV_LINK_MODE=copy -RUN apt-get update && apt-get install -y git && rm -rf /var/lib/apt/lists/* - # Install the project's dependencies using the lockfile and settings RUN --mount=type=cache,target=/root/.cache/uv \ --mount=type=bind,source=uv.lock,target=uv.lock \ --mount=type=bind,source=pyproject.toml,target=pyproject.toml \ - uv sync --frozen --no-install-project --no-dev + uv sync --frozen --no-install-project --no-dev --no-editable # Then, add the rest of the project source code and install it # Installing separately from its dependencies allows optimal layer caching ADD . /app RUN --mount=type=cache,target=/root/.cache/uv \ - uv sync --frozen --no-dev + uv sync --frozen --no-dev --no-editable + +FROM python:3.12-slim-bookworm + +RUN apt-get update && apt-get install -y git && rm -rf /var/lib/apt/lists/* + +WORKDIR /app + +COPY --from=uv /root/.local /root/.local +COPY --from=uv --chown=app:app /app/.venv /app/.venv # Place executables in the environment at the front of the path ENV PATH="/app/.venv/bin:$PATH" # when running the container, add --db-path and a bind mount to the host's db file -ENTRYPOINT ["uv" , "run" , "--directory", ".", "mcp-server-git"] +ENTRYPOINT ["mcp-server-git"] diff --git a/src/sentry/Dockerfile b/src/sentry/Dockerfile index 5cd6f220..a706a15e 100644 --- a/src/sentry/Dockerfile +++ b/src/sentry/Dockerfile @@ -1,5 +1,5 @@ # Use a Python image with uv pre-installed -FROM ghcr.io/astral-sh/uv:python3.12-bookworm-slim +FROM ghcr.io/astral-sh/uv:python3.12-bookworm-slim AS uv # Install the project into `/app` WORKDIR /app @@ -14,16 +14,24 @@ ENV UV_LINK_MODE=copy RUN --mount=type=cache,target=/root/.cache/uv \ --mount=type=bind,source=uv.lock,target=uv.lock \ --mount=type=bind,source=pyproject.toml,target=pyproject.toml \ - uv sync --frozen --no-install-project --no-dev + uv sync --frozen --no-install-project --no-dev --no-editable # Then, add the rest of the project source code and install it # Installing separately from its dependencies allows optimal layer caching ADD . /app RUN --mount=type=cache,target=/root/.cache/uv \ - uv sync --frozen --no-dev + uv sync --frozen --no-dev --no-editable + +FROM python:3.12-slim-bookworm + +WORKDIR /app + +COPY --from=uv /root/.local /root/.local +COPY --from=uv --chown=app:app /app/.venv /app/.venv # Place executables in the environment at the front of the path ENV PATH="/app/.venv/bin:$PATH" # when running the container, add --db-path and a bind mount to the host's db file -ENTRYPOINT ["uv" , "run" , "--directory", ".", "mcp-server-sentry"] +ENTRYPOINT ["mcp-server-sentry"] + diff --git a/src/sqlite/Dockerfile b/src/sqlite/Dockerfile index 8189a3d6..2edc34b0 100644 --- a/src/sqlite/Dockerfile +++ b/src/sqlite/Dockerfile @@ -1,5 +1,5 @@ # Use a Python image with uv pre-installed -FROM ghcr.io/astral-sh/uv:python3.12-bookworm-slim +FROM ghcr.io/astral-sh/uv:python3.12-bookworm-slim AS uv # Install the project into `/app` WORKDIR /app @@ -14,16 +14,24 @@ ENV UV_LINK_MODE=copy RUN --mount=type=cache,target=/root/.cache/uv \ --mount=type=bind,source=uv.lock,target=uv.lock \ --mount=type=bind,source=pyproject.toml,target=pyproject.toml \ - uv sync --frozen --no-install-project --no-dev + uv sync --frozen --no-install-project --no-dev --no-editable # Then, add the rest of the project source code and install it # Installing separately from its dependencies allows optimal layer caching ADD . /app RUN --mount=type=cache,target=/root/.cache/uv \ - uv sync --frozen --no-dev + uv sync --frozen --no-dev --no-editable + +FROM python:3.12-slim-bookworm + +WORKDIR /app + +COPY --from=uv /root/.local /root/.local +COPY --from=uv --chown=app:app /app/.venv /app/.venv # Place executables in the environment at the front of the path ENV PATH="/app/.venv/bin:$PATH" # when running the container, add --db-path and a bind mount to the host's db file -ENTRYPOINT ["uv" , "run" , "--directory", ".", "mcp-server-sqlite"] +ENTRYPOINT ["mcp-server-sqlite"] + diff --git a/src/time/Dockerfile b/src/time/Dockerfile index b45b389d..bd62ea84 100644 --- a/src/time/Dockerfile +++ b/src/time/Dockerfile @@ -1,5 +1,5 @@ # Use a Python image with uv pre-installed -FROM ghcr.io/astral-sh/uv:python3.12-bookworm-slim +FROM ghcr.io/astral-sh/uv:python3.12-bookworm-slim AS uv # Install the project into `/app` WORKDIR /app @@ -14,16 +14,23 @@ ENV UV_LINK_MODE=copy RUN --mount=type=cache,target=/root/.cache/uv \ --mount=type=bind,source=uv.lock,target=uv.lock \ --mount=type=bind,source=pyproject.toml,target=pyproject.toml \ - uv sync --frozen --no-install-project --no-dev + uv sync --frozen --no-install-project --no-dev --no-editable # Then, add the rest of the project source code and install it # Installing separately from its dependencies allows optimal layer caching ADD . /app RUN --mount=type=cache,target=/root/.cache/uv \ - uv sync --frozen --no-dev + uv sync --frozen --no-dev --no-editable + +FROM python:3.12-slim-bookworm + +WORKDIR /app + +COPY --from=uv /root/.local /root/.local +COPY --from=uv --chown=app:app /app/.venv /app/.venv # Place executables in the environment at the front of the path ENV PATH="/app/.venv/bin:$PATH" # when running the container, add --db-path and a bind mount to the host's db file -ENTRYPOINT ["uv" , "run" , "--directory", ".", "mcp-server-time"] +ENTRYPOINT ["mcp-server-time"] From 071f41df53b05de7c89d53719d474c8518e278dc Mon Sep 17 00:00:00 2001 From: colinmcneil Date: Fri, 20 Dec 2024 11:58:39 -0500 Subject: [PATCH 30/58] Remove step 6 for gdrive --- src/gdrive/README.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/gdrive/README.md b/src/gdrive/README.md index bb200dd4..2d153815 100644 --- a/src/gdrive/README.md +++ b/src/gdrive/README.md @@ -31,9 +31,8 @@ The server provides access to Google Drive files: 3. [Configure an OAuth consent screen](https://console.cloud.google.com/apis/credentials/consent) ("internal" is fine for testing) 4. Add OAuth scope `https://www.googleapis.com/auth/drive.readonly` 5. [Create an OAuth Client ID](https://console.cloud.google.com/apis/credentials/oauthclient) for application type "Desktop App" -6. Add http://localhost:3000/oauth2callback as a redirect URI -7. Download the JSON file of your client's OAuth keys -8. Rename the key file to `gcp-oauth.keys.json` and place into the root of this repo (i.e. `servers/gcp-oauth.keys.json`) +6. Download the JSON file of your client's OAuth keys +7. Rename the key file to `gcp-oauth.keys.json` and place into the root of this repo (i.e. `servers/gcp-oauth.keys.json`) Make sure to build the server with either `npm run build` or `npm run watch`. From ddd4860452a769e324c4c8e2ae853fc507045275 Mon Sep 17 00:00:00 2001 From: colinmcneil Date: Fri, 20 Dec 2024 12:27:42 -0500 Subject: [PATCH 31/58] Emit gdrive log on stderr to prevent rpc errors in claude desktop --- src/gdrive/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/gdrive/index.ts b/src/gdrive/index.ts index 4a8e954c..575c350c 100644 --- a/src/gdrive/index.ts +++ b/src/gdrive/index.ts @@ -206,7 +206,7 @@ async function loadCredentialsAndRunServer() { auth.setCredentials(credentials); google.options({ auth }); - console.log("Credentials loaded. Starting server."); + console.error("Credentials loaded. Starting server."); const transport = new StdioServerTransport(); await server.connect(transport); } From 8b596a0f0490bab786da03464fec9c1546711c16 Mon Sep 17 00:00:00 2001 From: David Soria Parra Date: Fri, 20 Dec 2024 18:29:47 +0000 Subject: [PATCH 32/58] bump node --- .github/workflows/typescript.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/typescript.yml b/.github/workflows/typescript.yml index 7d55e744..a87cdd8f 100644 --- a/.github/workflows/typescript.yml +++ b/.github/workflows/typescript.yml @@ -34,7 +34,7 @@ jobs: - uses: actions/setup-node@v4 with: - node-version: 18 + node-version: 22 cache: npm - name: Install dependencies @@ -64,7 +64,7 @@ jobs: - uses: actions/checkout@v4 - uses: actions/setup-node@v4 with: - node-version: 18 + node-version: 22 cache: npm registry-url: "https://registry.npmjs.org" From 12dfc22a333ae40035bacafaadfb7adea7f94ec2 Mon Sep 17 00:00:00 2001 From: David Soria Parra Date: Fri, 20 Dec 2024 18:59:40 +0000 Subject: [PATCH 33/58] update lockfile --- package-lock.json | 100 +++++----------------------------------------- 1 file changed, 10 insertions(+), 90 deletions(-) diff --git a/package-lock.json b/package-lock.json index 140b5ca3..0dcbfbbc 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1573,11 +1573,12 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "22.9.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.9.0.tgz", - "integrity": "sha512-vuyHg81vvWA1Z1ELfvLko2c8f34gyA0zaic0+Rllc5lbCnbSyuvb2Oxpm6TAUAC/2xZN3QGqxBNggD1nNR2AfQ==", + "version": "22.10.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.2.tgz", + "integrity": "sha512-Xxr6BBRCAOQixvonOye19wnzyDiUtTeqldOOmj3CkeblonbccA12PFwlufvRdrpjXxqnmUaeiU5EOA+7s5diUQ==", + "license": "MIT", "dependencies": { - "undici-types": "~6.19.8" + "undici-types": "~6.20.0" } }, "node_modules/@types/node-fetch": { @@ -4774,9 +4775,10 @@ } }, "node_modules/undici-types": { - "version": "6.19.8", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", - "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==" + "version": "6.20.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz", + "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==", + "license": "MIT" }, "node_modules/universalify": { "version": "2.0.1", @@ -5020,15 +5022,6 @@ "typescript": "^5.6.2" } }, - "src/aws-kb-retrieval-server/node_modules/@types/node": { - "version": "20.17.9", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.17.9.tgz", - "integrity": "sha512-0JOXkRyLanfGPE2QRCwgxhzlBAvaRdCNMcvbd7jFfpmD4eEXll7LRwy5ymJmyeZqk7Nh7eD2LeUyQ68BbndmXw==", - "dev": true, - "dependencies": { - "undici-types": "~6.19.2" - } - }, "src/brave-search": { "name": "@modelcontextprotocol/server-brave-search", "version": "0.6.2", @@ -5055,16 +5048,6 @@ "zod": "^3.23.8" } }, - "src/brave-search/node_modules/@types/node": { - "version": "20.17.6", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.17.6.tgz", - "integrity": "sha512-VEI7OdvK2wP7XHnsuXbAJnEpEkF6NjSN45QJlL4VGqZSXsnicpesdTWsg9RISeSdYd3yeRj/y3k5KGjUXYnFwQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "undici-types": "~6.19.2" - } - }, "src/duckduckgo": { "name": "@modelcontextprotocol/server-duckduckgo", "version": "0.2.0", @@ -5104,15 +5087,6 @@ "typescript": "^5.3.3" } }, - "src/everart/node_modules/@types/node": { - "version": "20.17.9", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.17.9.tgz", - "integrity": "sha512-0JOXkRyLanfGPE2QRCwgxhzlBAvaRdCNMcvbd7jFfpmD4eEXll7LRwy5ymJmyeZqk7Nh7eD2LeUyQ68BbndmXw==", - "dev": true, - "dependencies": { - "undici-types": "~6.19.2" - } - }, "src/everart/node_modules/data-uri-to-buffer": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz", @@ -5216,16 +5190,6 @@ "zod": "^3.23.8" } }, - "src/filesystem/node_modules/@types/node": { - "version": "20.17.6", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.17.6.tgz", - "integrity": "sha512-VEI7OdvK2wP7XHnsuXbAJnEpEkF6NjSN45QJlL4VGqZSXsnicpesdTWsg9RISeSdYd3yeRj/y3k5KGjUXYnFwQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "undici-types": "~6.19.2" - } - }, "src/filesystem/node_modules/brace-expansion": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", @@ -5313,15 +5277,6 @@ "zod": "^3.23.8" } }, - "src/gdrive/node_modules/@types/node": { - "version": "22.9.3", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.9.3.tgz", - "integrity": "sha512-F3u1fs/fce3FFk+DAxbxc78DF8x0cY09RRL8GnXLmkJ1jvx3TtPdWoTT5/NiYfI5ASqXBmfqJi9dZ3gxMx4lzw==", - "dev": true, - "dependencies": { - "undici-types": "~6.19.8" - } - }, "src/github": { "name": "@modelcontextprotocol/server-github", "version": "0.6.2", @@ -5352,14 +5307,6 @@ "zod": "^3.23.8" } }, - "src/github/node_modules/@types/node": { - "version": "20.17.9", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.17.9.tgz", - "integrity": "sha512-0JOXkRyLanfGPE2QRCwgxhzlBAvaRdCNMcvbd7jFfpmD4eEXll7LRwy5ymJmyeZqk7Nh7eD2LeUyQ68BbndmXw==", - "dependencies": { - "undici-types": "~6.19.2" - } - }, "src/github/node_modules/data-uri-to-buffer": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz", @@ -5516,15 +5463,6 @@ "zod": "^3.23.8" } }, - "src/memory/node_modules/@types/node": { - "version": "22.9.3", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.9.3.tgz", - "integrity": "sha512-F3u1fs/fce3FFk+DAxbxc78DF8x0cY09RRL8GnXLmkJ1jvx3TtPdWoTT5/NiYfI5ASqXBmfqJi9dZ3gxMx4lzw==", - "dev": true, - "dependencies": { - "undici-types": "~6.19.8" - } - }, "src/postgres": { "name": "@modelcontextprotocol/server-postgres", "version": "0.6.2", @@ -5597,15 +5535,6 @@ "typescript": "^5.3.3" } }, - "src/sequentialthinking/node_modules/@types/node": { - "version": "20.17.9", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.17.9.tgz", - "integrity": "sha512-0JOXkRyLanfGPE2QRCwgxhzlBAvaRdCNMcvbd7jFfpmD4eEXll7LRwy5ymJmyeZqk7Nh7eD2LeUyQ68BbndmXw==", - "dev": true, - "dependencies": { - "undici-types": "~6.19.2" - } - }, "src/slack": { "name": "@modelcontextprotocol/server-slack", "version": "0.6.2", @@ -5631,15 +5560,6 @@ "raw-body": "^3.0.0", "zod": "^3.23.8" } - }, - "src/slack/node_modules/@types/node": { - "version": "22.9.3", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.9.3.tgz", - "integrity": "sha512-F3u1fs/fce3FFk+DAxbxc78DF8x0cY09RRL8GnXLmkJ1jvx3TtPdWoTT5/NiYfI5ASqXBmfqJi9dZ3gxMx4lzw==", - "dev": true, - "dependencies": { - "undici-types": "~6.19.8" - } } } -} \ No newline at end of file +} From 31e80adaa8777d77aec02167905d94b447f32a34 Mon Sep 17 00:00:00 2001 From: Frank Fiegel <108313943+punkpeye@users.noreply.github.com> Date: Fri, 27 Dec 2024 13:23:16 -0600 Subject: [PATCH 34/58] Add a section about MCP frameworks --- README.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/README.md b/README.md index 499e3e41..02fffac0 100644 --- a/README.md +++ b/README.md @@ -109,6 +109,13 @@ A growing set of community-developed and maintained servers demonstrates various - **[Google Tasks](https://github.com/zcaceres/gtasks-mcp)** - Google Tasks API Model Context Protocol Server. - **[Fetch](https://github.com/zcaceres/fetch-mcp)** - A server that flexibly fetches HTML, JSON, Markdown, or plaintext +## πŸ“š Frameworks + +These are high-level frameworks that make it easier to build MCP servers. + +* [FastMCP](https://github.com/jlowin/fastmcp) (Python) +* [FastMCP](https://github.com/punkpeye/fastmcp) (TypeScript) + ## πŸ“š Resources Additional resources on MCP. From 5855eb228e639d76b27f2014e71cf1a18288905c Mon Sep 17 00:00:00 2001 From: Thomas Payet Date: Sat, 28 Dec 2024 16:21:43 +0100 Subject: [PATCH 35/58] Update README.md with Meilisearch (Search API) MCP server --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 499e3e41..1ea4ddab 100644 --- a/README.md +++ b/README.md @@ -51,6 +51,7 @@ Official integrations are maintained by companies building production ready MCP - [Search1API](https://github.com/fatwang2/search1api-mcp) - One API for Search, Crawling, and Sitemaps - **[Qdrant](https://github.com/qdrant/mcp-server-qdrant/)** - Implement semantic memory layer on top of the Qdrant vector search engine - **[Metoro](https://github.com/metoro-io/metoro-mcp-server)** - Query and interact with kubernetes environments monitored by Metoro +- Meilisearch Logo **[Meilisearch](https://github.com/meilisearch/meilisearch-mcp)** - Interact & query with Meilisearch (Full-text & semantic search API) ### 🌎 Community Servers From acc41a0a987301c25b2a5857a241f8ba1d03fcf7 Mon Sep 17 00:00:00 2001 From: Michael DeMarco Date: Sun, 29 Dec 2024 19:27:00 +0000 Subject: [PATCH 36/58] Fixed typo in README.md for git server --- src/git/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/git/README.md b/src/git/README.md index cb22629e..f0855695 100644 --- a/src/git/README.md +++ b/src/git/README.md @@ -213,7 +213,7 @@ If you are doing local development, there are two ways to test your changes: ```json { "mcpServers": { - "brave-search": { + "git": { "command": "docker", "args": [ "run", From fcbf58069d1251939a49c05597abd6df730dcdbf Mon Sep 17 00:00:00 2001 From: shiruixing <2946193417@qq.com> Date: Mon, 30 Dec 2024 19:44:59 +0800 Subject: [PATCH 37/58] fix: Fix the readme of github server --- src/github/README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/github/README.md b/src/github/README.md index 14bab491..d2277ab0 100644 --- a/src/github/README.md +++ b/src/github/README.md @@ -257,10 +257,10 @@ To use this with Claude Desktop, add the following to your `claude_desktop_confi "args": [ "-y", "@modelcontextprotocol/server-github" - ] - }, - "env": { - "GITHUB_PERSONAL_ACCESS_TOKEN": "" + ], + "env": { + "GITHUB_PERSONAL_ACCESS_TOKEN": "" + } } } } From 5856c3b9f28220e2744053be7a2c9d1a6a863639 Mon Sep 17 00:00:00 2001 From: privetin <81558906+privetin@users.noreply.github.com> Date: Tue, 31 Dec 2024 22:56:25 +0900 Subject: [PATCH 38/58] chroma: Add Chroma vector database --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 499e3e41..a341d7d2 100644 --- a/README.md +++ b/README.md @@ -108,6 +108,7 @@ A growing set of community-developed and maintained servers demonstrates various - **[Atlassian](https://github.com/sooperset/mcp-atlassian)** - Interact with Atlassian Cloud products (Confluence and Jira) including searching/reading Confluence spaces/pages, accessing Jira issues, and project metadata. - **[Google Tasks](https://github.com/zcaceres/gtasks-mcp)** - Google Tasks API Model Context Protocol Server. - **[Fetch](https://github.com/zcaceres/fetch-mcp)** - A server that flexibly fetches HTML, JSON, Markdown, or plaintext +- **[Chroma](https://github.com/privetin/chroma)** - Vector database server for semantic document search and metadata filtering, built on Chroma ## πŸ“š Resources From d48d1d5f6e09526d3ff2a08b87cf428352b95e78 Mon Sep 17 00:00:00 2001 From: Tonny Ouma Date: Tue, 31 Dec 2024 18:45:31 +0000 Subject: [PATCH 39/58] Add Offial sample AWS S3 MCP server --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 499e3e41..bd47c975 100644 --- a/README.md +++ b/README.md @@ -108,6 +108,7 @@ A growing set of community-developed and maintained servers demonstrates various - **[Atlassian](https://github.com/sooperset/mcp-atlassian)** - Interact with Atlassian Cloud products (Confluence and Jira) including searching/reading Confluence spaces/pages, accessing Jira issues, and project metadata. - **[Google Tasks](https://github.com/zcaceres/gtasks-mcp)** - Google Tasks API Model Context Protocol Server. - **[Fetch](https://github.com/zcaceres/fetch-mcp)** - A server that flexibly fetches HTML, JSON, Markdown, or plaintext +- **[AWS S3](https://github.com/aws-samples/sample-mcp-server-s3)** - A sample MCP server for AWS S3 that flexibly fetches objects from S3 such as PDF documents ## πŸ“š Resources From d8ce2e29f4d426ade454c8004e0def0b9d15e60e Mon Sep 17 00:00:00 2001 From: Aditya Karnam Date: Tue, 31 Dec 2024 23:41:18 -0600 Subject: [PATCH 40/58] Add Scholarly MCP Server --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 499e3e41..471406aa 100644 --- a/README.md +++ b/README.md @@ -108,6 +108,7 @@ A growing set of community-developed and maintained servers demonstrates various - **[Atlassian](https://github.com/sooperset/mcp-atlassian)** - Interact with Atlassian Cloud products (Confluence and Jira) including searching/reading Confluence spaces/pages, accessing Jira issues, and project metadata. - **[Google Tasks](https://github.com/zcaceres/gtasks-mcp)** - Google Tasks API Model Context Protocol Server. - **[Fetch](https://github.com/zcaceres/fetch-mcp)** - A server that flexibly fetches HTML, JSON, Markdown, or plaintext + **[Scholarly](https://github.com/adityak74/mcp-scholarly)** - A MCP server to search for scholarly and academic articles. ## πŸ“š Resources From 0a05e1085d9a3ba7bd8b42b99ceade02704c5865 Mon Sep 17 00:00:00 2001 From: Yuta Miyama Date: Wed, 1 Jan 2025 16:22:57 +0900 Subject: [PATCH 41/58] Update mcp/git README.md --- src/git/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/git/README.md b/src/git/README.md index cb22629e..f0855695 100644 --- a/src/git/README.md +++ b/src/git/README.md @@ -213,7 +213,7 @@ If you are doing local development, there are two ways to test your changes: ```json { "mcpServers": { - "brave-search": { + "git": { "command": "docker", "args": [ "run", From ce727603029e1e3e7f515287551b60c09c98c699 Mon Sep 17 00:00:00 2001 From: yangdx Date: Thu, 2 Jan 2025 16:51:23 +0800 Subject: [PATCH 42/58] Fix webpage content pagination logic error MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Improve truncated content handling. Fix empty content return logic β€’ --- src/fetch/src/mcp_server_fetch/server.py | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/src/fetch/src/mcp_server_fetch/server.py b/src/fetch/src/mcp_server_fetch/server.py index 6e831ff6..ef029a49 100644 --- a/src/fetch/src/mcp_server_fetch/server.py +++ b/src/fetch/src/mcp_server_fetch/server.py @@ -233,9 +233,21 @@ Although originally you did not have internet access, and were advised to refuse content, prefix = await fetch_url( url, user_agent_autonomous, force_raw=args.raw ) - if len(content) > args.max_length: - content = content[args.start_index : args.start_index + args.max_length] - content += f"\n\nContent truncated. Call the fetch tool with a start_index of {args.start_index + args.max_length} to get more content." + original_length = len(content) + if args.start_index >= original_length: + content = "No more content available." + else: + truncated_content = content[args.start_index : args.start_index + args.max_length] + if not truncated_content: + content = "No more content available." + else: + content = truncated_content + actual_content_length = len(truncated_content) + remaining_content = original_length - (args.start_index + actual_content_length) + # Only add the prompt to continue fetching if there is still remaining content + if actual_content_length == args.max_length and remaining_content > 0: + next_start = args.start_index + actual_content_length + content += f"\n\nContent truncated. Call the fetch tool with a start_index of {next_start} to get more content." return [TextContent(type="text", text=f"{prefix}Contents of {url}:\n{content}")] @server.get_prompt() From 385a9999361b30c22ccf6954dc3ac26581b50c35 Mon Sep 17 00:00:00 2001 From: Ironben Date: Thu, 2 Jan 2025 20:04:16 +0800 Subject: [PATCH 43/58] Add MCP Badges to Resources section --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 499e3e41..513b1571 100644 --- a/README.md +++ b/README.md @@ -125,6 +125,7 @@ Additional resources on MCP. - **[MCP X Community](https://x.com/i/communities/1861891349609603310)** – A X community for MCP by **[Xiaoyi](https://x.com/chxy)** - **[mcp-manager](https://github.com/zueai/mcp-manager)** - Simple Web UI to install and manage MCP servers for Claude Desktop by **[Zue](https://github.com/zueai)** - **[MCPHub](https://github.com/Jeamee/MCPHub-Desktop)** – An Open Source MacOS & Windows GUI Desktop app for discovering, installing and managing MCP servers by **[Jeamee](https://github.com/jeamee)** +- **[MCP Badges](https://github.com/mcpx-dev/mcp-badges)** – Quickly highlight your MCP project with clear, eye-catching badges, by **[Ironben](https://github.com/nanbingxyz)** ## πŸš€ Getting Started From 09680e048dc58558d6b8a3bc857351cccb02717b Mon Sep 17 00:00:00 2001 From: erdnax123 Date: Thu, 2 Jan 2025 12:40:16 -0300 Subject: [PATCH 44/58] fix docker build command --- src/sequentialthinking/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sequentialthinking/README.md b/src/sequentialthinking/README.md index 77ccb454..3914d8ea 100644 --- a/src/sequentialthinking/README.md +++ b/src/sequentialthinking/README.md @@ -83,7 +83,7 @@ Add this to your `claude_desktop_config.json`: Docker: ```bash -docker build -t mcp/sequentialthinking -f sequentialthinking/Dockerfile . +docker build -t mcp/sequentialthinking -f src/sequentialthinking/Dockerfile . ``` ## License From 99c8fd42f9c1adbdfe997ad3a85532c628fc371f Mon Sep 17 00:00:00 2001 From: Justin Spahr-Summers Date: Thu, 2 Jan 2025 16:45:26 +0000 Subject: [PATCH 45/58] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index ef6ed129..c53c4a65 100644 --- a/README.md +++ b/README.md @@ -95,7 +95,7 @@ A growing set of community-developed and maintained servers demonstrates various - **[RAG Web Browser](https://github.com/apify/mcp-server-rag-web-browser)** An MCP server for Apify's RAG Web Browser Actor to perform web searches, scrape URLs, and return content in Markdown. - **[XMind](https://github.com/apeyroux/mcp-xmind)** - Read and search through your XMind directory containing XMind files. - **[oatpp-mcp](https://github.com/oatpp/oatpp-mcp)** - C++ MCP integration for Oat++. Use [Oat++](https://oatpp.io) to build MCP servers. -- **[coin_api_mcp](https://github.com/longmans/coin_api_mcp)** - A MCP server that provides access to [coinmarketcap](https://coinmarketcap.com/) cryptocurrency data. +- **[coin_api_mcp](https://github.com/longmans/coin_api_mcp)** - Provides access to [coinmarketcap](https://coinmarketcap.com/) cryptocurrency data. - **[Contentful-mcp](https://github.com/ivo-toby/contentful-mcp)** - Read, update, delete, publish content in your [Contentful](https://contentful.com) space(s) from this MCP Server. - **[Home Assistant](https://github.com/tevonsb/homeassistant-mcp)** - Interact with [Home Assistant](https://www.home-assistant.io/) including viewing and controlling lights, switches, sensors, and all other Home Assistant entities. - **[cognee-mcp](https://github.com/topoteretes/cognee-mcp-server)** - GraphRAG memory server with customizable ingestion, data processing and search From 63cb22def6b4c2f4576fc8b7ab37c16c19b895a7 Mon Sep 17 00:00:00 2001 From: Luke Fan Date: Fri, 3 Jan 2025 18:09:18 +0800 Subject: [PATCH 46/58] Add Awesome crypto mcp servers --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 14a01e40..97cdab75 100644 --- a/README.md +++ b/README.md @@ -119,6 +119,7 @@ Additional resources on MCP. - **[Awesome MCP Servers by punkpeye](https://github.com/punkpeye/awesome-mcp-servers)** (**[website](https://glama.ai/mcp/servers)**) - A curated list of MCP servers by **[Frank Fiegel](https://github.com/punkpeye)** - **[Awesome MCP Servers by wong2](https://github.com/wong2/awesome-mcp-servers)** (**[website](https://mcpservers.org)**) - A curated list of MCP servers by **[wong2](https://github.com/wong2)** - **[Awesome MCP Servers by appcypher](https://github.com/appcypher/awesome-mcp-servers)** - A curated list of MCP servers by **[Stephen Akinyemi](https://github.com/appcypher)** +- **[Awesome Crypto MCP Servers by badkk](https://github.com/badkk/awesome-crypto-mcp-servers)** - A curated list of MCP servers by **[Luke Fan](https://github.com/badkk)** - **[Open-Sourced MCP Servers Directory](https://github.com/chatmcp/mcp-directory)** - A curated list of MCP servers by **[mcpso](https://mcp.so)** - **[Discord Server](https://glama.ai/mcp/discord)** – A community discord server dedicated to MCP by **[Frank Fiegel](https://github.com/punkpeye)** - **[Smithery](https://smithery.ai/)** - A registry of MCP servers to find the right tools for your LLM agents by **[Henry Mao](https://github.com/calclavia)** From 3b5363df3eb635375e7c14e63a6c720abee58a44 Mon Sep 17 00:00:00 2001 From: Aditya Karnam Date: Fri, 3 Jan 2025 14:47:05 -0600 Subject: [PATCH 47/58] fixed the list --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 471406aa..cb1414e8 100644 --- a/README.md +++ b/README.md @@ -108,7 +108,7 @@ A growing set of community-developed and maintained servers demonstrates various - **[Atlassian](https://github.com/sooperset/mcp-atlassian)** - Interact with Atlassian Cloud products (Confluence and Jira) including searching/reading Confluence spaces/pages, accessing Jira issues, and project metadata. - **[Google Tasks](https://github.com/zcaceres/gtasks-mcp)** - Google Tasks API Model Context Protocol Server. - **[Fetch](https://github.com/zcaceres/fetch-mcp)** - A server that flexibly fetches HTML, JSON, Markdown, or plaintext - **[Scholarly](https://github.com/adityak74/mcp-scholarly)** - A MCP server to search for scholarly and academic articles. +- **[Scholarly](https://github.com/adityak74/mcp-scholarly)** - A MCP server to search for scholarly and academic articles. ## πŸ“š Resources From f464f0dd6064b56a6ee63463dc2fae8ad1c7ff4a Mon Sep 17 00:00:00 2001 From: Rehan Date: Fri, 3 Jan 2025 18:32:22 -0500 Subject: [PATCH 48/58] Add Kagi MCP --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 14a01e40..a3737054 100644 --- a/README.md +++ b/README.md @@ -52,7 +52,7 @@ Official integrations are maintained by companies building production ready MCP - **[Qdrant](https://github.com/qdrant/mcp-server-qdrant/)** - Implement semantic memory layer on top of the Qdrant vector search engine - **[Metoro](https://github.com/metoro-io/metoro-mcp-server)** - Query and interact with kubernetes environments monitored by Metoro - Meilisearch Logo **[Meilisearch](https://github.com/meilisearch/meilisearch-mcp)** - Interact & query with Meilisearch (Full-text & semantic search API) - +- Kagi Logo **[Kagi Search](https://github.com/kagisearch/kagimcp)** - Search the web using Kagi's search API ### 🌎 Community Servers From 3260e77f7cd7d320a505b263228e5a1471b3205b Mon Sep 17 00:00:00 2001 From: Christoph Englisch <58257386+ChristophEnglisch@users.noreply.github.com> Date: Mon, 6 Jan 2025 17:02:47 +0100 Subject: [PATCH 49/58] Add Keycloak MCP Server to README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 14a01e40..9ed50098 100644 --- a/README.md +++ b/README.md @@ -110,6 +110,7 @@ A growing set of community-developed and maintained servers demonstrates various - **[Atlassian](https://github.com/sooperset/mcp-atlassian)** - Interact with Atlassian Cloud products (Confluence and Jira) including searching/reading Confluence spaces/pages, accessing Jira issues, and project metadata. - **[Google Tasks](https://github.com/zcaceres/gtasks-mcp)** - Google Tasks API Model Context Protocol Server. - **[Fetch](https://github.com/zcaceres/fetch-mcp)** - A server that flexibly fetches HTML, JSON, Markdown, or plaintext +- **[Keycloak MCP](https://github.com/ChristophEnglisch/keycloak-model-context-protocol)** - This MCP server enables natural language interaction with Keycloak for user and realm management including creating, deleting, and listing users and realms. ## πŸ“š Resources From 8837fcf1b356a4c345199e0c4ad19dc7b808fa30 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Till=20D=C3=B6hmen?= Date: Tue, 7 Jan 2025 14:45:20 +0100 Subject: [PATCH 50/58] Add MotherDuck and DuckDB MCP Server --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 14a01e40..d222d375 100644 --- a/README.md +++ b/README.md @@ -52,6 +52,7 @@ Official integrations are maintained by companies building production ready MCP - **[Qdrant](https://github.com/qdrant/mcp-server-qdrant/)** - Implement semantic memory layer on top of the Qdrant vector search engine - **[Metoro](https://github.com/metoro-io/metoro-mcp-server)** - Query and interact with kubernetes environments monitored by Metoro - Meilisearch Logo **[Meilisearch](https://github.com/meilisearch/meilisearch-mcp)** - Interact & query with Meilisearch (Full-text & semantic search API) +- MohterDuck Logo **[MotherDuck](https://github.com/motherduckdb/mcp-server-motherduck)** - Query and analyze data with MotherDuck and local DuckDB ### 🌎 Community Servers From 321ac6817f324918f4e65a24149d7a407fccfa49 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Till=20D=C3=B6hmen?= Date: Tue, 7 Jan 2025 15:01:19 +0100 Subject: [PATCH 51/58] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index d222d375..d23f64c7 100644 --- a/README.md +++ b/README.md @@ -52,7 +52,7 @@ Official integrations are maintained by companies building production ready MCP - **[Qdrant](https://github.com/qdrant/mcp-server-qdrant/)** - Implement semantic memory layer on top of the Qdrant vector search engine - **[Metoro](https://github.com/metoro-io/metoro-mcp-server)** - Query and interact with kubernetes environments monitored by Metoro - Meilisearch Logo **[Meilisearch](https://github.com/meilisearch/meilisearch-mcp)** - Interact & query with Meilisearch (Full-text & semantic search API) -- MohterDuck Logo **[MotherDuck](https://github.com/motherduckdb/mcp-server-motherduck)** - Query and analyze data with MotherDuck and local DuckDB +- MotherDuck Logo **[MotherDuck](https://github.com/motherduckdb/mcp-server-motherduck)** - Query and analyze data with MotherDuck and local DuckDB ### 🌎 Community Servers From 30de05c9b031c101ee87ea34b9296db18bda4005 Mon Sep 17 00:00:00 2001 From: Tadas Antanavicius Date: Tue, 7 Jan 2025 10:35:47 -0800 Subject: [PATCH 52/58] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index b14b48c9..b398792f 100644 --- a/README.md +++ b/README.md @@ -122,7 +122,7 @@ Additional resources on MCP. - **[Open-Sourced MCP Servers Directory](https://github.com/chatmcp/mcp-directory)** - A curated list of MCP servers by **[mcpso](https://mcp.so)** - **[Discord Server](https://glama.ai/mcp/discord)** – A community discord server dedicated to MCP by **[Frank Fiegel](https://github.com/punkpeye)** - **[Smithery](https://smithery.ai/)** - A registry of MCP servers to find the right tools for your LLM agents by **[Henry Mao](https://github.com/calclavia)** -- **[PulseMCP](https://www.pulsemcp.com)** ([API](https://www.pulsemcp.com/api)) - A comprehensive, human-reviewed index of MCP servers and clients by **[Tadas Antanavicius](https://github.com/tadasant)**, **[Mike Coughlin](https://github.com/macoughl)**, and **[Ravina Patel](https://github.com/ravinahp)** +- **[PulseMCP](https://www.pulsemcp.com)** ([API](https://www.pulsemcp.com/api)) - Community hub & weekly newsletter for discovering MCP servers, clients, articles, and news by **[Tadas Antanavicius](https://github.com/tadasant)**, **[Mike Coughlin](https://github.com/macoughl)**, and **[Ravina Patel](https://github.com/ravinahp)** - **[mcp-get](https://mcp-get.com)** - Command line tool for installing and managing MCP servers by **[Michael Latman](https://github.com/michaellatman)** - **[mcp-cli](https://github.com/wong2/mcp-cli)** - A CLI inspector for the Model Context Protocol by **[wong2](https://github.com/wong2)** - **[r/mcp](https://www.reddit.com/r/mcp)** – A Reddit community dedicated to MCP by **[Frank Fiegel](https://github.com/punkpeye)** From ff0a511a702d60ecb1bf217835d1b96f3cdc5b0d Mon Sep 17 00:00:00 2001 From: David Soria Parra <167242713+dsp-ant@users.noreply.github.com> Date: Tue, 7 Jan 2025 18:37:59 +0000 Subject: [PATCH 53/58] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index a7f9120c..5a30a67d 100644 --- a/README.md +++ b/README.md @@ -115,8 +115,8 @@ A growing set of community-developed and maintained servers demonstrates various These are high-level frameworks that make it easier to build MCP servers. -* [FastMCP](https://github.com/jlowin/fastmcp) (Python) * [FastMCP](https://github.com/punkpeye/fastmcp) (TypeScript) +* [EasyMCP](https://github.com/zcaceres/easy-mcp/) (TypeScript) ## πŸ“š Resources From 71005c2b3d3bf377c277d6ff4c2598ebe2c8e0a4 Mon Sep 17 00:00:00 2001 From: Scott <1350160+scorzeth@users.noreply.github.com> Date: Tue, 7 Jan 2025 16:24:42 -0800 Subject: [PATCH 54/58] Adding Anki MCP to README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 5a30a67d..d572f256 100644 --- a/README.md +++ b/README.md @@ -110,6 +110,7 @@ A growing set of community-developed and maintained servers demonstrates various - **[Atlassian](https://github.com/sooperset/mcp-atlassian)** - Interact with Atlassian Cloud products (Confluence and Jira) including searching/reading Confluence spaces/pages, accessing Jira issues, and project metadata. - **[Google Tasks](https://github.com/zcaceres/gtasks-mcp)** - Google Tasks API Model Context Protocol Server. - **[Fetch](https://github.com/zcaceres/fetch-mcp)** - A server that flexibly fetches HTML, JSON, Markdown, or plaintext +- **[Anki](https://github.com/scorzeth/anki-mcp-server)** - An MCP server for interacting with your [Anki](https://apps.ankiweb.net) decks and cards. ## πŸ“š Frameworks From 71303793576425e38f2ba35f7c713c36aaef7185 Mon Sep 17 00:00:00 2001 From: longyi1207 <59838570+longyi1207@users.noreply.github.com> Date: Tue, 7 Jan 2025 22:20:15 -0800 Subject: [PATCH 55/58] Update README --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 5a30a67d..6c503c7a 100644 --- a/README.md +++ b/README.md @@ -110,6 +110,7 @@ A growing set of community-developed and maintained servers demonstrates various - **[Atlassian](https://github.com/sooperset/mcp-atlassian)** - Interact with Atlassian Cloud products (Confluence and Jira) including searching/reading Confluence spaces/pages, accessing Jira issues, and project metadata. - **[Google Tasks](https://github.com/zcaceres/gtasks-mcp)** - Google Tasks API Model Context Protocol Server. - **[Fetch](https://github.com/zcaceres/fetch-mcp)** - A server that flexibly fetches HTML, JSON, Markdown, or plaintext +- **[Glean](https://github.com/longyi1207/glean-mcp-server)** - A server that uses Glean API to search and chat. ## πŸ“š Frameworks From b2a63858c03ba2c83829965d34935fcee2b79357 Mon Sep 17 00:00:00 2001 From: Felo Restrepo <44730261+felores@users.noreply.github.com> Date: Wed, 8 Jan 2025 09:06:00 -0500 Subject: [PATCH 56/58] Cloudinary community MCP server Upload images and videos to Cloudinary --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 5a30a67d..3a8d4362 100644 --- a/README.md +++ b/README.md @@ -110,6 +110,7 @@ A growing set of community-developed and maintained servers demonstrates various - **[Atlassian](https://github.com/sooperset/mcp-atlassian)** - Interact with Atlassian Cloud products (Confluence and Jira) including searching/reading Confluence spaces/pages, accessing Jira issues, and project metadata. - **[Google Tasks](https://github.com/zcaceres/gtasks-mcp)** - Google Tasks API Model Context Protocol Server. - **[Fetch](https://github.com/zcaceres/fetch-mcp)** - A server that flexibly fetches HTML, JSON, Markdown, or plaintext +- **[Cloudinary](https://github.com/felores/cloudinary-mcp-server)** - Cloudinary Model Context Protocol Server to upload media to Cloudinary and get back the media link and details. ## πŸ“š Frameworks From ae0197e37435f5cc448f410304c69b01a19ede6f Mon Sep 17 00:00:00 2001 From: TerminalMan <84923604+SecretiveShell@users.noreply.github.com> Date: Wed, 8 Jan 2025 20:12:43 +0000 Subject: [PATCH 57/58] fix sampling --- src/everything/everything.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/everything/everything.ts b/src/everything/everything.ts index e89dd192..84beb942 100644 --- a/src/everything/everything.ts +++ b/src/everything/everything.ts @@ -411,7 +411,7 @@ export const createServer = () => { maxTokens, ); return { - content: [{ type: "text", text: `LLM sampling result: ${result}` }], + content: [{ type: "text", text: `LLM sampling result: ${result.content.text}` }], }; } From eadddb3fd725e879dee87da83a37e64108120560 Mon Sep 17 00:00:00 2001 From: Se7en Date: Thu, 9 Jan 2025 17:30:00 +0800 Subject: [PATCH 58/58] add elasticsearch-mcp-server --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 7b815dea..960e24d3 100644 --- a/README.md +++ b/README.md @@ -111,6 +111,7 @@ A growing set of community-developed and maintained servers demonstrates various - **[Google Tasks](https://github.com/zcaceres/gtasks-mcp)** - Google Tasks API Model Context Protocol Server. - **[Fetch](https://github.com/zcaceres/fetch-mcp)** - A server that flexibly fetches HTML, JSON, Markdown, or plaintext - **[AWS S3](https://github.com/aws-samples/sample-mcp-server-s3)** - A sample MCP server for AWS S3 that flexibly fetches objects from S3 such as PDF documents +- **[Elasticsearch](https://github.com/cr7258/elasticsearch-mcp-server)** - MCP server implementation that provides Elasticsearch interaction. ## πŸ“š Frameworks