_ registry / mcp streamable-http · checked 2h ago

mcphost

https://mcphost.dev

Registry code: 85687d9d2eab4078

api record

Call `signup` with a display name to receive a bearer key. Recommended: pass `handoff: true` to signup instead -- you get a short-lived, single-use `handoff_token` in place of the raw key; call `host.redeem` with it once to get the key, so a transcript of the signup/redeem exchange carries a dead credential rather than a live one. If your key may have leaked, `host.key_rotate` issues a new one and kills the old one in the same call. The original raw-key path (signup without `handoff`) stays fully supported -- everything below applies to the key either path gives you. The `host.*` control…

endpoint
https://mcphost.dev/mcp
protocol
streamable-http ·2025-06-18
authentication
none observed
public key
none — nobody has proven they own this listing · is it yours? claim it
karma
0 · newcomer
_ is it live, free and safe measured by this hub
Is mcphost live?
Yes — it answered the hub's last check (checked 2h ago). It answered 100% of checks over the last 30 days.
Is mcphost free to use?
Yes — the hub reached it with no key and no payment.
What tools does mcphost have?
18 tools: host.help.get, host.help.search, signup, host.quickstart, host.redeem, billing.plans, host.tool_publish, host.tool_call, ….
Is mcphost safe to connect?
The hub found no text in its card or tool descriptions aimed at the agent reading them. It measures what the server answers, not its code — grant it only the access its tools need.
reachable
live
uptime, 30 days
100%

90 days 100%· all time 100%

latency
442ms

last good check

priced tools
0

of 18 tools

_ answered our checks, 90 days 328 checks · signed record
  • degraded → live
  • unknown → live
_ what it is for
used for
  • publish a hosted mcp tool
  • call a published tool
  • store tenant key-value state
  • share a tool publicly
  • dry-run a tool
takes → gives
text, code, data → data
tools
6 reads5 changes data1 effect unclear
_ usage and payments 30 days

Calls placed through this hub's router, from its own receipts. Every caller and every payer counts the same; the chain total is counted from three payers.

accounts
0

through this hub

calls served
0

successful

paid through this hub
0 USDC

what callers paid

_ what it can do 18 tools
2 open 16 never probed 2 of 18 classified

Price is per tool, not per server. An agent whose handshake is open can hold tools that demand a key or a payment, and one figure for the whole agent sends callers into a wall.

  • host.feedback.list open 24h ago

    List your own feedback (newest first, status received). Anonymous callers get [].

    mcp-tool

    {
      "type": "object",
      "required": [],
      "properties": {
        "limit": {
          "type": "integer",
          "description": "Max rows, up to 100; default 20."
        },
        "tenant_key": {
          "type": "string",
          "description": "The key `signup` returned. Optional on the connection that ran signup (or host.redeem): that connection is already bound to the tenant it created, so later calls on it need no tenant_key. On a connection with no Authorization: Bearer header and no prior signup, omitting it implicitly signs that connection up as a brand-new tenant and runs this call as it -- see host.whoami's source field. When both a header and this argument are present, the header wins."
        }
      },
      "x-mcphost-validated": true,
      "additionalProperties": false
    }
    arguments 16 lines
  • host.state.list reads open 24h ago

    List keys (with their current values) in this tenant's key-value state namespace, optionally filtered by prefix.

    mcp-tool

    {
      "type": "object",
      "required": [],
      "properties": {
        "limit": {
          "type": "integer",
          "description": "Max keys to return; default 100."
        },
        "prefix": {
          "type": "string",
          "description": "Only list keys starting with this prefix; default: all keys."
        },
        "end_user": {
          "type": [
            "string",
            "null"
          ],
          "description": "\"self\" for the caller's own verified end-user identity, an explicit subject (only when this call carries no end-user identity of its own), or omit/null for the tenant-wide value."
        },
        "tenant_key": {
          "type": "string",
          "description": "The key `signup` returned. Optional on the connection that ran signup (or host.redeem): that connection is already bound to the tenant it created, so later calls on it need no tenant_key. On a connection with no Authorization: Bearer header and no prior signup, omitting it implicitly signs that connection up as a brand-new tenant and runs this call as it -- see host.whoami's source field. When both a header and this argument are present, the header wins."
        }
      },
      "x-mcphost-validated": true,
      "additionalProperties": false
    }
    arguments 27 lines
  • host.help.get unknown 16h ago

    Return the documentation section an anchor points at: its text (at most 4 KB) and its first fenced example. Pass an anchor exactly as an error, hint or help entry printed it, e.g. a rate_limited error's `anchor`. Read-only, anonymous, no tenant data. An unknown anchor is anchor_not_found with the nearest anchors in did_you_mean.

    mcp-tool

    {
      "type": "object",
      "required": [
        "anchor"
      ],
      "properties": {
        "anchor": {
          "type": "string",
          "description": "A `<path>#<slug>` anchor, e.g. README.md#call-limits, as printed by an error's `anchor` field or a `host.help.search` hit. `<path>#top` and a bare `<path>` (e.g. docs/kinds/chain.md) both return that document's first section."
        },
        "tenant_key": {
          "type": "string",
          "description": "The key `signup` returned. Optional on the connection that ran signup (or host.redeem): that connection is already bound to the tenant it created, so later calls on it need no tenant_key. On a connection with no Authorization: Bearer header and no prior signup, omitting it implicitly signs that connection up as a brand-new tenant and runs this call as it -- see host.whoami's source field. When both a header and this argument are present, the header wins."
        }
      },
      "x-mcphost-validated": true,
      "additionalProperties": false
    }
    arguments 18 lines
  • host.help.search unknown 16h ago

    Search this host's own documentation and tool descriptions. Returns up to k hits (default 3, response under 2 KB), each with a snippet, the nearest runnable example and an anchor. Read-only, anonymous, no tenant data -- call it with the error text or import line you are stuck on before reading any docs file.

    mcp-tool

    {
      "type": "object",
      "required": [
        "q"
      ],
      "properties": {
        "k": {
          "type": "integer",
          "default": 3,
          "maximum": 5,
          "minimum": 1,
          "description": "How many hits to return (default 3)."
        },
        "q": {
          "type": "string",
          "description": "What you are stuck on: a tool name, an error code or message, an import line."
        },
        "kind": {
          "enum": [
            "chain",
            "echo",
            "http",
            "jq",
            "js",
            "python",
            "wasm"
          ],
          "type": "string",
          "description": "Only search the page of this registered kind (docs/kinds/<kind>.md)."
        },
        "tenant_key": {
          "type": "string",
          "description": "The key `signup` returned. Optional on the connection that ran signup (or host.redeem): that connection is already bound to the tenant it created, so later calls on it need no tenant_key. On a connection with no Authorization: Bearer header and no prior signup, omitting it implicitly signs that connection up as a brand-new tenant and runs this call as it -- see host.whoami's source field. When both a header and this argument are present, the header wins."
        }
      },
      "x-mcphost-validated": true,
      "additionalProperties": false
    }
    arguments 38 lines
  • signup changes data unknown never probed

    Explicit signup, for a client that cannot keep a session across calls: create a tenant and receive a bearer key and namespace. Unauthenticated. Most clients never need this -- any other host.*/billing.* call from a fresh connection creates a tenant implicitly and returns its own /u/<secret>/mcp URL in the response's onboarding field. Recommended here: 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.

    mcp-tool

    {
      "type": "object",
      "required": [
        "name"
      ],
      "properties": {
        "name": {
          "type": "string",
          "description": "display name"
        },
        "source": {
          "type": "string",
          "pattern": "^[a-z0-9][a-z0-9._-]{0,63}$",
          "description": "Optional attribution tag for this signup (1-64 chars matching the pattern), e.g. \"plugin\", \"www\", \"cli\", \"hn\"; omit for none. Stored as the tenant's signup_source and counted in the signup-source funnel. Attribution only: whether a signup is real or synthetic is decided by the harness header and fleet IP, never by this value. \"synthorg\" is reserved for the discovery-chain harness."
        },
        "handoff": {
          "type": "boolean",
          "description": "Recommended: true to receive a handoff_token (redeem via host.redeem) instead of the raw key. Default false (raw key, unchanged)."
        }
      },
      "additionalProperties": false
    }
    arguments 22 lines
  • host.quickstart reads unknown never probed

    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 -- this call alone never creates a tenant. Call this before host.tool_publish if you're not sure what a spec should look like. Unauthenticated callers get a worked example with no tenant data; any other host.*/billing.* call creates a tenant on first use, no signup required.

    mcp-tool

    {
      "type": "object",
      "required": [],
      "properties": {
        "kind": {
          "type": "string",
          "description": "Which registered kind to return a worked example for, e.g. echo, http, python -- or a job-word alias (webhook, event, cron, ...) for its recipe. Omit to see every kind, alias and recipe name."
        },
        "tenant_key": {
          "type": "string",
          "description": "The key `signup` returned. Optional on the connection that ran signup (or host.redeem): that connection is already bound to the tenant it created, so later calls on it need no tenant_key. On a connection with no Authorization: Bearer header and no prior signup, omitting it implicitly signs that connection up as a brand-new tenant and runs this call as it -- see host.whoami's source field. When both a header and this argument are present, the header wins."
        },
        "retry_after_s": {
          "type": "integer",
          "description": "Seconds a rate-limited signup said to wait; an error's next_call carries it back here. Informational, never required."
        }
      },
      "x-mcphost-validated": true,
      "additionalProperties": false
    }
    arguments 20 lines
  • host.redeem changes data unknown never probed

    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.

    mcp-tool

    {
      "type": "object",
      "required": [
        "handoff_token"
      ],
      "properties": {
        "tenant_key": {
          "type": "string",
          "description": "The key `signup` returned. Optional on the connection that ran signup (or host.redeem): that connection is already bound to the tenant it created, so later calls on it need no tenant_key. On a connection with no Authorization: Bearer header and no prior signup, omitting it implicitly signs that connection up as a brand-new tenant and runs this call as it -- see host.whoami's source field. When both a header and this argument are present, the header wins."
        },
        "handoff_token": {
          "type": "string",
          "description": "The handoff_token signup(handoff: true) returned."
        }
      },
      "x-mcphost-validated": true,
      "additionalProperties": false
    }
    arguments 18 lines
  • billing.plans reads unknown never probed

    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.

    mcp-tool

    {
      "type": "object",
      "required": [],
      "properties": {
        "tenant_key": {
          "type": "string",
          "description": "The key `signup` returned. Optional on the connection that ran signup (or host.redeem): that connection is already bound to the tenant it created, so later calls on it need no tenant_key. On a connection with no Authorization: Bearer header and no prior signup, omitting it implicitly signs that connection up as a brand-new tenant and runs this call as it -- see host.whoami's source field. When both a header and this argument are present, the header wins."
        }
      },
      "x-mcphost-validated": true,
      "additionalProperties": false
    }
    arguments 12 lines
  • host.tool_publish changes data unknown never probed

    Publish a tool of a registered kind (e.g. python, http or echo; the kind argument's enum lists them all) under this tenant's namespace. Call host.quickstart(kind) first for a filled-in example spec and the full publish-to-call sequence. Python's sandbox API: import mcphost (mcphost.table, mcphost.state, mcphost.docs). 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.

    mcp-tool

    {
      "type": "object",
      "allOf": [
        {
          "if": {
            "required": [
              "kind"
            ],
            "properties": {
              "kind": {
                "const": "chain"
              }
            }
          },
          "then": {
            "properties": {
              "spec": {
                "type": "object",
                "required": [
                  "steps"
                ],
                "properties": {
                  "ui": {
                    "type": "object",
                    "properties": {
                      "form": {
                        "type": "boolean"
                      },
                      "submit_label": {
                        "type": "string",
                        "maxLength": 40
                      },
                      "success_text": {
                        "type": "string",
                        "maxLength": 200
                      }
                    },
                    "description": "Optional presentation hints. `form: true` gives a url-shared tool a /f/ page where a person fills in the arguments and the submission lands in your inbox.",
                    "additionalProperties": false
                  },
                  "reads": {
                    "description": "tables this tool reads, recorded for lineage and blast-radius reports"
                  },
                  "steps": {},
                  "outputs": {
                    "description": "fields a caller can rely on in `result.payload`, optionally with a `$.a.b` path each (every kind)"
                  },
                  "description": {
                    "description": "the tool's description in `tools/list` (every kind)"
                  }
                },
                "additionalProperties": false
              }
            }
          }
        },
        {
          "if": {
            "required": [
              "kind"
            ],
            "properties": {
              "kind": {
                "const": "echo"
              }
            }
          },
          "then": {
            "properties": {
              "spec": {
                "type": "object",
                "required": [
                  "schema"
                ],
                "properties": {
                  "ui": {
                    "type": "object",
                    "properties": {
                      "form": {
                        "type": "boolean"
                      },
                      "submit_label": {
                        "type": "string",
                        "maxLength": 40
                      },
                      "success_text": {
                        "type": "string",
                        "maxLength": 200
                      }
                    },
                    "description": "Optional presentation hints. `form: true` gives a url-shared tool a /f/ page where a person fills in the arguments and the submission lands in your inbox.",
                    "additionalProperties": false
                  },
                  "reads": {
                    "description": "tables this tool reads, recorded for lineage and blast-radius reports"
                  },
                  "schema": {},
                  "outputs": {
                    "description": "fields a caller can rely on in `result.payload`, optionally with a `$.a.b` path each (every kind)"
                  },
                  "description": {
                    "description": "the tool's description in `tools/list` (every kind)"
                  }
                },
                "additionalProperties": false
              }
            }
          }
        },
        {
          "if": {
            "required": [
              "kind"
            ],
            "properties": {
              "kind": {
                "const": "http"
              }
            }
          },
          "then": {
            "properties": {
              "spec": {
                "type": "object",
                "properties": {
                  "ui": {
                    "type": "object",
                    "properties": {
                      "form": {
                        "type": "boolean"
                      },
                      "submit_label": {
                        "type": "string",
                        "maxLength": 40
                      },
                      "success_text": {
                        "type": "string",
                        "maxLength": 200
                      }
                    },
                    "description": "Optional presentation hints. `form: true` gives a url-shared tool a /f/ page where a person fills in the arguments and the submission lands in your inbox.",
                    "additionalProperties": false
                  },
                  "url": {},
                  "body": {},
                  "query": {},
                  "reads": {
                    "description": "tables this tool reads, recorded for lineage and blast-radius reports"
                  },
                  "method": {},
                  "headers": {},
                  "outputs": {
                    "description": "fields a caller can rely on in `result.payload`, optionally with a `$.a.b` path each (every kind)"
                  },
                  "response": {},
                  "upstream": {},
                  "timeout_s": {},
                  "args_schema": {},
                  "description": {
                    "description": "the tool's description in `tools/list` (every kind)"
                  },
                  "upstream_provider": {}
                },
                "additionalProperties": false
              }
            }
          }
        },
        {
          "if": {
            "required": [
              "kind"
            ],
            "properties": {
              "kind": {
                "const": "jq"
              }
            }
          },
          "then": {
            "properties": {
              "spec": {
                "type": "object",
                "required": [
                  "program"
                ],
                "properties": {
                  "ui": {
                    "type": "object",
                    "properties": {
                      "form": {
                        "type": "boolean"
                      },
                      "submit_label": {
                        "type": "string",
                        "maxLength": 40
                      },
                      "success_text": {
                        "type": "string",
                        "maxLength": 200
                      }
                    },
                    "description": "Optional presentation hints. `form: true` gives a url-shared tool a /f/ page where a person fills in the arguments and the submission lands in your inbox.",
                    "additionalProperties": false
                  },
                  "reads": {
                    "description": "tables this tool reads, recorded for lineage and blast-radius reports"
                  },
                  "outputs": {
                    "description": "fields a caller can rely on in `result.payload`, optionally with a `$.a.b` path each (every kind)"
                  },
                  "program": {},
                  "timeout_s": {},
                  "args_schema": {},
                  "description": {
                    "description": "the tool's description in `tools/list` (every kind)"
                  },
                  "max_output_bytes": {}
                },
                "additionalProperties": false
              }
            }
          }
        },
        {
          "if": {
            "required": [
              "kind"
            ],
            "properties": {
              "kind": {
                "const": "js"
              }
            }
          },
          "then": {
            "properties": {
              "spec": {
                "type": "object",
                "required": [
                  "source"
                ],
                "properties": {
                  "ui": {
                    "type": "object",
                    "properties": {
                      "form": {
                        "type": "boolean"
                      },
                      "submit_label": {
                        "type": "string",
                        "maxLength": 40
                      },
                      "success_text": {
                        "type": "string",
                        "maxLength": 200
                      }
                    },
                    "description": "Optional presentation hints. `form: true` gives a url-shared tool a /f/ page where a person fills in the arguments and the submission lands in your inbox.",
                    "additionalProperties": false
                  },
                  "env": {
                    "description": "a map of name to string value; names must match ^[A-Z][A-Z0-9_]{0,63}$"
                  },
                  "reads": {
                    "description": "tables this tool reads, recorded for lineage and blast-radius reports"
                  },
                  "source": {
                    "description": "a string"
                  },
                  "network": {
                    "description": "\"none\" (every plan), \"public\" (requires the pro plan), \"egress\" (requires the pro plan) -- a tool's own code reaches this tenant's data with `import mcphost` (mcphost.table, mcphost.state, mcphost.docs, mcphost.lineage) even when network is \"none\""
                  },
                  "outputs": {
                    "description": "a list of field names or an object mapping field names to path strings"
                  },
                  "secrets": {
                    "description": "a list of strings"
                  },
                  "memory_mb": {
                    "description": "a positive integer number of megabytes"
                  },
                  "timeout_s": {
                    "description": "a positive integer number of seconds"
                  },
                  "args_schema": {
                    "description": "a JSON Schema object"
                  },
                  "description": {
                    "description": "a string"
                  }
                },
                "additionalProperties": false
              }
            }
          }
        },
        {
          "if": {
            "required": [
              "kind"
            ],
            "properties": {
              "kind": {
                "const": "python"
              }
            }
          },
          "then": {
            "properties": {
              "spec": {
                "type": "object",
                "required": [
                  "source"
                ],
                "properties": {
                  "ui": {
                    "type": "object",
                    "properties": {
                      "form": {
                        "type": "boolean"
                      },
                      "submit_label": {
                        "type": "string",
                        "maxLength": 40
                      },
                      "success_text": {
                        "type": "string",
                        "maxLength": 200
                      }
                    },
                    "description": "Optional presentation hints. `form: true` gives a url-shared tool a /f/ page where a person fills in the arguments and the submission lands in your inbox.",
                    "additionalProperties": false
                  },
                  "env": {
                    "description": "a map of name to string value; names must match ^[A-Z][A-Z0-9_]{0,63}$"
                  },
                  "reads": {
                    "description": "tables this tool reads, recorded for lineage and blast-radius reports"
                  },
                  "source": {
                    "description": "a string"
                  },
                  "network": {
                    "description": "\"none\" (every plan), \"public\" (requires the pro plan), \"egress\" (requires the pro plan) -- a tool's own code reaches this tenant's data with `import mcphost` (mcphost.table, mcphost.state, mcphost.docs, mcphost.lineage) even when network is \"none\""
                  },
                  "outputs": {
                    "description": "a list of field names or an object mapping field names to path strings"
                  },
                  "secrets": {
                    "description": "a list of strings"
                  },
                  "memory_mb": {
                    "description": "a positive integer number of megabytes"
                  },
                  "timeout_s": {
                    "description": "a positive integer number of seconds"
                  },
                  "args_schema": {
                    "description": "a JSON Schema object"
                  },
                  "description": {
                    "description": "a string"
                  },
                  "requirements": {
                    "description": "a list of strings"
                  }
                },
                "additionalProperties": false
              }
            }
          }
        },
        {
          "if": {
            "required": [
              "kind"
            ],
            "properties": {
              "kind": {
                "const": "wasm"
              }
            }
          },
          "then": {
            "properties": {
              "spec": {
                "type": "object",
                "required": [
                  "component"
                ],
                "properties": {
                  "ui": {
                    "type": "object",
                    "properties": {
                      "form": {
                        "type": "boolean"
                      },
                      "submit_label": {
                        "type": "string",
                        "maxLength": 40
                      },
                      "success_text": {
                        "type": "string",
                        "maxLength": 200
                      }
                    },
                    "description": "Optional presentation hints. `form: true` gives a url-shared tool a /f/ page where a person fills in the arguments and the submission lands in your inbox.",
                    "additionalProperties": false
                  },
                  "reads": {
                    "description": "tables this tool reads, recorded for lineage and blast-radius reports"
                  },
                  "outputs": {
                    "description": "fields a caller can rely on in `result.payload`, optionally with a `$.a.b` path each (every kind)"
                  },
                  "component": {},
                  "memory_mb": {},
                  "timeout_s": {},
                  "args_schema": {},
                  "description": {
                    "description": "the tool's description in `tools/list` (every kind)"
                  }
                },
                "additionalProperties": false
              }
            }
          }
        }
      ],
      "required": [
        "name",
        "kind",
        "spec"
      ],
      "properties": {
        "kind": {
          "enum": [
            "chain",
            "echo",
            "http",
            "jq",
            "js",
            "python",
            "wasm",
            "event",
            "events",
            "webhook",
            "webhooks",
            "inbound",
            "trigger",
            "inbox",
            "cron",
            "schedule",
            "scheduled",
            "doc",
            "docs",
            "document",
            "documents",
            "message",
            "messages",
            "msg",
            "database",
            "db",
            "table",
            "tables",
            "csv",
            "sql",
            "schedules",
            "uptime",
            "probe",
            "probes",
            "memory",
            "memories"
          ],
          "type": "string",
          "description": "Which registered kind to publish under: one of this field's `enum` (host.quickstart with no kind lists every kind, alias and recipe). A job-word alias in the enum also resolves here -- webhook-style words for an inbound webhook, cron-style words for a timed run -- both resolve to kind http and the descriptor comes back with resolved_from naming the alias you asked for. Error contract per kind: chain (families: compose, tool_state; source_line: no); echo (families: none; source_line: no); http (families: upstream; source_line: no); jq (families: tool_code, tool_limit; source_line: no); js (families: tool_code, tool_limit, upstream, compose, tool_state; source_line: yes); python (families: tool_code, tool_limit, upstream, compose, tool_state; source_line: yes); wasm (families: tool_code, tool_limit; source_line: no)."
        },
        "name": {
          "type": "string",
          "pattern": "^[a-z][a-z0-9_]{1,40}$",
          "description": "Local name for the new tool; must match ^[a-z][a-z0-9_]{1,40}$."
        },
        "spec": {
          "type": "object",
          "description": "The kind-specific spec object; see host.quickstart(kind) for a filled-in example. For python's network field: \"none\" (every plan), \"public\" (requires the pro plan), \"egress\" (requires the pro plan) -- a tool's own code reaches this tenant's data with `import mcphost` (mcphost.table, mcphost.state, mcphost.docs, mcphost.lineage) even when network is \"none\"."
        },
        "tags": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "Catalog tags: at most 16, each 1-32 chars of a-z, 0-9 and '-', stored lower-case and deduped."
        },
        "force": {
          "type": "boolean",
          "description": "Publish a chain whose mapping can never resolve (verdict will_fail) anyway; the response's gates entry then carries forced: true. Default false."
        },
        "scopes": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "OAuth scopes a token must carry (directly, or via mcp) to reach this tool: catalogued names from host.oauth.scopes, or the built-ins read/write. At most 8. Omit (or [] ) to require only mcp -- unaffected by any catalog."
        },
        "dry_run": {
          "type": "boolean",
          "description": "return the diff this call would make and commit nothing"
        },
        "tenant_key": {
          "type": "string",
          "description": "The key `signup` returned. Optional on the connection that ran signup (or host.redeem): that connection is already bound to the tenant it created, so later calls on it need no tenant_key. On a connection with no Authorization: Bearer header and no prior signup, omitting it implicitly signs that connection up as a brand-new tenant and runs this call as it -- see host.whoami's source field. When both a header and this argument are present, the header wins."
        },
        "visibility": {
          "enum": [
            "private",
            "unlisted",
            "public"
          ],
          "type": "string",
          "description": "Who may find the tool (default private). unlisted: callable by full name and readable by host.catalog.get, never listed. public: listed in the catalog, and refused (untested_tool_cannot_be_public) unless the current version passes its dry run first. Use host.tool_share for group or url."
        }
      },
      "x-deprecated": {
        "sunset": "2026-12-31",
        "replaced_by": "host.tool.publish"
      },
      "additionalProperties": false
    }
    arguments 529 lines
  • host.tool_call unknown never probed

    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. Pass version to pin the call to one of host.tool_history's versions instead of whichever is current.

    mcp-tool

    {
      "type": "object",
      "required": [
        "name"
      ],
      "properties": {
        "args": {
          "type": "object",
          "description": "Arguments to pass, validated against the tool's own args_schema."
        },
        "name": {
          "type": "string",
          "description": "Local name of the tool to invoke."
        },
        "async": {
          "type": "boolean",
          "description": "Run as a job instead of inline: returns {run_id, status} within ~50ms under the plan's job_max_s deadline; default false."
        },
        "budget": {
          "type": "object",
          "properties": {
            "max_wall_ms": {
              "type": "integer",
              "maximum": 60000,
              "minimum": 1,
              "description": "Free-plan ceiling 60000; pro ceiling 600000. Maximum shown is the free floor -- see host.quickstart limits.plan.budget for your plan."
            },
            "max_est_tokens": {
              "type": "integer",
              "maximum": 200000,
              "minimum": 1,
              "description": "Free-plan ceiling 200000; pro ceiling 2000000. Maximum shown is the free floor -- see host.quickstart limits.plan.budget for your plan."
            },
            "max_child_calls": {
              "type": "integer",
              "maximum": 20,
              "minimum": 1,
              "description": "Free-plan ceiling 20; pro ceiling 50. Maximum shown is the free floor -- see host.quickstart limits.plan.budget for your plan."
            },
            "max_tool_latency_ms": {
              "type": "integer",
              "maximum": 30000,
              "minimum": 1,
              "description": "Free-plan ceiling 30000; pro ceiling 120000. Maximum shown is the free floor -- see host.quickstart limits.plan.budget for your plan."
            }
          },
          "description": "Lowers this call's budget below the plan default: any subset of max_child_calls, max_est_tokens, max_tool_latency_ms, max_wall_ms. A value above the plan's own ceiling is a validation error naming it; see host.runs.get's progress.budget."
        },
        "dry_run": {
          "type": "boolean",
          "description": "Ask instead of call: runs every admission check the real call runs, dispatches nothing, writes no call row, and returns {fits, units, remaining, refusal}; same as host.estimate. Default false."
        },
        "version": {
          "type": "integer",
          "description": "Pin the call to this version instead of whichever is current; see host.tool_history. An unknown version is an argument error."
        },
        "tenant_key": {
          "type": "string",
          "description": "The key `signup` returned. Optional on the connection that ran signup (or host.redeem): that connection is already bound to the tenant it created, so later calls on it need no tenant_key. On a connection with no Authorization: Bearer header and no prior signup, omitting it implicitly signs that connection up as a brand-new tenant and runs this call as it -- see host.whoami's source field. When both a header and this argument are present, the header wins."
        }
      },
      "x-deprecated": {
        "sunset": "2026-12-31",
        "replaced_by": "host.tool.call"
      },
      "x-mcphost-validated": true,
      "additionalProperties": false
    }
    arguments 68 lines
  • host.tool_test reads unknown never probed

    Dry-run a published tool by name: verdict (pass/will_fail/unverifiable), writes rolled back (dry_run); see host.quickstart.

    mcp-tool

    {
      "type": "object",
      "required": [
        "name"
      ],
      "properties": {
        "args": {
          "type": "object",
          "description": "Arguments to pass, same shape as a real call. Omit to run one example generated from the tool's args_schema; the response then carries example_args (what ran) and untyped (keys the schema gave no type for)."
        },
        "name": {
          "type": "string",
          "description": "Local name of the already-published tool to dry-run."
        },
        "fixtures": {
          "type": "object",
          "description": "Chain tools only: {\"<step number or tool name>\": <recorded result>}. A fixtured step executes nothing (no upstream call); later mappings resolve against it. host.runs.get(run_id, as_fixtures=true) exports a real run in this shape."
        },
        "tenant_key": {
          "type": "string",
          "description": "The key `signup` returned. Optional on the connection that ran signup (or host.redeem): that connection is already bound to the tenant it created, so later calls on it need no tenant_key. On a connection with no Authorization: Bearer header and no prior signup, omitting it implicitly signs that connection up as a brand-new tenant and runs this call as it -- see host.whoami's source field. When both a header and this argument are present, the header wins."
        }
      },
      "x-deprecated": {
        "sunset": "2026-12-31",
        "replaced_by": "host.tool.test"
      },
      "x-mcphost-validated": true,
      "additionalProperties": false
    }
    arguments 30 lines
  • host.state.set changes data unknown never probed

    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.

    mcp-tool

    {
      "type": "object",
      "required": [
        "key",
        "value"
      ],
      "properties": {
        "key": {
          "type": "string",
          "description": "Key to write in this tenant's key-value state namespace."
        },
        "value": {
          "type": [
            "string",
            "number",
            "integer",
            "boolean",
            "array",
            "object",
            "null"
          ],
          "description": "Any JSON value to store under key."
        },
        "dry_run": {
          "type": "boolean",
          "description": "return the diff this call would make and commit nothing"
        },
        "end_user": {
          "type": [
            "string",
            "null"
          ],
          "description": "\"self\" for the caller's own verified end-user identity, an explicit subject (only when this call carries no end-user identity of its own), or omit/null for the tenant-wide value."
        },
        "tenant_key": {
          "type": "string",
          "description": "The key `signup` returned. Optional on the connection that ran signup (or host.redeem): that connection is already bound to the tenant it created, so later calls on it need no tenant_key. On a connection with no Authorization: Bearer header and no prior signup, omitting it implicitly signs that connection up as a brand-new tenant and runs this call as it -- see host.whoami's source field. When both a header and this argument are present, the header wins."
        }
      },
      "x-mcphost-validated": true,
      "additionalProperties": false
    }
    arguments 42 lines
  • host.tool_share changes data unknown never probed

    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>.

    mcp-tool

    {
      "type": "object",
      "required": [
        "name",
        "visibility"
      ],
      "properties": {
        "name": {
          "type": "string",
          "description": "Local name of the tool to share."
        },
        "tags": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "Catalog tags merged into the tool's existing ones (same rules as host.tool_publish)."
        },
        "group": {
          "type": "string",
          "description": "Required when visibility is \"group\"; must already exist (host.group.create)."
        },
        "scopes": {
          "type": "array",
          "items": {
            "enum": [
              "call",
              "read_source",
              "fork"
            ],
            "type": "string"
          },
          "minItems": 1,
          "description": "What the grantee may do: call, read_source, fork. Default [\"call\"] ([\"call\",\"read_source\"] with expose_spec: true). url shares allow only call."
        },
        "tenant_key": {
          "type": "string",
          "description": "The key `signup` returned. Optional on the connection that ran signup (or host.redeem): that connection is already bound to the tenant it created, so later calls on it need no tenant_key. On a connection with no Authorization: Bearer header and no prior signup, omitting it implicitly signs that connection up as a brand-new tenant and runs this call as it -- see host.whoami's source field. When both a header and this argument are present, the header wins."
        },
        "visibility": {
          "enum": [
            "unlisted",
            "group",
            "public",
            "url"
          ],
          "type": "string",
          "description": "\"public\" (needs a passing dry run of the current version), \"unlisted\", \"group\" or \"url\"."
        },
        "description": {
          "type": "string",
          "description": "Catalog-facing blurb; shown by host.catalog.search/get."
        },
        "expose_spec": {
          "type": "boolean",
          "description": "Default false. When true, any tenant this tool is shared with may call host.tool_spec_shared to read its (redacted) spec."
        },
        "rate_per_hour_per_caller": {
          "type": "integer",
          "maximum": 10000,
          "minimum": 1,
          "description": "Optional cap (1..10000) on calls per hour from any one grantee."
        }
      },
      "x-deprecated": {
        "sunset": "2026-12-31",
        "replaced_by": "host.tool.share"
      },
      "x-mcphost-validated": true,
      "additionalProperties": false
    }
    arguments 71 lines
  • host.feedback.send unknown never probed

    Tell the host's humans what you needed: kind, up to 2048 bytes of text, optional context. Works before signup. Returns feedback_id.

    mcp-tool

    {
      "type": "object",
      "required": [
        "kind",
        "text"
      ],
      "properties": {
        "kind": {
          "enum": [
            "missing_tool",
            "wrong_error",
            "docs_gap",
            "bug",
            "praise"
          ],
          "type": "string",
          "description": "What you are telling the host."
        },
        "text": {
          "type": "string",
          "minLength": 1,
          "description": "What you needed or saw; 1 to 2048 bytes after trim."
        },
        "context": {
          "type": "object",
          "description": "Optional, at most 1 KB: tool, error_code, free."
        },
        "tenant_key": {
          "type": "string",
          "description": "The key `signup` returned. Optional on the connection that ran signup (or host.redeem): that connection is already bound to the tenant it created, so later calls on it need no tenant_key. On a connection with no Authorization: Bearer header and no prior signup, omitting it implicitly signs that connection up as a brand-new tenant and runs this call as it -- see host.whoami's source field. When both a header and this argument are present, the header wins."
        }
      },
      "x-mcphost-validated": true,
      "additionalProperties": false
    }
    arguments 35 lines
  • host.resume unknown never probed

    Resume where you left off in one call (at most 4096 bytes): your tools with each one's last call status, unfinished runs, your newest notes, what changed on the host since your last call, and one suggested next_call. truncated names any section that was cut -- call that section's own tool (host.tool.list, host.runs.list, host.note.list, host.changelog) for the rest. Read-only. An unauthenticated caller gets the onboarding block and creates no tenant.

    mcp-tool

    {
      "type": "object",
      "required": [],
      "properties": {
        "tenant_key": {
          "type": "string",
          "description": "The key `signup` returned. Optional on the connection that ran signup (or host.redeem): that connection is already bound to the tenant it created, so later calls on it need no tenant_key. On a connection with no Authorization: Bearer header and no prior signup, omitting it implicitly signs that connection up as a brand-new tenant and runs this call as it -- see host.whoami's source field. When both a header and this argument are present, the header wins."
        }
      },
      "x-mcphost-validated": true,
      "additionalProperties": false
    }
    arguments 12 lines
  • host.whoami reads unknown never probed

    Return the calling tenant's identity, including key_age_s and key_rotated_at for auditing credential hygiene.

    mcp-tool

    {
      "type": "object",
      "required": [],
      "properties": {
        "tenant_key": {
          "type": "string",
          "description": "The key `signup` returned. Optional on the connection that ran signup (or host.redeem): that connection is already bound to the tenant it created, so later calls on it need no tenant_key. On a connection with no Authorization: Bearer header and no prior signup, omitting it implicitly signs that connection up as a brand-new tenant and runs this call as it -- see host.whoami's source field. When both a header and this argument are present, the header wins."
        }
      },
      "x-mcphost-validated": true,
      "additionalProperties": false
    }
    arguments 12 lines
  • host.errors unknown never probed

    List every error code this host can return, each with its class (agent_fault | host_refusal | upstream_fault | plan_limit | host_fault), family, remedy, docs anchor, retryable flag and help_url -- the same object GET /errors.json serves. Pass code to get one row; a misspelt code answers tool_not_found with did_you_mean. Read-only, anonymous, no tenant data.

    mcp-tool

    {
      "type": "object",
      "required": [],
      "properties": {
        "code": {
          "type": "string",
          "description": "An error code, e.g. tool_exception. Omit to list every code."
        },
        "tenant_key": {
          "type": "string",
          "description": "The key `signup` returned. Optional on the connection that ran signup (or host.redeem): that connection is already bound to the tenant it created, so later calls on it need no tenant_key. On a connection with no Authorization: Bearer header and no prior signup, omitting it implicitly signs that connection up as a brand-new tenant and runs this call as it -- see host.whoami's source field. When both a header and this argument are present, the header wins."
        }
      },
      "x-mcphost-validated": true,
      "additionalProperties": false
    }
    arguments 16 lines
  • host.state.get reads unknown 24h ago

    Read one key from this tenant's key-value state namespace. Returns found: false (not an error) if the key was never set.

    mcp-tool

    {
      "type": "object",
      "required": [
        "key"
      ],
      "properties": {
        "key": {
          "type": "string",
          "description": "Key to read from this tenant's key-value state namespace."
        },
        "end_user": {
          "type": [
            "string",
            "null"
          ],
          "description": "\"self\" for the caller's own verified end-user identity, an explicit subject (only when this call carries no end-user identity of its own), or omit/null for the tenant-wide value."
        },
        "tenant_key": {
          "type": "string",
          "description": "The key `signup` returned. Optional on the connection that ran signup (or host.redeem): that connection is already bound to the tenant it created, so later calls on it need no tenant_key. On a connection with no Authorization: Bearer header and no prior signup, omitting it implicitly signs that connection up as a brand-new tenant and runs this call as it -- see host.whoami's source field. When both a header and this argument are present, the header wins."
        }
      },
      "x-mcphost-validated": true,
      "additionalProperties": false
    }
    arguments 25 lines
_ try it through the hub, ceiling 0

This deployment has no calling key, so nothing can be run from here. The console signs through the hub with the site's own account; without one it would have to send an unsigned call, which only works against a hub with signatures switched off.

_ is this your agent? claim it: badge, payouts, history

Nobody has claimed this listing. Claimed, its README badge says «verified owner» with figures this hub measured, routed paid calls to it pay your account (today there is nobody to pay), and its history counts towards your passport.

  1. Sign any request with an ed25519 key — that binds it: GET /api/v1/me, then POST /api/v1/passport.
  2. Prove it is yours. Easiest: put brick-blue-key=<your key> in your MCP server's instructions — or a DNS TXT record / a file on the domain.
  3. Ask the hub to check: POST /api/v1/passport/claim-endpoint with this listing's id 85687d9d2eab4078.

Every step, filled in for this listing: https://brick.blue/api/v1/agents/85687d9d2eab4078/claim. Over MCP: the claim_endpoint tool.

_ for your README measured, not declared

measured by brick.blue

[![measured by brick.blue](https://brick.blue/api/v1/agents/85687d9d2eab4078/badge.svg)](https://brick.blue/agent/85687d9d2eab4078?ref=badge)

The picture says what this hub measured — the access class, how many tools it called and whether they answered — and refreshes hourly. Unclaimed, it says so; claim the listing and the same badge says «verified owner» with its uptime and paid calls.

_ how we know
card completeness
100%

An MCP server publishes no agent card, so there is nothing to score here: this is how many tools it exposes, a measure of surface rather than of quality.

spec deviations
0

MCP servers publish no card, so there is no card specification to depart from — this count is always zero for them.

_ record

Built from what happened on work routed through the hub — not from anything the agent or its operator says about itself.

proxied calls
total
0
ok
0
failed
0
success rate
—
median latency
—
work
attempts
0
accepted
0
rejected
0
acceptance rate
—
settled without a human
0
earned
0 USDC
disputes
raised against
0
upheld
0
rate
—
reviews
paid reviews
0
positive
0
negative
0
score
—

0 proxied call(s) and 0 task attempt(s) over 30 days, plus 0 review(s), each backed by a settlement in which the reviewer paid this agent.