Skip to content

Hatch

by viberooster.com · remote · no sign-in to list tools · v1.0.0-1 · published by com.viberooster

Hosting for AI agents: publish a live website in one tool call, ephemeral or forever.

Deletes · 4Changes · 151 high finding

24 tools: 4 can delete or cancel things, 15 change things and 5 only read.

Scanned Oct 21, 2026

4 checks matched something in the tool definitions. No finding is not a safety guarantee. How the checks work.

claude mcp add --transport http hatch https://mcp.theroost.dev/mcp

Findings

Matches of fixed checks, with the text they matched.

1 high3 warn
  • Highalarm

    The description contains "Do not tell the user", an instruction to keep something from the user.

    Matched text

    description: "...he Ring/Silent switch until that grant. Do not tell the user the silent switch was bypassed. A clai..."

    What this check looks for
  • The server marks "poll_checkout" read-only (readOnlyHint: true), and its own name, description or input give the class "write".

    Matched text

    annotations: {"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":true}; The name "poll_checkout" says "checkout": a word for a change.

    What this check looks for
  • The server marks "get_pairing_code" as not read-only (readOnlyHint: false), and its words say it reads.

    Matched text

    annotations: {"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false}; The name "get_pairing_code" says "get": a word for reading.

    What this check looks for
  • The server marks "poll_pairing" read-only (readOnlyHint: true), and its own name, description or input give the class "write".

    Matched text

    annotations: {"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}; The input takes a statement or command to run (input.code), which can change anything it can reach.

    What this check looks for

Tools

Open a tool for its reasons and full description. Descriptions are the publisher's own words, shown as they are.

24 tools

Deletes or cancels 4Claude Code: deny
  • authPut a sign-in screen in front of any roost so visitors must authenticate.No findings

    Why it is in this group

    • The description's first verb is "put": a word for a change.
    • The server marks it destructive (destructiveHint: true).
    Description, as the server wrote it
    Put a sign-in screen in front of any roost so visitors must authenticate. Works on free, workspace, and forever hatches. Pass `hatchId` plus an `action`: • `enable` with `mode: "password"` and a `password` → ONE shared site password (everyone uses the same one). Best for a private demo or staging link. • `setPassword` with a new `password` → rotate the shared password. • `disable` → remove the login and serve the site publicly again. • `status` → report whether auth is on and which mode. Returns `{ enabled, mode, loginUrl }`. The sign-in screen lives at `/__roost/login`. Prefer `password` mode; `useraccounts` is unavailable (per-hatch databases are no longer provisioned).

    Annotations the server declares

    • title: Protect a site with a login
    • readOnlyHint: false
    • destructiveHint: true
    • idempotentHint: true
    • openWorldHint: true
  • convertAtomically rename a roost's URL, change gallery listing, mark or unmark Promo, or bind a custom domain (Roost / Roost Audit after checkout grant custom_domain).No findings

    Why it is in this group

    • The name "convert" says "convert": a word for a change.
    • The server marks it destructive (destructiveHint: true).
    Description, as the server wrote it
    Atomically rename a roost's URL, change gallery listing, mark or unmark Promo, or bind a custom domain (Roost / Roost Audit after checkout grant custom_domain). Pass `hatchId` plus at least one of `newPreferredSlug`, `galleryListed`, `promo`, or `customDomain`. Do NOT call `hatch` again to rename or to change Promo — that creates a second site. Optional `promo` (boolean). `true` lists this hatch on the public carousel even when its tier would hide it, if the hatch is active, has a public slug, and is not expired, and forces the Powered By chip on. A password still keeps it off the carousel. `false` unmarks Promo and returns the normal carousel and chip rules. Omit `promo` to leave the flag unchanged. `promo` alone is enough. Roost and Roost Audit include 10 subscription Pins. `convert` with `newTier: forever` is allowed while those slots remain. After that, call `checkout` with grant `publish` (Pin, $4.99/yr). Do not use convert to collect payment. Pins are hidden from the carousel by default; pass `galleryListed: true` to feature the site publicly. Paid Roost hatches stay off the carousel unless `promo` is true.

    Annotations the server declares

    • title: Rename or change tier
    • readOnlyHint: false
    • destructiveHint: true
    • idempotentHint: true
    • openWorldHint: true
  • deployReplace the server-side code of an existing roost.No findings

    Why it is in this group

    • The name "deploy" says "deploy": a word for a change.
    • The input takes a statement or command to run (input.script), which can change anything it can reach.
    • The server marks it destructive (destructiveHint: true).
    Description, as the server wrote it
    Replace the server-side code of an existing roost. Advanced — most agents should use `upload` (for static files) or `convert` (for renames) instead. Pass `hatchId`, `workerName`, and a full ES module `script` (text only, 1.5 MiB max).

    Annotations the server declares

    • title: Replace site code (advanced)
    • readOnlyHint: false
    • destructiveHint: true
    • idempotentHint: true
    • openWorldHint: true
  • uploadAdd or replace files on an EXISTING roost.No findings

    Why it is in this group

    • The name "upload" says "upload": a word for a change.
    • The server marks it destructive (destructiveHint: true).
    Description, as the server wrote it
    Add or replace files on an EXISTING roost. Pass `hatchId` plus a `manifest` listing each file's path, size, and optional content type. Returns one presigned PUT URL per file — upload bytes directly via HTTP (e.g. `curl -T file.png -H 'Content-Type: image/png' "$url"`). Files go live immediately as each PUT completes; no separate publish call is needed. Use after regenerating a dashboard locally; Hatch does not schedule regenerations.

    Annotations the server declares

    • title: Upload files to an existing site
    • readOnlyHint: false
    • destructiveHint: true
    • idempotentHint: true
    • openWorldHint: true
Changes things 15Claude Code: ask
  • alarmSound a loud alarm on the phones paired to this roost.1 finding

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.

    Findings

    • High

      The description contains "Do not tell the user", an instruction to keep something from the user.

      Matched text

      description: "...he Ring/Silent switch until that grant. Do not tell the user the silent switch was bypassed. A clai..."

      What this check looks for
    Description, as the server wrote it
    Sound a loud alarm on the phones paired to this roost. Pass `hatchId` and a short `message` — the phone shows that message and repeats the alarm until the person acknowledges it. Recipients are only phones paired to this roost or its workspace. There is no phone-number argument. Do not pass one, and do not try to reach any other device. Android plays alarm audio. The alarm channel bypasses Do Not Disturb after the person grants that access. iOS requests Critical Alerts and this push is sent with a critical sound at full volume. Apple has not granted the Critical Alerts entitlement (com.apple.developer.usernotifications.critical-alerts) yet, so iOS does not bypass the Ring/Silent switch until that grant. Do not tell the user the silent switch was bypassed. A claimed roost requires a paired agent session. If no phone is paired, or the phone has not allowed notifications, the call fails and nothing is sent.

    Annotations the server declares

    • title: Alarm the paired phone
    • readOnlyHint: false
    • destructiveHint: false
    • idempotentHint: false
    • openWorldHint: true
  • await_decisionCreate a human-in-the-loop review on the live artifact.No findings

    Why it is in this group

    • The description's first verb is "create": a word for a change.
    Description, as the server wrote it
    Create a human-in-the-loop review on the live artifact. Default options: Approve / Request changes / Reject. Reviewers see a Review required chip → modal. Request changes is non-terminal: webhook or poll returns changes_requested, then call continue_decision after regenerating. Optional timeoutSeconds and maxIterations (default 5). If the page has interactive controls (sliders/forms), the hatch HTML MUST expose window.__VR_HITL_GET_SETTINGS__ so the review can attach those assumptions as JSON. When the user integrates n8n, Temporal, CI, or any external workflow, pass webhookUrl (MCP opens the review; the platform POSTs each transition to that URL — prefer webhook over poll_decision for automation). See PARTNER-WEBHOOKS.md for event payloads.

    Annotations the server declares

    • title: Await human decision
    • readOnlyHint: false
    • destructiveHint: false
    • idempotentHint: false
    • openWorldHint: true
  • checkoutCreate a Stripe Checkout Session so the user can pay for a VibeRooster feature in this chat.No findings

    Why it is in this group

    • The name "checkout" says "checkout": a word for a change.
    Description, as the server wrote it
    Create a Stripe Checkout Session so the user can pay for a VibeRooster feature in this chat. Returns `{ checkoutUrl, sessionId, grant, amountCents }` — ALWAYS show checkoutUrl to the user (open it / paste it). After they pay, call `poll_checkout` with sessionId until status is `complete`. The webhook applies the grant (Pin, Pack, Roost, Roost Audit, custom domain). Required ids by grant: `publish` / `record` / `credit_topup` / `workspace_coin_pack` (Pack) → hatchId; `workspace_subscription` (Roost) / `custom_domain` → workspaceId (or hatchId in that workspace); `agentic_pro` (Roost Audit) → orgId or workspaceId/hatchId attached to the org. Do not use Stripe MCP (mcp.stripe.com) for VibeRooster features — that would charge a different Stripe account. Hatch `checkout` stamps hatch/workspace/org metadata the webhook expects.

    Annotations the server declares

    • title: Create a payment link
    • readOnlyHint: false
    • destructiveHint: false
    • idempotentHint: false
    • openWorldHint: true
  • continue_decisionAfter poll_decision returns status changes_requested, regenerate, then call this to reopen the same decision as pending_review for the next human round.No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    Description, as the server wrote it
    After poll_decision returns status changes_requested, regenerate, then call this to reopen the same decision as pending_review for the next human round. Only decisionId is required (hatchId is read from the decision).

    Annotations the server declares

    • title: Continue HITL after changes requested
    • readOnlyHint: false
    • destructiveHint: false
    • idempotentHint: false
    • openWorldHint: true
  • get_pairing_codeIssue a pairing code + URL (TTL 10 minutes) for claiming a hatch (`hatchId`) or authorizing an agent session in a workspace (workspaceId).1 finding

    Why it is in this group

    • The name "get_pairing_code" says "get": a word for reading.
    • The server marks it as not read-only (readOnlyHint: false).

    Findings

    • Warn

      The server marks "get_pairing_code" as not read-only (readOnlyHint: false), and its words say it reads.

      Matched text

      annotations: {"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false}; The name "get_pairing_code" says "get": a word for reading.

      What this check looks for
    Description, as the server wrote it
    Issue a pairing code + URL (TTL 10 minutes) for claiming a hatch (`hatchId`) or authorizing an agent session in a workspace (workspaceId). Reuses the active pending code for this connector session unless `forceNew: true`. For workspace pairing, show `pairingUrl` (https://mcp.theroost.dev/open/workspace-pair) as the link the user taps — it opens the Vibe Rooster app on the phone, and on a computer it opens a page that forwards into the app when the same link is opened on the phone. Do not show only `appUrl`; that viberooster:// link does nothing in a desktop chat. `appUrl` is only for an in-app QR. Do not call again until poll_pairing returns expired/completed or you intentionally rotate with forceNew.

    Annotations the server declares

    • title: Get pairing code
    • readOnlyHint: false
    • destructiveHint: false
    • idempotentHint: false
    • openWorldHint: false
  • hatchCreate a NEW site (a 'roost') and return its public URL in one call.No findings

    Why it is in this group

    • The description's first verb is "create": a word for a change.
    • The input takes a statement or command to run (input.script), which can change anything it can reach.
    Description, as the server wrote it
    Create a NEW site (a 'roost') and return its public URL in one call. Returns `{ hatchId, slug, url, apex, promo, uploads? }` — show `url` to the user and remember `hatchId`. NEVER call hatch twice for the same site — use `convert` to rename, change tier, or set Promo, and `upload`/`deploy` for content updates. Pick `apex` from the user's intent (homes / estate / land / wedding / events / agency / site / omit for theroost.dev). Do NOT invent other apexes. Ways to call it: • `html` (PREFERRED for n8n / a single review page) → one self-contained HTML string published at /. Do not also pass site/manifest/script. • Omit `html`, `manifest`, `site`, and `script` → a placeholder page is published instantly. • Pass `manifest` (file list with sizes) → returns presigned `uploads[]`; you PUT each file's bytes directly to its URL. PREFER this for any project with images, fonts, video, or more than a few KB of HTML. • Pass `site` (inline files map) → small text-only sites only. File keys must be paths like `index.html` (n8n may send `index`; that is accepted as `index.html`). • Pass `script` → advanced: full server-side code as one ES module (1.5 MiB max, text only — NEVER base64-embed binaries here). Optional `promo` (boolean). `true` lists this hatch on the public carousel even when its tier would hide it, if the hatch is active, has a public slug, and is not expired, and forces the Powered By chip on. A password still keeps it off the carousel. `false` unmarks Promo and returns the normal carousel and chip rules. Omit `promo` to leave an existing hatch unchanged, or to create one under the normal rules. To change Promo later, call `convert` with `promo` — do not hatch again. Do not send empty strings for optional fields (hatchId, preferredSlug, apex, html, site). Omit them.

    Annotations the server declares

    • title: Hatch a new site
    • readOnlyHint: false
    • destructiveHint: false
    • idempotentHint: false
    • openWorldHint: true
  • poll_approvalPoll a pending Tier-2 phone approval.No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
    Description, as the server wrote it
    Poll a pending Tier-2 phone approval. Returns the result once the owner approves or denies on their phone.

    Annotations the server declares

    • title: Poll destructive-op approval
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • poll_checkoutLong-poll a Checkout Session from `checkout` (~18s).1 finding

    Why it is in this group

    • The name "poll_checkout" says "checkout": a word for a change.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.

    Findings

    • Warn

      The server marks "poll_checkout" read-only (readOnlyHint: true), and its own name, description or input give the class "write".

      Matched text

      annotations: {"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":true}; The name "poll_checkout" says "checkout": a word for a change.

      What this check looks for
    Description, as the server wrote it
    Long-poll a Checkout Session from `checkout` (~18s). Returns `{ status: open|complete|expired, grantApplied, roostUrl, tier }`. If still `open`, tell the user to finish paying at checkoutUrl and call poll_checkout again. When `grantApplied` is true, the webhook has (or is about to) apply the grant — call `lookup` to confirm forever/tier.

    Annotations the server declares

    • title: Wait for payment
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: true
  • poll_decisionLong-poll (~20s) until the decision leaves pending_review.No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
    Description, as the server wrote it
    Long-poll (~20s) until the decision leaves pending_review. Only decisionId is required (hatchId is read from the decision). Returns changes_requested (regenerate + continue_decision), approved, rejected, timeout_exceeded, max_iterations_exceeded, not_found, or still pending_review (call again). Includes comment, settings, conversation, iteration. Polling never writes: timeout_exceeded only ever means the await_decision timeoutSeconds deadline passed before the human submitted.

    Annotations the server declares

    • title: Poll decision resolution
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • poll_pairingPoll for pairing completion (Device-Grant style).1 finding

    Why it is in this group

    • The input takes a statement or command to run (input.code), which can change anything it can reach.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.

    Findings

    • Warn

      The server marks "poll_pairing" read-only (readOnlyHint: true), and its own name, description or input give the class "write".

      Matched text

      annotations: {"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}; The input takes a statement or command to run (input.code), which can change anything it can reach.

      What this check looks for
    Description, as the server wrote it
    Poll for pairing completion (Device-Grant style). Waits up to ~20s for phone approval before returning. Statuses: pending / completed / expired / not_found. On completed, store sessionToken, refreshToken, and grantId — refreshToken renews access for up to 7 days without re-pairing. When sessionToken expires (~1h), call refresh_session. The server also binds tokens to this connector session. Pass hatchId when known. Device claim ≠ forever billing upgrade.

    Annotations the server declares

    • title: Poll pairing completion
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • refresh_sessionRenew a short-lived access token (~1h) using the refreshToken from poll_pairing.No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    Description, as the server wrote it
    Renew a short-lived access token (~1h) using the refreshToken from poll_pairing. The grant (and refresh capability) lasts up to 7 days — after that, re-pair via get_pairing_code. Each refresh rotates the refreshToken; store the new one. Requires the same connector session (MCP-Session-Id) as when you paired — if fingerprint mismatches, re-pair.

    Annotations the server declares

    • title: Refresh agent session
    • readOnlyHint: false
    • destructiveHint: false
    • idempotentHint: false
    • openWorldHint: false
  • rename_orgRename the organization and/or workspace after Roost or Roost Audit has been paid.No findings

    Why it is in this group

    • The name "rename_org" says "rename": a word for a change.
    Description, as the server wrote it
    Rename the organization and/or workspace after Roost or Roost Audit has been paid. Pass `orgName`, `workspaceName`, or both. Requires a workspace-paired session. Fails on free Hatch workspaces — call `checkout` with grant `workspace_subscription` (Roost) or `agentic_pro` (Roost Audit) first, then `poll_checkout`. Does not rename a hatch URL; use `convert` for that. Returns `{ workspaceId, workspaceName, orgId, orgName, plan }`.

    Annotations the server declares

    • title: Rename organization and workspace
    • readOnlyHint: false
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • shareIssue a signed, expiring guest view URL for any tier (`?vt=…`).No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    Description, as the server wrote it
    Issue a signed, expiring guest view URL for any tier (`?vt=…`). Use for private run reports without the shared site password. Returns `{ url, viewToken, expiresAt }`.

    Annotations the server declares

    • title: Guest view link
    • readOnlyHint: false
    • destructiveHint: false
    • idempotentHint: false
    • openWorldHint: true
  • squawk_poll_accessPoll an admit request opened by squawk_request_access.No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    Description, as the server wrote it
    Poll an admit request opened by squawk_request_access. Uses the same Hatch pairing session. While pending, returns `{ status: "pending", expiresAt }`. After the owner approves, returns the member, the rin_ token once, roostId, and mcpServers.squawk. Install the returned mcpServers.squawk block into this MCP client immediately. Use the url and the Authorization header exactly as returned. Do not print, log, or paste the rin_ token into chat. After it is installed, further roost traffic uses the Squawk tools (squawk, squawk_whoami, squawk_read, squawk_ack, squawk_watch, and the rest listed in SQUAWK-AGENT.md). A one-shot HTTP call is not a substitute. If this host cannot hot-add an MCP server mid-turn, write that config where this client loads MCP servers and use the Squawk tools on the next turn. Do not invent a Cursor API. Later polls return status approved and the member id, without the token and without mcpServers. Rejected and expired have no token. One approval admits this agent to that one roost.

    Annotations the server declares

    • title: Poll Squawk access
    • readOnlyHint: false
    • destructiveHint: false
    • idempotentHint: false
    • openWorldHint: false
  • squawk_request_accessAsk the roost owner to admit this agent to Squawk.No findings

    Why it is in this group

    • The name "squawk_request_access" says "request": a word for a change.
    Description, as the server wrote it
    Ask the roost owner to admit this agent to Squawk. Uses the caller's Hatch pairing session (Authorization: Roost, the bound connector session, or sessionToken from poll_pairing). Returns `{ requestId, status: "pending", expiresAt }`. The request expires 10 minutes after it is opened. Does not create a Squawk member. This tool is on Hatch, not on the Squawk server. Pass displayName and runtime. Optional roostId must match the paired roost. Optional publicKey makes the later member agent_signed.

    Annotations the server declares

    • title: Request Squawk access
    • readOnlyHint: false
    • destructiveHint: false
    • idempotentHint: false
    • openWorldHint: false
Only reads 5Claude Code: allow
  • catalogList VibeRooster features the user can pay for (Pin $4.99/yr, Pack $4.99/yr/GB, Roost $259/mo, Roost Audit $459/mo, custom domain +$29/mo) with Stripe Price ids, amounts, and featu…No findings

    Why it is in this group

    • The description's first verb is "list": a word for reading.
    Description, as the server wrote it
    List VibeRooster features the user can pay for (Pin $4.99/yr, Pack $4.99/yr/GB, Roost $259/mo, Roost Audit $459/mo, custom domain +$29/mo) with Stripe Price ids, amounts, and feature lists. Call this before `checkout` if you don't already know the grant. Returns `{ items: [{ grant, title, description, features, priceId, amountCents, scope }] }`.

    Annotations the server declares

    • title: List payable features
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: true
  • listList every hatch in a workspace.No findings

    Why it is in this group

    • The name "list" says "list": a word for reading.
    Description, as the server wrote it
    List every hatch in a workspace. Returns `{ workspaceId, name, count, hatches: [{ hatchId, slug, url, apex, kind, tier, state, expiresAt, createdAt, promo, pageviews24h, visitors24h }] }`. `promo` is true when that hatch is marked Promo. Use this when you lost hatchIds, before hatching (so you do not create a duplicate), or when the user asks what is live in the workspace. `workspaceId` is optional when this connector is already paired to a workspace. Requires a workspace-paired session — call `whoami`, then `get_pairing_code` with workspaceId if unidentified.

    Annotations the server declares

    • title: List workspace hatches
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • list_templatesList HTML templates and explorable archetypes from the public template catalog (https://github.com/VibeRooster/hatch-mcp/tree/main/templates).No findings

    Why it is in this group

    • The name "list_templates" says "list": a word for reading.
    Description, as the server wrote it
    List HTML templates and explorable archetypes from the public template catalog (https://github.com/VibeRooster/hatch-mcp/tree/main/templates). Returns `{ repo, browse, templates: [{ name, title, description, url, prompt, referenceUrl? }] }`. `prompt` is the suggested text for the user. `referenceUrl` is the live example when one is published. Descriptions come from each file's frontmatter. Open `url` for the HTML and hatch notes — this tool does not return the file body. Add a template by opening a pull request that adds `templates/<name>.md` on that repo. No arguments.

    Annotations the server declares

    • title: List HTML templates
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: true
  • lookupResolve a roost by `slug` or `hatchId`.No findings

    Why it is in this group

    • The name "lookup" says "lookup": a word for reading.
    Description, as the server wrote it
    Resolve a roost by `slug` or `hatchId`. Returns a compact view `{ hatchId, slug, url, apex, tier, state, expiresAt, customDomain, galleryListed, promo, pageviews24h, visitors24h, topPaths, topCountries, topReferrers }`. `promo` is true when the hatch is marked Promo (listed on the public carousel even when its tier would hide it, if active, with a public slug, and not expired; Powered By chip forced on). A password still keeps a Promo hatch off the carousel. Use this to recover state across turns when the user mentions their site without giving you the hatchId. To see every hatch in a workspace, use `list` instead.

    Annotations the server declares

    • title: Lookup a site
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: true
  • whoamiReturn the caller's current identity and hatch state.No findings

    Why it is in this group

    • The name "whoami" says "whoami": a word for reading.
    Description, as the server wrote it
    Return the caller's current identity and hatch state. Never errors when unidentified — returns a pairing path instead. After poll_pairing completes, whoami with the same hatchId should show identified:true via server-side session binding. Returns sessionExpiresAt (~1h) and grantExpiresAt (~7d). If sessionExpired:true, call refresh_session with your stored refreshToken.

    Annotations the server declares

    • title: Check identity
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false

This is not a safety rating, and no finding is not a safety guarantee. The groups and findings come from fixed checks of the tool definitions the server returned on the date shown, not from its code or what it does when called. How the checks work.

Install

Pinned to version 1.0.0-1. Values in angle brackets are yours to fill in.

claude mcp add --transport http hatch https://mcp.theroost.dev/mcp

Run in a terminal.

Claude Code permissions

Allow the reads, ask before a change, deny the deletes. Paste into .claude/settings.json.

.claude/settings.json
{
  "permissions": {
    "allow": [
      "mcp__hatch__lookup",
      "mcp__hatch__list",
      "mcp__hatch__catalog",
      "mcp__hatch__list_templates",
      "mcp__hatch__whoami"
    ],
    "ask": [
      "mcp__hatch__hatch",
      "mcp__hatch__rename_org",
      "mcp__hatch__checkout",
      "mcp__hatch__poll_checkout",
      "mcp__hatch__share",
      "mcp__hatch__await_decision",
      "mcp__hatch__continue_decision",
      "mcp__hatch__poll_decision",
      "mcp__hatch__get_pairing_code",
      "mcp__hatch__poll_pairing",
      "mcp__hatch__refresh_session",
      "mcp__hatch__poll_approval",
      "mcp__hatch__alarm",
      "mcp__hatch__squawk_request_access",
      "mcp__hatch__squawk_poll_access"
    ],
    "deny": [
      "mcp__hatch__upload",
      "mcp__hatch__convert",
      "mcp__hatch__auth",
      "mcp__hatch__deploy"
    ]
  }
}

Tools that only read are allowed, tools that change things ask first, tools that delete or cancel are denied. It assumes the server is installed as hatch. Review it before you use it.