Skip to main content
Glama

News MCP Server

by gr3enarr0w
mcp-simple-bridge.sh6.53 kB
#!/bin/bash\n\n# News MCP Server Docker Bridge for Claude Code\n# Conversation-aware persistent container with intelligent caching\n\nset -e\n\n# Configuration\nIMAGE_NAME=\"gr3enarr0w/news-mcp-server:latest\"\nENV_FILE=\"$HOME/.news-mcp.env\"\nCONVERSATION_TIMEOUT=1800 # 30 minutes\nCACHE_DIR=\"$HOME/.news-mcp-cache\"\n\n# Generate conversation ID (based on session or timestamp)\nCONVERSATION_ID=${MCP_CONVERSATION_ID:-$(date +%s)}\nCONTAINER_NAME=\"news-mcp-conv-${CONVERSATION_ID}\"\nREDIS_CONTAINER=\"news-redis-conv-${CONVERSATION_ID}\"\n\n# Create cache directory\nmkdir -p \"$CACHE_DIR\"\n\n# Create default env file if it doesn't exist\nif [ ! -f \"$ENV_FILE\" ]; then\n cat > \"$ENV_FILE\" << 'EOF'\n# News MCP Server Environment Variables\n# At least one API key is recommended for full functionality\n\n# Guardian API (5,000 requests/day FREE)\n# Get from: https://open-platform.theguardian.com/access/\nGUARDIAN_API_KEY=\n\n# GNews API (100 requests/day FREE) \n# Get from: https://gnews.io/\nGNEWS_API_KEY=\n\n# TheNewsAPI (100 requests/day FREE)\n# Get from: https://www.thenewsapi.com/\nTHENEWSAPI_KEY=\n\n# CurrentsAPI (600 requests/month FREE)\n# Get from: https://currentsapi.services/\nCURRENTS_API_KEY=\n\n# MediaStack (100 requests/month FREE)\n# Get from: https://mediastack.com/\nMEDIASTACK_API_KEY=\n\n# System configuration\nNODE_ENV=production\nMCP_TRANSPORT=stdio\nREDIS_URL=redis://news-redis:6379\nCONVERSATION_ID=${CONVERSATION_ID}\nEOF\n echo \"Created default environment file: $ENV_FILE\"\n echo \"Please edit this file with your API keys for full functionality\"\nfi\n\n# Check if Docker is running\nif ! docker info >/dev/null 2>&1; then\n echo \"Error: Docker is not running. Please start Docker first.\"\n exit 1\nfi\n\n# Container management functions\ncleanup_conversation() {\n echo \"Cleaning up conversation containers...\"\n docker stop \"$REDIS_CONTAINER\" >/dev/null 2>&1 || true\n docker stop \"$CONTAINER_NAME\" >/dev/null 2>&1 || true\n docker rm \"$REDIS_CONTAINER\" >/dev/null 2>&1 || true \n docker rm \"$CONTAINER_NAME\" >/dev/null 2>&1 || true\n echo \"Conversation cleanup complete\"\n}\n\ncleanup_old_conversations() {\n # Clean up MCP containers older than timeout\n docker ps -a --filter \"name=news-mcp-conv-\" --format \"table {{.Names}}\\t{{.CreatedAt}}\" | \\\n while read name created; do\n if [ \"$name\" != \"NAMES\" ] && [ -n \"$name\" ]; then\n # Check if container is older than timeout (simplified)\n container_age=$(docker inspect --format='{{.State.StartedAt}}' \"$name\" 2>/dev/null | xargs -I {} date -d {} +%s 2>/dev/null || echo 0)\n current_time=$(date +%s)\n if [ $((current_time - container_age)) -gt $CONVERSATION_TIMEOUT ]; then\n echo \"Cleaning up old container: $name\"\n # Extract conversation ID from container name\n conv_id=$(echo \"$name\" | sed 's/news-mcp-conv-//')\n redis_container=\"news-redis-conv-${conv_id}\"\n \n # Stop and remove both containers\n docker stop \"$name\" >/dev/null 2>&1 || true\n docker stop \"$redis_container\" >/dev/null 2>&1 || true\n docker rm \"$name\" >/dev/null 2>&1 || true\n docker rm \"$redis_container\" >/dev/null 2>&1 || true\n \n # Remove associated cache volume\n docker volume rm \"news-cache-${conv_id}\" >/dev/null 2>&1 || true\n echo \"Cleaned up conversation: $conv_id\"\n fi\n fi\n done\n \n # Also clean up orphaned Redis containers\n docker ps -a --filter \"name=news-redis-conv-\" --format \"{{.Names}}\" | \\\n while read redis_name; do\n if [ -n \"$redis_name\" ]; then\n conv_id=$(echo \"$redis_name\" | sed 's/news-redis-conv-//')\n mcp_container=\"news-mcp-conv-${conv_id}\"\n \n # If MCP container doesn't exist, clean up Redis\n if ! docker ps -a --filter \"name=$mcp_container\" --format \"{{.Names}}\" | grep -q \"$mcp_container\"; then\n echo \"Cleaning up orphaned Redis container: $redis_name\"\n docker stop \"$redis_name\" >/dev/null 2>&1 || true\n docker rm \"$redis_name\" >/dev/null 2>&1 || true\n docker volume rm \"news-cache-${conv_id}\" >/dev/null 2>&1 || true\n fi\n fi\n done\n}\n\n# Set up cleanup trap\ntrap cleanup_conversation EXIT INT TERM\n\n# Clean up old conversations\ncleanup_old_conversations\n\n# Start Redis container if not running\nif ! docker ps --filter \"name=$REDIS_CONTAINER\" --format \"{{.Names}}\" | grep -q \"$REDIS_CONTAINER\"; then\n echo \"Starting Redis container for conversation: $CONVERSATION_ID\"\n docker run -d \\\n --name \"$REDIS_CONTAINER\" \\\n --memory=128m \\\n --cpus=0.2 \\\n -v \"news-cache-$CONVERSATION_ID:/data\" \\\n redis:7-alpine \\\n redis-server --maxmemory 128mb --maxmemory-policy allkeys-lru >/dev/null\nfi\n\n# Start or reuse MCP server container\nif docker ps --filter \"name=$CONTAINER_NAME\" --format \"{{.Names}}\" | grep -q \"$CONTAINER_NAME\"; then\n echo \"Reusing existing conversation container: $CONVERSATION_ID\"\n # Container exists and is running, just attach to it\n exec docker exec -i \"$CONTAINER_NAME\" node src/index.js\nelif docker ps -a --filter \"name=$CONTAINER_NAME\" --format \"{{.Names}}\" | grep -q \"$CONTAINER_NAME\"; then\n echo \"Restarting existing conversation container: $CONVERSATION_ID\"\n # Container exists but stopped, restart it\n docker start \"$CONTAINER_NAME\" >/dev/null\n exec docker exec -i \"$CONTAINER_NAME\" node src/index.js\nelse\n echo \"Creating new conversation container: $CONVERSATION_ID\"\n # Create new persistent container\n docker run -d \\\n --name \"$CONTAINER_NAME\" \\\n --memory=512m \\\n --cpus=1.0 \\\n --env-file \"$ENV_FILE\" \\\n --link \"$REDIS_CONTAINER:news-redis\" \\\n --security-opt no-new-privileges:true \\\n --read-only \\\n --tmpfs /tmp \\\n --tmpfs /var/tmp \\\n --tmpfs /app/cache:rw \\\n \"$IMAGE_NAME\" \\\n sleep 3600 # Keep container alive for conversation\n \n # Execute MCP server in the persistent container\n exec docker exec -i \"$CONTAINER_NAME\" node src/index.js\nfi"

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/gr3enarr0w/news-mcp-server'

If you have feedback or need assistance with the MCP directory API, please join our Discord server