- Buttons → MCP (shipped):
buttons mcpruns Buttons as an MCP server, so any agent can list and press your buttons as deterministic tools. - MCP → Buttons (planned): capture an agent’s exploration of an MCP server — list tools, find the right tool and parameter shape, confirm the call works — and freeze that known-good invocation as a button. This is the page’s namesake feature and is not built yet.
What ships today: expose buttons as MCP tools
buttons mcp runs an MCP server over stdio that exposes a small meta-tool surface to any MCP client (Claude Desktop, Cursor, etc.):
buttons_list— list buttons available as toolsbuttons_press— press a button by name with argsbuttons_inspect— read a button’s specbuttons_create— only when started with--allow-create(off by default)
"--allow-create" to args to also expose buttons_create.
Only buttons that opt in are visible or pressable: set "mcp_enabled": true in the button’s button.json. The server is rate-limited (10 calls/min, 1 concurrent, 120s cap per call) so an agent can’t hammer it.
This is the inverse of the planned “freeze an MCP tool” flow: instead of wrapping someone else’s MCP tool as a button, you take any button you already have — shell, HTTP, anything — mark it mcp_enabled, and it becomes a scoped, deterministic tool an agent can call without re-discovering anything.
What’s planned: MCP → Buttons
The MCP-tool-to-button import is not implemented yet. The intended entry point is
buttons import mcp <server>, which today returns an IMPORT_ERROR (“not implemented yet”). Only import code, import skill, and import url create buttons right now. There is no buttons create --mcp flag.- An agent reviewing the button sees it’s a safe, scoped call — no re-discovery of the MCP server required
- A deterministic workflow (drawer, cron, webhook) can press it without involving an LLM at all — the MCP call is already parameterized and approved