Skip to main content
Glama

MCP Complete Implementation Guide

by saksham0712
chatgpt-proxy-demo.js•25.6 kB
const express = require('express'); require('dotenv').config(); const app = express(); // CORS for browser requests app.use((req, res, next) => { res.header('Access-Control-Allow-Origin', '*'); res.header('Access-Control-Allow-Headers', 'Origin, X-Requested-With, Content-Type, Accept'); res.header('Access-Control-Allow-Methods', 'GET, POST, OPTIONS'); if (req.method === 'OPTIONS') { res.sendStatus(200); } else { next(); } }); app.use(express.json()); // Demo chat endpoint that simulates ChatGPT using MCP tools app.post('/chat', async (req, res) => { try { console.log('šŸ“Ø Received chat request'); const { messages } = req.body; if (!messages || !Array.isArray(messages)) { return res.status(400).json({ error: 'Invalid messages format' }); } const lastMessage = messages[messages.length - 1]; const userMessage = lastMessage.content.toLowerCase(); // Enhanced AI-like response system let response = ''; let shouldUseTool = false; let toolName = ''; let toolArgs = {}; // 1. Handle calculations and math if (userMessage.includes('calculate') || userMessage.includes('math') || /\d+\s*[+\-*\/]\s*\d+/.test(userMessage)) { response = handleMathCalculation(userMessage); } // 2. Handle troubleshooting questions else if (userMessage.includes('troubleshoot') || userMessage.includes('problem') || userMessage.includes('error') || userMessage.includes('fix')) { response = handleTroubleshooting(userMessage); } // 3. Handle Linux questions else if (userMessage.includes('linux') || userMessage.includes('ubuntu') || userMessage.includes('bash') || userMessage.includes('chmod') || userMessage.includes('grep')) { response = handleLinuxQuestions(userMessage); } // 4. Handle Windows questions else if (userMessage.includes('windows') || userMessage.includes('cmd') || userMessage.includes('powershell') || userMessage.includes('registry')) { response = handleWindowsQuestions(userMessage); } // 5. Handle programming questions else if (userMessage.includes('code') || userMessage.includes('programming') || userMessage.includes('javascript') || userMessage.includes('python') || userMessage.includes('node')) { response = handleProgrammingQuestions(userMessage); } // 6. Handle network/connectivity issues else if (userMessage.includes('network') || userMessage.includes('internet') || userMessage.includes('connection') || userMessage.includes('ping')) { response = handleNetworkQuestions(userMessage); } // 7. MCP tool requests (existing functionality) else if (userMessage.includes('list') && (userMessage.includes('directory') || userMessage.includes('folder') || userMessage.includes('files'))) { shouldUseTool = true; toolName = 'list_directory'; toolArgs = { path: userMessage.includes('desktop') ? 'C:\\Users\\Saksham Verma\\Desktop' : 'C:\\Users\\Saksham Verma\\MCP' }; } else if (userMessage.includes('read') && userMessage.includes('file')) { shouldUseTool = true; toolName = 'read_file'; toolArgs = { path: 'C:\\Users\\Saksham Verma\\MCP\\README.md' }; } else if (userMessage.includes('system') && userMessage.includes('info')) { shouldUseTool = true; toolName = 'get_system_info'; toolArgs = {}; } else if (userMessage.includes('create') || userMessage.includes('write')) { shouldUseTool = true; toolName = 'write_file'; toolArgs = { path: 'C:\\Users\\Saksham Verma\\MCP\\demo-test.txt', content: 'This is a test file created by the demo ChatGPT+MCP integration!\n\nDateTime: ' + new Date().toISOString() }; } if (shouldUseTool) { console.log(`šŸ› ļø Executing tool: ${toolName}`, toolArgs); // Call the actual MCP tool const toolResult = await callMCPTool(toolName, toolArgs); console.log(`āœ… Tool ${toolName} completed:`, toolResult.success ? 'SUCCESS' : 'FAILED'); // Generate response based on tool result if (toolResult.success) { switch (toolName) { case 'list_directory': response = `I've listed the contents of ${toolArgs.path}:\n\n`; toolResult.listing.forEach(item => { const icon = item.type === 'directory' ? 'šŸ“' : 'šŸ“„'; response += `${icon} ${item.name}\n`; }); break; case 'read_file': response = `I've read the file ${toolArgs.path}. Here's the content:\n\n${toolResult.content}`; break; case 'get_system_info': response = `Here's your system information:\n\n`; Object.entries(toolResult.info).forEach(([key, value]) => { response += `• ${key.charAt(0).toUpperCase() + key.slice(1)}: ${value}\n`; }); break; case 'write_file': response = `I've successfully created the file ${toolArgs.path} with the requested content!`; break; default: response = `Tool ${toolName} executed successfully!`; } } else { response = `I encountered an error while using the ${toolName} tool: ${toolResult.error}`; } } else { // Generate a helpful response if (userMessage.includes('hello') || userMessage.includes('hi')) { response = `Hello! I'm a demo version of ChatGPT enhanced with MCP (Model Context Protocol) tools. I can help you with: šŸ“ File operations - try saying "list my MCP directory" or "read the README file" šŸ’» System information - try "get my system information" āœļø File creation - try "create a test file" What would you like me to help you with?`; } else if (userMessage.includes('help') || userMessage.includes('what can you do')) { response = `I'm a demo ChatGPT with MCP tools! Here's what I can do: šŸ”§ **Available MCP Tools:** • šŸ“ list_directory - Browse folders and see files • šŸ“„ read_file - Read the contents of any file • āœļø write_file - Create new files with content • šŸ’» get_system_info - Get information about your computer • 🌐 fetch_url - Download content from websites • ⚔ execute_command - Run system commands (with security) **Try these examples:** • "List the files in my MCP directory" • "Read my README.md file" • "Get my system information" • "Create a test file with some content" This is a **demo version** that works without OpenAI API calls!`; } else { response = `I understand you said: "${lastMessage.content}" As a demo ChatGPT with MCP tools, I can help you with file operations, system information, and more. Try asking me to: • List directory contents • Read files • Get system info • Create files What would you like me to do?`; } } res.json({ role: 'assistant', content: response }); } catch (error) { console.error('āŒ Chat error:', error.message); res.status(500).json({ error: error.message }); } }); // Enhanced AI Response Functions function handleMathCalculation(message) { try { // Extract and evaluate mathematical expressions const mathExpression = message.match(/[\d+\-*\/.()\s]+/g); if (mathExpression) { const expr = mathExpression[0].trim(); // Simple safe evaluation for basic math - only allow safe characters const safeExpr = expr.replace(/[^\d+\-*\/.()\s]/g, ''); if (safeExpr && /[\d]/.test(safeExpr)) { const result = Function('"use strict"; return (' + safeExpr + ')')(); return `šŸ”¢ **Calculation Result:**\n\nExpression: ${expr}\nResult: **${result}**\n\nI can help with various mathematical calculations including:\n• Basic arithmetic (+, -, *, /)\n• Percentages\n• Powers and roots\n• Unit conversions\n\nJust ask me to calculate anything!`; } } // Handle specific calculation requests if (message.includes('calculate')) { return `šŸ”¢ I'd be happy to help with calculations! Try asking me things like:\n• "Calculate 15 + 25 * 3"\n• "What's 20% of 150?"\n• "What is 2 * 2 * 2?"\n\nWhat would you like me to calculate?`; } } catch (error) { return `šŸ”¢ I'd be happy to help with calculations! Try asking me things like:\n• "Calculate 15 + 25 * 3"\n• "What's 20% of 150?"\n• "Convert 100 Fahrenheit to Celsius"\n\nWhat would you like me to calculate?`; } return `šŸ”¢ I can help with mathematical calculations! What would you like me to calculate?`; } function handleTroubleshooting(message) { if (message.includes('slow') || message.includes('performance')) { return `šŸ”§ **Performance Troubleshooting:**\n\n**Common causes of slow performance:**\n• High CPU/memory usage\n• Disk space running low\n• Too many startup programs\n• Malware/viruses\n• Outdated hardware/drivers\n\n**Quick fixes to try:**\n1. Restart your computer\n2. Check Task Manager for high CPU usage\n3. Clear temporary files\n4. Run disk cleanup\n5. Check available disk space\n6. Update system and drivers\n\n**MCP Tools I can use:**\n• Get system info to check resources\n• List directories to check disk usage\n• Execute system commands for diagnostics\n\nWant me to check your system info?`; } else if (message.includes('internet') || message.includes('wifi') || message.includes('network')) { return `🌐 **Network Troubleshooting:**\n\n**Step-by-step network diagnosis:**\n1. **Check physical connections** (cables, WiFi)\n2. **Restart network devices** (router, modem)\n3. **Check network settings**\n4. **Test connectivity**\n\n**Windows Network Commands:**\n\`\`\`\nipconfig /all # Check IP configuration\nping google.com # Test internet connectivity\nnslookup google.com # Test DNS resolution\nnetsh winsock reset # Reset network stack\n\`\`\`\n\n**Linux Network Commands:**\n\`\`\`\nifconfig # Check network interfaces\nping -c 4 google.com # Test connectivity\nnslookup google.com # Test DNS\nsudo systemctl restart NetworkManager\n\`\`\`\n\nWant me to run network diagnostics on your system?`; } else if (message.includes('boot') || message.includes('startup') || message.includes('won\'t start')) { return `šŸš€ **Boot/Startup Troubleshooting:**\n\n**Windows Boot Issues:**\n1. **Safe Mode:** Hold F8 or Shift+F8 during boot\n2. **System Restore:** Boot from recovery media\n3. **Check hardware:** RAM, hard drive, power\n4. **BIOS/UEFI:** Check boot order\n\n**Linux Boot Issues:**\n1. **GRUB rescue:** Use live USB to repair\n2. **Check file systems:** fsck command\n3. **Boot from live USB** for diagnosis\n\n**Common fixes:**\n• Check all cables and connections\n• Remove external USB devices\n• Test with minimal hardware\n• Check for overheating\n\nDescribe the exact symptoms you're seeing!`; } return `šŸ”§ **General Troubleshooting:**\n\nI can help troubleshoot various issues:\n• šŸ–„ļø Performance problems\n• 🌐 Network connectivity\n• šŸš€ Boot/startup issues\n• šŸ’» Software problems\n• ⚔ Hardware diagnostics\n\n**My approach:**\n1. Identify the problem\n2. Gather system information\n3. Provide step-by-step solutions\n4. Use MCP tools for diagnostics\n\nWhat specific issue are you experiencing?`; } function handleLinuxQuestions(message) { if (message.includes('permission') || message.includes('chmod')) { return `🐧 **Linux Permissions (chmod):**\n\n**Understanding permissions:**\n• r (read) = 4\n• w (write) = 2\n• x (execute) = 1\n\n**Common chmod examples:**\n\`\`\`bash\nchmod 755 file.sh # rwxr-xr-x (owner: all, others: read+execute)\nchmod 644 file.txt # rw-r--r-- (owner: read+write, others: read)\nchmod +x script.sh # Add execute permission\nchmod -w file.txt # Remove write permission\n\`\`\`\n\n**Directory permissions:**\n\`\`\`bash\nchmod 755 directory # Standard directory permissions\nchmod -R 755 dir/ # Recursive permission change\n\`\`\`\n\n**Check permissions:**\n\`\`\`bash\nls -la # List files with permissions\nls -ld directory/ # Check directory permissions\n\`\`\`\n\nNeed help with a specific permission issue?`; } else if (message.includes('grep') || message.includes('search')) { return `šŸ” **Linux grep (Text Search):**\n\n**Basic grep syntax:**\n\`\`\`bash\ngrep "pattern" file.txt\ngrep -i "pattern" file.txt # Case insensitive\ngrep -r "pattern" directory/ # Recursive search\ngrep -n "pattern" file.txt # Show line numbers\n\`\`\`\n\n**Advanced grep:**\n\`\`\`bash\ngrep -E "pattern1|pattern2" file.txt # Multiple patterns\ngrep -v "pattern" file.txt # Invert match (exclude)\ngrep -c "pattern" file.txt # Count matches\ngrep -A 3 -B 3 "pattern" file.txt # Show 3 lines before/after\n\`\`\`\n\n**Common combinations:**\n\`\`\`bash\nps aux | grep process_name # Find running processes\nls -la | grep ".txt" # Find .txt files\nhistory | grep "command" # Search command history\n\`\`\`\n\nWhat would you like to search for?`; } else if (message.includes('process') || message.includes('kill')) { return `⚔ **Linux Process Management:**\n\n**View processes:**\n\`\`\`bash\nps aux # All running processes\ntop # Real-time process viewer\nhtop # Better process viewer (if installed)\npgrep process_name # Find process by name\n\`\`\`\n\n**Kill processes:**\n\`\`\`bash\nkill PID # Terminate process (SIGTERM)\nkill -9 PID # Force kill (SIGKILL)\nkillall process # Kill all processes with name\npkill process # Kill process by name pattern\n\`\`\`\n\n**Background processes:**\n\`\`\`bash\ncommand & # Run in background\njobs # List background jobs\nfg %1 # Bring job to foreground\nbg %1 # Send job to background\nnohup command & # Run command that survives logout\n\`\`\`\n\nWhat process management task do you need help with?`; } return `🐧 **Linux Help Available:**\n\nI can help with various Linux topics:\n• šŸ“ File operations (ls, cp, mv, rm)\n• šŸ” Text processing (grep, sed, awk)\n• šŸ›”ļø Permissions (chmod, chown)\n• ⚔ Process management (ps, kill, top)\n• 🌐 Network tools (ping, wget, curl)\n• šŸ“¦ Package management (apt, yum, dnf)\n• šŸ”§ System administration\n\n**Example questions:**\n• "How do I change file permissions?"\n• "How to search for text in files?"\n• "How to kill a process?"\n\nWhat Linux topic can I help you with?`; } function handleWindowsQuestions(message) { if (message.includes('cmd') || message.includes('command')) { return `šŸ–„ļø **Windows Command Prompt:**\n\n**Essential CMD commands:**\n\`\`\`cmd\ndir # List directory contents\ncd directory # Change directory\ncopy file1 file2 # Copy files\nmove file1 file2 # Move/rename files\ndel filename # Delete file\nmkdir dirname # Create directory\n\`\`\`\n\n**System information:**\n\`\`\`cmd\nsysteminfo # Detailed system info\nipconfig /all # Network configuration\ntasklist # Running processes\ntaskkill /PID 1234 # Kill process by PID\n\`\`\`\n\n**Network commands:**\n\`\`\`cmd\nping google.com # Test connectivity\nnslookup domain.com # DNS lookup\nnetstat -an # Network connections\n\`\`\`\n\nNeed help with a specific command?`; } else if (message.includes('powershell') || message.includes('ps1')) { return `šŸ’™ **PowerShell Help:**\n\n**Basic PowerShell commands:**\n\`\`\`powershell\nGet-ChildItem # List files (like ls)\nSet-Location # Change directory\nCopy-Item # Copy files\nMove-Item # Move files\nRemove-Item # Delete files\n\`\`\`\n\n**System management:**\n\`\`\`powershell\nGet-Process # List processes\nStop-Process -Name # Kill process\nGet-Service # List services\nGet-ComputerInfo # System information\n\`\`\`\n\n**Advanced features:**\n\`\`\`powershell\nGet-Help command # Get help for commands\nGet-Command *word* # Find commands containing word\nGet-EventLog # View event logs\n\`\`\`\n\nWhat PowerShell task do you need help with?`; } else if (message.includes('registry') || message.includes('regedit')) { return `šŸ—ƒļø **Windows Registry:**\n\n**āš ļø CAUTION: Always backup registry before making changes!**\n\n**Registry structure:**\n• HKEY_CURRENT_USER (HKCU) - Current user settings\n• HKEY_LOCAL_MACHINE (HKLM) - System-wide settings\n• HKEY_CLASSES_ROOT (HKCR) - File associations\n\n**PowerShell registry commands:**\n\`\`\`powershell\nGet-ItemProperty -Path "HKLM:\\Software\\Key"\nSet-ItemProperty -Path "HKLM:\\Software\\Key" -Name "Value" -Value "Data"\nNew-Item -Path "HKLM:\\Software\\NewKey"\n\`\`\`\n\n**Common registry locations:**\n• Startup programs: HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Run\n• System info: HKLM\\Software\\Microsoft\\Windows NT\\CurrentVersion\n\n**Best practices:**\n1. Export registry key before changes\n2. Create system restore point\n3. Test changes carefully\n\nWhat registry task do you need help with?`; } return `🪟 **Windows Help Available:**\n\nI can help with Windows topics:\n• šŸ–„ļø Command Prompt (CMD)\n• šŸ’™ PowerShell\n• šŸ—ƒļø Registry editing\n• šŸ“ File management\n• 🌐 Network configuration\n• āš™ļø System administration\n• šŸ”§ Troubleshooting\n\n**Example questions:**\n• "How to use PowerShell to list files?"\n• "How to edit registry safely?"\n• "Windows network commands?"\n\nWhat Windows topic can I help you with?`; } function handleProgrammingQuestions(message) { if (message.includes('javascript') || message.includes('js') || message.includes('node')) { return `🟨 **JavaScript/Node.js Help:**\n\n**JavaScript basics:**\n\`\`\`javascript\n// Variables\nconst name = "value"; // Immutable\nlet count = 0; // Mutable\n\n// Functions\nfunction greet(name) {\n return \`Hello, \${name}!\`;\n}\n\n// Arrow functions\nconst add = (a, b) => a + b;\n\n// Async/await\nasync function fetchData() {\n const response = await fetch('url');\n return await response.json();\n}\n\`\`\`\n\n**Node.js essentials:**\n\`\`\`javascript\n// File system\nconst fs = require('fs');\nfs.readFile('file.txt', 'utf8', callback);\n\n// HTTP server\nconst http = require('http');\nconst server = http.createServer((req, res) => {\n res.writeHead(200, {'Content-Type': 'text/plain'});\n res.end('Hello World!');\n});\n\`\`\`\n\nWhat JavaScript concept do you need help with?`; } else if (message.includes('python') || message.includes('py')) { return `šŸ **Python Help:**\n\n**Python basics:**\n\`\`\`python\n# Variables and data types\nname = "Python"\nnumbers = [1, 2, 3, 4]\ndict_data = {"key": "value"}\n\n# Functions\ndef greet(name):\n return f"Hello, {name}!"\n\n# List comprehensions\nsquares = [x**2 for x in range(10)]\n\n# File handling\nwith open('file.txt', 'r') as f:\n content = f.read()\n\`\`\`\n\n**Common libraries:**\n\`\`\`python\n# HTTP requests\nimport requests\nresponse = requests.get('https://api.example.com')\n\n# JSON handling\nimport json\ndata = json.loads(json_string)\n\n# Date and time\nfrom datetime import datetime\nnow = datetime.now()\n\`\`\`\n\nWhat Python topic can I help you with?`; } return `šŸ‘Øā€šŸ’» **Programming Help Available:**\n\nI can help with various programming languages:\n• 🟨 JavaScript/Node.js\n• šŸ Python\n• 🌐 HTML/CSS\n• šŸ“Š SQL\n• šŸ”§ Shell scripting\n• šŸ› ļø Git/Version control\n\n**Topics I can help with:**\n• Syntax and best practices\n• Debugging common errors\n• Code optimization\n• Library recommendations\n• Architecture patterns\n\nWhat programming topic interests you?`; } function handleNetworkQuestions(message) { if (message.includes('ping') || message.includes('connectivity')) { return `🌐 **Network Connectivity Testing:**\n\n**Basic connectivity tests:**\n\`\`\`bash\n# Test internet connectivity\nping google.com\nping 8.8.8.8 # Google DNS\nping 1.1.1.1 # Cloudflare DNS\n\n# Test specific ports\ntelnet google.com 80\nnc -zv google.com 80 # Linux netcat\n\`\`\`\n\n**Windows specific:**\n\`\`\`cmd\nping -t google.com # Continuous ping\ntracert google.com # Trace route\nnslookup google.com # DNS lookup\nnetsh winsock reset # Reset network stack\n\`\`\`\n\n**Linux specific:**\n\`\`\`bash\nping -c 4 google.com # Ping 4 times\ntraceroute google.com # Trace route\ndig google.com # DNS lookup\nsudo systemctl restart NetworkManager\n\`\`\`\n\n**Troubleshooting steps:**\n1. Check physical connections\n2. Test local network (ping router)\n3. Test internet (ping 8.8.8.8)\n4. Test DNS (ping google.com)\n\nWhat network issue are you experiencing?`; } else if (message.includes('port') || message.includes('firewall')) { return `šŸ”„ **Firewall and Port Management:**\n\n**Check open ports:**\n\`\`\`bash\n# Linux\nnetstat -tulnp # All listening ports\nss -tulnp # Modern alternative\nnmap localhost # Scan local ports\n\n# Windows\nnetstat -an # All connections\nnetstat -ab # Show process names\n\`\`\`\n\n**Firewall management:**\n\`\`\`bash\n# Linux (ufw)\nsudo ufw status # Check firewall status\nsudo ufw allow 80 # Allow port 80\nsudo ufw deny 22 # Block port 22\n\n# Linux (iptables)\nsudo iptables -L # List rules\nsudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT\n\n# Windows\nnetsh advfirewall show allprofiles\nnetsh advfirewall firewall add rule name="Allow Port 80" dir=in action=allow protocol=TCP localport=80\n\`\`\`\n\n**Common ports:**\n• 22 - SSH\n• 80 - HTTP\n• 443 - HTTPS\n• 3389 - RDP\n• 21 - FTP\n\nWhat port or firewall issue do you need help with?`; } return `🌐 **Network Help Available:**\n\nI can help with network topics:\n• šŸ” Connectivity testing\n• šŸ”„ Firewall configuration\n• šŸ“” Port management\n• šŸŒ DNS troubleshooting\n• šŸ“Š Network monitoring\n• šŸ”’ VPN setup\n• šŸ›”ļø Security best practices\n\n**Common network commands:**\n• ping, traceroute, nslookup\n• netstat, ss, nmap\n• iptables, ufw (Linux)\n• netsh (Windows)\n\nWhat network topic can I help you with?`; } // Function to call MCP server tools directly async function callMCPTool(toolName, args) { const fs = require('fs').promises; const path = require('path'); const os = require('os'); const { exec } = require('child_process'); const { promisify } = require('util'); const execAsync = promisify(exec); try { switch (toolName) { case 'read_file': const content = await fs.readFile(args.path, 'utf-8'); return { success: true, content }; case 'write_file': await fs.writeFile(args.path, args.content, 'utf-8'); return { success: true, message: `Successfully wrote to ${args.path}` }; case 'list_directory': const items = await fs.readdir(args.path, { withFileTypes: true }); const listing = items.map(item => ({ name: item.name, type: item.isDirectory() ? 'directory' : 'file', path: path.join(args.path, item.name), })); return { success: true, listing }; case 'get_system_info': const info = { platform: os.platform(), arch: os.arch(), hostname: os.hostname(), cpus: os.cpus().length, totalMemory: Math.round(os.totalmem() / 1024 / 1024 / 1024) + ' GB', freeMemory: Math.round(os.freemem() / 1024 / 1024 / 1024) + ' GB', uptime: Math.round(os.uptime() / 3600) + ' hours', nodeVersion: process.version, currentDirectory: process.cwd(), }; return { success: true, info }; case 'execute_command': const { stdout, stderr } = await execAsync(args.command, { cwd: args.cwd || process.cwd() }); return { success: true, stdout, stderr, command: args.command }; case 'fetch_url': const fetch = require('node-fetch'); const response = await fetch(args.url, { method: args.method || 'GET', headers: args.headers || {}, }); const responseContent = await response.text(); return { success: true, status: response.status, statusText: response.statusText, headers: Object.fromEntries(response.headers), content: responseContent, }; default: throw new Error(`Unknown tool: ${toolName}`); } } catch (error) { return { success: false, error: error.message }; } } // Health check endpoint app.get('/health', (req, res) => { res.json({ status: 'healthy', timestamp: new Date().toISOString() }); }); const PORT = process.env.CHATGPT_PROXY_PORT || 3001; app.listen(PORT, () => { console.log(`šŸŽ­ ChatGPT Demo Proxy Server running on port ${PORT}`); console.log(`šŸ’” This is a DEMO version that works without OpenAI API calls`); console.log(`Health check: http://localhost:${PORT}/health`); console.log(`Chat interface: file://C:\\\\Users\\\\Saksham Verma\\\\MCP\\\\chatgpt-interface.html`); console.log(''); console.log('šŸ”§ Demo Features:'); console.log(' • File system operations'); console.log(' • System information'); console.log(' • Simulated AI responses'); console.log(' • All MCP tools working'); });

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/saksham0712/MCP'

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