{"serverId":"mcp-registry/com.boathousecloud/boathouse","tools":[{"name":"delete_tool","fixed":{"name":"delete_tool","description":"Delete a tool: its container, its releases and its sharing. By default the tool's database and files are kept. purge true also destroys them forever, and then requires purge_confirm true as well.","inputSchema":{"type":"object","required":["tool"],"properties":{"tool":{"type":"string","description":"The tool's short name, for example 'finance', or 'acme/finance' to select its workspace."},"purge":{"type":"boolean","description":"Also destroy the tool's database and uploaded files. Irreversible."},"workspace":{"type":"string","description":"Workspace slug to act in. Use this when you belong to several workspaces; whoami lists them."},"purge_confirm":{"type":"boolean","description":"Must be true alongside purge, as a second confirmation."}}},"annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: true, idempotentHint: true (inferred from the name).","verify":true}],"tokensBefore":219,"tokensAfter":219},{"name":"deploy","fixed":{"name":"deploy","description":"Deploy a folder as a tool and make it live at https://<tool>.<workspace domain>. Send the whole folder in `files`, which MUST include a top-level Dockerfile whose process listens on $PORT (8080). Creates the tool on the first deploy; afterwards it replaces the running container. If you got these files from `pull`, pass the release number you pulled as `base` so a deploy someone else made in the meantime is not silently overwritten.","inputSchema":{"type":"object","required":["tool","files"],"properties":{"base":{"type":"integer","description":"The release number these files were pulled from. The deploy is refused with STALE_BASE if a newer release is live."},"name":{"type":"string","description":"Human name for the tool, used when it is created (e.g. 'CRCS Finance')."},"note":{"type":"string","description":"Why this release exists; shown in the release list."},"tool":{"type":"string","description":"The tool's short name, for example 'finance', or 'acme/finance' to select its workspace."},"files":{"type":"object","description":"The folder: relative path -> the file's text content, e.g. {\"Dockerfile\": \"FROM python:3.12-slim\\n...\", \"app.py\": \"...\"}. No leading slash and no '..' in paths.","additionalProperties":{"type":"string"}},"base64":{"type":"object","description":"Optional binary files: relative path -> base64 of the bytes.","additionalProperties":{"type":"string"}},"workspace":{"type":"string","description":"Workspace slug to act in. Use this when you belong to several workspaces; whoami lists them."}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":438,"tokensAfter":438},{"name":"domain_buy","fixed":{"name":"domain_buy","description":"Buy a domain through Boathouse's registrar and point it at this box, paid from the workspace's prepaid balance. Without confirm it only returns the quote (cost now, renewal price, your balance) and buys nothing. Owners only.","inputSchema":{"type":"object","required":["domain"],"properties":{"domain":{"type":"string","description":"The domain to buy, e.g. 'crcstools.com'."},"confirm":{"type":"boolean","description":"False or absent returns the quote and does nothing. True actually does it."},"quote_id":{"type":"string","description":"The quote_id from the dry run. Required to confirm; reuse it on retries."},"workspace":{"type":"string","description":"Workspace slug to act in. Use this when you belong to several workspaces; whoami lists them."},"max_cost_cents":{"type":"integer","minimum":1,"description":"Maximum approved total, including Boathouse's margin. Required to confirm."}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":259,"tokensAfter":259},{"name":"domain_check","fixed":{"name":"domain_check","description":"Ask the registrar whether a domain is free and what it costs per year. Buys nothing. total_cents is the price the workspace pays (registrar_cents plus Boathouse's margin_cents); show that one.","inputSchema":{"type":"object","required":["domain"],"properties":{"domain":{"type":"string","description":"A full domain name, e.g. 'crcstools.com'."},"workspace":{"type":"string","description":"Workspace slug to act in. Use this when you belong to several workspaces; whoami lists them."}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":146,"tokensAfter":146},{"name":"domain_renewal_set","fixed":{"name":"domain_renewal_set","description":"Set automatic renewal and a maximum prepaid renewal charge. Quote the change first, then require explicit approval with confirm true. Turning renewal off lets the domain expire. Owners only.","inputSchema":{"type":"object","required":["domain","enabled"],"properties":{"domain":{"type":"string","description":"A domain owned through this organization, including detached domains."},"confirm":{"type":"boolean","description":"False or absent returns the quote and does nothing. True actually does it."},"enabled":{"type":"boolean","description":"True renews from prepaid credit; false lets the domain expire."},"workspace":{"type":"string","description":"Workspace slug to act in. Use this when you belong to several workspaces; whoami lists them."},"max_cost_cents":{"type":"integer","maximum":100000,"minimum":1,"description":"Approved maximum per renewal including the service fee; required when enabling."}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: true (inferred from the name).","verify":true}],"tokensBefore":266,"tokensAfter":266},{"name":"domains_list","fixed":{"name":"domains_list","description":"The addresses this workspace answers on: the free <workspace>.boathousecloud.com address, the primary domain, and every custom domain with its DNS state.","inputSchema":{"type":"object","required":[],"properties":{"workspace":{"type":"string","description":"Workspace slug to act in. Use this when you belong to several workspaces; whoami lists them."}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":110,"tokensAfter":110},{"name":"get_tool","fixed":{"name":"get_tool","description":"One tool in detail: URL, container state, current release, who it is visible to, and the list of people it has been shared with.","inputSchema":{"type":"object","required":["tool"],"properties":{"tool":{"type":"string","description":"The tool's short name, for example 'finance', or 'acme/finance' to select its workspace."},"workspace":{"type":"string","description":"Workspace slug to act in. Use this when you belong to several workspaces; whoami lists them."}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":139,"tokensAfter":139},{"name":"list_tools","fixed":{"name":"list_tools","description":"Every tool in the workspace with its state (running/absent), current release, public URL and who can see it. A 'tool' is one small web app Boathouse runs behind the workspace login.","inputSchema":{"type":"object","required":[],"properties":{"workspace":{"type":"string","description":"Workspace slug to act in. Use this when you belong to several workspaces; whoami lists them."}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":117,"tokensAfter":117},{"name":"secrets_delete","fixed":{"name":"secrets_delete","description":"Remove one secret from a tool. It disappears on the tool's next restart or deploy.","inputSchema":{"type":"object","required":["tool","name"],"properties":{"name":{"type":"string","description":"The secret's name."},"tool":{"type":"string","description":"The tool's short name, for example 'finance', or 'acme/finance' to select its workspace."},"workspace":{"type":"string","description":"Workspace slug to act in. Use this when you belong to several workspaces; whoami lists them."}}},"annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: true, idempotentHint: true (inferred from the name).","verify":true}],"tokensBefore":147,"tokensAfter":147},{"name":"secrets_list","fixed":{"name":"secrets_list","description":"The names of a tool's secrets (API keys and the like), when each was last set and by whom. Values are never returned.","inputSchema":{"type":"object","required":["tool"],"properties":{"tool":{"type":"string","description":"The tool's short name, for example 'finance', or 'acme/finance' to select its workspace."},"workspace":{"type":"string","description":"Workspace slug to act in. Use this when you belong to several workspaces; whoami lists them."}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":137,"tokensAfter":137},{"name":"secrets_set","fixed":{"name":"secrets_set","description":"Set one secret on a tool. It is injected as an environment variable of that name and the tool is restarted. Names are UPPER_SNAKE_CASE. Never echo the value back to the user.","inputSchema":{"type":"object","required":["tool","name","value"],"properties":{"name":{"type":"string","description":"UPPER_SNAKE_CASE environment variable name, e.g. STRIPE_KEY."},"tool":{"type":"string","description":"The tool's short name, for example 'finance', or 'acme/finance' to select its workspace."},"value":{"type":"string","description":"The secret value."},"workspace":{"type":"string","description":"Workspace slug to act in. Use this when you belong to several workspaces; whoami lists them."}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: true (inferred from the name).","verify":true}],"tokensBefore":202,"tokensAfter":202},{"name":"set_access","fixed":{"name":"set_access","description":"Set who a tool is open to by default: 'members' means anyone in the workspace (at the given tier), 'listed' means only the people it has been explicitly shared with. Use 'listed' for anything sensitive.","inputSchema":{"type":"object","required":["tool","mode"],"properties":{"mode":{"enum":["members","listed","public"],"type":"string","description":"members (anyone in the workspace), listed (only people shared with), or public (anyone on the internet may read; writes still need sign-in)."},"tier":{"enum":["viewer","editor","admin"],"type":"string","description":"The tier workspace members get when mode is 'members'."},"tool":{"type":"string","description":"The tool's short name, for example 'finance', or 'acme/finance' to select its workspace."},"workspace":{"type":"string","description":"Workspace slug to act in. Use this when you belong to several workspaces; whoami lists them."}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: true (inferred from the name).","verify":true}],"tokensBefore":260,"tokensAfter":260},{"name":"users_add","fixed":{"name":"users_add","description":"Add a person to the workspace, or change their role. owner = may spend money, buy domains and manage people, and is admin on every tool; member = may see tools open to members and deploy their own; guest = sees only what is explicitly shared with them. Returns a one-time invite link for someone new. Owners only.","inputSchema":{"type":"object","required":["email"],"properties":{"role":{"enum":["member","owner","guest"],"type":"string","description":"Default member."},"email":{"type":"string","description":"The person's email address."},"workspace":{"type":"string","description":"Workspace slug to act in. Use this when you belong to several workspaces; whoami lists them."}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":200,"tokensAfter":200},{"name":"users_invite","fixed":{"name":"users_invite","description":"Resend an invitation to someone in the workspace. New accounts confirm their mailbox through the emailed link; established accounts receive a normal sign-in URL. Password recovery is self-service on that page, and only the account holder's mailbox receives a reset link. Check emailed before offering a fallback.","inputSchema":{"type":"object","required":["email"],"properties":{"email":{"type":"string","description":"The person's email address."},"workspace":{"type":"string","description":"Workspace slug to act in. Use this when you belong to several workspaces; whoami lists them."}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":175,"tokensAfter":175},{"name":"users_list","fixed":{"name":"users_list","description":"Everyone in the workspace: role (owner, member or guest), name, and whether they have set a password yet.","inputSchema":{"type":"object","required":[],"properties":{"workspace":{"type":"string","description":"Workspace slug to act in. Use this when you belong to several workspaces; whoami lists them."}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":96,"tokensAfter":96},{"name":"users_remove","fixed":{"name":"users_remove","description":"Remove a person from the workspace. Their sessions, project keys, invites and tool grants stop working immediately. Owners only.","inputSchema":{"type":"object","required":["email"],"properties":{"email":{"type":"string","description":"The person's email address."},"workspace":{"type":"string","description":"Workspace slug to act in. Use this when you belong to several workspaces; whoami lists them."}}},"annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: true, idempotentHint: true (inferred from the name).","verify":true}],"tokensBefore":124,"tokensAfter":124}],"toolsChanged":16,"tokensSaved":0,"todo":[],"note":"Deterministic fixes. Changes marked verify need a human look before shipping (renames, inferred annotations, inferred types, removed text). Parameter descriptions in `todo` need to be written by someone who knows the API."}