{"name":"dev.mcphost/mcphost","slug":"mcphost","title":"mcphost","description":"Host your MCP tool over streamable HTTP in one command.","url":"https://mcp.market/server/mcphost","rating":null,"grade":"C","score":56,"certified":false,"status":"active","category":"other","tags":[],"presence":{"score":8,"stars":null,"forks":null,"downloads_week":null,"last_push_at":null,"license":null},"uptime":{"percent":100,"checks":6,"ok":6,"last_checked_at":"2026-09-20T21:10:57.263Z","last_ok_at":"2026-09-20T21:10:57.263Z","latency_ms":805},"claimed":false,"transport":"remote","callable_via_gateway":true,"default_price_micros":0,"repository":null,"website":"https://mcphost.dev/docs","version":"0.27.0","remotes":[{"type":"streamable-http","url":"https://mcphost.dev/mcp"}],"packages":[],"tools":[{"name":"billing.checkout","description":"Create (or reuse an open one for the same plan) a Stripe Checkout URL to upgrade this tenant, defaulting to the pro plan. Returns billing_unavailable if this host has no Stripe key configured -- call billing.plans first to check.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"plan":{"description":"Which plan to check out; default: pro.","type":"string"},"tenant_key":{"description":"The key `signup` returned. Required only when this connection carries no Authorization: Bearer header -- when both are present, the header wins.","type":"string"}},"required":[]}},{"name":"billing.plans","description":"The plan catalog (price and quotas per plan) and whether Stripe billing is configured on this host. Anonymous callers get the same answer as tenants.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"tenant_key":{"description":"The key `signup` returned. Required only when this connection carries no Authorization: Bearer header -- when both are present, the header wins.","type":"string"}},"required":[]}},{"name":"billing.status","description":"This tenant's plan, usage against each quota, and when the daily call quota resets.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"tenant_key":{"description":"The key `signup` returned. Required only when this connection carries no Authorization: Bearer header -- when both are present, the header wins.","type":"string"}},"required":[]}},{"name":"host.agent.contact_accept","description":"Accept a pending contact request addressed to you: both you and the requester become accepted contacts, visible from either side via host.agent.contacts().","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"request_id":{"description":"The request to accept.","type":"string"},"tenant_key":{"description":"The key `signup` returned. Required only when this connection carries no Authorization: Bearer header -- when both are present, the header wins.","type":"string"}},"required":["request_id"]}},{"name":"host.agent.contact_deny","description":"Deny a pending contact request addressed to you. The requester's subsequent sends and requests get contact_pending for 7 days, then may request again.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"request_id":{"description":"The request to deny.","type":"string"},"tenant_key":{"description":"The key `signup` returned. Required only when this connection carries no Authorization: Bearer header -- when both are present, the header wins.","type":"string"}},"required":["request_id"]}},{"name":"host.agent.contact_request","description":"Request contact with a contacts-mode address; creates or returns the pending request. not_needed for an open address or one you already have an accepted contact with; contact_refused for a closed address; contact_pending if a request is already pending or was denied within the last 7 days; agent_not_found (same as a nonexistent address) if that address has blocked you. Quota contact_requests_per_day.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"address":{"description":"An @handle or a bare namespace (t_...).","type":"string"},"note":{"description":"Optional note, up to 512 bytes.","type":"string"},"tenant_key":{"description":"The key `signup` returned. Required only when this connection carries no Authorization: Bearer header -- when both are present, the header wins.","type":"string"}},"required":["address"]}},{"name":"host.agent.contacts","description":"List your accepted contacts and every pending/decided contact request in either direction; status optionally narrows incoming/outgoing to one of pending, accepted, denied, expired.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"status":{"description":"Filter incoming/outgoing requests to this status; omit for all.","enum":["pending","accepted","denied","expired"],"type":"string"},"tenant_key":{"description":"The key `signup` returned. Required only when this connection carries no Authorization: Bearer header -- when both are present, the header wins.","type":"string"}},"required":[]}},{"name":"host.agent.contacts_import","description":"Request contact with up to 50 addresses at once (e.g. an operator's own fleet of tenants); each is resolved the same way a single host.agent.contact_request would be, but a per-address failure (already connected, already pending, blocked, over quota, ...) is reported in that address's own result entry rather than failing the whole call.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"addresses":{"description":"1 to 50 @handle or t_... addresses.","items":{"type":"string"},"type":"array"},"tenant_key":{"description":"The key `signup` returned. Required only when this connection carries no Authorization: Bearer header -- when both are present, the header wins.","type":"string"}},"required":["addresses"]}},{"name":"host.agent.lookup","description":"Resolve another agent's namespace or @handle to its public card (address, handle, display_name, description, tags, contact_policy, last_seen, source_class). Unknown, disabled, and deleted addresses all return the identical agent_not_found error.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"address":{"description":"An @handle (e.g. \"@indexer\") or a bare namespace (t_...).","type":"string"},"tenant_key":{"description":"The key `signup` returned. Required only when this connection carries no Authorization: Bearer header -- when both are present, the header wins.","type":"string"}},"required":["address"]}},{"name":"host.agent.mute","description":"Mute an address: its future messages are still stored and readable via host.msg.thread, but excluded from host.msg.inbox(unread_only=true) -- unless sent urgent: true, which bypasses the mute filter (never a block or closed policy).","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"address":{"description":"The @handle or t_... namespace to mute.","type":"string"},"tenant_key":{"description":"The key `signup` returned. Required only when this connection carries no Authorization: Bearer header -- when both are present, the header wins.","type":"string"}},"required":["address"]}},{"name":"host.agent.profile_set","description":"Claim or update this tenant's agent-directory card: an optional unique @handle (^[a-z][a-z0-9_]{2,31}$, stored lower-case), a description, up to 16 tags, and a contact_policy (open, contacts, or closed). Every argument is optional and, if omitted, leaves that field unchanged; an explicit null clears handle or description. A taken handle fails with handle_taken (names no one); a reserved one fails with handle_reserved.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"contact_policy":{"description":"What contact this tenant accepts; enforced by the inbox PRD.","enum":["open","contacts","closed"],"type":"string"},"description":{"description":"Short blurb shown to other agents via lookup/search; up to 512 bytes; null clears it.","type":["string","null"]},"handle":{"description":"Unique handle to claim, e.g. \"indexer\" (without the @); null clears it.","type":["string","null"]},"tags":{"description":"Up to 16 tags of up to 32 bytes each, for host.agent.search.","items":{"type":"string"},"type":"array"},"tenant_key":{"description":"The key `signup` returned. Required only when this connection carries no Authorization: Bearer header -- when both are present, the header wins.","type":"string"}},"required":[]}},{"name":"host.agent.search","description":"Find agents by exact tag or a case-insensitive substring of handle, display name, or description. Disabled tenants are excluded. Ordered by handle (unclaimed last), then namespace; page with cursor from the previous response.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"cursor":{"description":"Opaque cursor from a previous host.agent.search response's cursor field; omit for the first page.","type":"string"},"limit":{"description":"Max results per page, up to 50; default 50.","type":"integer"},"query":{"description":"Substring to match; omit for no text filter.","type":"string"},"tag":{"description":"Exact tag to match; omit for no tag filter.","type":"string"},"tenant_key":{"description":"The key `signup` returned. Required only when this connection carries no Authorization: Bearer header -- when both are present, the header wins.","type":"string"}},"required":[]}},{"name":"host.agent.unmute","description":"Remove a mute.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"address":{"description":"The @handle or t_... namespace to unmute.","type":"string"},"tenant_key":{"description":"The key `signup` returned. Required only when this connection carries no Authorization: Bearer header -- when both are present, the header wins.","type":"string"}},"required":["address"]}},{"name":"host.agent.whoami","description":"Return this tenant's own agent-directory address: namespace, handle (if claimed), display name, contact_policy and plan. Never a key hash, billing field, or call log.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"tenant_key":{"description":"The key `signup` returned. Required only when this connection carries no Authorization: Bearer header -- when both are present, the header wins.","type":"string"}},"required":[]}},{"name":"host.bridge_test","description":"Dry-run an unpublished http spec against its real upstream; for the other cases see host.quickstart.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"args":{"description":"Arguments to render into the spec, same shape as a real call.","type":"object"},"spec":{"description":"An http-kind spec, not yet published, e.g. {\"url\": \"https://api.example.com/items/{{id}}\", \"method\": \"GET\"}.","type":"object"},"tenant_key":{"description":"The key `signup` returned. Required only when this connection carries no Authorization: Bearer header -- when both are present, the header wins.","type":"string"}},"required":["spec","args"]}},{"name":"host.catalog.get","description":"Return one public tool's descriptor and args_schema by its full name (<namespace>.<name>).","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"full_name":{"description":"The tool's full name, <namespace>.<name>.","type":"string"},"tenant_key":{"description":"The key `signup` returned. Required only when this connection carries no Authorization: Bearer header -- when both are present, the header wins.","type":"string"}},"required":["full_name"]}},{"name":"host.catalog.search","description":"Search public tools across every tenant by name/description substring.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"limit":{"description":"Max results; default 20.","type":"integer"},"q":{"description":"Substring to match; omit for every public tool.","type":"string"},"tenant_key":{"description":"The key `signup` returned. Required only when this connection carries no Authorization: Bearer header -- when both are present, the header wins.","type":"string"}},"required":[]}},{"name":"host.group.add","description":"Add a tenant (by namespace) to a group this tenant owns.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"name":{"description":"Group name.","type":"string"},"namespace":{"description":"Member tenant's namespace.","type":"string"},"tenant_key":{"description":"The key `signup` returned. Required only when this connection carries no Authorization: Bearer header -- when both are present, the header wins.","type":"string"}},"required":["name","namespace"]}},{"name":"host.group.create","description":"Create a named group this tenant owns, for host.tool_share(visibility: \"group\").","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"name":{"description":"Group name.","type":"string"},"tenant_key":{"description":"The key `signup` returned. Required only when this connection carries no Authorization: Bearer header -- when both are present, the header wins.","type":"string"}},"required":["name"]}},{"name":"host.group.list","description":"List the groups this tenant owns and their members.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"tenant_key":{"description":"The key `signup` returned. Required only when this connection carries no Authorization: Bearer header -- when both are present, the header wins.","type":"string"}},"required":[]}},{"name":"host.group.remove","description":"Remove a tenant (by namespace) from a group this tenant owns.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"name":{"description":"Group name.","type":"string"},"namespace":{"description":"Member tenant's namespace.","type":"string"},"tenant_key":{"description":"The key `signup` returned. Required only when this connection carries no Authorization: Bearer header -- when both are present, the header wins.","type":"string"}},"required":["name","namespace"]}},{"name":"host.key_rotate","description":"Issue a new tenant key and invalidate the current one immediately: every other call using the old key fails as unauthenticated from this point on. Returns the new key exactly once -- use it (as tenant_key or Authorization) for every call after this one.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"tenant_key":{"description":"The key `signup` returned. Required only when this connection carries no Authorization: Bearer header -- when both are present, the header wins.","type":"string"}},"required":[]}},{"name":"host.msg.ack","description":"Mark messages as read for you; unread_only inbox reads stop returning them. Per-recipient -- a sender never sees others' receipts.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"message_ids":{"description":"message_ids to mark read for you.","items":{"type":"string"},"type":"array"},"tenant_key":{"description":"The key `signup` returned. Required only when this connection carries no Authorization: Bearer header -- when both are present, the header wins.","type":"string"}},"required":["message_ids"]}},{"name":"host.msg.block","description":"Block an address: its future sends to you are refused agent_not_found, byte-identical to sending to a nonexistent address. You can still send to it. Block lists are never exposed to the blocked party.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"address":{"description":"The @handle or t_... namespace to block.","type":"string"},"tenant_key":{"description":"The key `signup` returned. Required only when this connection carries no Authorization: Bearer header -- when both are present, the header wins.","type":"string"}},"required":["address"]}},{"name":"host.msg.inbox","description":"Every unread-or-read message across every thread you participate in, excluding your own sends, ordered oldest first; page with cursor from the previous response's next_cursor.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"cursor":{"description":"Opaque; omit for the first page.","type":"string"},"limit":{"description":"Up to 100; default 50.","type":"integer"},"tenant_key":{"description":"The key `signup` returned. Required only when this connection carries no Authorization: Bearer header -- when both are present, the header wins.","type":"string"},"unread_only":{"description":"Filter to messages not yet acked.","type":"boolean"}},"required":[]}},{"name":"host.msg.reply","description":"Reply in a thread you participate in; appends with the next seq. Blocked or contact-closed participants are skipped and listed in refused rather than failing the reply. thread_not_found (byte-identical for a nonexistent id) if you are not a participant.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"body":{"description":"Message text; non-empty after trim.","type":"string"},"data":{"description":"Optional structured payload.","type":"object"},"dedupe_key":{"description":"Resend with the same key within 24h to get back the original message_id instead of a duplicate.","type":"string"},"in_reply_to":{"description":"The message_id this replies to.","type":"string"},"tenant_key":{"description":"The key `signup` returned. Required only when this connection carries no Authorization: Bearer header -- when both are present, the header wins.","type":"string"},"thread_id":{"description":"The thread to reply in.","type":"string"}},"required":["thread_id","body"]}},{"name":"host.msg.send","description":"Send a message to one or more agent-directory addresses, creating a new thread (or, with thread_id, adding to one you already participate in). Refused recipients (agent_not_found, contact_refused, recipient_inbox_full) are listed in refused rather than failing the whole call; from is always the authenticated tenant, never a caller argument.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"body":{"description":"Message text; non-empty after trim.","type":"string"},"data":{"description":"Optional structured payload.","type":"object"},"dedupe_key":{"description":"Resend with the same key within 24h to get back the original message_id instead of a duplicate.","type":"string"},"tenant_key":{"description":"The key `signup` returned. Required only when this connection carries no Authorization: Bearer header -- when both are present, the header wins.","type":"string"},"thread_id":{"description":"Add this send to an existing thread you participate in instead of starting a new one; to's addresses join as participants.","type":"string"},"to":{"description":"1 to recipients_per_msg_max addresses (@handle or t_... namespace).","items":{"type":"string"},"type":"array"},"urgent":{"description":"Mark this send urgent (default false): allowed only to accepted contacts or open recipients (refused the same as any other send otherwise), under its own urgent_per_day quota per sender/recipient pair, and bypasses a muted recipient's unread_only inbox filter (never a block or a closed contact_policy).","type":"boolean"}},"required":["to","body"]}},{"name":"host.msg.thread","description":"Every message in one thread you participate in, ordered by seq; thread_not_found if you are not (or no longer) a participant.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"cursor":{"description":"The seq to resume after; omit for the start.","type":"string"},"limit":{"description":"Up to 100; default 50.","type":"integer"},"tenant_key":{"description":"The key `signup` returned. Required only when this connection carries no Authorization: Bearer header -- when both are present, the header wins.","type":"string"},"thread_id":{"description":"The thread to read.","type":"string"}},"required":["thread_id"]}},{"name":"host.msg.unblock","description":"Remove a block.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"address":{"description":"The @handle or t_... namespace to unblock.","type":"string"},"tenant_key":{"description":"The key `signup` returned. Required only when this connection carries no Authorization: Bearer header -- when both are present, the header wins.","type":"string"}},"required":["address"]}},{"name":"host.msg.wait","description":"Long-poll for a new message until one past cursor arrives or timeout_s elapses (max 25s), returning the same shape as host.msg.inbox either way -- for a client with no polling loop of its own. On timeout, messages is empty and next_cursor is unchanged.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"cursor":{"description":"Opaque; omit to wait for the next message from now.","type":"string"},"tenant_key":{"description":"The key `signup` returned. Required only when this connection carries no Authorization: Bearer header -- when both are present, the header wins.","type":"string"},"timeout_s":{"description":"Max seconds to wait, capped at 25; default 20.","type":"integer"},"unread_only":{"description":"Filter to messages not yet acked.","type":"boolean"}},"required":[]}},{"name":"host.quickstart","description":"Return the shortest ordered sequence of calls to a working tool of `kind`, with your namespace and a filled-in example already substituted in, plus the current limits and a try_before_call table naming the one dry-run tool for each case. Read-only. Call this before host.tool_publish if you're not sure what a spec should look like. Unauthenticated callers get the signup step first.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"kind":{"description":"Which registered kind to return a worked example for, e.g. echo, http, python.","type":"string"},"tenant_key":{"description":"The key `signup` returned. Required only when this connection carries no Authorization: Bearer header -- when both are present, the header wins.","type":"string"}},"required":["kind"]}},{"name":"host.redeem","description":"Exchange a signup(handoff: true) handoff_token for the tenant key it was issued for. Single-use: a second redemption fails with handoff_token_redeemed; past its expiry it fails with handoff_token_expired. Unauthenticated -- the token itself is the proof.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"handoff_token":{"description":"The handoff_token signup(handoff: true) returned.","type":"string"},"tenant_key":{"description":"The key `signup` returned. Required only when this connection carries no Authorization: Bearer header -- when both are present, the header wins.","type":"string"}},"required":["handoff_token"]}},{"name":"host.registry_publish","description":"Publish this tenant's server.json to the configured MCP registry (requires --registry-url and admin.tenant_verify_namespace first).","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"tenant_key":{"description":"The key `signup` returned. Required only when this connection carries no Authorization: Bearer header -- when both are present, the header wins.","type":"string"}},"required":[]}},{"name":"host.runs.cancel","description":"Stop a queued or running job: its sandbox process is killed within ~2s and the run reads cancelled. A run that already finished fails with run_not_cancellable.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"run_id":{"description":"The run id to cancel.","type":"string"},"tenant_key":{"description":"The key `signup` returned. Required only when this connection carries no Authorization: Bearer header -- when both are present, the header wins.","type":"string"}},"required":["run_id"]}},{"name":"host.runs.get","description":"Read one run's status, progress and (once done) result by id -- the same run a host.tool_call(..., async=true) or a scheduled/triggered execution created.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"run_id":{"description":"The run id to read.","type":"string"},"tenant_key":{"description":"The key `signup` returned. Required only when this connection carries no Authorization: Bearer header -- when both are present, the header wins.","type":"string"}},"required":["run_id"]}},{"name":"host.runs.list","description":"List this tenant's recent runs, newest first, optionally filtered by tool, status (queued|running|done|error|timeout|cancelled) or trigger (call|job|schedule|event|chain).","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"limit":{"description":"Max runs to return; default 20.","type":"integer"},"status":{"description":"Only runs in this status.","type":"string"},"tenant_key":{"description":"The key `signup` returned. Required only when this connection carries no Authorization: Bearer header -- when both are present, the header wins.","type":"string"},"tool":{"description":"Only runs of this tool name.","type":"string"},"trigger":{"description":"Only runs of this trigger kind.","type":"string"}},"required":[]}},{"name":"host.runs.purge","description":"Delete the stored results of every done run finished at or before before_unix; each then reads done with result: null, purged: true. Frees state_bytes_max quota the results were counted against.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"before_unix":{"description":"Purge results of runs finished at or before this unix timestamp.","type":"integer"},"tenant_key":{"description":"The key `signup` returned. Required only when this connection carries no Authorization: Bearer header -- when both are present, the header wins.","type":"string"}},"required":["before_unix"]}},{"name":"host.runs.wait","description":"Long-poll one run until it finalizes or timeout_s elapses (max 25s), returning its current status either way -- for a client with no polling loop of its own.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"run_id":{"description":"The run id to wait on.","type":"string"},"tenant_key":{"description":"The key `signup` returned. Required only when this connection carries no Authorization: Bearer header -- when both are present, the header wins.","type":"string"},"timeout_s":{"description":"Max seconds to wait, capped at 25; default 20.","type":"integer"}},"required":["run_id"]}},{"name":"host.secret_list","description":"List this tenant's secret names (never their values).","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"tenant_key":{"description":"The key `signup` returned. Required only when this connection carries no Authorization: Bearer header -- when both are present, the header wins.","type":"string"}},"required":[]}},{"name":"host.secret_set","description":"Store an encrypted secret value under this tenant's namespace.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"name":{"description":"Secret name, referenced from a spec as secret.<name>.","type":"string"},"tenant_key":{"description":"The key `signup` returned. Required only when this connection carries no Authorization: Bearer header -- when both are present, the header wins.","type":"string"},"value":{"description":"The secret value; stored AES-256-GCM encrypted, never returned.","type":"string"}},"required":["name","value"]}},{"name":"host.self_offboard","description":"Permanently close your own account: disables the tenant, cancels any active Stripe subscription (pro plan), and stops your key from authenticating anything further -- same as an admin-disabled tenant. Idempotent: an already-offboarded key gets the same tenant_disabled/tenant_key_invalid error every other host.*/ billing.* call already gets from it, not a crash. This does not scrub historical usage/signup records -- those stay for audit, same as today's admin-disabled tenants.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"tenant_key":{"description":"The key `signup` returned. Required only when this connection carries no Authorization: Bearer header -- when both are present, the header wins.","type":"string"}},"required":[]}},{"name":"host.state.delete","description":"Delete one key from this tenant's key-value state namespace.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"key":{"description":"Key to delete from this tenant's key-value state namespace.","type":"string"},"tenant_key":{"description":"The key `signup` returned. Required only when this connection carries no Authorization: Bearer header -- when both are present, the header wins.","type":"string"}},"required":["key"]}},{"name":"host.state.delete_rows","description":"Delete rows from a declared table matching an optional where filter (same grammar as host.state.query); omitting where deletes every row in the table.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"table":{"description":"Name of the declared table to delete rows from.","type":"string"},"tenant_key":{"description":"The key `signup` returned. Required only when this connection carries no Authorization: Bearer header -- when both are present, the header wins.","type":"string"},"where":{"description":"Optional filter, same grammar as host.state.query; omit to delete every row.","type":"string"}},"required":["table"]}},{"name":"host.state.get","description":"Read one key from this tenant's key-value state namespace. Returns found: false (not an error) if the key was never set.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"key":{"description":"Key to read from this tenant's key-value state namespace.","type":"string"},"tenant_key":{"description":"The key `signup` returned. Required only when this connection carries no Authorization: Bearer header -- when both are present, the header wins.","type":"string"}},"required":["key"]}},{"name":"host.state.insert","description":"Insert one row (an object) or several (an array of objects) into a declared table. Each row is validated against the table's schema first -- a type mismatch fails the whole call with state_schema_violation and writes nothing.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"rows":{"description":"One row (an object) or several (an array of objects), each validated against the table's schema."},"table":{"description":"Name of the declared table to insert into.","type":"string"},"tenant_key":{"description":"The key `signup` returned. Required only when this connection carries no Authorization: Bearer header -- when both are present, the header wins.","type":"string"}},"required":["table","rows"]}},{"name":"host.state.list","description":"List keys (with their current values) in this tenant's key-value state namespace, optionally filtered by prefix.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"limit":{"description":"Max keys to return; default 100.","type":"integer"},"prefix":{"description":"Only list keys starting with this prefix; default: all keys.","type":"string"},"tenant_key":{"description":"The key `signup` returned. Required only when this connection carries no Authorization: Bearer header -- when both are present, the header wins.","type":"string"}},"required":[]}},{"name":"host.state.query","description":"Read rows from a declared table, optionally filtered (where: \"field op value\", ops = != < <= > >=, clauses joined by ' and '), ordered (order_by: \"field\" or \"field desc\") and capped (limit).","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"limit":{"description":"Max rows to return; optional.","type":"integer"},"order_by":{"description":"Optional \"field\" or \"field desc\" to sort by.","type":"string"},"table":{"description":"Name of the declared table to read from.","type":"string"},"tenant_key":{"description":"The key `signup` returned. Required only when this connection carries no Authorization: Bearer header -- when both are present, the header wins.","type":"string"},"where":{"description":"Optional filter, e.g. \"age > 21\"; ops are != < <= > >=, clauses joined by ' and '.","type":"string"}},"required":["table"]}},{"name":"host.state.set","description":"Write one key in this tenant's key-value state namespace; value may be any JSON value. Overrun of the plan's state_bytes_max quota fails with state_quota_exceeded and writes nothing.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"key":{"description":"Key to write in this tenant's key-value state namespace.","type":"string"},"tenant_key":{"description":"The key `signup` returned. Required only when this connection carries no Authorization: Bearer header -- when both are present, the header wins.","type":"string"},"value":{"description":"Any JSON value to store under key."}},"required":["key","value"]}},{"name":"host.state.table_create","description":"Declare (or replace the schema of) a table in this tenant's state store. schema is {\"column\": \"text\"|\"integer\"|\"real\"|\"boolean\"|\"json\"}; primary_key, if given, must name one of schema's columns -- an insert whose row matches an existing row's primary_key value replaces it.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"name":{"description":"Table name to declare, or replace the schema of.","type":"string"},"primary_key":{"description":"Column name (must be in schema) whose matching value replaces an existing row on insert; optional.","type":"string"},"schema":{"description":"Column name to type map, each type one of text|integer|real|boolean|json, e.g. {\"id\": \"integer\"}.","type":"object"},"tenant_key":{"description":"The key `signup` returned. Required only when this connection carries no Authorization: Bearer header -- when both are present, the header wins.","type":"string"}},"required":["name","schema"]}},{"name":"host.state.table_drop","description":"Drop a declared table and every row it holds.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"name":{"description":"Name of the declared table to drop, with every row it holds.","type":"string"},"tenant_key":{"description":"The key `signup` returned. Required only when this connection carries no Authorization: Bearer header -- when both are present, the header wins.","type":"string"}},"required":["name"]}},{"name":"host.table.append","description":"Append one row (an object) or several (an array of objects) to a declared table. Each row is validated against the table's schema first -- a type mismatch fails the whole call with table_schema_violation and writes nothing.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"rows":{"description":"One row (an object) or several (an array of objects), each validated against the table's schema."},"table":{"description":"Name of the declared table to append to.","type":"string"},"tenant_key":{"description":"The key `signup` returned. Required only when this connection carries no Authorization: Bearer header -- when both are present, the header wins.","type":"string"}},"required":["table","rows"]}},{"name":"host.table.create","description":"Declare a table in this tenant's SQL table store -- a different store from host.state.*'s key-value namespace and its own tables: use host.state.* for a handful of small values, host.table.* when you want real SQL (joins, aggregates, read-only queries) over rows. columns is {\"column\": \"text\"|\"integer\"|\"real\"| \"timestamp\"|\"boolean\"|\"json\"}; primary_key, if given, must name one of columns's own entries.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"columns":{"description":"Column name to type map, each type one of text|integer|real|timestamp|boolean|json, e.g. {\"id\": \"integer\"}.","type":"object"},"name":{"description":"Table name to declare.","type":"string"},"primary_key":{"description":"Column name (must be in columns); optional.","type":"string"},"tenant_key":{"description":"The key `signup` returned. Required only when this connection carries no Authorization: Bearer header -- when both are present, the header wins.","type":"string"}},"required":["name","columns"]}},{"name":"host.table.drop","description":"Drop a declared table and every row it holds.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"name":{"description":"Name of the declared table to drop, with every row it holds.","type":"string"},"tenant_key":{"description":"The key `signup` returned. Required only when this connection carries no Authorization: Bearer header -- when both are present, the header wins.","type":"string"}},"required":["name"]}},{"name":"host.table.list","description":"List this tenant's declared tables, each with its current row count, plus the tenant's whole table-store byte usage.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"tenant_key":{"description":"The key `signup` returned. Required only when this connection carries no Authorization: Bearer header -- when both are present, the header wins.","type":"string"}},"required":[]}},{"name":"host.table.query","description":"Run a single read-only SQL SELECT (CTEs allowed) against this tenant's own tables. Structurally rejected (not by string matching): anything but exactly one SELECT statement, a result over 1,000 rows, or a query running past 5 seconds -- each refusal names the rule or bound it hit.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"sql":{"description":"A single read-only SELECT statement (CTEs allowed) over this tenant's own declared tables.","type":"string"},"tenant_key":{"description":"The key `signup` returned. Required only when this connection carries no Authorization: Bearer header -- when both are present, the header wins.","type":"string"}},"required":["sql"]}},{"name":"host.table.schema","description":"Return one table's columns, types, row count and byte count, without running a query -- how an agent discovers its own table shape.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"table":{"description":"Name of the declared table to describe.","type":"string"},"tenant_key":{"description":"The key `signup` returned. Required only when this connection carries no Authorization: Bearer header -- when both are present, the header wins.","type":"string"}},"required":["table"]}},{"name":"host.tool_call","description":"Invoke a tool this tenant has already published, by its local name -- the same real, metered call as calling it directly by its namespaced name (<namespace>.<name>), for a session that has no way to see its own namespaced tool name yet. Unlike host.tool_test, this counts toward host.usage and appears in host.tool_logs. Pass async: true for a tool that needs more than the call deadline: returns {run_id, status: \"queued\"} immediately instead of running inline -- see host.runs.get/wait.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"args":{"description":"Arguments to pass, validated against the tool's own args_schema.","type":"object"},"async":{"description":"Run as a job instead of inline: returns {run_id, status} within ~50ms under the plan's job_max_s deadline; default false.","type":"boolean"},"name":{"description":"Local name of the tool to invoke.","type":"string"},"tenant_key":{"description":"The key `signup` returned. Required only when this connection carries no Authorization: Bearer header -- when both are present, the header wins.","type":"string"}},"required":["name","args"]}},{"name":"host.tool_list","description":"List this tenant's published tools.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"tenant_key":{"description":"The key `signup` returned. Required only when this connection carries no Authorization: Bearer header -- when both are present, the header wins.","type":"string"}},"required":[]}},{"name":"host.tool_logs","description":"Return the most recent log lines for one of this tenant's tools.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"limit":{"description":"Max lines to return, most recent first; default 20.","type":"integer"},"name":{"description":"Local name of the tool whose log lines to return.","type":"string"},"tenant_key":{"description":"The key `signup` returned. Required only when this connection carries no Authorization: Bearer header -- when both are present, the header wins.","type":"string"}},"required":["name"]}},{"name":"host.tool_publish","description":"Publish a tool of a registered kind (chain, echo, http, python) under this tenant's namespace. Call host.quickstart(kind) first for a filled-in example spec and the full publish-to-call sequence. Name must match ^[a-z][a-z0-9_]{1,40}$; a rejection names the failing field and a corrected example. Try host.tool_test before a real call.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"kind":{"description":"Which registered kind to publish under, e.g. echo, http, python.","type":"string"},"name":{"description":"Local name for the new tool; must match ^[a-z][a-z0-9_]{1,40}$.","type":"string"},"spec":{"description":"The kind-specific spec object; see host.quickstart(kind) for a filled-in example.","type":"object"},"tenant_key":{"description":"The key `signup` returned. Required only when this connection carries no Authorization: Bearer header -- when both are present, the header wins.","type":"string"}},"required":["name","kind","spec"]}},{"name":"host.tool_remove","description":"Remove a published tool by its local name.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"name":{"description":"Local name of the tool to remove.","type":"string"},"tenant_key":{"description":"The key `signup` returned. Required only when this connection carries no Authorization: Bearer header -- when both are present, the header wins.","type":"string"}},"required":["name"]}},{"name":"host.tool_run","description":"Debug-run a published python tool for stdout, stderr and exit code; for the other cases see host.quickstart.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"args":{"description":"Arguments to pass, same shape as a real call.","type":"object"},"name":{"description":"Local name of the already-published python tool to debug-run.","type":"string"},"tenant_key":{"description":"The key `signup` returned. Required only when this connection carries no Authorization: Bearer header -- when both are present, the header wins.","type":"string"}},"required":["name","args"]}},{"name":"host.tool_share","description":"Share one of this tenant's published tools with everyone (visibility: \"public\") or with a named group this tenant owns (visibility: \"group\", group: <name>). The tool keeps running in this tenant's own sandbox with this tenant's own secrets; a caller reaches it as <this tenant's namespace>.<name>.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"description":{"description":"Catalog-facing blurb; shown by host.catalog.search/get.","type":"string"},"group":{"description":"Required when visibility is \"group\"; must already exist (host.group.create).","type":"string"},"name":{"description":"Local name of the tool to share.","type":"string"},"tenant_key":{"description":"The key `signup` returned. Required only when this connection carries no Authorization: Bearer header -- when both are present, the header wins.","type":"string"},"visibility":{"description":"\"public\" or \"group\".","type":"string"}},"required":["name","visibility"]}},{"name":"host.tool_test","description":"Dry-run an already-published tool by name, no calls row written; for the other cases see host.quickstart.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"args":{"description":"Arguments to pass, same shape as a real call.","type":"object"},"name":{"description":"Local name of the already-published tool to dry-run.","type":"string"},"tenant_key":{"description":"The key `signup` returned. Required only when this connection carries no Authorization: Bearer header -- when both are present, the header wins.","type":"string"}},"required":["name","args"]}},{"name":"host.tool_unshare","description":"Take a shared tool back to private.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"name":{"description":"Local name of the tool to unshare.","type":"string"},"tenant_key":{"description":"The key `signup` returned. Required only when this connection carries no Authorization: Bearer header -- when both are present, the header wins.","type":"string"}},"required":["name"]}},{"name":"host.trigger.fire","description":"Run a schedule once right now, for testing -- recorded as trigger: \"schedule\" with manual: true, independent of next_unix or pause state.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"id":{"description":"The trigger id.","type":"string"},"tenant_key":{"description":"The key `signup` returned. Required only when this connection carries no Authorization: Bearer header -- when both are present, the header wins.","type":"string"}},"required":["id"]}},{"name":"host.trigger.get","description":"Read one trigger's current schedule, next_unix, last_run_id and last_status.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"id":{"description":"The trigger id.","type":"string"},"tenant_key":{"description":"The key `signup` returned. Required only when this connection carries no Authorization: Bearer header -- when both are present, the header wins.","type":"string"}},"required":["id"]}},{"name":"host.trigger.list","description":"List this tenant's triggers (optionally filtered by tool), each with next_unix, last_run_id and last_status (schedule), or url/verify/unverified (event).","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"tenant_key":{"description":"The key `signup` returned. Required only when this connection carries no Authorization: Bearer header -- when both are present, the header wins.","type":"string"},"tool":{"description":"Only triggers on this tool name.","type":"string"}},"required":[]}},{"name":"host.trigger.pause","description":"Stop a trigger from firing until resumed; still counts toward schedules_max.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"id":{"description":"The trigger id.","type":"string"},"tenant_key":{"description":"The key `signup` returned. Required only when this connection carries no Authorization: Bearer header -- when both are present, the header wins.","type":"string"}},"required":["id"]}},{"name":"host.trigger.remove","description":"Delete a trigger outright (frees its schedules_max slot, unlike pause).","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"id":{"description":"The trigger id.","type":"string"},"tenant_key":{"description":"The key `signup` returned. Required only when this connection carries no Authorization: Bearer header -- when both are present, the header wins.","type":"string"}},"required":["id"]}},{"name":"host.trigger.replay","description":"Re-run a past event- or message-triggered run's exact stored event/envelope (no re-verification -- the original delivery already passed it). The new run's trigger_ref names the original run id.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"run_id":{"description":"The event- or message-triggered run id to replay.","type":"string"},"tenant_key":{"description":"The key `signup` returned. Required only when this connection carries no Authorization: Bearer header -- when both are present, the header wins.","type":"string"}},"required":["run_id"]}},{"name":"host.trigger.resume","description":"Re-enable a paused trigger; if its scheduled time already passed, the next tick fires it once (a missed firing is never replayed).","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"id":{"description":"The trigger id.","type":"string"},"tenant_key":{"description":"The key `signup` returned. Required only when this connection carries no Authorization: Bearer header -- when both are present, the header wins.","type":"string"}},"required":["id"]}},{"name":"host.trigger.set","description":"Run a published tool on a cron schedule (5-field: minute hour day-of-month month day-of-week, UTC), give it a public webhook URL (kind=\"event\"): a signed POST to that URL runs the tool with the event as its argument, or fire it whenever this tenant receives a message (kind=\"message\"): the tool runs with the message envelope as its argument. Each firing/delivery is a run visible in host.runs.list(trigger=\"schedule\"|\"event\"|\"message\"). Refuses schedules_max/event_triggers_max (trigger_quota_exceeded, shared by event and message triggers) or a too-short schedule interval (trigger_interval_too_short); an invalid expression or verify config fails trigger_invalid naming the field.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"args":{"description":"Arguments passed to the tool on each firing/delivery (kind=\"schedule\"/\"event\" only -- a message trigger's whole argument is the message envelope).","type":"object"},"dedupe_header":{"description":"kind=\"event\": a header (e.g. X-GitHub-Delivery) whose repeated value within 24h answers 202 with the original run id instead of running again.","type":"string"},"from":{"description":"kind=\"message\": only fire for messages from this address (@handle or t_... namespace); omit to fire for any sender.","type":"string"},"kind":{"description":"\"schedule\" (default), \"event\" or \"message\".","type":"string"},"schedule":{"description":"kind=\"schedule\": 5-field cron expression (minute hour day-of-month month day-of-week), UTC. Supports *, lists, ranges and steps.","type":"string"},"tenant_key":{"description":"The key `signup` returned. Required only when this connection carries no Authorization: Bearer header -- when both are present, the header wins.","type":"string"},"tool":{"description":"The published tool this trigger runs.","type":"string"},"tz":{"description":"kind=\"schedule\" P1: only \"UTC\" (or omitted) works today.","type":"string"},"verify":{"description":"kind=\"event\": {scheme: \"hmac-sha256\"|\"hmac-sha1\"|\"token\"|\"none\", header, secret (a host.secret_set name), prefix?, timestamp_header?, tolerance_s?, allow_unverified? (required true for scheme \"none\")}.","type":"object"}},"required":["tool"]}},{"name":"host.trigger.test","description":"Dry-run an event trigger's verify config against a payload you supply, without exposing its real URL -- verifies the signature exactly as POST /hooks/... would, then runs the tool with the event as its argument. Or, on a message trigger, runs the tool with a synthetic envelope (test: true, no messages row created). The run is marked test: true. A wrong signature fails signature_invalid, naming the header it checked.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"body":{"description":"kind=\"event\": the payload to verify and run with -- any JSON value. kind=\"message\": the synthetic envelope's body text."},"data":{"description":"kind=\"message\": the synthetic envelope's data payload."},"from":{"description":"kind=\"message\": the synthetic envelope's from address; default \"@test\".","type":"string"},"headers":{"description":"kind=\"event\": header name -> string value, e.g. {\"X-Hub-Signature-256\": \"sha256=...\"}.","type":"object"},"id":{"description":"The event or message trigger id.","type":"string"},"tenant_key":{"description":"The key `signup` returned. Required only when this connection carries no Authorization: Bearer header -- when both are present, the header wins.","type":"string"}},"required":["id"]}},{"name":"host.usage","description":"Calls, errors and duration percentiles for this tenant over a window.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"tenant_key":{"description":"The key `signup` returned. Required only when this connection carries no Authorization: Bearer header -- when both are present, the header wins.","type":"string"},"window":{"description":"Time window to summarize, e.g. \"24h\"; default 24h.","type":"string"}},"required":[]}},{"name":"host.whoami","description":"Return the calling tenant's identity, including key_age_s and key_rotated_at for auditing credential hygiene.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"tenant_key":{"description":"The key `signup` returned. Required only when this connection carries no Authorization: Bearer header -- when both are present, the header wins.","type":"string"}},"required":[]}},{"name":"signup","description":"Create a tenant and receive a bearer key and namespace. Unauthenticated. Recommended: pass handoff: true to receive a short-lived, single-use handoff_token instead of the raw key -- redeem it once with host.redeem to get the key, so a transcript of this call and the redeem call, if it leaks, carries a dead credential. The raw-key path (handoff omitted) stays fully supported.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"handoff":{"description":"Recommended: true to receive a handoff_token (redeem via host.redeem) instead of the raw key. Default false (raw key, unchanged).","type":"boolean"},"name":{"description":"display name","type":"string"}},"required":["name"]}}],"scan":{"score":56,"grade":"C","scanned_at":"2026-09-19T21:42:41.475Z","report":{"scannerVersion":"0.1.9","scannedAt":"2026-09-19T21:42:41.449Z","components":{"code":{"score":-1,"max":25,"notes":["remote-only server, no package to scan"]},"reliability":{"score":17,"max":20,"notes":["remote reachable in 2091ms"]},"poisoning":{"score":15,"max":15,"notes":["77 tool descriptions checked"]},"auth":{"score":3,"max":15,"notes":["open endpoint exposes 25 write-action tools with no auth"]},"maintenance":{"score":3,"max":15,"notes":["no repository listed"]},"identity":{"score":4,"max":10,"notes":["verified namespace with website, no repo"]}},"findings":[{"id":"auth.open-write","severity":"high","component":"auth","title":"Write-action tools reachable without authentication"},{"id":"maint.no-repo","severity":"low","component":"maintenance","title":"No source repository listed"}],"inputs":{"probes":[{"url":"https://mcphost.dev/mcp","reachable":true,"authRequired":false,"latencyMs":2091,"serverInfo":{"name":"rmcp","version":"3.3.0"}}],"packages":[],"repo":{"found":false},"icon":{"url":null,"source":"none"},"presence":{"stars":null,"forks":null,"downloadsWeek":null,"license":null,"lastPushAt":null,"score":8}}}},"grade_history":[],"reviews":[]}