Luxe

MCP

Model Context Protocol servers, treated as untrusted.

MCP servers plug in tools (databases, browsers, APIs) — but their tool definitions are verbose, and registering them all up front burns thousands of context tokens whether the agent uses them or not. Luxe exposes a single mcp proxy tool (~200 tokens) instead: the agent discovers what it needs on demand.

mcp({ search: "screenshot" })              // find tools by keyword across servers
mcp({ tool: "chrome/take_screenshot" })    // show one tool's parameters
mcp({ tool: "chrome/take_screenshot", args: "{\"format\":\"png\"}" })  // call it (args is a JSON string)

Servers are lazy — they connect on first call and idle-disconnect; tool metadata is cached (.luxe/mcp-metadata.json) so discovery works without a live connection. Set lifecycle to eager or keep-alive per server, and exclude_tools to hide noisy ones. Run /mcp in the TUI to see configured servers, their transport/auth, and tool counts.

Config is read (and merged, project-over-user, luxe-over-standard) from ~/.config/mcp/mcp.json, ~/.config/luxe/mcp.json, .mcp.json, and .luxe/mcp.json. Both the standard mcpServers shape (as written by Cursor/Claude/Codex) and Luxe’s own shape are understood, so an existing setup works unchanged:

{ "mcpServers": {
  "chrome": { "command": "npx", "args": ["-y", "chrome-devtools-mcp@latest"] },
  "linear": { "url": "https://mcp.linear.app/mcp", "auth": { "kind": "oauth" } }
} }

Transports: local stdio and remote Streamable HTTP (with SSE responses). Auth (HTTP only): a static bearer token ({ "kind": "bearer", "token_env": "…" }) or OAuth 2.1 ({ "kind": "oauth" } — PKCE, .well-known discovery, and dynamic client registration fill in the rest). Authorize an OAuth server once with luxe mcp login --id <server>; tokens are stored 0600 and auto-refreshed. Login is a deliberate human step — the agent never initiates an auth flow.

MCP servers stay untrusted: opt-in, an MCP call goes through the same permission policy (keyed by its server/name target under the mcp tool), and results are passed to the model as data, never as instructions.