protogrid

Search / io.pingroom/pingroom

PingRoom

R0· no sign-in

Send mobile pings and route human questions, approvals, and handoffs from AI agents.

v0.1.0 · active · website · descriptor JSON · versions

An agent can connect right now, no human step.Remote endpoint, no authentication, reachable on the last probe.
Quality83good
Trust79of 100
Uptime, 30 days96%
Latency p50646 ms

Connect

8 clients · secrets stay placeholders
{
  "mcpServers": {
    "pingroom": {
      "type": "http",
      "url": "https://api.pingroom.io/api/agent/mcp"
    }
  }
}
claude mcp add --transport http pingroom https://api.pingroom.io/api/agent/mcp
[mcp_servers.pingroom]
url = "https://api.pingroom.io/api/agent/mcp"
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "pingroom": {
      "type": "remote",
      "url": "https://api.pingroom.io/api/agent/mcp",
      "enabled": true
    }
  }
}
{
  "mcpServers": {
    "pingroom": {
      "type": "http",
      "url": "https://api.pingroom.io/api/agent/mcp"
    }
  },
  "deeplink": "cursor://anysphere.cursor-deeplink/mcp/install?name=pingroom&config=eyJ0eXBlIjoiaHR0cCIsInVybCI6Imh0dHBzOi8vYXBpLnBpbmdyb29tLmlvL2FwaS9hZ2VudC9tY3AifQ%3D%3D"
}
{
  "servers": {
    "pingroom": {
      "type": "http",
      "url": "https://api.pingroom.io/api/agent/mcp"
    }
  }
}
{
  "mcpServers": {
    "pingroom": {
      "httpUrl": "https://api.pingroom.io/api/agent/mcp"
    }
  }
}
extensions:
  "pingroom":
    enabled: true
    name: "pingroom"
    type: streamable_http
    uri: "https://api.pingroom.io/api/agent/mcp"
    timeout: 300

Quality 83 / 100good

protocol75 · weight 25
  • warn
    protocol.modernnewest supported version is 2025-11-25; 2026-07-28 not supported, older versions are deprecated until 2027-07-28
  • n/a
    protocol.statelessonly applies to 2026-07-28 servers
  • pass
    protocol.transportstreamable HTTP
  • n/a
    protocol.list_ttlonly applies to 2026-07-28 servers
authorizationn/a · weight 15
  • n/a
    auth.prm, auth.as_metadata, auth.cimdno remote uses OAuth
  • n/a
    auth.secret_in_urlno templated URL
tool hygiene93 · weight 30
  • pass
    tools.descriptionsevery tool has a description
  • pass
    tools.description_lengthdescriptions are concise
  • pass
    tools.schemasevery tool has an object input schema
  • pass
    tools.annotations41 of 41 tools declare readOnlyHint or destructiveHint
  • pass
    tools.directory_hintsevery tool declares readOnlyHint, destructiveHint, idempotentHint and openWorldHint
  • warn
    tools.token_costabout 11,064 tokens to load every tool
  • pass
    tools.api_dumptools are not a one-to-one API dump
stability75 · weight 15
  • warn
    stability.changes25 tool changes in 30 days
  • pass
    stability.rug_pullno tool changed its meaning under the same name
dependenciesn/a · weight 15
  • n/a
    deps.known_vulns, deps.mcp_sdk_version, deps.resolvableno npm or PyPI package

41 tools, about 11,064 tokens to load them all · tool set e1188d019757 · tools last changed 2026-10-16 · checked 2026-10-19 10:20 UTC

Tool changes

  • broadcastchangeddescription, input schema
    before

    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, without is_urgent or requires_ack (both are ignored there), and it counts toward the visitor's two-ping cap; otherwise use trigger_quick_action there.

    after · 93% of words in common

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

  • broadcastchangeddescription
    before

    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, and it counts toward the visitor's two-ping cap; otherwise use trigger_quick_action there.

    after · 83% of words in common

    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, without is_urgent or requires_ack (both are ignored there), and it counts toward the visitor's two-ping cap; otherwise use trigger_quick_action there.

  • trigger_quick_actionchangeddescription
    before

    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.

    after · 69% of words in common

    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.

  • broadcastchangeddescription
    before

    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. Not available in personal rooms (use trigger_quick_action there).

    after · 62% of words in common

    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, and it counts toward the visitor's two-ping cap; otherwise use trigger_quick_action there.

  • ask_questionchangedinput schema
  • wait_for_ackchangedoutput schema
  • wait_for_notificationchangedoutput schema
  • get_notificationchangeddescription, output schema
    before

    Fetch one visible ping by notification id, including its current action_state.

    after · 60% of words in common

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

  • list_notificationschangedoutput schema
  • broadcastchangeddescription, input schema, output schema
    before

    Send a custom ping to a room the account belongs to. Rate-limited. Not available in personal rooms (use trigger_quick_action there).

    after · 66% of words in common

    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. Not available in personal rooms (use trigger_quick_action there).

Showing the latest 10. Full history: list_changes · trend: quality JSON.

Checks run on what our credential-free, read-only probes observe; tools are never called and no code audit is performed. How it is computed.

Trust 79 / 100

no-repository
provenance55
liveness99
freshness85
hygiene80

+dns-namespace +website +reachable +uptime-96% ~updated-48d-ago -no-repository

Derived from observable signals (official registry feed and our own credential-free probes); no code audit performed. How it is computed.

Endpoints

remoteauthreachableuptime 30dp50protocollast ok
https://api.pingroom.io/api/agent/mcp streamable-httpnoneyes96%646 ms2025-11-252026-10-19

Tools (41)

activate_agent_inboxStart 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.
ask_questionAsk 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.
broadcastSend 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, 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.
cancel_questiondestructiveWithdraw a still-pending question you asked.
connection_inforead-onlyVerify 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.
create_handoffHand 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.
create_public_roomCreate a publicly discoverable room with a unique @handle. Counts toward the free-plan five-room cap.
create_roomCreate 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.
create_webhookCreate 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.
delete_attachmentdestructiveDelete an attachment this agent uploaded that is not yet claimed by a ping.
delete_webhookdestructiveDelete an incoming webhook (by id) from a room the account owns.
disconnectdestructiveRevoke 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.
get_approvalread-onlyFetch the current status of an approval request without blocking.
get_attachmentread-onlyFetch 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.
get_handoffread-onlyFetch the authoritative current state of one Handoff without blocking.
get_live_statusread-onlyRead 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. 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.
get_notificationread-onlyFetch one visible ping by notification id, including its current action_state and, once anything on its data.checklist is checked, checklist_state.
get_questionread-onlyFetch the current state of a question without blocking.
get_roomread-onlyFetch a single room by its invite code, including members and quick actions.
join_roomdestructiveJoin a room using its invite code. Include the password only if the room is protected.
list_handoffsread-onlyList 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.
list_notificationsread-onlyList a bounded page of recent pings across approved rooms, newest first. Use page to continue while has_more is true.
list_questionsread-onlyList a bounded page of questions you asked, newest first. Optionally filter by state; use page while has_more is true.
list_quick_actionsread-onlyList the quick actions configured for a room.
list_room_iconsread-onlyList 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.
list_roomsread-onlyList the rooms the authenticated account belongs to.
list_webhooksread-onlyList the incoming webhooks (with their trigger URLs) for a room the account owns.
live_statusdestructiveStart, 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.
request_approvalAsk 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.
rotate_handledestructiveRotate this agent's public handle — kill-switch for a leaked handle.
set_avatardestructiveSet this agent's avatar. Must be one of the PingRoom bot avatars.
trigger_quick_actionPress 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.
update_quick_actiondestructiveConfigure a numbered quick-action slot for a room the account owns. Sends a background room refresh to room members' devices.
update_quick_actionsdestructiveConfigure 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.
update_webhookdestructiveUpdate an incoming webhook (by id) on a room the account owns — e.g. change its icon, title, message, or sound.
upload_attachmentUpload 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.
wait_for_ackread-onlyLong-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.
wait_for_answerread-onlyLong-poll a question until it is answered or expires. Returns the state and, once answered, the chosen option value + label and the responder.
wait_for_approvalread-onlyLong-poll an approval request until the human decides or it expires. Returns the status and, once decided, the chosen option.
wait_for_handoffLong-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.
wait_for_notificationread-onlyLong-poll for the next ping. Blocks until one arrives or the timeout elapses — the real-time inbound channel for an agent. The agent's own sends are excluded.

Schemas: list_tools.

Official server.json
{
  "name": "io.pingroom/pingroom",
  "icons": [
    {
      "src": "https://pingroom.io/Pingroom-icon.png",
      "sizes": [
        "400x400"
      ],
      "mimeType": "image/png"
    }
  ],
  "title": "PingRoom",
  "$schema": "https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json",
  "remotes": [
    {
      "url": "https://api.pingroom.io/api/agent/mcp",
      "type": "streamable-http"
    }
  ],
  "version": "0.1.0",
  "websiteUrl": "https://pingroom.io/developers",
  "description": "Send mobile pings and route human questions, approvals, and handoffs from AI agents."
}