The config files
server/runtime/mcp.js discovers servers from, in order (later wins):
- Global —
~/.bed-of-roses/mcp/servers.json - Shared local —
.bed-of-roses/mcp/servers.json(the bundledbrowserbaseautomation browser is configured here by default) - Per-presence —
.bor/mcp.json(where the marketplace installs, and where the AI reads/writes)
.bor/mcp.json is the primary place; it wins over the shared templates. Its absolute path for the current presence is shown by /api/mcp/installed and handed to the AI in install tasks.
The format
All three files use the same shape:stdio server (subprocess)
streamable-http / SSE server (remote)
type: "sse" for an SSE endpoint. Headers carry auth.
Fields
Editing it
- Via the marketplace — Install does it for you (LLM-driven), reading the file first so it never clobbers existing servers.
- Via the AI — ask BOR to add/configure a server; it reads
.bor/mcp.json, writes the new entry, and can run any needed setup commands. - By hand — edit
.bor/mcp.jsondirectly. The runtime picks up changes (restart the presence if it doesn’t).
Verifying
list_mcp_servers— see what’s configured and connected.list_mcp_tools <server>— see the tools a server exposes.use_mcp_tool/access_mcp_resource— actually call it.GET /api/mcp/installed— the server names in this presence’s.bor/mcp.jsonplus the config path.
Secrets
API keys for MCP servers live in theenv block of .bor/mcp.json (under os-data/). Treat that file as sensitive, like config.json.