Read-only watchtower for AI agents on-chain: decoded receipts, plan vs execution, Safe audits.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
Start watching an address. Use when onboarding a new agent or Safe.
Address to watch (0x…40 hex)
Optional short label (e.g. Agent EOA)
This tool isn't marked read-only, so it may change something on the server or in an account you connected.
Start watching an address. Use when onboarding a new agent or Safe.
| Argument | Type | Description |
|---|---|---|
| label | string | Optional short label (e.g. Agent EOA) |
| chains | string | |
| address* | string | Address to watch (0x…40 hex) |
{
"type": "object",
"required": [
"address"
],
"properties": {
"label": {
"type": "string",
"description": "Optional short label (e.g. Agent EOA)"
},
"chains": {
"type": "string"
},
"address": {
"type": "string",
"description": "Address to watch (0x…40 hex)"
}
}
}Read the declared identity of a watched agent (name, model provider, how often it runs, role, purpose, operator) and whether its public passport page is published.
| Argument | Type | Description |
|---|---|---|
| address* | string | Watched agent address (0x…40 hex) |
{
"type": "object",
"required": [
"address"
],
"properties": {
"address": {
"type": "string",
"description": "Watched agent address (0x…40 hex)"
}
}
}List alerts scoped to this principal's watched addresses (empty watch list → call watch_demo_set first). Use when checking what needs attention.
| Argument | Type | Description |
|---|---|---|
| status | string |
{
"type": "object",
"properties": {
"status": {
"type": "string"
}
}
}Counterfactual P&L / agent alpha vs do-nothing baselines. Use for performance honesty checks. Check matched_agent — false means the key has no indexed activity.
| Argument | Type | Description |
|---|---|---|
| agent_key* | string | Agent EOA address (0x…40 hex) |
{
"type": "object",
"required": [
"agent_key"
],
"properties": {
"agent_key": {
"type": "string",
"description": "Agent EOA address (0x…40 hex)"
}
}
}Blast-radius / historical capability for an agent key. Use before trusting an agent with funds.
| Argument | Type | Description |
|---|---|---|
| agent_key* | string |
{
"type": "object",
"required": [
"agent_key"
],
"properties": {
"agent_key": {
"type": "string"
}
}
}Persona-tailored dashboard brief (fidelity, alerts, pending plans, recent planned-vs-executed). NEW USERS with empty watches: call watch_demo_set first, then get_dashboard again. Narrate in plain language; ask the user to Always allow the AgentWatch MCP App widget when the host prompts.
| Argument | Type | Description |
|---|---|---|
| persona | string | Optional override; otherwise uses saved persona |
{
"type": "object",
"properties": {
"persona": {
"type": "string",
"description": "Optional override; otherwise uses saved persona"
}
}
}Decoded activity feed for an address. Use when reviewing what an agent did on-chain.
| Argument | Type | Description |
|---|---|---|
| since | number | Unix seconds lower bound |
| address* | string | Watched address (0x…40 hex) |
{
"type": "object",
"required": [
"address"
],
"properties": {
"since": {
"type": "number",
"description": "Unix seconds lower bound"
},
"address": {
"type": "string",
"description": "Watched address (0x…40 hex)"
}
}
}Intent↔execution fidelity score for an agent or Safe. Use for accountability / coverage meter. Check matched_agent — false means the address has no indexed activity (as signer or as the Safe that executed), so the score is vacuous.
| Argument | Type | Description |
|---|---|---|
| agent_key* | string | Agent EOA address (0x…40 hex) |
{
"type": "object",
"required": [
"agent_key"
],
"properties": {
"agent_key": {
"type": "string",
"description": "Agent EOA address (0x…40 hex)"
}
}
}Public standings for agents with a published passport, ranked from receipts (declared-first coverage, fidelity, reliability, hygiene, sustained work). Pass agent_key to get that agent's own rank, its component scores, and what it would need to climb. Read-only: nothing here can be self-reported.
| Argument | Type | Description |
|---|---|---|
| limit | number | How many ranked rows to return (default 10, max 50) |
| agent_key | string | Optional: address to locate in the standings |
{
"type": "object",
"properties": {
"limit": {
"type": "number",
"description": "How many ranked rows to return (default 10, max 50)"
},
"agent_key": {
"type": "string",
"description": "Optional: address to locate in the standings"
}
}
}Pending Safe multisig proposals from the Safe Transaction Service (indexer confidence). Pass safe=0x… or omit to scan all watched addresses.
| Argument | Type | Description |
|---|---|---|
| safe | string | Optional Safe address; default = all watched |
| chains | string | Optional comma-separated chain ids |
{
"type": "object",
"properties": {
"safe": {
"type": "string",
"description": "Optional Safe address; default = all watched"
},
"chains": {
"type": "string",
"description": "Optional comma-separated chain ids"
}
}
}Return the default Safe ownership plan for an agent EOA: threshold 1 + agent + selected recovery (1/2 when one recovery is set). Call before register_intent for Safe deploys. AgentWatch never deploys or signs.
| Argument | Type | Description |
|---|---|---|
| chain | string | Optional chain hint for the intent constraints |
| purpose | string | Optional purpose filter (e.g. trading) |
| agent_key* | string | Agent EOA that will be an owner/signer |
| all_recoveries | boolean | If true, include all matching recoveries (1/n) instead of just the default one |
| recovery_label | string | Optional label to pick among several recoveries |
{
"type": "object",
"required": [
"agent_key"
],
"properties": {
"chain": {
"type": "string",
"description": "Optional chain hint for the intent constraints"
},
"purpose": {
"type": "string",
"description": "Optional purpose filter (e.g. trading)"
},
"agent_key": {
"type": "string",
"description": "Agent EOA that will be an owner/signer"
},
"all_recoveries": {
"type": "boolean",
"description": "If true, include all matching recoveries (1/n) instead of just the default one"
},
"recovery_label": {
"type": "string",
"description": "Optional label to pick among several recoveries"
}
}
}TCA market-context snapshot for an event_id (chain:txHash). Use when judging execution quality.
| Argument | Type | Description |
|---|---|---|
| event_id* | string |
{
"type": "object",
"required": [
"event_id"
],
"properties": {
"event_id": {
"type": "string"
}
}
}List this user's saved recovery wallets (human co-signers for default 1/2 Safes). Each may have a label/purpose — users often keep several for different vaults.
No arguments.
{
"type": "object",
"properties": {},
"additionalProperties": false
}List watched addresses for this connector principal. NEW USERS: if empty, call watch_demo_set next (do not invent a global feed), then get_dashboard.
No arguments.
{
"type": "object",
"properties": {},
"additionalProperties": false
}Force an immediate poller pass over this principal's watched addresses (catch up txs from explorers into AgentWatch). Use after add_watch / a fresh broadcast when get_feed is still empty. Optional address / chains to focus the pass.
| Argument | Type | Description |
|---|---|---|
| chains | string | Optional csv of chains (default: ethereum,base first, then the rest) |
| address | string | Optional single address to refresh (0x…40 hex) |
{
"type": "object",
"properties": {
"chains": {
"type": "string",
"description": "Optional csv of chains (default: ethereum,base first, then the rest)"
},
"address": {
"type": "string",
"description": "Optional single address to refresh (0x…40 hex)"
}
}
}Declare an intent BEFORE broadcasting. Returns {intent_id, pairing_code}. Append the 16-hex pairing_code as the last 8 bytes of calldata (no magic prefix), then broadcast — EXCEPT bare ETH transfers to contracts (empty data + value>0): appending reverts on Safe/fallback handlers; register without a suffix and use expected.steps for multi-leg flows (e.g. approve+supply). Pairing codes are single-use and only consumed by successful (non-reverted) txs. Use deadline_minutes (relative) — normalized to absolute constraints.deadline at registration.
| Argument | Type | Description |
|---|---|---|
| expected | object | Structured shape. Use steps: ['approve','other'] (or similar) so one intent covers approve+supply/swap companions. |
| agent_key* | string | |
| declared_at | number | |
| description* | string | |
| deadline_minutes | number | Relative window; stored as absolute constraints.deadline |
{
"type": "object",
"required": [
"agent_key",
"description"
],
"properties": {
"expected": {
"type": "object",
"description": "Structured shape. Use steps: ['approve','other'] (or similar) so one intent covers approve+supply/swap companions."
},
"agent_key": {
"type": "string"
},
"declared_at": {
"type": "number"
},
"description": {
"type": "string"
},
"deadline_minutes": {
"type": "number",
"description": "Relative window; stored as absolute constraints.deadline"
}
}
}Remove a saved recovery address for this user.
| Argument | Type | Description |
|---|---|---|
| address* | string |
{
"type": "object",
"required": [
"address"
],
"properties": {
"address": {
"type": "string"
}
}
}Run provenance audit on a Safe/address. Use when the user asks 'is this fake?' or wants a shareable verdict.
| Argument | Type | Description |
|---|---|---|
| chain | string | |
| agents | string | Comma-separated agent keys |
| address* | string | Safe/address to audit (0x…40 hex) |
{
"type": "object",
"required": [
"address"
],
"properties": {
"chain": {
"enum": [
"base",
"ethereum"
],
"type": "string"
},
"agents": {
"type": "string",
"description": "Comma-separated agent keys"
},
"address": {
"type": "string",
"description": "Safe/address to audit (0x…40 hex)"
}
}
}Declare who a watched agent is: model provider, run cadence, role, purpose, operator, and whether to publish a shareable public passport at /a/<slug>. Declarations never change the receipt-derived numbers next to them; publishing exposes only this address, never the rest of the watch list.
| Argument | Type | Description |
|---|---|---|
| role | string | |
| model | string | Optional model or framework detail |
| public | boolean | Publish a public passport page |
| address* | string | Watched agent address (0x…40 hex) |
| cadence | string | always_on, scheduled, event_driven, on_demand |
| purpose | string | One or two sentences on what it is for |
| operator | string | Who runs it |
| provider | string | Which model drives the agent |
| display_name | string | Name shown instead of the raw address |
Save or update a recovery address for this user. Product default Safe is then 1/2: threshold 1, owners = [agent, this recovery]. Use make_default=true to prefer this label in get_safe_defaults.
| Argument | Type | Description |
|---|---|---|
| label | string | Short name, e.g. hardware, treasury, personal |
| address* | string | 0x recovery wallet the human controls |
| purpose | string | What this recovery is for, e.g. default, trading |
| make_default | boolean | Prefer this label for default Safes |
{
"type": "object",
"required": [
"address"
],
"properties": {
"label": {
"type": "string",
"description": "Short name, e.g. hardware, treasury, personal"
},
"address": {
"type": "string",
"description": "0x recovery wallet the human controls"
},
"purpose": {
"type": "string",
"description": "What this recovery is for, e.g. default, trading"
},
"make_default": {
"type": "boolean",
"description": "Prefer this label for default Safes"
}
}
}ONE-SHOT cold-start for brand-new Claude / MCP users with an empty watch list. Adds the July 18 fixture (Agent EOA + Safe A + Safe B on Base, with declared intents) and one live Polygon trading bot, so the first dashboard has recent activity. Call this FIRST after connect when list_watched is empty, then call get_dashboard (Always allow the App). Idempotent — skips addresses already watched.
No arguments.
{
"type": "object",
"properties": {},
"additionalProperties": false
}{
"type": "object",
"required": [
"address"
],
"properties": {
"role": {
"enum": [
"trading",
"market_making",
"prediction",
"treasury",
"payments",
"research",
"infra",
"personal",
"other"
],
"type": "string"
},
"model": {
"type": "string",
"description": "Optional model or framework detail"
},
"public": {
"type": "boolean",
"description": "Publish a public passport page"
},
"address": {
"type": "string",
"description": "Watched agent address (0x…40 hex)"
},
"cadence": {
"enum": [
"always_on",
"scheduled",
"event_driven",
"on_demand",
"unknown"
],
"type": "string",
"description": "always_on, scheduled, event_driven, on_demand"
},
"purpose": {
"type": "string",
"description": "One or two sentences on what it is for"
},
"operator": {
"type": "string",
"description": "Who runs it"
},
"provider": {
"enum": [
"anthropic",
"openai",
"google",
"xai",
"meta",
"mistral",
"deepseek",
"qwen",
"open_source",
"multi",
"none",
"unknown"
],
"type": "string",
"description": "Which model drives the agent"
},
"display_name": {
"type": "string",
"description": "Name shown instead of the raw address"
}
}
}