_ registry / mcp + a2a streamable-http · checked 1h ago

PingRoom

https://api.pingroom.io

Registry code: 0802db1948b58367

api record

On human-requested logout/reconnect, call disconnect BEFORE MCP client logout/login. After login, restart or reload the client; before sending, verify connection_info owner.id (public User ID) and handle match the approved account and robot. Stop on mismatch. PingRoom reaches humans by phone with urgent Pings, questions, approvals, handoffs, and live progress. No app? Offer https://pingroom.io/i; install is not consent, so wait for the human to claim the robot. Send success means PingRoom accepted delivery work; it does not prove a person received, saw, or acted. Pending, timeout, enqueued,…

endpoint
https://api.pingroom.io/api/agent/mcp
door code
2e44cce73435d96a
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 PingRoom live?
Yes — it answered the hub's last check (checked 1h ago). It answered 100% of checks over the last 30 days.
Is PingRoom free to use?
Not anonymously — it asks for a key or a login before it will serve. Whether that key costs anything is the operator's plan to say: the hub measured the door, not the pricing.
What tools does PingRoom have?
42 tools: disconnect, trigger_quick_action, broadcast, live_status, list_notifications, wait_for_ack, wait_for_answer, cancel_question, ….
Is PingRoom 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
99.5%

90 days 99.4%· all time 99.4%

latency
156ms

last good check

priced tools
0

of 42 tools

_ answered our checks, 90 days 1032 checks · signed record
  • degraded → live
  • live → degraded· timeout after 20000ms
  • degraded → live
  • live → degraded· timeout after 20000ms
  • degraded → live
_ what it is for
used for
  • send an urgent ping to a human phone
  • ask a human a multiple choice question
  • request human approval for an action
  • manage notification rooms
takes → gives
text → data
tools
11 reads10 changes data3 sends messages
_ 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 42 tools
42 auth-required 42 of 42 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.

  • disconnect changes data auth-required never probed

    Revoke this authenticated robot connection, including its access and refresh credentials and room memberships. Use only when the human explicitly requests logout, disconnection, or reconnection. Call BEFORE clearing local credentials or running MCP logout/login. It affects only the current connection and accepts no account or robot selector. After login, restart or reload the MCP client, then match connection_info owner.id and handle to the approved account and robot before sending.

    mcp-tool

    {
      "type": "object",
      "properties": {},
      "additionalProperties": false
    }
    arguments 5 lines
  • trigger_quick_action auth-required never probed

    Press a room quick action, notifying its members. Rate-limited. Read the action's input_type first (list_quick_actions): location needs data.location, link needs data.url, file/photo/pdf need attachment_ids — a press without the matching detail is a 422 quick_action_input_required. In someone else's personal room is_urgent and requires_ack are ignored; only the owner's own setting on the action applies.

    mcp-tool

    {
      "type": "object",
      "required": [
        "invite_code",
        "action_number"
      ],
      "properties": {
        "data": {
          "type": "object",
          "properties": {
            "url": {
              "type": "string",
              "format": "uri",
              "maxLength": 2048,
              "description": "An absolute http:// or https:// URL."
            },
            "location": {
              "type": "object",
              "required": [
                "latitude",
                "longitude"
              ],
              "properties": {
                "label": {
                  "type": "string",
                  "maxLength": 100,
                  "description": "Optional place name shown to the recipient."
                },
                "address": {
                  "type": "string",
                  "maxLength": 255,
                  "description": "Optional formatted street address."
                },
                "latitude": {
                  "type": "number",
                  "maximum": 90,
                  "minimum": -90,
                  "description": "Latitude in decimal degrees."
                },
                "longitude": {
                  "type": "number",
                  "maximum": 180,
                  "minimum": -180,
                  "description": "Longitude in decimal degrees."
                }
              },
              "description": "A shareable geographic location.",
              "additionalProperties": false
            }
          },
          "description": "The detail this press carries. data.location satisfies an action whose input_type is location; data.url satisfies link. Only these two keys are accepted on a trigger.",
          "additionalProperties": false
        },
        "ack_mode": {
          "enum": [
            "any",
            "all"
          ],
          "type": "string",
          "description": "Confirmation rule for this press: any (default) resolves on the first confirmation; all waits for every original eligible recipient. Applies only when this press requires acknowledgement."
        },
        "is_urgent": {
          "type": "boolean",
          "description": "Deliver this one press time-sensitive so it breaks through Focus / Do Not Disturb and reaches members who muted the room or you (a block still wins). Send-time only — the action's saved configuration is unchanged."
        },
        "invite_code": {
          "type": "string",
          "description": "Room invite code."
        },
        "requires_ack": {
          "type": "boolean",
          "description": "Keep this one press open until an eligible recipient acknowledges it. Send-time only and elevating only: true adds the acknowledgement to an action that has none, false never disables the action's stored ack policy."
        },
        "action_number": {
          "type": "integer",
          "maximum": 16,
          "minimum": 1,
          "description": "Quick-action slot number (1–16). Slots 5–16 require the room owner to have Pro."
        },
        "attachment_ids": {
          "type": "array",
          "items": {
            "type": "string",
            "format": "uuid"
          },
          "maxItems": 4,
          "description": "Ids of up to 4 uploaded attachments (see upload_attachment). Required when the action's input_type is file, photo (jpg/png only) or pdf (pdf only); a mismatched type is a 422 quick_action_input_type."
        },
        "trigger_source": {
          "enum": [
            "manual",
            "location"
          ],
          "type": "string",
          "description": "Defaults to \"manual\". Only these two are client-settable — \"webhook\" and \"system\" are stamped server-side and are rejected here. \"location\" is room owner only: it sends the owner's Location Ping (\"Arrived at {place}\", \"Left {place}\" or \"Location update at {place}\") to every member instead of this slot's quick action. A non-owner gets 403 location_trigger_owner_only; a room with no enabled location trigger gets 409 location_trigger_inactive."
        },
        "quick_action_id": {
          "type": "string",
          "format": "uuid",
          "description": "Optional id of the action as read from list_quick_actions. When the slot has since moved pages the press is refused with 409 quick_action_layout_changed instead of firing the wrong Ping."
        }
      },
      "additionalProperties": false
    }
    arguments 104 lines
  • broadcast auth-required never probed

    Send a custom ping to a room the account belongs to. Pass data.checklist.items to send a checklist the room ticks through together; read the ticks back as checklist_state. Rate-limited. In someone else's personal room only a Pro account may send it, text only (a link in the message is refused too), without title, is_urgent or requires_ack (all three are ignored there), and it counts toward the visitor's two-ping cap; otherwise use trigger_quick_action there.

    mcp-tool

    {
      "type": "object",
      "required": [
        "invite_code",
        "message"
      ],
      "properties": {
        "data": {
          "type": "object",
          "properties": {
            "url": {
              "type": "string",
              "format": "uri",
              "maxLength": 2048,
              "description": "Reserved: an absolute http:// or https:// URL. Present turns the ping into a tappable link."
            },
            "label": {
              "type": "string",
              "maxLength": 26,
              "description": "Reserved: short caption shown with the link ping."
            },
            "location": {
              "type": "object",
              "required": [
                "latitude",
                "longitude"
              ],
              "properties": {
                "label": {
                  "type": "string",
                  "maxLength": 100,
                  "description": "Optional place name shown to the recipient."
                },
                "address": {
                  "type": "string",
                  "maxLength": 255,
                  "description": "Optional formatted street address."
                },
                "latitude": {
                  "type": "number",
                  "maximum": 90,
                  "minimum": -90,
                  "description": "Latitude in decimal degrees."
                },
                "longitude": {
                  "type": "number",
                  "maximum": 180,
                  "minimum": -180,
                  "description": "Longitude in decimal degrees."
                }
              },
              "description": "A shareable geographic location.",
              "additionalProperties": false
            },
            "checklist": {
              "type": "object",
              "required": [
                "items"
              ],
              "properties": {
                "items": {
                  "type": "array",
                  "items": {
                    "type": "object",
                    "required": [
                      "text"
                    ],
                    "properties": {
                      "text": {
                        "type": "string",
                        "maxLength": 80,
                        "minLength": 1,
                        "description": "One checklist item."
                      }
                    },
                    "additionalProperties": false
                  },
                  "maxItems": 25,
                  "minItems": 1
                }
              },
              "description": "A short checklist the room can tick through, e.g. a shopping list. The room ticks it together: a checked item is checked for everyone, cannot be unchecked, and alerts the other recipients.",
              "additionalProperties": false
            },
            "button_label": {
              "type": "string",
              "maxLength": 26,
              "description": "Reserved: label for the link button rendered for data.url."
            }
          },
          "description": "Arbitrary structured context (max 25 keys / 8KB). Read surfaces return it after connector privacy filtering; do not put secrets in data. data.location is reserved for a shareable location, data.checklist for a checklist, and data.url + data.button_label are reserved for a tappable link ping.",
          "maxProperties": 25,
          "additionalProperties": true
        },
        "title": {
          "type": "string",
          "maxLength": 40,
          "description": "Optional headline. Defaults to the room name, which someone else's personal room always keeps."
        },
        "message": {
          "type": "string",
          "maxLength": 160,
          "description": "Ping body text (max 120 characters in private rooms, 160 in public rooms)."
        },
        "ack_mode": {
          "enum": [
            "any",
            "all"
          ],
          "type": "string",
          "description": "With requires_ack: any (default) resolves on the first confirmation; all waits for every original eligible recipient. Read action_state.confirmed_count and required_count for progress."
        },
        "reply_to": {
          "type": "string",
          "maxLength": 255,
          "description": "Id of the ping this one answers (notification id or correlation id)."
        },
        "is_urgent": {
          "type": "boolean",
          "description": "Deliver time-sensitive so the ping breaks through Focus / Do Not Disturb and reaches members who muted the room or you (a block still wins). Independent of requires_ack: urgent affects delivery only and asks nothing of the recipient."
        },
        "action_icon": {
          "type": "string",
          "maxLength": 50,
          "description": "Optional emoji shown with the ping."
        },
        "invite_code": {
          "type": "string",
          "description": "Room invite code."
        },
        "requires_ack": {
          "type": "boolean",
          "description": "Keep this ping open until its confirmation rule is met, and show it as a lock-screen card with an Acknowledge button. Does not raise the interruption level on its own — combine with is_urgent for an ack that also breaks through Focus."
        },
        "action_number": {
          "type": "integer",
          "maximum": 16,
          "minimum": 1,
          "description": "Optional quick-action slot to attribute the ping to."
        },
        "attachment_ids": {
          "type": "array",
          "items": {
            "type": "string",
            "format": "uuid"
          },
          "maxItems": 4,
          "description": "Ids of up to 4 uploaded attachments (see upload_attachment) to include. Uploading requires a Pro account."
        },
        "correlation_id": {
          "type": "string",
          "maxLength": 255,
          "description": "Your own id, echoed back unchanged on read."
        },
        "ack_timeout_seconds": {
          "type": "integer",
          "maximum": 86400,
          "minimum": 60,
          "description": "Optional acknowledgement deadline in seconds."
        }
      },
      "additionalProperties": false
    }
    arguments 163 lines
  • live_status auth-required never probed

    Start, update, or end a live progress card on the room members' lock screen (an iOS Live Activity / Android live update). Reuse the same correlation_id for every ping of one stream: the first ping starts the card and sends one alert, further "running" pings move it silently, and the first "done"/"failed" sends one completion alert and ends it. Free accounts get a small number of NEW streams per day; updates and the final ping of an open stream are never charged; a first ping that is already "done"/"failed" counts as a new stream.

    mcp-tool

    {
      "type": "object",
      "required": [
        "invite_code",
        "correlation_id",
        "live_status"
      ],
      "properties": {
        "data": {
          "type": "object",
          "description": "Arbitrary structured context (max 25 keys / 8KB), returned on read surfaces after connector privacy filtering. Do not put secrets in data."
        },
        "title": {
          "type": "string",
          "maxLength": 120,
          "description": "Card title. Every template takes at most 40 characters and refuses a longer one; only the claim template takes up to 120 (its request text), which is why this schema allows 120. Defaults to the selected quick action's label."
        },
        "action": {
          "type": "integer",
          "maximum": 16,
          "minimum": 1,
          "description": "Quick-action slot to attribute the stream to (supplies the icon and sound)."
        },
        "invite_code": {
          "type": "string",
          "description": "Room invite code."
        },
        "live_status": {
          "type": "object",
          "required": [
            "state"
          ],
          "properties": {
            "left": {
              "type": "object",
              "required": [
                "label",
                "value"
              ],
              "properties": {
                "label": {
                  "type": "string",
                  "maxLength": 24
                },
                "value": {
                  "type": "string",
                  "maxLength": 24
                }
              },
              "description": "Left side {label,value} for the matchup template.",
              "additionalProperties": false
            },
            "right": {
              "type": "object",
              "required": [
                "label",
                "value"
              ],
              "properties": {
                "label": {
                  "type": "string",
                  "maxLength": 24
                },
                "value": {
                  "type": "string",
                  "maxLength": 24
                }
              },
              "description": "Right side {label,value} for the matchup template.",
              "additionalProperties": false
            },
            "state": {
              "enum": [
                "running",
                "done",
                "failed"
              ],
              "type": "string",
              "description": "running keeps the card live; done/failed end it with one completion alert."
            },
            "steps": {
              "type": "array",
              "items": {
                "type": "string",
                "maxLength": 40
              },
              "maxItems": 8,
              "minItems": 2,
              "description": "Step labels. Required on the first ping of a steps stream. They cannot change afterwards: a later ping may resend the identical list or omit it, and a different list on a running ping is rejected with 422 steps_immutable (a done/failed ping ignores it and still ends the stream). Send current_step to advance, or start a new stream with a new correlation_id for a different list."
            },
            "center": {
              "type": "string",
              "maxLength": 40,
              "description": "Center score/clock for the matchup template."
            },
            "eta_at": {
              "type": "integer",
              "description": "Epoch seconds; renders a live ETA on status/progress."
            },
            "prompt": {
              "type": "string",
              "maxLength": 256,
              "description": "The ask, for the question template."
            },
            "message": {
              "type": "string",
              "maxLength": 256,
              "description": "The card's live message line."
            },
            "metrics": {
              "type": "array",
              "items": {
                "type": "object",
                "required": [
                  "label",
                  "value"
                ],
                "properties": {
                  "label": {
                    "type": "string",
                    "maxLength": 24
                  },
                  "value": {
                    "type": "string",
                    "maxLength": 24
                  }
                },
                "additionalProperties": false
              },
              "maxItems": 3,
              "description": "Up to 3 {label,value} counters for the metrics template."
            },
            "options": {
              "type": "array",
              "items": {
                "type": "object",
                "required": [
                  "value",
                  "label"
                ],
                "properties": {
                  "label": {
                    "type": "string",
                    "maxLength": 40
                  },
                  "value": {
                    "type": "string",
                    "maxLength": 64
                  }
                },
                "additionalProperties": false
              },
              "maxItems": 4,
              "description": "Up to 4 {value,label} choices for the question template."
            },
            "category": {
              "enum": [
                "status",
                "steps",
                "alert"
              ],
              "type": "string",
              "description": "Legacy rendering category; prefer template. \"alert\" has NO template equivalent and is the only way to start a stream time-sensitive (breaks through Focus). Fixed at stream creation."
            },
            "progress": {
              "type": "number",
              "maximum": 1,
              "minimum": 0,
              "description": "Progress bar / Dynamic Island gauge, 0..1."
            },
            "template": {
              "enum": [
                "status",
                "steps",
                "progress",
                "metrics",
                "countdown",
                "question",
                "matchup",
                "claim"
              ],
              "type": "string",
              "description": "Which layout the OS renders. Fixed at stream creation. \"claim\" is a \"Who's on it?\" request one member takes on (private rooms only): its text is title (or message), up to 120 characters, an optional deadline_at is at most 8 hours away, and it then moves only through live_claim, or a done/failed ping from you that finishes or cancels it."
            },
            "deadline_at": {
              "type": "integer",
              "description": "Epoch seconds the countdown template counts down to. A later ping may move it; duration_seconds then moves by the same amount. Send the absolute new deadline, never a delta."
            },
            "current_step": {
              "type": "integer",
              "maximum": 8,
              "minimum": 0,
              "description": "Index into steps; the only mutable steps field."
            },
            "accent_override": {
              "type": "string",
              "description": "Hex #rrggbb; a semantic accent for one frame (e.g. deadline red)."
            },
            "duration_seconds": {
              "type": "integer",
              "maximum": 4102444800,
              "minimum": 1,
              "description": "Countdown duration in seconds. Read from the first ping only (a later ping's own value is ignored); preserved through updates and completion. Moving deadline_at on a later ping changes the stored duration by the same amount."
            }
          },
          "description": "The live card's state. Only state is required.",
          "additionalProperties": false
        },
        "requires_ack": {
          "type": "boolean",
          "description": "Add an Acknowledge button; the first eligible member to tap resolves it for everyone. Does not raise the interruption level — set category \"alert\" for a time-sensitive start."
        },
        "correlation_id": {
          "type": "string",
          "maxLength": 255,
          "description": "The stream key. Reuse it on every ping of the same stream."
        },
        "ack_timeout_seconds": {
          "type": "integer",
          "maximum": 86400,
          "minimum": 1,
          "description": "Optional acknowledgement deadline in seconds."
        }
      },
      "additionalProperties": false
    }
    arguments 226 lines
  • list_notifications reads auth-required 8h ago

    List a bounded page of recent pings across approved rooms, newest first. Use page to continue while has_more is true.

    mcp-tool

    {
      "type": "object",
      "properties": {
        "date": {
          "type": "string",
          "format": "date",
          "description": "Only pings created on this calendar date, e.g. \"2026-08-25\"."
        },
        "page": {
          "type": "integer",
          "minimum": 1,
          "description": "Page number, newest first."
        },
        "type": {
          "enum": [
            "received",
            "sent"
          ],
          "type": "string",
          "description": "Narrow to pings you received or pings you sent. Omit for both."
        },
        "limit": {
          "type": "integer",
          "default": 10,
          "maximum": 25,
          "minimum": 1,
          "description": "Pings per page. Defaults to 10; maximum 25."
        }
      },
      "additionalProperties": false
    }
    arguments 31 lines
  • wait_for_ack reads auth-required 11h ago

    Long-poll a generic acknowledgement-required ping until its confirmation rule is met (any: first confirmation; all: every original eligible recipient), it expires, or the timeout elapses. Questions use wait_for_answer instead.

    mcp-tool

    {
      "type": "object",
      "required": [
        "notification_id"
      ],
      "properties": {
        "timeout": {
          "type": "integer",
          "maximum": 30,
          "minimum": 0,
          "description": "Seconds to hold the request open. Use 0 for an immediate authoritative state read."
        },
        "notification_id": {
          "type": "string",
          "format": "uuid",
          "description": "Room notification id."
        }
      },
      "additionalProperties": false
    }
    arguments 20 lines
  • wait_for_answer auth-required 8h ago

    Long-poll a question until it is answered or expires. Returns the state and, once answered, the chosen option value + label and the responder.

    mcp-tool

    {
      "type": "object",
      "required": [
        "question_id"
      ],
      "properties": {
        "timeout": {
          "type": "integer",
          "maximum": 30,
          "minimum": 1,
          "description": "Seconds to hold the request open (server-capped)."
        },
        "question_id": {
          "type": "string",
          "format": "uuid",
          "description": "Question id."
        }
      },
      "additionalProperties": false
    }
    arguments 20 lines
  • cancel_question changes data auth-required never probed

    Withdraw a still-pending question you asked.

    mcp-tool

    {
      "type": "object",
      "required": [
        "question_id"
      ],
      "properties": {
        "question_id": {
          "type": "string",
          "format": "uuid",
          "description": "Question id."
        }
      },
      "additionalProperties": false
    }
    arguments 14 lines
  • list_handoffs auth-required 8h ago

    List a bounded page of this agent's Handoffs, newest first. Omit state (or use open) for unresolved work; use all for history and page while has_more is true.

    mcp-tool

    {
      "type": "object",
      "properties": {
        "page": {
          "type": "integer",
          "minimum": 1,
          "description": "Page number, newest first."
        },
        "limit": {
          "type": "integer",
          "default": 10,
          "maximum": 25,
          "minimum": 1,
          "description": "Handoffs per page. Defaults to 10; maximum 25."
        },
        "state": {
          "enum": [
            "open",
            "all"
          ],
          "type": "string",
          "description": "Filter to open Handoffs or include all states."
        }
      },
      "additionalProperties": false
    }
    arguments 26 lines
  • get_room auth-required 14h ago

    Fetch a single room by its invite code, including members and quick actions.

    mcp-tool

    {
      "type": "object",
      "required": [
        "invite_code"
      ],
      "properties": {
        "invite_code": {
          "type": "string",
          "description": "Room invite code."
        }
      },
      "additionalProperties": false
    }
    arguments 13 lines
  • create_room auth-required never probed

    Create a new private room owned by the authenticated account. Free accounts may own up to five rooms. If this agent was granted every room and has no delivery room yet, the new room becomes its delivery room — where its handoffs and direct questions land.

    mcp-tool

    {
      "type": "object",
      "required": [
        "name",
        "icon",
        "color"
      ],
      "properties": {
        "icon": {
          "type": "string",
          "description": "A v3 room-icon catalog id, e.g. \"bell\". Call list_room_icons to discover the valid ids."
        },
        "name": {
          "type": "string",
          "maxLength": 24,
          "description": "Room display name."
        },
        "color": {
          "type": "string",
          "description": "Hex color, e.g. \"#e33122\"."
        }
      },
      "additionalProperties": false
    }
    arguments 24 lines
  • create_public_room changes data auth-required never probed

    Create a publicly discoverable room with a unique @handle. Counts toward the free-plan five-room cap.

    mcp-tool

    {
      "type": "object",
      "required": [
        "name",
        "icon",
        "color",
        "handle"
      ],
      "properties": {
        "icon": {
          "type": "string",
          "description": "A v3 room-icon catalog id, e.g. \"bell\". Call list_room_icons to discover the valid ids."
        },
        "name": {
          "type": "string",
          "maxLength": 24,
          "description": "Room display name."
        },
        "color": {
          "type": "string",
          "description": "Hex color, e.g. \"#e33122\"."
        },
        "handle": {
          "type": "string",
          "pattern": "^[a-z0-9_]{3,20}$",
          "description": "Globally unique @handle (vanity URL): lowercase letters, digits, underscores."
        },
        "category": {
          "type": "string",
          "maxLength": 100,
          "description": "Discovery category."
        },
        "show_owner": {
          "type": "boolean",
          "description": "Whether the owner is shown publicly. Defaults to true."
        },
        "description": {
          "type": "string",
          "maxLength": 120,
          "description": "Short room description shown in public discovery."
        },
        "location_name": {
          "type": "string",
          "maxLength": 160,
          "description": "Place name shown in nearby discovery. Send all three location fields or none."
        },
        "location_latitude": {
          "type": "number",
          "maximum": 90,
          "minimum": -90,
          "description": "Latitude in decimal degrees. Send all three location fields or none."
        },
        "location_longitude": {
          "type": "number",
          "maximum": 180,
          "minimum": -180,
          "description": "Longitude in decimal degrees. Send all three location fields or none."
        }
      },
      "additionalProperties": false
    }
    arguments 61 lines
  • join_room changes data auth-required never probed

    Join a room using its invite code. Include the password only if the room is protected.

    mcp-tool

    {
      "type": "object",
      "required": [
        "invite_code"
      ],
      "properties": {
        "password": {
          "type": "string",
          "description": "Only required for password-protected rooms."
        },
        "invite_code": {
          "type": "string",
          "description": "Room invite code."
        }
      },
      "additionalProperties": false
    }
    arguments 17 lines
  • create_webhook changes data auth-required never probed

    Create an incoming webhook for a room the account owns. The bound account must be Pro. Returns the secret trigger URL — treat it as a credential.

    mcp-tool

    {
      "type": "object",
      "required": [
        "invite_code",
        "name"
      ],
      "properties": {
        "icon": {
          "type": "string",
          "description": "A v3 room-icon catalog id, e.g. \"bell\". Call list_room_icons to discover the valid ids."
        },
        "name": {
          "type": "string",
          "maxLength": 100,
          "description": "Webhook name (shown to the owner)."
        },
        "color": {
          "type": "string",
          "description": "Hex color, e.g. \"#e33122\"."
        },
        "sound": {
          "type": "string",
          "description": "Canonical sound id, e.g. \"ting\". Omit for the room default."
        },
        "title": {
          "type": "string",
          "maxLength": 40,
          "description": "Optional push title used when the webhook fires."
        },
        "enabled": {
          "type": "boolean",
          "description": "Whether the webhook is active. Defaults to true."
        },
        "message": {
          "type": "string",
          "maxLength": 160,
          "description": "Optional default push body (max 120 characters in private rooms, 160 in public rooms)."
        },
        "invite_code": {
          "type": "string",
          "description": "Room invite code."
        },
        "action_number": {
          "type": [
            "integer",
            "null"
          ],
          "maximum": 16,
          "minimum": 1,
          "description": "Quick-action slot whose label, sound, and acknowledgement preset fires use. Omit or pass null for an independent webhook with no Quick Ping preset."
        },
        "cooldown_seconds": {
          "type": "integer",
          "maximum": 60,
          "minimum": 0,
          "description": "Minimum seconds between fires. Defaults to 5."
        }
      },
      "additionalProperties": false
    }
    arguments 60 lines
  • update_quick_action changes data auth-required never probed

    Configure a numbered quick-action slot for a room the account owns. Sends a background room refresh to room members' devices.

    mcp-tool

    {
      "type": "object",
      "required": [
        "invite_code",
        "action_number",
        "label",
        "icon"
      ],
      "properties": {
        "icon": {
          "type": "string",
          "description": "Emoji or icon id."
        },
        "label": {
          "type": "string",
          "maxLength": 255,
          "description": "Button label. Must be sent, but may be empty (\"\") — a Ping can be named by its emoji alone, and clients render an untitled one as just the emoji."
        },
        "sound": {
          "type": "string",
          "description": "Canonical sound id, e.g. \"ting\". Omit for the room default."
        },
        "input_type": {
          "enum": [
            "none",
            "location",
            "link",
            "file",
            "photo",
            "pdf"
          ],
          "type": "string",
          "description": "Detail every press of this action must carry: none (default), location (data.location), link (data.url), file (any attachment), photo (jpg/png attachment) or pdf (pdf attachment). A press without it is a 422 quick_action_input_required."
        },
        "invite_code": {
          "type": "string",
          "description": "Room invite code."
        },
        "requires_ack": {
          "type": "boolean",
          "description": "Whether pings from this action remain open until one eligible recipient acknowledges them."
        },
        "action_number": {
          "type": "integer",
          "maximum": 16,
          "minimum": 1,
          "description": "Quick-action slot number (1–16). Slots 5–16 require the room owner to have Pro."
        }
      },
      "additionalProperties": false
    }
    arguments 51 lines
  • update_quick_actions changes data auth-required never probed

    Configure several of a room's quick-action slots in one call. Prefer this over repeated update_quick_action: each single-slot write wakes room members' devices with its own background refresh, so setting up four Pings one at a time spends four of a finite daily push budget on one operation. Slots you do not list are left exactly as they are, so this is also the right tool for editing a single Ping.

    mcp-tool

    {
      "type": "object",
      "required": [
        "invite_code",
        "actions"
      ],
      "properties": {
        "actions": {
          "type": "array",
          "items": {
            "type": "object",
            "required": [
              "action_number",
              "label",
              "icon"
            ],
            "properties": {
              "icon": {
                "type": "string",
                "description": "Emoji or icon id."
              },
              "label": {
                "type": "string",
                "maxLength": 255,
                "description": "Button label. Must be sent, but may be empty (\"\") — a Ping can be named by its emoji alone, and clients render an untitled one as just the emoji."
              },
              "sound": {
                "type": "string",
                "description": "Canonical sound id, e.g. \"ting\". Omit for the room default."
              },
              "input_type": {
                "enum": [
                  "none",
                  "location",
                  "link",
                  "file",
                  "photo",
                  "pdf"
                ],
                "type": "string",
                "description": "Detail every press of this action must carry: none (default), location (data.location), link (data.url), file (any attachment), photo (jpg/png attachment) or pdf (pdf attachment). A press without it is a 422 quick_action_input_required."
              },
              "requires_ack": {
                "type": "boolean",
                "description": "Whether pings from this action remain open until one eligible recipient acknowledges them."
              },
              "action_number": {
                "type": "integer",
                "maximum": 16,
                "minimum": 1,
                "description": "Quick-action slot number (1–16). Slots 5–16 require the room owner to have Pro."
              }
            },
            "additionalProperties": false
          },
          "maxItems": 16,
          "minItems": 1,
          "description": "Add new pages as complete groups of four in order (5–8, 9–12, 13–16); the room owner needs Pro. The slots to write. Each action_number must appear at most once. Slots omitted here keep their current configuration — nothing in this tool deletes an action."
        },
        "invite_code": {
          "type": "string",
          "description": "Room invite code."
        }
      },
      "additionalProperties": false
    }
    arguments 66 lines
  • set_avatar changes data auth-required never probed

    Set this agent's avatar. Must be one of the PingRoom bot avatars.

    mcp-tool

    {
      "type": "object",
      "required": [
        "avatar_id"
      ],
      "properties": {
        "avatar_id": {
          "type": "string",
          "description": "Bot avatar id, e.g. \"bots-3\"."
        }
      },
      "additionalProperties": false
    }
    arguments 13 lines
  • live_claim auth-required never probed

    Act on a "Who's on it?" request (a live_status stream with template "claim") as your human: "claim" takes an open request (anyone but its asker), "release" lets go of one you hold, "done" finishes it (its claimer, or its asker at any time) and "cancel" withdraws it (its asker, or a room owner or admin). Two claims at once have one winner: the other gets 409 claim_conflict with the current claim, naming who holds it. Repeating your own last action is a no-op that returns the same claim.

    mcp-tool

    {
      "type": "object",
      "required": [
        "invite_code",
        "notification_id",
        "action"
      ],
      "properties": {
        "action": {
          "enum": [
            "claim",
            "release",
            "done",
            "cancel"
          ],
          "type": "string",
          "description": "What to do with the request."
        },
        "invite_code": {
          "type": "string",
          "description": "Room invite code."
        },
        "notification_id": {
          "type": "string",
          "format": "uuid",
          "description": "The request's notification id, from list_notifications or the live_status response."
        }
      },
      "additionalProperties": false
    }
    arguments 30 lines
  • wait_for_approval reads auth-required 4h ago

    Long-poll an approval request until the human decides or it expires. Returns the status and, once decided, the chosen option.

    mcp-tool

    {
      "type": "object",
      "required": [
        "approval_id"
      ],
      "properties": {
        "timeout": {
          "type": "integer",
          "maximum": 30,
          "minimum": 1,
          "description": "Seconds to hold the request open (server-capped)."
        },
        "approval_id": {
          "type": "string",
          "format": "uuid",
          "description": "Approval request id."
        }
      },
      "additionalProperties": false
    }
    arguments 20 lines
  • update_webhook auth-required never probed

    Update an incoming webhook (by id) on a room the account owns — e.g. change its icon, title, message, or sound.

    mcp-tool

    {
      "type": "object",
      "required": [
        "invite_code",
        "webhook_id"
      ],
      "properties": {
        "icon": {
          "type": "string",
          "description": "A v3 room-icon catalog id, e.g. \"bell\". Call list_room_icons to discover the valid ids."
        },
        "name": {
          "type": "string",
          "maxLength": 100,
          "description": "Webhook name (shown to the owner)."
        },
        "color": {
          "type": "string",
          "description": "Hex color, e.g. \"#e33122\"."
        },
        "sound": {
          "type": "string",
          "description": "Canonical sound id, e.g. \"ting\"."
        },
        "title": {
          "type": "string",
          "maxLength": 40,
          "description": "Push title used when the webhook fires."
        },
        "enabled": {
          "type": "boolean",
          "description": "Whether the webhook is active."
        },
        "message": {
          "type": "string",
          "maxLength": 160,
          "description": "Default push body (max 120 characters in private rooms, 160 in public rooms)."
        },
        "webhook_id": {
          "type": "string",
          "description": "Webhook id (from list_webhooks or create_webhook)."
        },
        "invite_code": {
          "type": "string",
          "description": "Room invite code."
        },
        "action_number": {
          "type": [
            "integer",
            "null"
          ],
          "maximum": 16,
          "minimum": 1,
          "description": "Quick-action slot whose label, sound, and acknowledgement preset fires use. Pass null to clear the preset and make the webhook independent."
        },
        "cooldown_seconds": {
          "type": "integer",
          "maximum": 60,
          "minimum": 0,
          "description": "Minimum seconds between fires."
        },
        "regenerate_secret": {
          "type": "boolean",
          "description": "Rotate the secret trigger URL."
        }
      },
      "additionalProperties": false
    }
    arguments 68 lines
  • create_handoff auth-required never probed

    Hand work to exactly one human as either an acknowledgement or a tappable question. The server verifies that one of the recipient's current devices supports the complete Handoff action before creating anything.

    mcp-tool

    {
      "type": "object",
      "required": [
        "kind",
        "prompt",
        "audience"
      ],
      "properties": {
        "data": {
          "type": "object",
          "description": "Structured context returned on read surfaces after connector privacy filtering. Do not put secrets in data."
        },
        "kind": {
          "enum": [
            "ack",
            "question"
          ],
          "type": "string",
          "description": "ack asks the human to acknowledge; question asks them to choose an option."
        },
        "prompt": {
          "type": "string",
          "maxLength": 500,
          "description": "The work/request shown to the human."
        },
        "options": {
          "type": "array",
          "items": {
            "oneOf": [
              {
                "type": "string",
                "maxLength": 40
              },
              {
                "type": "object",
                "required": [
                  "value",
                  "label"
                ],
                "properties": {
                  "label": {
                    "type": "string",
                    "maxLength": 40
                  },
                  "style": {
                    "enum": [
                      "primary",
                      "danger",
                      "default"
                    ],
                    "type": "string"
                  },
                  "value": {
                    "type": "string",
                    "maxLength": 40
                  }
                },
                "additionalProperties": false
              }
            ]
          },
          "maxItems": 4,
          "minItems": 2,
          "description": "Required for question and forbidden for ack. Each item may be a label string or a structured option."
        },
        "urgency": {
          "enum": [
            "active",
            "passive"
          ],
          "type": "string",
          "description": "Notification interruption level. Defaults to active."
        },
        "audience": {
          "type": "object",
          "required": [
            "type",
            "user_id"
          ],
          "properties": {
            "type": {
              "enum": [
                "direct"
              ],
              "type": "string"
            },
            "user_id": {
              "enum": [
                "me"
              ],
              "type": "string",
              "description": "The authorizing human, expressed as the literal value \"me\"."
            }
          },
          "additionalProperties": false
        },
        "reply_to": {
          "type": "string",
          "maxLength": 255,
          "description": "Optional routing pointer."
        },
        "expires_in": {
          "type": "integer",
          "description": "Seconds before the handoff expires; the server clamps this to its safe range."
        },
        "correlation_id": {
          "type": "string",
          "maxLength": 255,
          "description": "Your own stable correlation id."
        },
        "idempotency_key": {
          "type": "string",
          "maxLength": 255,
          "minLength": 1,
          "description": "Stable key for at-most-once creation across both Ack and Question kinds."
        }
      },
      "additionalProperties": false
    }
    arguments 119 lines
  • delete_attachment changes data auth-required never probed

    Delete an attachment this agent uploaded that is not yet claimed by a ping.

    mcp-tool

    {
      "type": "object",
      "required": [
        "attachment_id"
      ],
      "properties": {
        "attachment_id": {
          "type": "string",
          "format": "uuid",
          "description": "Attachment id returned by upload_attachment."
        }
      },
      "additionalProperties": false
    }
    arguments 14 lines
  • get_live_status auth-required 16h ago

    Read back the current state of a live stream you created, so a restarted producer can reconcile instead of starting a duplicate. Only returns streams started by this credential, within the last 24 hours. Returns notification_id and correlation_id, then the stored display state (state, progress, message, category, template, accent_override, eta_at, deadline_at, duration_seconds, metrics, prompt, options, left, right, center, steps, current_step), action_state, and updated_at; a claim request also returns its title and claim (status, by, at, late). Fields you never set come back as null rather than being omitted, so a matchup/metrics/countdown/question stream can be resumed without re-sending content.

    mcp-tool

    {
      "type": "object",
      "required": [
        "invite_code",
        "correlation_id"
      ],
      "properties": {
        "invite_code": {
          "type": "string",
          "description": "Room invite code."
        },
        "correlation_id": {
          "type": "string",
          "maxLength": 255,
          "description": "The stream key used when the stream was started."
        }
      },
      "additionalProperties": false
    }
    arguments 19 lines
  • wait_for_notification auth-required 26h ago

    Long-poll for the next ping. Blocks until one arrives or the timeout elapses — the real-time inbound channel for an agent. Excludes everything your connected human sends (and your own sends); you receive other room members' Pings.

    mcp-tool

    {
      "type": "object",
      "properties": {
        "after": {
          "type": "string",
          "format": "uuid",
          "description": "Cursor from the previous call; omit to get the current head."
        },
        "timeout": {
          "type": "integer",
          "maximum": 30,
          "minimum": 1,
          "description": "Seconds to hold the request open (server-capped)."
        }
      },
      "additionalProperties": false
    }
    arguments 17 lines
  • list_rooms reads auth-required 16h ago

    List the rooms the authenticated account belongs to.

    mcp-tool

    {
      "type": "object",
      "properties": {},
      "additionalProperties": false
    }
    arguments 5 lines
  • connection_info reads auth-required 11h ago

    Verify the current connection: owner.id is the human public User ID, handle identifies the robot, and home_room is its delivery room. After login or reconnect, match owner.id and handle to the approved account and robot before sending. A mismatch means stop and reload or restart the MCP client. Includes a credential-protected latest-pings feed and token-free install URL; never send credentials to the install URL.

    mcp-tool

    {
      "type": "object",
      "properties": {},
      "additionalProperties": false
    }
    arguments 5 lines
  • rotate_handle auth-required never probed

    Rotate this agent's public handle — kill-switch for a leaked handle.

    mcp-tool

    {
      "type": "object",
      "properties": {},
      "additionalProperties": false
    }
    arguments 5 lines
  • get_notification reads auth-required 16h ago

    Fetch one visible ping by notification id, including its current action_state and, once anything on its data.checklist is checked, checklist_state.

    mcp-tool

    {
      "type": "object",
      "required": [
        "notification_id"
      ],
      "properties": {
        "notification_id": {
          "type": "string",
          "format": "uuid",
          "description": "Room notification id."
        }
      },
      "additionalProperties": false
    }
    arguments 14 lines
  • list_questions auth-required 1h ago

    List a bounded page of questions you asked, newest first. Optionally filter by state; use page while has_more is true.

    mcp-tool

    {
      "type": "object",
      "properties": {
        "page": {
          "type": "integer",
          "minimum": 1,
          "description": "Page number, newest first."
        },
        "limit": {
          "type": "integer",
          "default": 10,
          "maximum": 25,
          "minimum": 1,
          "description": "Questions per page. Defaults to 10; maximum 25."
        },
        "state": {
          "enum": [
            "pending",
            "answered",
            "expired",
            "cancelled",
            "all"
          ],
          "type": "string",
          "description": "Filter by state. Omit for all."
        }
      },
      "additionalProperties": false
    }
    arguments 29 lines
  • get_approval reads auth-required 1h ago

    Fetch the current status of an approval request without blocking.

    mcp-tool

    {
      "type": "object",
      "required": [
        "approval_id"
      ],
      "properties": {
        "approval_id": {
          "type": "string",
          "format": "uuid",
          "description": "Approval request id."
        }
      },
      "additionalProperties": false
    }
    arguments 14 lines
  • delete_webhook auth-required never probed

    Delete an incoming webhook (by id) from a room the account owns.

    mcp-tool

    {
      "type": "object",
      "required": [
        "invite_code",
        "webhook_id"
      ],
      "properties": {
        "webhook_id": {
          "type": "string",
          "description": "Webhook id (from list_webhooks or create_webhook)."
        },
        "invite_code": {
          "type": "string",
          "description": "Room invite code."
        }
      },
      "additionalProperties": false
    }
    arguments 18 lines
  • list_quick_actions reads auth-required 14h ago

    List the quick actions configured for a room.

    mcp-tool

    {
      "type": "object",
      "required": [
        "invite_code"
      ],
      "properties": {
        "invite_code": {
          "type": "string",
          "description": "Room invite code."
        }
      },
      "additionalProperties": false
    }
    arguments 13 lines
  • request_approval sends messages auth-required never probed

    Ask the human to approve or reject an action, then block on their answer (pair with wait_for_approval). Delivered as a push to the connected human only, so like a direct ask_question to them it needs no trigger permission in the room; public and personal rooms are refused. Rate-limited.

    mcp-tool

    {
      "type": "object",
      "required": [
        "invite_code",
        "question"
      ],
      "properties": {
        "ttl": {
          "type": "integer",
          "minimum": 1,
          "description": "Seconds the request stays open before it expires."
        },
        "data": {
          "type": "object",
          "description": "Arbitrary structured context, returned on reads after connector privacy filtering. Do not put secrets in data."
        },
        "title": {
          "type": "string",
          "maxLength": 40,
          "description": "Optional short title for the request."
        },
        "options": {
          "type": "array",
          "items": {
            "type": "string",
            "maxLength": 40
          },
          "maxItems": 4,
          "minItems": 2,
          "description": "Answers to choose between. Defaults to [\"approve\",\"deny\"]."
        },
        "question": {
          "type": "string",
          "maxLength": 500,
          "description": "What you want the human to decide on."
        },
        "invite_code": {
          "type": "string",
          "description": "Room invite code."
        },
        "correlation_id": {
          "type": "string",
          "maxLength": 255,
          "description": "Your own id, echoed back unchanged on read."
        },
        "idempotency_key": {
          "type": "string",
          "maxLength": 255,
          "minLength": 1,
          "description": "Stable key so a retried call cannot create a second one."
        }
      },
      "additionalProperties": false
    }
    arguments 54 lines
  • get_question reads auth-required 14h ago

    Fetch the current state of a question without blocking.

    mcp-tool

    {
      "type": "object",
      "required": [
        "question_id"
      ],
      "properties": {
        "question_id": {
          "type": "string",
          "format": "uuid",
          "description": "Question id."
        }
      },
      "additionalProperties": false
    }
    arguments 14 lines
  • get_handoff reads auth-required 21h ago

    Fetch the authoritative current state of one Handoff without blocking.

    mcp-tool

    {
      "type": "object",
      "required": [
        "handoff_id"
      ],
      "properties": {
        "handoff_id": {
          "type": "string",
          "format": "uuid",
          "description": "Handoff id."
        }
      },
      "additionalProperties": false
    }
    arguments 14 lines
  • list_room_icons auth-required 21h ago

    List the room-icon catalog (icon ids, tags, and categories). Call this before create_room / create_public_room / create_webhook to pick a valid icon id, and to interpret icon values returned by reads.

    mcp-tool

    {
      "type": "object",
      "properties": {},
      "additionalProperties": false
    }
    arguments 5 lines
  • ask_question sends messages auth-required never probed

    Ask a person a question with 2-4 tappable options, then block on their answer (pair with wait_for_answer). Delivered as a push they can answer from the lock screen or in-app; the first valid answer wins. Rate-limited.

    mcp-tool

    {
      "type": "object",
      "required": [
        "invite_code",
        "prompt"
      ],
      "properties": {
        "ttl": {
          "type": "integer",
          "minimum": 1,
          "description": "Seconds the question stays open before it expires."
        },
        "data": {
          "type": "object",
          "properties": {
            "location": {
              "type": "object",
              "required": [
                "latitude",
                "longitude"
              ],
              "properties": {
                "label": {
                  "type": "string",
                  "maxLength": 100,
                  "description": "Optional place name shown to the recipient."
                },
                "address": {
                  "type": "string",
                  "maxLength": 255,
                  "description": "Optional formatted street address."
                },
                "latitude": {
                  "type": "number",
                  "maximum": 90,
                  "minimum": -90,
                  "description": "Latitude in decimal degrees."
                },
                "longitude": {
                  "type": "number",
                  "maximum": 180,
                  "minimum": -180,
                  "description": "Longitude in decimal degrees."
                }
              },
              "description": "A shareable geographic location.",
              "additionalProperties": false
            },
            "checklist": {
              "type": "object",
              "required": [
                "items"
              ],
              "properties": {
                "items": {
                  "type": "array",
                  "items": {
                    "type": "object",
                    "required": [
                      "text"
                    ],
                    "properties": {
                      "text": {
                        "type": "string",
                        "maxLength": 80,
                        "minLength": 1,
                        "description": "One checklist item."
                      }
                    },
                    "additionalProperties": false
                  },
                  "maxItems": 25,
                  "minItems": 1
                }
              },
              "description": "A short checklist the room can tick through, e.g. a shopping list. The room ticks it together: a checked item is checked for everyone, cannot be unchecked, and alerts the other recipients.",
              "additionalProperties": false
            }
          },
          "description": "Arbitrary structured context (max 25 keys / 8KB). Read surfaces return it after connector privacy filtering; do not put secrets in data. data.location is reserved for a shareable location, and data.checklist for a checklist.",
          "maxProperties": 25,
          "additionalProperties": true
        },
        "prompt": {
          "type": "string",
          "maxLength": 500,
          "description": "The question the person reads."
        },
        "context": {
          "type": "string",
          "maxLength": 40,
          "description": "Optional secondary line, e.g. a build number."
        },
        "options": {
          "type": "array",
          "items": {
            "type": "object",
            "required": [
              "value",
              "label"
            ],
            "properties": {
              "label": {
                "type": "string",
                "maxLength": 40,
                "description": "Button text shown to the person."
              },
              "style": {
                "enum": [
                  "primary",
                  "danger",
                  "default"
                ],
                "type": "string",
                "description": "primary = affirmative (brand color), danger = destructive (red), default = quiet."
              },
              "value": {
                "type": "string",
                "maxLength": 40,
                "description": "Stable token returned as the answer."
              }
            },
            "additionalProperties": false
          },
          "maxItems": 4,
          "minItems": 2,
          "description": "Answer options in display order. Omit for a default Approve/Deny."
        },
        "reply_to": {
          "type": "string",
          "maxLength": 255,
          "description": "Optional routing pointer, echoed back unchanged."
        },
        "text_input": {
          "type": "object",
          "properties": {
            "max_length": {
              "type": "integer",
              "maximum": 60,
              "minimum": 1,
              "description": "Max characters (default 60)."
            },
            "placeholder": {
              "type": "string",
              "maxLength": 60,
              "description": "Hint shown in the reply field."
            }
          },
          "description": "Invite a typed answer (on its own, or alongside options). max_length is capped at 60.",
          "additionalProperties": false
        },
        "invite_code": {
          "type": "string",
          "description": "Room invite code."
        },
        "attachment_ids": {
          "type": "array",
          "items": {
            "type": "string",
            "format": "uuid"
          },
          "maxItems": 4,
          "description": "Ids of up to 4 uploaded attachments (see upload_attachment) to include. Uploading requires a Pro account."
        },
        "correlation_id": {
          "type": "string",
          "maxLength": 255,
          "description": "Your own id, echoed back unchanged on read."
        },
        "idempotency_key": {
          "type": "string",
          "maxLength": 255,
          "minLength": 1,
          "description": "Stable key so a retried call cannot create a second one."
        }
      },
      "additionalProperties": false
    }
    arguments 178 lines
  • activate_agent_inbox sends messages auth-required never probed

    Start or resume the onboarding Question in the private room the human chose during authorization. If recipient_not_ready, ask the human to install or update PingRoom from install_url, open the app, sign in, and enable notifications before retrying. Read question.id, then call wait_for_handoff only while state is pending and within a bounded local deadline. Success is answered with activation_completed true. Any other terminal result is incomplete: stop polling that attempt, then call activate_agent_inbox again for one numbered retry. The stamp requires native phone receipt before the human answer.

    mcp-tool

    {
      "type": "object",
      "properties": {},
      "additionalProperties": false
    }
    arguments 5 lines
  • wait_for_handoff auth-required never probed

    Long-poll a Handoff until the human resolves it, it expires, or the bounded timeout elapses. For the onboarding Question returned by activate_agent_inbox, success requires an answered result with activation_completed true; use a bounded local deadline and treat any terminal answer without that stamp as incomplete.

    mcp-tool

    {
      "type": "object",
      "required": [
        "handoff_id"
      ],
      "properties": {
        "timeout": {
          "type": "integer",
          "maximum": 25,
          "minimum": 0,
          "description": "Seconds to hold the request open; use 0 for an immediate state read."
        },
        "handoff_id": {
          "type": "string",
          "format": "uuid",
          "description": "Handoff id."
        }
      },
      "additionalProperties": false
    }
    arguments 20 lines
  • upload_attachment changes data auth-required never probed

    Upload a small file (max ~90 KiB over MCP; Pro account required) and get an attachment id to include in broadcast or ask_question via attachment_ids. Larger files: use the PingRoom CLI or agent REST API.

    mcp-tool

    {
      "type": "object",
      "required": [
        "filename",
        "content_base64"
      ],
      "properties": {
        "filename": {
          "type": "string",
          "maxLength": 255,
          "minLength": 1,
          "description": "File name including extension, e.g. report.md."
        },
        "mime_type": {
          "type": "string",
          "maxLength": 100,
          "description": "Optional MIME type, e.g. text/markdown. Defaults from the filename extension."
        },
        "content_base64": {
          "type": "string",
          "maxLength": 124000,
          "minLength": 1,
          "description": "Base64-encoded file bytes (standard alphabet, padding optional)."
        }
      },
      "additionalProperties": false
    }
    arguments 27 lines
  • get_attachment auth-required 21h ago

    Fetch an attachment visible to this agent as base64 content plus metadata. Results over the connector size limit return attachment_too_large — fetch those via the agent REST API instead.

    mcp-tool

    {
      "type": "object",
      "required": [
        "attachment_id"
      ],
      "properties": {
        "attachment_id": {
          "type": "string",
          "format": "uuid",
          "description": "Attachment id returned by upload_attachment."
        }
      },
      "additionalProperties": false
    }
    arguments 14 lines
  • list_webhooks reads auth-required 11h ago

    List the incoming webhooks (with their trigger URLs) for a room the account owns.

    mcp-tool

    {
      "type": "object",
      "required": [
        "invite_code"
      ],
      "properties": {
        "invite_code": {
          "type": "string",
          "description": "Room invite code."
        }
      },
      "additionalProperties": false
    }
    arguments 13 lines
_ try it over mcp 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 0802db1948b58367.

Every step, filled in for this listing: https://brick.blue/api/v1/agents/0802db1948b58367/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/0802db1948b58367/badge.svg)](https://brick.blue/agent/0802db1948b58367?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 knowoff the mcp door
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.