From caccb925e6899577c8e7485d272c1917633e3c98 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Szabolcs=20Gelencse=CC=81r?= Date: Thu, 10 Apr 2025 16:38:47 +0200 Subject: [PATCH 1/7] feat: adding Bitrise's official MCP server --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index a7962b4ec5..f59a0169ac 100644 --- a/README.md +++ b/README.md @@ -51,6 +51,7 @@ Official integrations are maintained by companies building production ready MCP - Axiom Logo **[Axiom](https://github.com/axiomhq/mcp-server-axiom)** - Query and analyze your Axiom logs, traces, and all other event data in natural language - Bankless Logo **[Bankless Onchain](https://github.com/bankless/onchain-mcp)** - Query Onchain data, like ERC20 tokens, transaction history, smart contract state. - BICScan Logo **[BICScan](https://github.com/ahnlabio/bicscan-mcp)** - Risk score / asset holdings of EVM blockchain address (EOA, CA, ENS) and even domain names. +- Bitrise Logo **[Bitrise](https://github.com/bitrise-io/bitrise-mcp)** - Chat with your builds, CI, and [more](https://bitrise.io/blog/post/chat-with-your-builds-ci-and-more-introducing-the-bitrise-mcp-server). - Box Logo **[Box](https://github.com/box-community/mcp-server-box)** - Interact with the Intelligent Content Management platform through Box AI. - Browserbase Logo **[Browserbase](https://github.com/browserbase/mcp-server-browserbase)** - Automate browser interactions in the cloud (e.g. web navigation, data extraction, form filling, and more) - **[Chargebee](https://github.com/chargebee/agentkit/tree/main/modelcontextprotocol)** - MCP Server that connects AI agents to [Chargebee platform](https://www.chargebee.com). From e5477c2bd438289a01293e850fbe1f6235308f0d Mon Sep 17 00:00:00 2001 From: olaservo Date: Mon, 14 Apr 2025 21:12:35 -0700 Subject: [PATCH 2/7] Standardize build and binary references --- src/redis/package.json | 8 +++--- src/redis/src/index.ts | 62 +++++++++++++++++++---------------------- src/redis/tsconfig.json | 3 +- 3 files changed, 34 insertions(+), 39 deletions(-) diff --git a/src/redis/package.json b/src/redis/package.json index 3315526514..e2fa50b150 100644 --- a/src/redis/package.json +++ b/src/redis/package.json @@ -1,6 +1,6 @@ { "name": "@modelcontextprotocol/server-redis", - "version": "0.1.0", + "version": "0.1.1", "description": "MCP server for using Redis", "license": "MIT", "author": "Anthropic, PBC (https://anthropic.com)", @@ -8,13 +8,13 @@ "bugs": "https://github.com/modelcontextprotocol/servers/issues", "type": "module", "bin": { - "redis": "./build/index.js" + "mcp-server-redis": "dist/index.js" }, "files": [ - "build" + "dist" ], "scripts": { - "build": "tsc && shx chmod +x build/*.js", + "build": "tsc && shx chmod +x dist/*.js", "prepare": "npm run build", "watch": "tsc --watch" }, diff --git a/src/redis/src/index.ts b/src/redis/src/index.ts index 27ce91fae8..c16d8d854f 100644 --- a/src/redis/src/index.ts +++ b/src/redis/src/index.ts @@ -1,3 +1,5 @@ +#!/usr/bin/env node + import { Server } from "@modelcontextprotocol/sdk/server/index.js"; import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js"; import { @@ -233,26 +235,25 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => { } }); -// Start the server -async function main() { - try { - // Set up Redis event handlers - redisClient.on('error', (err: Error) => { - console.error('Redis Client Error:', err); - }); +// Set up Redis event handlers +redisClient.on('error', (err: Error) => { + console.error('Redis Client Error:', err); +}); - redisClient.on('connect', () => { - console.error(`Connected to Redis at ${REDIS_URL}`); - }); +redisClient.on('connect', () => { + console.error(`Connected to Redis at ${REDIS_URL}`); +}); - redisClient.on('reconnecting', () => { - console.error('Attempting to reconnect to Redis...'); - }); +redisClient.on('reconnecting', () => { + console.error('Attempting to reconnect to Redis...'); +}); - redisClient.on('end', () => { - console.error('Redis connection closed'); - }); +redisClient.on('end', () => { + console.error('Redis connection closed'); +}); +async function runServer() { + try { // Connect to Redis await redisClient.connect(); @@ -261,26 +262,21 @@ async function main() { await server.connect(transport); console.error("Redis MCP Server running on stdio"); } catch (error) { - console.error("Error during startup:", error); - await cleanup(); + console.error("Fatal error running server:", error); + await redisClient.quit().catch(() => {}); + process.exit(1); } } -// Cleanup function -async function cleanup() { - try { - await redisClient.quit(); - } catch (error) { - console.error("Error during cleanup:", error); - } - process.exit(1); -} - // Handle process termination -process.on('SIGINT', cleanup); -process.on('SIGTERM', cleanup); +process.on('SIGINT', async () => { + await redisClient.quit().catch(() => {}); + process.exit(0); +}); -main().catch((error) => { - console.error("Fatal error in main():", error); - cleanup(); +process.on('SIGTERM', async () => { + await redisClient.quit().catch(() => {}); + process.exit(0); }); + +runServer(); diff --git a/src/redis/tsconfig.json b/src/redis/tsconfig.json index efcd96e7e1..e4d02eb531 100644 --- a/src/redis/tsconfig.json +++ b/src/redis/tsconfig.json @@ -3,7 +3,7 @@ "target": "ES2022", "module": "Node16", "moduleResolution": "Node16", - "outDir": "./build", + "outDir": "./dist", "rootDir": "./src", "strict": true, "esModuleInterop": true, @@ -13,4 +13,3 @@ "include": ["src/**/*"], "exclude": ["node_modules"] } - \ No newline at end of file From 73d826cdabcee326e8f6fdd026fa3e4526b4076f Mon Sep 17 00:00:00 2001 From: jifrozen0110 Date: Thu, 17 Apr 2025 13:42:34 +0900 Subject: [PATCH 3/7] Add Riot Games API MCP Server --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 5a631bacaa..a7407086b4 100644 --- a/README.md +++ b/README.md @@ -346,6 +346,7 @@ A growing set of community-developed and maintained servers demonstrates various - **[Replicate](https://github.com/deepfates/mcp-replicate)** - Search, run and manage machine learning models on Replicate through a simple tool-based interface. Browse models, create predictions, track their status, and handle generated images. - **[Rquest](https://github.com/xxxbrian/mcp-rquest)** - An MCP server providing realistic browser-like HTTP request capabilities with accurate TLS/JA3/JA4 fingerprints for bypassing anti-bot measures. - **[Rijksmuseum](https://github.com/r-huijts/rijksmuseum-mcp)** - Interface with the Rijksmuseum API to search artworks, retrieve artwork details, access image tiles, and explore user collections. +- **[Riot Games](https://github.com/jifrozen0110/mcp-riot)** - MCP server for League of Legends – fetch player info, ranks, champion stats, and match history via Riot API. - **[Salesforce MCP](https://github.com/smn2gnt/MCP-Salesforce)** - Interact with Salesforce Data and Metadata - **[Scholarly](https://github.com/adityak74/mcp-scholarly)** - A MCP server to search for scholarly and academic articles. - **[scrapling-fetch](https://github.com/cyberchitta/scrapling-fetch-mcp)** - Access text content from bot-protected websites. Fetches HTML/markdown from sites with anti-automation measures using Scrapling. From d3b61a612469d4b0d2e669aaea00f52e037402be Mon Sep 17 00:00:00 2001 From: olaservo Date: Thu, 17 Apr 2025 18:50:54 -0700 Subject: [PATCH 4/7] Update package-lock --- package-lock.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index d682159928..7bbb204d4b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5795,7 +5795,7 @@ }, "src/redis": { "name": "@modelcontextprotocol/server-redis", - "version": "0.1.0", + "version": "0.1.1", "license": "MIT", "dependencies": { "@modelcontextprotocol/sdk": "^1.7.0", @@ -5804,7 +5804,7 @@ "redis": "^4.7.0" }, "bin": { - "redis": "build/index.js" + "mcp-server-redis": "dist/index.js" }, "devDependencies": { "shx": "^0.3.4", From 743a9341f3b5c6671458d82dca184cfeedccdc2a Mon Sep 17 00:00:00 2001 From: olaservo Date: Thu, 17 Apr 2025 18:51:06 -0700 Subject: [PATCH 5/7] Update error logging --- src/redis/src/index.ts | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/src/redis/src/index.ts b/src/redis/src/index.ts index c16d8d854f..f3a21fb787 100644 --- a/src/redis/src/index.ts +++ b/src/redis/src/index.ts @@ -21,11 +21,14 @@ const redisClient = createClient({ socket: { reconnectStrategy: (retries) => { if (retries >= MAX_RETRIES) { - console.error(`Maximum retries (${MAX_RETRIES}) reached. Giving up.`); + console.error(`[Redis Error] Maximum retries (${MAX_RETRIES}) reached. Giving up.`); + console.error(`[Redis Error] Connection: ${REDIS_URL}`); return new Error('Max retries reached'); } const delay = Math.min(Math.pow(2, retries) * MIN_RETRY_DELAY, MAX_RETRY_DELAY); - console.error(`Reconnection attempt ${retries + 1}/${MAX_RETRIES} in ${delay}ms`); + console.error(`[Redis Retry] Attempt ${retries + 1}/${MAX_RETRIES} failed`); + console.error(`[Redis Retry] Next attempt in ${delay}ms`); + console.error(`[Redis Retry] Connection: ${REDIS_URL}`); return delay; } } @@ -237,19 +240,21 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => { // Set up Redis event handlers redisClient.on('error', (err: Error) => { - console.error('Redis Client Error:', err); + console.error(`[Redis Error] ${err.name}: ${err.message}`); + console.error(`[Redis Error] Connection: ${REDIS_URL}`); + console.error(`[Redis Error] Stack: ${err.stack}`); }); redisClient.on('connect', () => { - console.error(`Connected to Redis at ${REDIS_URL}`); + console.error(`[Redis Connected] Successfully connected to ${REDIS_URL}`); }); redisClient.on('reconnecting', () => { - console.error('Attempting to reconnect to Redis...'); + console.error('[Redis Reconnecting] Connection lost, attempting to reconnect...'); }); redisClient.on('end', () => { - console.error('Redis connection closed'); + console.error('[Redis Disconnected] Connection closed'); }); async function runServer() { @@ -262,7 +267,11 @@ async function runServer() { await server.connect(transport); console.error("Redis MCP Server running on stdio"); } catch (error) { - console.error("Fatal error running server:", error); + const err = error as Error; + console.error("[Redis Fatal] Server initialization failed"); + console.error(`[Redis Fatal] Error: ${err.name}: ${err.message}`); + console.error(`[Redis Fatal] Connection: ${REDIS_URL}`); + console.error(`[Redis Fatal] Stack: ${err.stack}`); await redisClient.quit().catch(() => {}); process.exit(1); } From 14bd265f9c8fb8689811da9c43b2723f4b0f5631 Mon Sep 17 00:00:00 2001 From: olaservo Date: Thu, 17 Apr 2025 18:51:21 -0700 Subject: [PATCH 6/7] Add more details on connection troubleshooting to Readme --- src/redis/README.md | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/src/redis/README.md b/src/redis/README.md index 992471dc5f..75b69e3b69 100644 --- a/src/redis/README.md +++ b/src/redis/README.md @@ -14,12 +14,18 @@ A Model Context Protocol server that provides access to Redis databases. This se ### Connection Errors **ECONNREFUSED** - - **Cause**: Redis server is not running or unreachable + - **Cause**: Redis/Memurai server is not running or unreachable - **Solution**: - - Verify Redis is running: `redis-cli ping` should return "PONG" - - Check Redis service status: `systemctl status redis` (Linux) or `brew services list` (macOS) + - Verify server is running: + - Redis: `redis-cli ping` should return "PONG" + - Memurai (Windows): `memurai-cli ping` should return "PONG" + - Check service status: + - Linux: `systemctl status redis` + - macOS: `brew services list` + - Windows: Check Memurai in Services (services.msc) - Ensure correct port (default 6379) is not blocked by firewall - Verify Redis URL format: `redis://hostname:port` + - If `redis://localhost:6379` fails with ECONNREFUSED, try using the explicit IP: `redis://127.0.0.1:6379` ### Server Behavior @@ -57,7 +63,7 @@ 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) -* Redis URL can be specified as an argument, defaults to "redis://localhost:6379" +* Redis URL can be specified as an argument, defaults to "redis://localhost:6379" (use "redis://127.0.0.1:6379" if localhost fails) ```json { @@ -69,7 +75,7 @@ To use this server with the Claude Desktop app, add the following configuration "-i", "--rm", "mcp/redis", - "redis://host.docker.internal:6379"] + "redis://host.docker.internal:6379"] // For macOS/Windows, or use "redis://127.0.0.1:6379" for direct connection } } } @@ -85,7 +91,7 @@ To use this server with the Claude Desktop app, add the following configuration "args": [ "-y", "@modelcontextprotocol/server-redis", - "redis://localhost:6379" + "redis://localhost:6379" // or "redis://127.0.0.1:6379" if localhost fails ] } } From 687a5ef5f6451ae6b69ba2da74ff8c8c411605a5 Mon Sep 17 00:00:00 2001 From: olaservo Date: Thu, 17 Apr 2025 19:06:27 -0700 Subject: [PATCH 7/7] Remove comments from JSON code blocks in readme to avoid invalid JSON copy/paste --- src/redis/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/redis/README.md b/src/redis/README.md index 75b69e3b69..48de29f86b 100644 --- a/src/redis/README.md +++ b/src/redis/README.md @@ -75,7 +75,7 @@ To use this server with the Claude Desktop app, add the following configuration "-i", "--rm", "mcp/redis", - "redis://host.docker.internal:6379"] // For macOS/Windows, or use "redis://127.0.0.1:6379" for direct connection + "redis://host.docker.internal:6379"] } } } @@ -91,7 +91,7 @@ To use this server with the Claude Desktop app, add the following configuration "args": [ "-y", "@modelcontextprotocol/server-redis", - "redis://localhost:6379" // or "redis://127.0.0.1:6379" if localhost fails + "redis://localhost:6379" ] } }