vault-broker-mcp
MCP server that gives Claude scoped, indirect access to Vaultwarden credentials by listing non-secret metadata and performing logins without exposing plaintext passwords. It brokers actions rather than values, keeping secrets out of the LLM context.
README
vault-broker-mcp
Kleine, zelf-gehoste MCP-server die Claude scoped, indirecte toegang geeft tot credentials in Vaultwarden — zonder dat Claude ooit een plaintext wachtwoord in zijn context krijgt.
Waarom deze opzet
Claude mag geen wachtwoorden lezen en zelf in formulieren typen. Deze broker lost dat op door acties aan te bieden in plaats van waardes:
list_credentials→ geeft alleen niet-geheime metadata terug (naam, gebruikersnaam, URL). Nooit het wachtwoord-veld.login→ krijgt een credential-ID + doel-URL, haalt het wachtwoord intern op, vult het formulier zelf in (via Playwright) en geeft alleen{success, url}terug. Het secret verlaat de container nooit.
Zo blijft de scheiding hard: Claude kiest welk item gebruikt wordt, de broker is de enige die de waarde ooit ziet.
Vaultwarden-kant (handmatig, door Steno)
Dit deel kan Claude niet voor je doen (accounts aanmaken / wachtwoorden instellen is voor Claude verboden terrein, ook met toestemming).
- In de bestaande Vaultwarden-instance (container
app_a0d7b954_bitwarden, poort 7277 op hethassio-netwerk — waarschijnlijk ontsloten viasecure.steno.nl, even checken in NPM): maak een organisatie of hergebruik een bestaande, met een nieuwe collectie, bijv.Gedeeld met Claude. - Maak een aparte login aan voor de agent-identiteit, bijv.
steenhagen.jeroen+claude@gmail.com, met een eigen sterk wachtwoord + 2FA. - Nodig die identiteit uit in de organisatie met toegang tot alleen de
collectie
Gedeeld met Claude. - Zet de items die je wilt delen in die collectie (kopiëren/delen, niet per se verplaatsen).
- Maak voor die identiteit een API key aan (Account settings → Security → Keys) — dat is wat de broker gebruikt om in te loggen, niet het master password rechtstreeks.
- Geef mij: de vault-URL, de organisatie-ID en de collectie-ID (allemaal
niet-geheime waardes, te vinden in de URL/admin-UI). De echte secrets
(API key, master password) zet je zelf in
.envop de server — die stuur je niet naar mij door.
Broker-kant (dit scaffold)
Dockerfile— Node 20, installeert de Bitwarden CLI (bw).server.js— MCP-server (SSE), twee tools:list_credentials,login(login is nu een stub met TODO's, zie hieronder).docker-compose.yml— draait op het gedeeldehassio-netwerk, net als je andere self-hosted MCP-servers. Niet publiek via NPM ontsluiten — dit is een secrets-gateway, alleen intern/via Tailscale bereikbaar houden.
Nog te doen voordat dit bruikbaar is
- [ ]
.envinvullen (zie.env.example) zodra stap 1–6 hierboven klaar zijn. - [ ]
login-tool afmaken: nu roept hij nog geen echte Playwright-instance aan. Meest voor de hand liggend: laten praten met je bestaandeplaywright-mcp-containers (playwright-amazon-mcp,playwright-bol-mcp) of een eigen headless Playwright-instance in dezelfde container. - [ ] Testen met één laag-risico item voordat er meer gedeeld wordt.
- [ ] Pas als dit werkt: als Portainer-stack deployen (met jouw akkoord, dit raak ik niet zelf aan zonder te vragen).
Bekende valkuil: bw CLI-versie vs. Vaultwarden-versie
@bitwarden/cli@latest (getest: 2026.7.0) crasht met een WASM-panic
("invalid type: JsValue(Object(...)), expected a string") bij bw list items
tegen onze Vaultwarden-instance (versie 2025.12.0, te checken via
GET /api/config, publiek/niet-geheim endpoint). Oorzaak: de nieuwste
officiële CLI verwacht een response-schema dat deze Vaultwarden-versie nog
niet levert.
Fix: CLI-versie dicht bij de serverversie pinnen — getest en werkend met
@bitwarden/cli@2025.12.1. Dockerfile en test-list-credentials.sh gebruiken
deze pin. Bij een Vaultwarden-upgrade: eerst opnieuw testen voordat je de
CLI-pin optrekt.
Tweede addertje: bw config server weigert te wijzigen zolang de CLI al
ingelogd is ("Logout required before server config update") — het lokale
bw-datadir (~/.config/Bitwarden CLI / %APPDATA%\Bitwarden CLI) onthoudt
de sessie ook tussen verschillende CLI-versies in. Altijd bw logout
(fouten negeren) vóór bw config server in scripts.
Derde addertje: node:20-alpine als base image laat de build wel
slagen, maar Playwright's Chromium draait niet betrouwbaar op musl
libc/Alpine, en playwright install --with-deps kent alleen apt, geen
apk. Ontdekt pas bij de eerste Portainer-deploy (lokaal getest zonder
Docker, dus dit verschil bleef onzichtbaar tot de echte build). Fix:
mcr.microsoft.com/playwright:v1.48.0-jammy als base image (zelfde familie
als playwright-amazon-mcp/playwright-bol-mcp), Chromium + OS-deps al
ingebakken.
Beveiligingsnotities
- MCP SSE-endpoint verwacht het secret als query-param (
?key=...), niet als pad-prefix — zie de bekende valkuil metah-mcp(root-relatieve callback-paden breken anders). list_credentialsfiltert serverside altijd hetlogin.password-veld eruit, ook als de Bitwarden CLI het teruggeeft — nooit vertrouwen op "de aanroeper vraagt er toch niet om".- Container draait met een
.env-bestand dat niet in git komt (.gitignoresluit 'm uit).
推荐服务器
Baidu Map
百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。
Playwright MCP Server
一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。
Magic Component Platform (MCP)
一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。
Audiense Insights MCP Server
通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。
VeyraX
一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。
graphlit-mcp-server
模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。
Kagi MCP Server
一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。
e2b-mcp-server
使用 MCP 通过 e2b 运行代码。
Neon MCP Server
用于与 Neon 管理 API 和数据库交互的 MCP 服务器
Exa MCP Server
模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。