Skip to content
verify mcp Beta VerifyMCP is currently in beta. If you notice any issues, get in touch and we’ll put it right.

Hatch

REMOTE · MCP.THEROOST.DEV · SCANNED AUG 21

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

Available components

+4 this week 61 Trust /100
Trust breakdown (6 categories)

How this component scores in each security and reliability category. Every signal is checked automatically against the live server, and we only credit what we can confirm. How we score →

Endpoint Security46
Transport & Reachability100
Schema Quality & AI Usability74
  • 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).Pass
  • AI-judged instruction clarity (good).Pass
  • Context-footprint check failed: tool/resource definitions use about 4097 tokens (~273/item across 15 items; 15 tools + 0 resources), over budget; trim descriptions and params. See how to fix → Fail
  • Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management23
  • Stability observed for 7 of 30 days with no destabilising changes; credit accrues until the full window elapses.Partial
Tool Coverage89
  • 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
  • 66% of tool parameters carry a description.Partial
Capabilities100
  • Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.Pass
Install

Add this component to your MCP client. Where a client-specific snippet is available, pick your client below and copy it straight into your config; otherwise use the connection detail shown.

remote · mcp.theroost.dev

# add to Claude Code
claude mcp add --transport http com-viberooster-hatch https://mcp.theroost.dev/mcp
# ~/.codex/config.toml
[mcp_servers.com-viberooster-hatch]
url = "https://mcp.theroost.dev/mcp"
// opencode.json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "com-viberooster-hatch": {
      "type": "remote",
      "url": "https://mcp.theroost.dev/mcp",
      "enabled": true
    }
  }
}
# add to OpenClaw
openclaw mcp add com-viberooster-hatch --url https://mcp.theroost.dev/mcp --transport streamable-http
# ~/.hermes/config.yaml
mcp_servers:
  com-viberooster-hatch:
    url: "https://mcp.theroost.dev/mcp"
// mcp.json
{
  "mcpServers": {
    "com-viberooster-hatch": {
      "type": "http",
      "url": "https://mcp.theroost.dev/mcp"
    }
  }
}

The mcpServers block is a cross-client convention. Remote transports vary, so check your client's docs.

Changelog

Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.

  • 21 Aug 26 +1
    • The server rewrote its instructions, which are the text every model session reads security
    • Tool “await_decision” rewrote its description, which is the text the model reads security
    • Schema quality: 248 → 273 functional
    • Server version: 2026-08-12+eafb90d → 2026-08-21+4adea95 functional
    • “await_decision” reworded the description of “webhookUrl” cosmetic
    • “hatch” reworded the description of “tenantId” cosmetic
  • 19 Aug 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 13 to 17. That category is still filling its 30-day observation window: 4 days of observed history at the previous scan, 5 at this one. The score rises as the window fills, whether or not the server changes.

  • 17 Aug 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 7 to 10. That category is still filling its 30-day observation window: 2 days of observed history at the previous scan, 3 at this one. The score rises as the window fills, whether or not the server changes.

  • 15 Aug 26 +1
    • Stability: unverified → 0.03 functional
  • 14 Aug 26 57

    First indexed and scored.

Diagnostics

Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.

Captured 21 Aug 2026 · Probed https://mcp.theroost.dev/mcp

TLS valid

Negotiated TLS 1.3 with TLS_AES_128_GCM_SHA256 .

Subject Issuer Valid from Valid until Key Signature Serial
CN=theroost.dev CN=YE2,O=Let's Encrypt,C=US 9 Jul 2026 7 Oct 2026 ECDSA 256 ECDSA-SHA384 5ee57247a8980bbce70d5b833401e0c65b6
SANs: *.theroost.dev, theroost.dev
CN=YE2,O=Let's Encrypt,C=US (CA) CN=Root YE,O=ISRG,C=US 3 Sept 2025 2 Sept 2028 ECDSA 384 ECDSA-SHA384 4df3b15dd6c0784c507cd37b58e6f115
CN=Root YE,O=ISRG,C=US (CA) CN=ISRG Root X2,O=Internet Security Research Group,C=US 13 May 2026 2 Sept 2032 ECDSA 384 ECDSA-SHA384 872165fc34b6e5fba8add5b3705fb53a
CN=ISRG Root X2,O=Internet Security Research Group,C=US (CA) CN=ISRG Root X1,O=Internet Security Research Group,C=US 13 May 2026 2 Sept 2032 ECDSA 384 SHA256-RSA 6c8f1dc727c7117f7baf853ac980f9cd
DNSSEC insecure

Validation of mcp.theroost.dev. Not signed

Zone DS Keys Algorithms Outcome
. trust_anchor 20326, 38696 8, 8 Verified
dev. present 60074 8 Verified
theroost.dev. absent Unsigned (proven) parent-signed NSEC/NSEC3 proves an unsigned delegation
Authentication No authorisation required

The endpoint answered without asking for a token. Anyone who knows the URL can reach it.

Result No authorisation required
HTTP status 200
Transports 2 probes
Transport URL Outcome Status Location
streamable-http https://mcp.theroost.dev/mcp Verified 200
http (plaintext) http://mcp.theroost.dev/mcp Inconclusive 405
MCP tools · 15 exposed · ~2,893 tokens

The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability.

Tool Tokens
auth ~302

Put a sign-in screen in front of a `forever` roost so visitors must authenticate. Pass `tenantId` 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 }`. Auth is only available on `forever` roosts — `convert` a free roost first. The sign-in screen lives at `/__roost/login`. Prefer `password` mode; `useraccounts` is unavailable (per-tenant databases are no longer provisioned).

NameTypeReqDescription
actionstringWhat to do. Defaults to `status`.
modestring`password` = one shared site password (recommended). `useraccounts` is unavailable. Required when `action` is `enable`.
passwordstringThe shared site password (password mode only). Required for `enable` (password mode) and `setPassword`.
sessionTokenstringOptional paired session token from poll_pairing (when Authorization headers are unavailable).
tenantIdstringyesTenant id from the original hatch response.

No output schema declared.

No examples provided.

await_decision ~378

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.

NameTypeReqDescription
agentOutputstringOptional seed of the agent’s current output into the conversation transcript.
contextUrlstring
maxIterationsintegerMax review rounds (default 5). Requesting changes at the last iteration fails with max_iterations_exceeded.
optionsarrayRadio choices (default Approve, Request changes, Reject). Labels are classified into approve / reject / changes_requested.
sessionTokenstring
tenantIdstringyes
timeoutSecondsintegerWall-clock timeout for this review round; omit for no timeout.
titlestringModal heading (default: Finish your review).
webhookUrlstringHTTPS URL that receives a POST on every HITL transition (decision.resolved, decision.changes_requested, timeout, etc.). Prefer this over poll_decision when wiring n8n, Temporal, or other automation —…

No output schema declared.

No examples provided.

continue_decision ~100

After poll_decision returns status changes_requested, regenerate, then call this to reopen the same decision as pending_review for the next human round.

NameTypeReqDescription
agentOutputstringSummary of the revised output for the conversation transcript.
decisionIdstringyes
sessionTokenstring
tenantIdstringyes
timeoutSecondsintegerOptional new timeout for this review round.
titlestring

No output schema declared.

No examples provided.

convert ~241

Atomically rename a roost's URL and/or change its tier. Pass `tenantId` plus at least one of `newPreferredSlug` (rename), `newTier` (e.g. `free` → `forever`), or `galleryListed` (opt in/out of the Barnyard carousel on viberooster.com). Do NOT call `hatch` again to upgrade — that creates a second site with a new id. Forever roosts are hidden from the carousel by default; pass `galleryListed: true` when promoting to forever to feature the site publicly.

NameTypeReqDescription
galleryListedbooleanOpt in (`true`) or out (`false`) of the public Barnyard carousel. Forever tier requires `true` to appear; free tier is listed unless set to `false`.
newPreferredSlugstringNew hostname label. The old slug is released atomically.
newTierstringNew tier. Clears `expiresAt` when promoting to `forever`.
sessionTokenstringOptional paired session token from poll_pairing (when Authorization headers are unavailable).
tenantIdstringyes

No output schema declared.

No examples provided.

deploy ~147

Replace the server-side code of an existing roost. Advanced — most agents should use `upload` (for static files) or `convert` (for renames) instead. Pass `tenantId`, `workerName`, and a full ES module `script` (text only, 1.5 MiB max).

NameTypeReqDescription
approvalIdstringTier-2 phone approval id from a prior deploy attempt.
metadataobject
scriptstringyesFull ES module source.
sessionTokenstringOptional paired session token from poll_pairing (when Authorization headers are unavailable).
tenantIdstringyes
workerNamestringyes

No output schema declared.

No examples provided.

get_pairing_code ~93

Issue a fresh pairing code + URL (TTL 10 minutes) for claiming a tenant or authorizing a new agent session. Render pairingUrl as a QR for the Vibe Rooster app. Prefer this over whoami when starting a pairing flow. Do not call again until poll_pairing returns expired/completed — repeated calls invalidate the previous code.

NameTypeReqDescription
tenantIdstringyesTenant id from hatch response.

No output schema declared.

No examples provided.

hatch ~763

Create a NEW site (a 'roost') and return its public URL in one call. Returns `{ tenantId, slug, url, apex, uploads? }` — show `url` to the user and remember `tenantId`. NEVER call hatch twice for the same site — use `convert` to rename or change tier, 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. Four ways to call it: • Omit `manifest`, `site`, and `script` → a placeholder page is published instantly (best zero-token first turn). • 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. Files are sent in the request body, so this is expensive in tokens for anything bigger than a handful of HTML/CSS files. • Pass `script` → advanced: full server-side code as one ES module (1.5 MiB max, text only — NEVER base64-embed binaries here).

NameTypeReqDescription
apexstringSpecialty hostname apex for the live URL (`https://{slug}.{apex}`). Choose from user intent: theroost.homes (residential listing), theroost.estate (commercial/luxury), theroost.land (land/parcels), t…
kindstringArtifact kind. Use `run-report` for agent observability / compliance run reports; default `site` for consumer sites.
manifestobjectPREFERRED for sites with assets. List every file you want served, with its byte size and optional MIME type. The response includes one presigned PUT URL per file; upload bytes directly via HTTP (e.g.…
preferredSlugstringHostname label. Omit for a friendly auto-name (e.g. swift-falcon-7a).
scriptstringAdvanced: full server-side code as one ES module. Text only, 1.5 MiB hard limit. NEVER embed images/fonts/binaries here — use `manifest` instead.
scriptMetadataobject
siteobjectInline file map. Suitable ONLY for small text-only sites (a handful of HTML/CSS files). For anything with images or binaries, use `manifest` instead.
tenantIdstringOptional id to reuse. Omit entirely to auto-generate. Do not send an empty string (n8n: leave this field unmapped). Lowercase letters, numbers, and hyphens only; 1–50 chars; must start and end alphan…
tierstringyes`free` auto-expires (default 48h; override with `ttlSeconds`). `forever` is persistent.
tosAcceptedAtstringISO-8601 timestamp
ttlSecondsintegerFree-tier TTL in seconds (1h–7d). Default 172800 (48h). Ignored for `forever`.

No output schema declared.

No examples provided.

lookup ~91

Resolve a roost by `slug` or `tenantId`. Returns a compact view `{ tenantId, slug, url, apex, tier, state, expiresAt, customDomain, galleryListed }`. Use this to recover state across turns when the user mentions their site without giving you the tenantId.

NameTypeReqDescription
slugstringHostname label (without the apex domain)
tenantIdstring

No output schema declared.

No examples provided.

poll_approval ~47

Poll a pending Tier-2 phone approval. Returns the result once the owner approves or denies on their phone.

NameTypeReqDescription
approvalIdstringyes
tenantIdstringyes

No output schema declared.

No examples provided.

poll_decision ~77

Long-poll (~20s) until the decision leaves pending_review. Returns changes_requested (regenerate + continue_decision), approved, rejected, timeout_exceeded, max_iterations_exceeded, or still pending_review. Includes comment, settings, conversation, iteration.

NameTypeReqDescription
decisionIdstringyes
tenantIdstringyes

No output schema declared.

No examples provided.

poll_pairing ~148

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 tenantId when known. Device claim ≠ forever billing upgrade.

NameTypeReqDescription
codestringyesPairing code from get_pairing_code / whoami.
tenantIdstringOptional tenant id — improves lookup after the phone has approved.

No output schema declared.

No examples provided.

refresh_session ~133

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.

NameTypeReqDescription
refreshTokenstringyesOpaque refresh token from poll_pairing (vr1.{grantId}.{secret}).
tenantIdstringyesTenant id from hatch / poll_pairing.

No output schema declared.

No examples provided.

share ~71

Issue a signed, expiring guest view URL for any tier (`?vt=…`). Use for private run reports without forever-tier password auth. Returns `{ url, viewToken, expiresAt }`.

NameTypeReqDescription
expiresSecondsinteger
sessionTokenstring
tenantIdstringyes

No output schema declared.

No examples provided.

upload ~170

Add or replace files on an EXISTING roost. Pass `tenantId` 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.

NameTypeReqDescription
expiresSecondsintegerURL TTL in seconds (default 3600).
manifestobjectyes
sessionTokenstringOptional paired session token from poll_pairing (when Authorization headers are unavailable).
tenantIdstringyesTenant id from the original hatch response.

No output schema declared.

No examples provided.

whoami ~132

Return the caller's current identity and tenant state. Never errors when unidentified — returns a pairing path instead. After poll_pairing completes, whoami with the same tenantId 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.

NameTypeReqDescription
sessionTokenstringOptional token from poll_pairing. Pass when whoami stays unidentified after a successful pair (connectors that cannot set Authorization headers).
tenantIdstringOptional tenant to check or re-pair against.

No output schema declared.

No examples provided.