Deploy
Deploy and manage MCP (Model Context Protocol) servers on Cloudflare Workers
Ask AI about Deploy
Powered by Claude Β· Grounded in docs
I know everything about Deploy. Ask me about installation, configuration, usage, or troubleshooting.
0/500
Reviews
Documentation
MCP Deploy
A Next.js dashboard for deploying and managing MCP (Model Context Protocol) servers on Cloudflare Workers.
Install
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 command
Then 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:3000
Or 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 health
npm package coming soon β Once published,
npm install -g mcp-deploywill replace the clone + link step.
Features
- 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
What it does
- 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
Managed MCPs
- Paper Search MCP β Search academic papers across Semantic Scholar, CrossRef, arXiv, PubMed, bioRxiv, medRxiv
- Zotero Assistant MCP β Manage your Zotero library with 20+ tools
Quick Start
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.,
MCP detail page β secrets, auth, connection info
Light mode
Settings β Cloudflare account, theme, app info
Connecting to Claude Desktop
- 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 mode
- 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.
CLI Usage
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
Architecture
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β 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 β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Build vs Deploy
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)
Deployment Flow
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
Tech Stack
- 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
Project Structure
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
Adding a New MCP
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.
External Dependencies
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).
Contributing
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.
Roadmap
- 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
Advanced
Development
npm run dev # Start dev server with hot reload (Turbopack)
Unlinking
To remove the global mcp-deploy command:
npm unlink -g mcp-deploy
Running Tests
npx vitest run # Run all tests
npm run lint # Run linter
npm run build # Production build
License
This project is licensed under the GNU General Public License v3.0 - see the LICENSE file for details.
