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
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
- The endpoint's TLS certificate is valid, in date, and uses a strong key. View diagnostics → Pass
- Authorisation check failed: no authorisation is required to call this server, and it exposes a tool marked destructive (upload). See how to fix → View diagnostics → Fail
- HTTPS enforcement could not be verified: the plaintext port answered with HTTP 405, which proves neither a plaintext path nor enforcement. View diagnostics → Unverified
- HSTS check failed: the Strict-Transport-Security header is absent. See how to fix → View diagnostics → Fail
- DNSSEC check failed: this domain isn't protected by DNSSEC. See how to fix → View diagnostics → Fail
Transport & Reachability100
- Verified streamable-http transport via a live MCP handshake. View diagnostics → Pass
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
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
claude mcp add --transport http com-viberooster-hatch https://mcp.theroost.dev/mcp
[mcp_servers.com-viberooster-hatch] url = "https://mcp.theroost.dev/mcp"
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"com-viberooster-hatch": {
"type": "remote",
"url": "https://mcp.theroost.dev/mcp",
"enabled": true
}
}
} openclaw mcp add com-viberooster-hatch --url https://mcp.theroost.dev/mcp --transport streamable-http
mcp_servers:
com-viberooster-hatch:
url: "https://mcp.theroost.dev/mcp" {
"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.
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.
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 |
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.
auth Protect a site with a login ~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).
| Name | Type | Req | Description |
|---|---|---|---|
| action | string | – | What to do. Defaults to `status`. |
| mode | string | – | `password` = one shared site password (recommended). `useraccounts` is unavailable. Required when `action` is `enable`. |
| password | string | – | The shared site password (password mode only). Required for `enable` (password mode) and `setPassword`. |
| sessionToken | string | – | Optional paired session token from poll_pairing (when Authorization headers are unavailable). |
| tenantId | string | yes | Tenant id from the original hatch response. |
No output schema declared.
No examples provided.
await_decision Await human 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.
| Name | Type | Req | Description |
|---|---|---|---|
| agentOutput | string | – | Optional seed of the agent’s current output into the conversation transcript. |
| contextUrl | string | – | – |
| maxIterations | integer | – | Max review rounds (default 5). Requesting changes at the last iteration fails with max_iterations_exceeded. |
| options | array | – | Radio choices (default Approve, Request changes, Reject). Labels are classified into approve / reject / changes_requested. |
| sessionToken | string | – | – |
| tenantId | string | yes | – |
| timeoutSeconds | integer | – | Wall-clock timeout for this review round; omit for no timeout. |
| title | string | – | Modal heading (default: Finish your review). |
| webhookUrl | string | – | HTTPS 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 Continue HITL after changes requested ~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.
| Name | Type | Req | Description |
|---|---|---|---|
| agentOutput | string | – | Summary of the revised output for the conversation transcript. |
| decisionId | string | yes | – |
| sessionToken | string | – | – |
| tenantId | string | yes | – |
| timeoutSeconds | integer | – | Optional new timeout for this review round. |
| title | string | – | – |
No output schema declared.
No examples provided.
convert Rename or change tier ~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.
| Name | Type | Req | Description |
|---|---|---|---|
| galleryListed | boolean | – | Opt in (`true`) or out (`false`) of the public Barnyard carousel. Forever tier requires `true` to appear; free tier is listed unless set to `false`. |
| newPreferredSlug | string | – | New hostname label. The old slug is released atomically. |
| newTier | string | – | New tier. Clears `expiresAt` when promoting to `forever`. |
| sessionToken | string | – | Optional paired session token from poll_pairing (when Authorization headers are unavailable). |
| tenantId | string | yes | – |
No output schema declared.
No examples provided.
deploy Replace site code (advanced) ~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).
| Name | Type | Req | Description |
|---|---|---|---|
| approvalId | string | – | Tier-2 phone approval id from a prior deploy attempt. |
| metadata | object | – | – |
| script | string | yes | Full ES module source. |
| sessionToken | string | – | Optional paired session token from poll_pairing (when Authorization headers are unavailable). |
| tenantId | string | yes | – |
| workerName | string | yes | – |
No output schema declared.
No examples provided.
get_pairing_code 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.
| Name | Type | Req | Description |
|---|---|---|---|
| tenantId | string | yes | Tenant id from hatch response. |
No output schema declared.
No examples provided.
hatch Hatch a new site ~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).
| Name | Type | Req | Description |
|---|---|---|---|
| apex | string | – | Specialty 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… |
| kind | string | – | Artifact kind. Use `run-report` for agent observability / compliance run reports; default `site` for consumer sites. |
| manifest | object | – | PREFERRED 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.… |
| preferredSlug | string | – | Hostname label. Omit for a friendly auto-name (e.g. swift-falcon-7a). |
| script | string | – | Advanced: full server-side code as one ES module. Text only, 1.5 MiB hard limit. NEVER embed images/fonts/binaries here — use `manifest` instead. |
| scriptMetadata | object | – | – |
| site | object | – | Inline file map. Suitable ONLY for small text-only sites (a handful of HTML/CSS files). For anything with images or binaries, use `manifest` instead. |
| tenantId | string | – | Optional 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… |
| tier | string | yes | `free` auto-expires (default 48h; override with `ttlSeconds`). `forever` is persistent. |
| tosAcceptedAt | string | – | ISO-8601 timestamp |
| ttlSeconds | integer | – | Free-tier TTL in seconds (1h–7d). Default 172800 (48h). Ignored for `forever`. |
No output schema declared.
No examples provided.
lookup Lookup a site ~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.
| Name | Type | Req | Description |
|---|---|---|---|
| slug | string | – | Hostname label (without the apex domain) |
| tenantId | string | – | – |
No output schema declared.
No examples provided.
poll_approval Poll destructive-op approval ~47
Poll a pending Tier-2 phone approval. Returns the result once the owner approves or denies on their phone.
| Name | Type | Req | Description |
|---|---|---|---|
| approvalId | string | yes | – |
| tenantId | string | yes | – |
No output schema declared.
No examples provided.
poll_decision Poll decision resolution ~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.
| Name | Type | Req | Description |
|---|---|---|---|
| decisionId | string | yes | – |
| tenantId | string | yes | – |
No output schema declared.
No examples provided.
poll_pairing Poll pairing completion ~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.
| Name | Type | Req | Description |
|---|---|---|---|
| code | string | yes | Pairing code from get_pairing_code / whoami. |
| tenantId | string | – | Optional tenant id — improves lookup after the phone has approved. |
No output schema declared.
No examples provided.
refresh_session Refresh agent 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.
| Name | Type | Req | Description |
|---|---|---|---|
| refreshToken | string | yes | Opaque refresh token from poll_pairing (vr1.{grantId}.{secret}). |
| tenantId | string | yes | Tenant id from hatch / poll_pairing. |
No output schema declared.
No examples provided.
share Guest view link ~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 }`.
| Name | Type | Req | Description |
|---|---|---|---|
| expiresSeconds | integer | – | – |
| sessionToken | string | – | – |
| tenantId | string | yes | – |
No output schema declared.
No examples provided.
upload Upload files to an existing site ~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.
| Name | Type | Req | Description |
|---|---|---|---|
| expiresSeconds | integer | – | URL TTL in seconds (default 3600). |
| manifest | object | yes | – |
| sessionToken | string | – | Optional paired session token from poll_pairing (when Authorization headers are unavailable). |
| tenantId | string | yes | Tenant id from the original hatch response. |
No output schema declared.
No examples provided.
whoami Check identity ~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.
| Name | Type | Req | Description |
|---|---|---|---|
| sessionToken | string | – | Optional token from poll_pairing. Pass when whoami stays unidentified after a successful pair (connectors that cannot set Authorization headers). |
| tenantId | string | – | Optional tenant to check or re-pair against. |
No output schema declared.
No examples provided.