Vytvořeno: 5.5.2026 | Aktualizováno: 10.05.2026 20:06
mcpc je open-source CLI klient pro Model Context Protocol, který vytvořil Apify. Tento článek pokrývá nejen co mcpc je, ale především jak ho prakticky nasadit jako centralizovaný hub pro MCP servery napříč AI nástroji (Claude Code, OpenCode), aby každý nový stroj šel nastavit za pár minut a aby byly tajnosti bezpečně izolované.
~/.config/mcpc/
├── mcp.json # všechny servery, secrets jako ${VAR}
├── secrets.env # API klíče (mode 0600)
└── README.md # lokální dokumentace
~/.bashrc # bash funkce mcpc() — subshell izolace tajností
~/.config/opencode/AGENTS.md # registr serverů + quick start (sdílen s ~/.claude/CLAUDE.md)
Volání mcpc @<session> tools-call … funguje out-of-the-box, klíče jsou viditelné jen uvnitř mcpc subshellu, AI agent nikdy klíče nevidí v shellu ani jiných procesech.
Klasické MCP klienty (Claude Code, OpenCode, Cursor) načtou při startu všechny definice nástrojů ze všech nakonfigurovaných MCP serverů do kontextu. To má dva praktické problémy:
mcpc řeší oboje:
mcpc @server tools-call … přes Bash() jen tehdy, když tool reálně potřebuje. Definice jsou na disku v configu, ne v kontextu.Apify projekt představil na Vibecoding Talks 20. 4. 2026 (Jan Curn) s tezí, že „CLI vs. MCP„ je falešná dichotomie — správně je MCP pro vzdálený standard + CLI jako lokální rozhraní agenta.
┌──────────────┐ Bash() ┌──────────┐ Unix socket ┌────────┐ MCP ┌────────────┐
│ AI agent │ ─────────────────▶ │ mcpc CLI │ ────────────────▶ │ bridge │ ────────▶ │ MCP server │
│ (CC/OpenCode)│ └──────────┘ └────────┘ └────────────┘
└──────────────┘ (perzistentní, (HTTP nebo lokální
1 na server) stdio child process)
@apify)
Bridge přežívá mezi voláními — žádný timeout po nečinnosti. Žije, dokud ho explicitně nezavřeš (mcpc @session close) nebo se nereboot stroj.
mcpc je distribuovaný jako npm balíček, ale globálně ho lze instalovat přes Bun bez sudo. Potřebuješ nainstalovaný Bun a jeho binární adresář v PATH.
bun install -g @apify/mcpc # Ověření mcpc --version which mcpc
mcpc ukládá tajnosti (OAuth tokeny, bearer tokeny) do OS keychainu přes Secret Service API. Na desktopu (GNOME, KDE) to funguje automaticky. Na headless systémech mcpc bezproblémově fallbackuje na file-based credential store v ~/.mcpc/credentials.json (mode 0600).
To znamená: na Dockeru/Alpine/CI server nemusíš instalovat libsecret ani gnome-keyring. Fallback je z bezpečnostního pohledu v izolovaném kontejneru ekvivalentní.
Pokud chceš plnohodnotný OS keychain i v headless (ne nutné):
# Ubuntu sudo apt install -y libsecret-1-0 gnome-keyring dbus # Alpine sudo apk add libsecret gnome-keyring dbus # Pak pouštět mcpc přes: dbus-run-session -- bash -c "echo -n 'pwd' | gnome-keyring-daemon --unlock && mcpc ..."
V drtivé většině případů to není potřeba.
Nyní k praktické části — jak nakonfigurovat mcpc tak, aby ho mohl AI agent využívat z více nástrojů, byly tajnosti izolované a přidávání nových serverů bylo triviální.
~/.config/mcpc/mcp.json) — nikoliv per-projekt~/.config/mcpc/secrets.env) — odděleně od configu, proto config může jít do gitu.bashrc — tajnosti se exportují jen do subshellu pro daný mcpc call, ne do interaktivního shelluAGENTS.md — krátká tabulka „kdo má co k dispozici“, aby AI věděla, co volat~/.config/mcpc/
├── README.md # lokální dokumentace tohoto setupu
├── mcp.json # konfigurace všech serverů, secrets jako ${VAR}
└── secrets.env # API klíče v KEY=VALUE formátu (mode 0600)
~/.bashrc # obsahuje funkci mcpc()
~/.config/opencode/AGENTS.md # registr serverů (pro AI)
~/.claude/CLAUDE.md → ~/.config/opencode/AGENTS.md # symlink, sdíleno
~/.mcpc/ # runtime state (sessions, sockety, logy) — nesahat
mkdir -p ~/.config/mcpc cat > ~/.config/mcpc/mcp.json <<'EOF' { "mcpServers": {} } EOF
touch ~/.config/mcpc/secrets.env chmod 600 ~/.config/mcpc/secrets.env
cat >> ~/.bashrc <<'EOF' # mcpc — load secrets only into mcpc subshell, not the interactive shell mcpc() { if [ -f "$HOME/.config/mcpc/secrets.env" ]; then ( set -a; . "$HOME/.config/mcpc/secrets.env"; set +a; command mcpc "$@" ) else command mcpc "$@" fi } EOF source ~/.bashrc type mcpc # mcpc is a function
Jak to funguje:
(…) vytvoří subshell s vlastním envset -a zařídí, že každá proměnná z následujícího sourcu se exportuje. secrets.env načte tajnosti — jen v subshellucommand mcpc „$@“ spustí reálný binární mcpc z /usr/local/bin/ (klíčové slovo command přeskočí naši funkci, aby nevznikla rekurze)Ověření izolace:
echo "$CONTEXT7_API_KEY" # prázdné — klíč není v interaktivním shellu mcpc @ctx tools-list # funguje — klíč se substituuje uvnitř subshellu echo "$CONTEXT7_API_KEY" # pořád prázdné
V Claude Code je globální konfigurace v ~/.claude/CLAUDE.md, v OpenCode v ~/.config/opencode/AGENTS.md. Pro sdílení:
mkdir -p ~/.claude ln -s ~/.config/opencode/AGENTS.md ~/.claude/CLAUDE.md
(Pokud ~/.claude/CLAUDE.md už existuje, prvně si ho zazálohuj a pak nahraď symlinkem.)
Do ~/.config/opencode/AGENTS.md přidej tuto sekci (na konec):
# MCP servery přes mcpc
MCP servery se nepřipojují nativně v Claude Code/OpenCode (úspora kontextu) — místo toho se on-demand spouští přes CLI `mcpc`. Hub config: `~/.config/mcpc/mcp.json`. Pro detaily použití mcpc (sessions, OAuth, troubleshooting) je k dispozici skill `mcpc` — načti přes Skill tool.
## Dostupné servery
| Entry | Session | Popis | Pozn. |
|---|---|---|---|
| (přidávej řádky podle reálně nakonfigurovaných serverů) | | | |
## Quick start (platí pro libovolný entry z tabulky)
```bash
HUB=~/.config/mcpc/mcp.json
mcpc connect $HUB:<entry> @<session> # idempotentní; cold-start ~10–30 s, jinak instant
mcpc @<session> tools-list # přehled toolů
mcpc @<session> tools-get <tool> # plné schéma jednoho toolu
mcpc @<session> tools-call <tool> arg:=value # zavolat tool
mcpc --json @<session> tools-call <tool> ... # JSON výstup pro pipeline
```
**Sessions jsou warm pool — nezavírej je po dokončení úkolu.** Drží se v paměti záměrně kvůli rychlosti dalších volání. `mcpc @<session> close` volej jen na explicitní pokyn uživatele.
**Servery s API klíčem:** hodnota patří do `~/.config/mcpc/secrets.env` (formát `KEY=VALUE`), v `mcp.json` se referencuje jako `${KEY}`.
Tři varianty podle typu serveru.
1. Přidej klíč do secrets.env:
echo 'CONTEXT7_API_KEY=ctx7sk-...' >> ~/.config/mcpc/secrets.env
(Žádné mezery kolem =, žádný export.)
2. Přidej entry do mcp.json:
"context7": {
"url": "https://mcp.context7.com/mcp",
"headers": {
"CONTEXT7_API_KEY": "${CONTEXT7_API_KEY}"
}
}
Některé servery chtějí standardní Authorization: Bearer …:
"apify": {
"url": "https://mcp.apify.com",
"headers": {
"Authorization": "Bearer ${APIFY_TOKEN}"
}
}
mcpc umí libovolný název headeru.
3. Otestuj:
mcpc connect ~/.config/mcpc/mcp.json:context7 @ctx mcpc @ctx tools-list
4. Aktualizuj tabulku v AGENTS.md:
| `context7` | `@ctx` | Aktuální dokumentace knihoven, frameworků, SDK. | — |
1. Entry v mcp.json:
"playwright": {
"command": "npx",
"args": [
"@playwright/mcp@latest",
"--isolated",
"--headless",
"--browser", "chrome"
],
"env": {
"PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD": "1"
}
}
Pozor: stdio podproces dědí z prostředí jen whitelist (PATH, HOME, SHELL, …). Cokoliv jiného (HTTPS_PROXY, NODE_EXTRA_CA_CERTS, vlastní API klíč) musí být explicitně v env bloku, případně přes ${VAR} reference na shell proměnnou (která může pocházet ze secrets.env).
2. Otestuj a aktualizuj AGENTS.md (stejně jako varianta A).
1. Entry s jen url:
"my-public": { "url": "https://public.example.com/mcp" }
2. Otestuj a aktualizuj AGENTS.md.
# Přehled aktivních sessions a OAuth profilů mcpc # Připojit (idempotentní — když session už existuje, jen potvrdí) mcpc connect ~/.config/mcpc/mcp.json:<entry> @<alias> # Detail serveru, capabilities, instructions, tooly mcpc @<alias> # Seznam toolů mcpc @<alias> tools-list # názvy + krátké popisy mcpc @<alias> tools-list --full # plné schéma všech toolů # Plné schéma jednoho toolu mcpc @<alias> tools-get <tool-name> # Zavolat tool mcpc @<alias> tools-call <tool-name> arg:=value # Hledání napříč sessions mcpc grep "search" # Interaktivní shell mcpc @<alias> shell # Restart bridge (ztratí state, ale obnoví spojení) mcpc @<alias> restart # Zavřít session (uvolní paměť) mcpc @<alias> close # Úklid (live sessions zachová, smaže staré logy a zombie sockety) mcpc clean # Nuclear option — všechno mcpc clean all
# String, number, bool — auto-parsing JSON mcpc @s tools-call search query:="hello world" limit:=10 enabled:=true # Force string z čísla mcpc @s tools-call get-by-id id:='"123"' # Inline JSON object (první arg začíná { nebo [) mcpc @s tools-call create '{"name":"foo","tags":["a","b"]}' # Z stdin echo '{"query":"hello"}' | mcpc @s tools-call search
# Strojový JSON výstup mcpc --json @apify tools-call search-actors keywords:="scraper" \ | jq -r '.content[0].text' # Skládání přes pipe mcpc --json @s1 tools-call get-data \ | jq '.id' \ | xargs -I {} mcpc @s2 tools-call process id:="{}"
connect na server, který ještě neběží: 10–30 s (HTTP servery rychlejší, stdio s těžkým podprocesem jako Puppeteer/Chromium pomalejší)connect na live session: instantní (~50 ms, jen potvrzení)
Pro AI workflow je proto idiomatické vždy začít mcpc connect … — díky idempotentnosti to nestojí nic, když session žije, a automaticky řeší cold start, když ne.
Bridge proces drží spojení a typicky i podproces serveru živý. Memory pattern:
| Stav | Typický RSS |
|---|---|
| Bridge bez spuštěného podprocesu | ~95 MB (node) |
| Bridge + lehký HTTP server (context7) | ~95 MB |
| Bridge + stdio server bez browseru (typický playwright neaktivní) | ~285 MB |
| Bridge + stdio server s otevřeným headless Chromium (playwright aktivní, perplexity) | 1.2–2.0 GB |
Memory nestoupá nekontrolovatelně — pool má fixní velikost. Po opakovaných voláních RSS osciluje kolem stabilní hodnoty (±50 MB).
mcpc @s close, restart stroje, OOM killmcpc clean neruší live sessions, jen úklidBridge se spustil, ale rychle umřel a parent CLI to interpretoval jako timeout. Skutečnou příčinu hledej v bridge logu:
cat ~/.mcpc/logs/bridge-@<alias>.log
Časté důvody:
${VAR} se nepřeložil. Zkontroluj secrets.env a že bash funkce mcpc() je aktivní (type mcpc musí říct „is a function„).bun/npx/zápis cesty.[server stderr]).
Cold-start race: první search přišla dřív, než server stihl otevřít browser pool. Řešení:
mcpc connect ~/.config/mcpc/mcp.json:perplexity @px sleep 8 # dej serveru čas na inicializaci mcpc @px tools-call search query:="..." # první call zabere ~30 s, další 13–18 s
Server odmítl klíč:
secrets.env je aktuálnímcpc @<alias> close mcpc connect ~/.config/mcpc/mcp.json:<entry> @<alias>
mcpc samo nemá memory leak. Pokud RSS roste:
mcpc a zkontroluj počet sessions — možná máš živé session, o kterých nevíšps aux | grep -E 'bridge|mcp' ukáže reálné procesy a jejich PIDsmcpc @<alias> restartmcpc clean sessions (zruší všechny)type mcpc # Pokud výstup je "/usr/local/bin/mcpc", funkce není načtená: source ~/.bashrc type mcpc # Teď musí být "is a function"
V neinteraktivních shellech (CI, některé hooks) se .bashrc automaticky nesourcuje — vyřeš nastavením BASH_ENV=$HOME/.bashrc nebo voláním bash -l (login shell).
Bash funkce mcpc() načte tajnosti jen do subshellu pro daný call. To znamená:
| Co | S auto-source v .bashrc | S bash funkcí (náš setup) |
|---|---|---|
echo $API_KEY v terminálu | vrátí klíč ⚠️ | prázdné ✅ |
Jiný proces čte /proc/<pid>/environ shellu | vidí klíč ⚠️ | bez klíče ✅ |
| Náhodný npm balíček spuštěný uživatelem | vidí klíč ⚠️ | bez klíče ✅ |
mcpc connect/call … | funguje | funguje ✅ |
✅ AI vidí: výstup mcpc příkazů (stdout) ✅ AI vidí: seznam serverů v AGENTS.md (entry, popis, session alias) ❌ AI nevidí: obsah secrets.env (není v žádné šabloně/contextu) ❌ AI nevidí: hodnoty $API_KEY ve shellu (subshell isolation) ❌ AI nevidí: resolved hodnoty v mcp.json (substituce probíhá v paměti mcpc)
Pro nedůvěryhodný kód můžeš spustit mcpc v proxy režimu:
# Ty jako uživatel: vytvoř autentizovanou session s proxy serverem mcpc connect ~/.config/mcpc/mcp.json:apify @ai-relay --proxy 8080 # AI v sandboxu: připojí se na proxy bez znalosti původních credentials mcpc connect localhost:8080 @sandboxed mcpc @sandboxed tools-call search-actors keywords:="..."
AI vidí jen rozhraní proxy, ne původní OAuth tokeny ani API klíče.
Pro nasazení na nový stroj (např. Docker image, nový server):
mkdir -p ~/.config/mcpc/ + mcp.json skeletonsecrets.env s permissions 0600~/.bashrc~/.config/mcpc/README.md (lokální dokumentace pro budoucí AI agenty na tomto stroji)AGENTS.md / CLAUDE.md s registrem serverů
Šablonu hub README.md, který se na stroji vytvoří, najdeš v GitHub repo nebo si ji můžeš stáhnout/přizpůsobit z této wiki.
| Funkce | Stav |
|---|---|
| Instructions / Tools / Prompts / Resources | ✅ plná podpora |
| Logování a notifikace | ✅ |
| Stránkování výsledků | ✅ automatické |
| Asynchronní úlohy | ✅ |
| OAuth 2.1 + PKCE + DCR + CIMD | ✅ |
| x402 platby | ✅ (experimentální) |
| Roots / Elicitation / Completion | 🚧 plánováno |
| Sampling | ❌ neaplikovatelné (mcpc nemá vlastní LLM) |