A Next.js dashboard for deploying and managing MCP (Model Context Protocol) servers on Cloudflare Workers.
Requires Node.js 20+ and a Cloudflare account (free tier works).
git clone https://github.com/upascal/mcp-deploy.git
cd mcp-deploy
npm install
npm link # Makes `mcp-deploy` available as a global commandThen log in to Cloudflare and start the web interface:
mcp-deploy login # Opens browser for Cloudflare OAuth
mcp-deploy gui # Start the web UI at http://localhost:3000Or use the CLI directly:
mcp-deploy add upascal/paper-search-mcp # Add an MCP from GitHub
mcp-deploy deploy paper-search-mcp # Deploy to Cloudflare Workers
mcp-deploy status paper-search-mcp # Check deployment healthnpm package coming soon — Once published,
npm install -g mcp-deploywill replace the clone + link step.
- One-Click Deployment — Deploy MCP servers to Cloudflare Workers with a single click
- Secure Secrets Management — AES-256-GCM encrypted storage for API keys and tokens
- Multiple Auth Modes — Choose between bearer tokens, OAuth, or open access
- GitHub Integration — Fetch MCP servers directly from GitHub releases
- CLI + Web Interface — Use the web dashboard or command-line tools
- No Always-On Server Required — MCPs run on Cloudflare's edge network
- Hot Secret Updates — Change API keys without redeploying
- Health Monitoring — Check deployment status and worker health
- Add MCP servers from GitHub releases
- Configure secrets (API keys, library IDs, etc.)
- Deploy to Cloudflare Workers with one click
- Choose authentication mode (bearer, OAuth, or open)
- Get connection URLs for Claude Desktop and other MCP clients
- Update secrets without redeploying
- Monitor health of deployed workers
- Paper Search MCP — Search academic papers across Semantic Scholar, CrossRef, arXiv, PubMed, bioRxiv, medRxiv
- Zotero Assistant MCP — Manage your Zotero library with 20+ tools
Open http://localhost:3000 after running mcp-deploy gui:
- Add an MCP -- Paste a GitHub repo URL (must have releases with
mcp-deploy.json+worker.mjs) - Configure -- Enter any required secrets (API keys, tokens)
- Deploy -- Click Deploy. You'll get back:
- MCP URL (e.g.,
https://your-mcp.yoursubdomain.workers.dev/mcp) - Bearer Token + MCP URL with Token (if you chose bearer auth)
- OAuth flow (if you chose OAuth auth)
- Open URL (if you chose open / no auth)
- MCP URL (e.g.,
- Deploy an MCP using the web interface
- In Claude Desktop: Settings > Connectors > Add custom connector
- Paste the URL for the auth mode you chose:
- Bearer: use the MCP URL with Token (e.g.,
https://your-mcp.workers.dev/mcp/t/{token}) - OAuth: use the MCP URL (you'll be prompted to authorize with a password)
- Open: use the MCP URL (no auth)
- Bearer: use the MCP URL with Token (e.g.,
- Click Connect -- done!
- OAuth runs inside each deployed MCP worker (no always-on mcp-deploy server required).
- If
OAUTH_PASSWORDis set, that value is used during authorization. - If not set, mcp-deploy will generate a password at deploy time and show it in the deploy result.
All commands (after npm link during install):
mcp-deploy gui [-p PORT] # Start the web interface (default: 3000)
mcp-deploy list # List deployed MCPs
mcp-deploy add <github-repo> # Add an MCP from GitHub
mcp-deploy remove <slug> # Remove an MCP
mcp-deploy deploy <slug> # Deploy an MCP
mcp-deploy status <slug> # Check MCP status
mcp-deploy secrets:list <slug> # List configured secret keys
mcp-deploy secrets:set <slug> <key> # Set a secret (prompts for value)
mcp-deploy secrets:delete <slug> <key> # Delete a secret
mcp-deploy login # Login to Cloudflare via wrangler┌─────────────────────────────────────────────────────────┐
│ MCP-Deploy Dashboard (Next.js) │
│ - React frontend with Tailwind CSS │
│ - API routes for deployment orchestration │
└─────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────┐
│ GitHub Releases │
│ - mcp-deploy.json (metadata) │
│ - worker.mjs (bundle) │
└─────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────┐
│ Cloudflare Workers (deployed via wrangler) │
│ - Each MCP runs as a Durable Object │
│ - Secrets stored securely on Cloudflare │
└─────────────────────────────────────────────────────────┘
Deploy time (user action via dashboard):
- Fetches
mcp-deploy.json+worker.mjsfrom a GitHub release - Uploads the worker via
npx wrangler deploy - Sets secrets (API keys, bearer token)
User clicks Deploy
↓
Load MCP from registry → Resolve GitHub release
↓
Fetch `worker.mjs` from GitHub
↓
Upload to Cloudflare via wrangler CLI
↓
Set secrets (API keys, config, bearer token)
↓
Store deployment record in local SQLite
↓
Return Claude Desktop config snippet
- Frontend: Next.js 16 App Router + Tailwind CSS
- Backend: Next.js API routes
- Storage: Local SQLite for deployment records + encrypted secrets
- Deployment: Cloudflare Workers via
wranglerCLI - Security: AES-256-GCM encryption for secrets at rest
src/
app/ # Pages + API routes
components/ # React components
lib/
mcp-registry.ts # Registry of managed MCPs
encryption.ts # AES-256-GCM for secrets at rest
db.ts # SQLite setup + migrations
store.ts # SQLite accessors
scripts/
bundle-workers.ts # (unused) local bundling utility
To add an MCP to mcp-deploy's registry:
-
Add to registry — In
src/lib/mcp-registry.ts:{ slug: "my-mcp", githubRepo: "owner/my-mcp", }
-
Add test connection (optional) — In
src/app/api/test-connection/route.ts
For MCP authors: If you're building an MCP server and want to make it compatible with mcp-deploy, see the MCP Release Guide for instructions on setting up your GitHub releases.
The worker bundles come from these repos (via GitHub releases):
| MCP | Source Repo |
|---|---|
| Paper Search | paper-search-mcp |
| Zotero Assistant | zotero-assistant-mcp |
These repos are required at deploy time for their release assets (mcp-deploy.json + worker.mjs).
We welcome contributions! Please see CONTRIBUTING.md for:
- Development setup instructions
- How to run tests
- Project structure overview
- Coding standards
- Pull request guidelines
To report bugs or request features, open an issue on GitHub.
For security vulnerabilities, please see SECURITY.md for responsible disclosure instructions.
- V1: Dashboard for managing 2 existing MCPs
- Add more MCPs as they're built
- Auto-analyze arbitrary MCP repos for Cloudflare compatibility
- AI-powered secret discovery from source code + README
- MCP-deploy-MCP (an MCP that helps deploy MCPs)
- Stats on deployed MCPs
npm run dev # Start dev server with hot reload (Turbopack)To remove the global mcp-deploy command:
npm unlink -g mcp-deploynpx vitest run # Run all tests
npm run lint # Run linter
npm run build # Production buildThis project is licensed under the GNU General Public License v3.0 - see the LICENSE file for details.



