-
Notifications
You must be signed in to change notification settings - Fork 1
MCP Catalog
60 curated MCP (Model Context Protocol) servers across 10 categories. The catalog is a marketplace of cards — each card has its own Install/Remove button and a status pill, with inline token forms and live install progress.
/env-setup/mcp in the web UI.
| Category | Count | Notable |
|---|---|---|
| 🛠 Dev tools | 6 | filesystem ★, git ★, memory ★, sequential thinking, time, everything |
| 🌐 Git hosting | 5 | GitHub ★, GitLab, Gitea, Bitbucket, Azure DevOps |
| 🗄 Database | 8 | SQLite ★, Postgres, MySQL, MongoDB, Redis, Elasticsearch, Supabase, Firebase |
| 🔎 Search / web | 6 | Brave ★, Tavily, Perplexity, Firecrawl, Google Maps, Context7 ★ |
| 🖥 Browser | 2 | Playwright ★, Puppeteer |
| ✅ Productivity | 13 | Notion ★, Linear, Jira, Confluence, Slack, Discord, Trello, Asana, ClickUp, Airtable, Monday, Google Drive, Obsidian |
| ☁ Cloud | 6 | AWS KB, Cloudflare, Vercel, Heroku, Railway, Docker Hub |
| 📨 Communications | 5 | SendGrid, Twilio, Telegram, Stripe, Sentry |
| 📱 App publish (Experimental) | 4 | Google Play Publisher, App Store Connect, Fastlane, App Publish (Play + App Store) |
| 🧠 AI assist | 5 | OpenAI Bridge, YouTube Transcript, Wikipedia, ArXiv, Everart |
★ = recommended for first-time setup (9 entries).
-
VERIFIED — Anthropic-official
@modelcontextprotocol/*or a 1st-party vendor (Notion, Cloudflare, GitHub-via-Anthropic). Package name is stable. - COMMUNITY — Popular 3rd-party packages. Package names can change as the maintainer publishes new versions.
-
EXPERIMENTAL — Package name not yet finalized or install behavior
unverified. May fail; recommended to manually fine-tune
.mcp.jsonafter install.
Some MCPs require an interactive browser OAuth callback as part of
their first call (not just a key/token up front). vibe-coder runs MCP
servers as non-interactive child processes — there's no way for the
browser-callback step to happen inside that flow. These MCPs are listed in
the catalog with a ⏳ 준비중 badge, the checkbox is disabled, and the
server refuses install requests for them (400 coming_soon).
Currently affected:
-
Google Drive (
@modelcontextprotocol/server-gdrive) — Even after you upload the OAuth client JSON, the first call needs a user to open a browser, sign in, and approve scopes. There's no "Service Account" path for Drive in the standard MCP server.
Workarounds if you really need them today:
- Run the MCP server once on a desktop (
npx -y @modelcontextprotocol/server-gdrive) to complete the OAuth dance and produce a refresh-token file. - Copy that token file into the container (
docker cp) at the path the MCP server expects. - Register the MCP entry manually in
~/.claude/.mcp.json.
Otherwise wait for a future release that wraps the OAuth flow server-side.
Each catalog entry is a card with a status pill (Installed / Registered only / Not installed):
- Fill the inline token/URL fields on the card if it needs credentials (GitHub PAT, Slack Bot token, etc.). Required fields are marked with *.
- Click the card's Install (or Reinstall) button. Server runs
npm install -g <pkg>and registers it via the standard user scope (claude mcp add-json <name> '<json>' -s user→.claude.json'smcpServers). User scope (not${CLAUDE_CONFIG_DIR}/.mcp.json, which Claude Code does not read) so the server is recognized consistently by the console, sub-agents, the terminal, andclaude mcp list. - Live progress at
/env-setup/tasks/{taskId}(or via WS). - After install, the MCP is available in the next Claude turn (no need to restart the per-project child — Claude re-reads user scope per request).
- Installed/registered cards show a Remove button (see below).
Under the hood the same endpoints are used — each card posts a single-entry
select to POST /api/env-setup/mcp/install (or …/unregister).
The per-project MCP tab (/projects/{id}/mcp) shows a live status card at
the top: the MCP servers Claude actually recognizes in that project and their
connection state, parsed from claude mcp list run in the project cwd —
Connected (✓), Failed to connect (✗), Needs auth (!), Pending (⏸).
A ↻ refresh button re-runs the health check. It loads as a separate ajax
fragment (GET /projects/{id}/mcp/status) because the health check can take a
few seconds. Unlike the disk-parsed chip lists (which show "is it registered"),
this card shows "did Claude load it and connect".
Some MCP servers are native binaries, not npm packages. These are bundled into
the image (e.g. the official Gitea MCP gitea-mcp, a Go static binary
downloaded from gitea.com/gitea/gitea-mcp releases into /usr/local/bin).
For such entries Install skips npm install -g and only registers user
scope; "Installed" is judged by the binary being present on PATH. The catalog
pins the absolute command path (/usr/local/bin/gitea-mcp) to avoid any stale
PATH shadow. Config follows the official convention: GITEA_HOST (instance root
URL — not /api/v1) + GITEA_ACCESS_TOKEN (+ optional GITEA_INSECURE).
-
Unregister / Remove (
POST /api/env-setup/mcp/unregister): removes the entry from.mcp.jsononly. The npm package stays on disk; pressing the card's Install again brings it back instantly. -
Hard uninstall:
docker exec -it --user vibe vibe-coder-server npm uninstall -g <pkg>. Useful only to reclaim disk space.
Each MCP entry exposes zero or more config fields through
McpEntryDto.configFields[]. The schema is fixed — clients can render a
generic form by iterating these keys:
| Key | Type | Required | Default | Meaning |
|---|---|---|---|---|
key |
String | ✅ | — | Env var name stored verbatim in .mcp.json env block (e.g. GITHUB_PERSONAL_ACCESS_TOKEN). |
label |
String | ✅ | — | Human-readable form label. |
placeholder |
String? | — | null |
HTML placeholder for the input. |
isSecret |
Boolean | — | false |
Mask the value (password-style input). |
required |
Boolean | — | true |
Server 400 missing_config if empty at install time. |
help |
String? | — | null |
Tooltip / sub-label / one-line explanation. |
isFile |
Boolean | — | false |
Use the file-upload endpoint and pass back the returned path. |
acceptMime |
String? | — | null |
When isFile=true, value for <input accept="...">. |
There is intentionally no type, default, or description field.
- All values are transmitted as String on the wire.
- "Default" values are baked into
McpEntry.argsTemplateserver-side (e.g.--workspace-root /workspaceforfilesystem) and are not client-controllable. - The longer-form description belongs on the entry (
McpEntryDto.description), not on individual fields.
Generated by the catalog:
{
"mcpServers": {
"github": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-github"],
"env": {
"GITHUB_PERSONAL_ACCESS_TOKEN": "ghp_..."
}
},
"filesystem": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-filesystem", "/workspace"]
},
...
}
}You can hand-edit this file inside the container (docker exec -it --user vibe vibe-coder-server vi ~/.claude/.mcp.json) for entries the catalog
doesn't cover. Survives image upgrades.
Two ways:
docker exec -it --user vibe vibe-coder-server bash
npm install -g some-mcp-package
# Edit ~/.claude/.mcp.json to add the entryBoth paths (/home/vibe/.local + /home/vibe/.claude) are bind-mounted
so the install + registration survive image upgrades.
Add an entry to server/.../env/McpCatalog.kt. The 50-line snippet
includes id / package / category / trust tier / configFields. Send a PR.
Some MCPs authenticate with a key file instead of a token string:
| MCP | File format | Where to get it |
|---|---|---|
| Google Play Publisher |
.json (Service Account) |
Play Console → Setup → API access → Service accounts → Create key |
| App Store Connect | .p8 |
App Store Connect → Users and Access → Keys → Generate API Key |
| App Publish (Play + App Store) |
.json (Service Account) and/or .p8
|
Unified server (mikusnuz/app-publish-mcp) — fill only the platform(s) you use; both keys are optional |
| Firebase |
.json (Service Account) |
GCP Console → IAM → Service Accounts → Keys |
| Google Drive |
.json (OAuth client) |
GCP Console → APIs & Services → Credentials → OAuth client ID → Download |
- Check the box of the MCP that needs a file. The config block expands.
- The field shows a file picker (
<input type="file">), not a text input. - Pick the file. As soon as you select it, the browser uploads it via
POST /env-setup/mcp/{mcpId}/file/{fieldKey}(multipart) immediately — no separate "upload" button. - The server saves it to
/home/vibe/.config/mcp-secrets/<mcpId>-<fieldKey>.<ext>(0600 permissions, directory 0700) and returns the absolute path. - The path appears below the field. Clicking "Install selected" includes
the path in
.mcp.json'senvblock automatically — the MCP server reads it on first call.
-
128 KB max per file. Service Account JSON and
.p8keys are a few KB; a larger file is rejected as suspicious. - File extension is taken from the original filename (preferred) or
acceptMime. - Filename is sanitized (
[^A-Za-z0-9._-]→_) to prevent path traversal.
Simply pick a new file in the same field. The server atomic-moves it over
the old one (same <mcpId>-<fieldKey> slot).
If you'd rather drop the file in via docker cp:
docker cp ./play-sa.json vibe-coder-server:/home/vibe/.config/mcp-secrets/google-play-publisher-GOOGLE_PLAY_SERVICE_ACCOUNT_JSON.json
docker exec --user vibe vibe-coder-server chmod 600 /home/vibe/.config/mcp-secrets/google-play-publisher-GOOGLE_PLAY_SERVICE_ACCOUNT_JSON.jsonThen in the catalog UI, the existing path will show — no upload needed, just check the box and click Install.
For most users:
| ★ | What it does |
|---|---|
| filesystem | Read/write under the workspace |
| git | Git log/diff/status (read-only) |
| memory | Knowledge graph across sessions |
| sqlite | Query the SQLite under .vibecoder/ |
| context7 | Up-to-date library docs |
| GitHub | Issues/PRs/repo browsing (needs PAT) |
| Notion | Workspace pages (needs Integration token) |
| Brave Search | Web search (free API key) |
After this 9-pack, install Playwright or Puppeteer only if you actually need browser automation (~300 MB Chromium download).