Repository: zueai/mcp-manager Branch: main Commit: 0713b36f75aa Files: 33 Total size: 53.7 KB Directory structure: gitextract_oi45e3m7/ ├── .cursorrules ├── .gitignore ├── LICENSE ├── README.md ├── biome.json ├── bun.lockb ├── eslint.config.js ├── index.html ├── package.json ├── postcss.config.js ├── public/ │ └── robots.txt ├── src/ │ ├── App.tsx │ ├── components/ │ │ ├── applying-instructions.tsx │ │ ├── loading-instructions.tsx │ │ ├── mcp-server-card.tsx │ │ ├── mcp-servers.tsx │ │ ├── server-configs/ │ │ │ ├── env-config.tsx │ │ │ ├── filesystem-config.tsx │ │ │ ├── obsidian-config.tsx │ │ │ ├── postgres-config.tsx │ │ │ ├── sentry-config.tsx │ │ │ └── sqlite-config.tsx │ │ └── terminal-command.tsx │ ├── index.css │ ├── main.tsx │ ├── server-configs.ts │ ├── utils.ts │ └── vite-env.d.ts ├── tailwind.config.ts ├── tsconfig.app.json ├── tsconfig.json ├── tsconfig.node.json └── vite.config.ts ================================================ FILE CONTENTS ================================================ ================================================ FILE: .cursorrules ================================================ this is a simple react and vite project that allows users to manage a JSON file on their computer with a nice UI. the file path is " ~/Library/Application\ Support/Claude/claude_desktop_config.json" styling is done with tailwindcss and daisyui whenever possible never use "any" as a type always add the type=button property to buttons always use bun over npm for this project JSX elements without children should be marked as self-closing ================================================ FILE: .gitignore ================================================ # Logs logs *.log npm-debug.log* yarn-debug.log* yarn-error.log* pnpm-debug.log* lerna-debug.log* node_modules dist dist-electron dist-ssr *.local # Editor directories and files .vscode/* !.vscode/extensions.json .idea .DS_Store *.suo *.ntvs* *.njsproj *.sln *.sw? ================================================ FILE: LICENSE ================================================ MIT License Copyright (c) 2024 Zue AI Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ================================================ FILE: README.md ================================================

MCP Manager for Claude Desktop

A simple web GUI to manage Model Context Protocol (MCP) servers for the Claude Desktop app on MacOS easily. Just follow the instructions and paste a few commands to give your Claude app instant superpowers.

![MCP Manager for Claude Desktop](https://assets.zue.ai/mcp-manager-hero.png) ## What is MCP? The Model Context Protocol (MCP) enables Claude to access private data, APIs, and other services to answer questions and perform actions on your behalf. Learn more about MCP at: - [modelcontextprotocol.io](https://modelcontextprotocol.io) - [Anthropic's MCP Announcement](https://www.anthropic.com/news/model-context-protocol) ## Features - 🚀 Easy-to-use interface for managing MCP servers - 🔒 Runs entirely client-side - your data never leaves your computer - ⚡️ Quick setup for popular MCP servers: - Apple Notes - Access and search your Apple Notes - AWS Knowledge Base - Access and query AWS Knowledge Base for information retrieval - Brave Search - Search the web with Brave Search API - Browserbase - Let Claude explore the web with Browserbase - Cloudflare - Manage your Cloudflare workers and account resources - Everart - Interface with Everart API for digital art and design tools - Exa - Search the web with Exa - Filesystem - Access and manage local filesystem - GitHub - Access your GitHub repositories - GitLab - Manage GitLab repositories and resources - Google Drive - Access and search files in your Google Drive - Google Maps - Access Google Maps API for location services - Memory - Give Claude memory of previous conversations - Obsidian - Read and search files in your Obsidian vault - Perplexity - Search the web with Perplexity API - PostgreSQL - Connect and interact with PostgreSQL databases - Puppeteer - Automate browser interactions - Sequential Thinking - Enable step-by-step reasoning - Slack - Access your Slack workspace - SQLite - Manage SQLite databases - Todoist - Access and search your Todoist tasks - YouTube Transcript - Access and search YouTube transcripts - 🛠 Simple configuration of environment variables and server settings - 📋 One-click copying of terminal commands for installation ## Tech Stack - **Frontend Framework**: React 18 with TypeScript - **Build Tool**: Vite - **Styling**: - TailwindCSS for utility-first CSS - DaisyUI for component styling - Tiempos Font to match the Anthropic Design Language - **Package Manager**: Bun - **Deployment**: Cloudflare Pages for <60s build times ## Project Structure ```plaintext src/ ├── components/ # React components │ ├── server-configs/ # Server-specific configuration components │ └── ... ├── assets/ # Static assets and fonts ├── App.tsx # Main application component ├── server-configs.ts # MCP server configurations └── utils.ts # Utility functions ``` ## Development 1. Install dependencies: ```bash bun install ``` 2. Start the dev server: ```bash bun dev ``` 3. Build for production: ```bash bun run build ``` ## Contributing Contributions are extremely welcome! Please open a PR with new MCP servers or any other improvements to the codebase. PS. I wasnt able to get fetch, time, and sentry working, if you can help me out, that would be great! ## Disclaimer This project is not affiliated with Anthropic. All logos are trademarks of their respective owners. ## License MIT ---

zue logo zue logo

Contact us for custom AI automation solutions and product development.

================================================ FILE: biome.json ================================================ { "files": { "ignore": ["dist/**/*", "node_modules/**/*", "public/**/*", "**/*.css"] }, "linter": { "enabled": true, "rules": { "recommended": true, "suspicious": { "noArrayIndexKey": "off" } }, "ignore": ["**/*.md", "**/*.css"] }, "formatter": { "enabled": true, "indentStyle": "tab", "indentWidth": 4 }, "javascript": { "formatter": { "semicolons": "asNeeded", "trailingCommas": "none" } }, "json": { "parser": { "allowComments": true } } } ================================================ FILE: eslint.config.js ================================================ import js from "@eslint/js" import reactHooks from "eslint-plugin-react-hooks" import reactRefresh from "eslint-plugin-react-refresh" import globals from "globals" import tseslint from "typescript-eslint" export default tseslint.config( { ignores: ["dist"] }, { extends: [js.configs.recommended, ...tseslint.configs.recommended], files: ["**/*.{ts,tsx}"], languageOptions: { ecmaVersion: 2020, globals: globals.browser }, plugins: { "react-hooks": reactHooks, "react-refresh": reactRefresh }, rules: { ...reactHooks.configs.recommended.rules, "react-refresh/only-export-components": [ "warn", { allowConstantExport: true } ], "@typescript-eslint/no-unused-vars": "off" } } ) ================================================ FILE: index.html ================================================ MCP Manager for Claude Desktop
================================================ FILE: package.json ================================================ { "name": "mcp-manager", "private": true, "version": "0.0.0", "type": "module", "scripts": { "dev": "bun check && vite --port 7777", "build": "bun check && vite build", "lint": "eslint .", "preview": "vite preview", "check": "tsc --noEmit && biome check --write ." }, "dependencies": { "lucide-react": "^0.468.0", "react": "^18.3.1", "react-dom": "^18.3.1" }, "devDependencies": { "@biomejs/biome": "^1.9.4", "@eslint/js": "^9.15.0", "@types/node": "^22.10.1", "@types/react": "^18.3.12", "@types/react-dom": "^18.3.1", "@vitejs/plugin-react": "^4.3.4", "autoprefixer": "^10.4.20", "daisyui": "^4.12.14", "eslint": "^9.15.0", "eslint-plugin-react-hooks": "^5.0.0", "eslint-plugin-react-refresh": "^0.4.14", "globals": "^15.12.0", "postcss": "^8.4.49", "tailwindcss": "^3.4.16", "typescript": "~5.6.2", "typescript-eslint": "^8.15.0", "vite": "^6.0.1" } } ================================================ FILE: postcss.config.js ================================================ export default { plugins: { tailwindcss: {}, autoprefixer: {} } } ================================================ FILE: public/robots.txt ================================================ User-agent: * Allow: / ================================================ FILE: src/App.tsx ================================================ import { ApplyingInstructions } from "@/components/applying-instructions" import { LoadingInstructions } from "@/components/loading-instructions" import { MCPServers } from "@/components/mcp-servers" import { SERVER_CONFIGS } from "@/server-configs" import type React from "react" import { useState } from "react" function App() { const [jsonContent, setJsonContent] = useState<{ mcpServers: Record< string, { command: string; args: string[]; env?: Record } > }>({ mcpServers: {} }) const [uploadStatus, setUploadStatus] = useState< "idle" | "success" | "error" >("idle") const [isInstructionsOpen, setIsInstructionsOpen] = useState(true) const handleJsonInput = (e: React.ChangeEvent) => { try { const content = JSON.parse(e.target.value) setJsonContent(content) setUploadStatus("success") setIsInstructionsOpen(false) // Close accordion on successful upload } catch (error) { console.error("Error parsing JSON:", error) setUploadStatus("error") } } const handleServerAdd = (serverType: keyof typeof SERVER_CONFIGS) => { const serverConfig = SERVER_CONFIGS[serverType] // Ensure we only add servers with required properties const newServer = { command: serverConfig.command as string, args: serverConfig.args as string[], ...(serverConfig.env && { env: serverConfig.env }) } setJsonContent({ ...jsonContent, mcpServers: { ...jsonContent.mcpServers, [serverType]: newServer } }) } const handleServerRemove = (serverType: string) => { // Remove from mcpServers if present if (jsonContent.mcpServers[serverType]) { const { [serverType]: _, ...rest } = jsonContent.mcpServers setJsonContent({ ...jsonContent, mcpServers: rest }) } } return (
MCP Manager
Claude

MCP Manager for Claude Desktop

Give Claude access to private data, APIs, and other services using the Model Context Protocol so it can answer questions and perform actions on your behalf.{" "}

In a nutshell, MCP servers are like plugins that give Claude (the "client") prompts, resources, and tools to perform actions on your behalf. Read the{" "} MCP docs {" "} or check out{" "} Anthropic's announcement {" "} to learn more.

This is a simple, web-based GUI to help you install and manage MCP servers in your Claude App.
This runs client-side in your browser so your data will never leave your computer.
{Object.keys(jsonContent).length > 0 && uploadStatus === "success" && (
} > }} onUpdate={setJsonContent} onServerAdd={handleServerAdd} onServerRemove={handleServerRemove} /> {Object.keys(jsonContent.mcpServers).length > 0 && ( )}
)}
This project is not affiliated with Anthropic. All logos are trademarks of their respective owners.
) } export default App ================================================ FILE: src/components/applying-instructions.tsx ================================================ import { TerminalCommand } from "@/components/terminal-command" import { SERVER_CONFIGS } from "@/server-configs" import type { ServerConfig } from "@/server-configs" type RuntimeServerConfig = { command: string args: string[] env?: Record } type ApplyingInstructionsProps = { jsonContent: { mcpServers: Record cloudflare?: unknown } } export function ApplyingInstructions({ jsonContent }: ApplyingInstructionsProps) { const serversNeedingSetup = Object.keys(jsonContent.mcpServers).filter( (serverType) => SERVER_CONFIGS[serverType as keyof typeof SERVER_CONFIGS] ?.setupCommands ) // Helper function to modify the JSON content with absolute paths const getJsonWithAbsolutePaths = () => { const { cloudflare: _, ...modifiedContent } = jsonContent for (const [serverType, config] of Object.entries( modifiedContent.mcpServers )) { const serverConfig = SERVER_CONFIGS[serverType as keyof typeof SERVER_CONFIGS] if (serverConfig?.setupCommands) { // Update the args to use the shell variable expansion syntax config.args = config.args?.map((arg) => { if (arg.includes("index.js")) { switch (serverType) { case "exa": return "$HOME_DIR/mcp-servers/exa-mcp-server-main/build/index.js" case "browserbase": return "$HOME_DIR/mcp-servers/mcp-server-browserbase-main/browserbase/dist/index.js" default: return arg } } return arg }) } } return modifiedContent } return (

Apply your changes

Step 1: Install Node.js and uv by running these commands (if not already installed)

> ~/.zshrc && source ~/.zshrc && fnm use --install-if-missing 22 && node -v' } /> If the command above fails, install Node.js by downloading the installer from{" "} https://nodejs.org/en/download/prebuilt-installer

Step 2: Save your MCP servers to Claude by running:

"$HOME_DIR/Library/Application Support/Claude/claude_desktop_config.json"`} />
{serversNeedingSetup.length > 0 && (

Step 3: Some servers require additional setup. Run the following commands:

{serversNeedingSetup.map((serverType) => (

{serverType.charAt(0).toUpperCase() + serverType.slice(1)} :

))}
)}

Step {serversNeedingSetup.length > 0 ? "4" : "3"}: Restart Claude.app

) } ================================================ FILE: src/components/loading-instructions.tsx ================================================ import { TerminalCommand } from "@/components/terminal-command" import { Check, XCircle } from "lucide-react" import type { ChangeEvent } from "react" interface LoadingInstructionsProps { isOpen: boolean onOpenChange: (isOpen: boolean) => void onJsonInput: (e: ChangeEvent) => void uploadStatus: "idle" | "success" | "error" } export function LoadingInstructions({ isOpen, onOpenChange, onJsonInput, uploadStatus }: LoadingInstructionsProps) { const command = "test -f ~/Library/Application\\ Support/Claude/claude_desktop_config.json && pbcopy < ~/Library/Application\\ Support/Claude/claude_desktop_config.json || (echo '{\\n \"mcpServers\": {}\\n}' | tee ~/Library/Application\\ Support/Claude/claude_desktop_config.json | pbcopy)" return (
onOpenChange(e.target.checked)} aria-label="MacOS Instructions" />

MacOS Instructions

Step 1: Run this terminal command to copy your current MCP config to the clipboard.

If you've never used MCP before, this will create a blank config file and copy its contents.

Step 2: Paste your config below.