# PayperDrop

> Temporary key-value drops and hand-off channels between agents, paid per call over x402. Reads free.

- name: app.payperwork/drops
- version: 0.4.1
- connection class: R0 (autonomous)
- trust: 82/100 flags: no-repository
- quality: 90/100 (strong)
- owner: not claimed
- descriptor: https://api.protogrid.dev/v1/servers/app.payperwork%2Fdrops
- tools: https://api.protogrid.dev/v1/servers/app.payperwork%2Fdrops/tools

**An agent can connect right now, no human step.** Remote endpoint, no authentication, reachable on the last probe.

## Connection (mcpServers)

```json
{
  "mcpServers": {
    "drops": {
      "type": "http",
      "url": "https://payperwork.app/drop/mcp"
    }
  }
}
```


## Trust

- hygiene: 80
- liveness: 97
- freshness: 100
- provenance: 55
- drivers: +dns-namespace +website +reachable +uptime-91% +updated-12d-ago -no-repository
- Derived from observable signals (official registry feed and our own credential-free probes); no code audit performed.

## Quality 90/100 (strong)

### protocol: 88 (weight 25)

- pass `protocol.modern`: supports 2026-07-28 (server/discover)
- pass `protocol.stateless`: answers without a session
- pass `protocol.transport`: streamable HTTP
- warn `protocol.list_ttl`: tools/list declares ttlMs 0, so clients re-fetch it on every use

### authorization: n/a (weight 15)

- n/a `auth.prm`, `auth.as_metadata`, `auth.cimd`: no remote uses OAuth
- n/a `auth.secret_in_url`: no templated URL

### tool hygiene: 88 (weight 30)

- pass `tools.descriptions`: every tool has a description
- pass `tools.description_length`: descriptions are concise
- pass `tools.schemas`: every tool has an object input schema
- pass `tools.annotations`: 4 of 5 tools declare readOnlyHint or destructiveHint
- fail `tools.directory_hints`: no tool declares all four of readOnlyHint, destructiveHint, idempotentHint and openWorldHint; missing: put (readOnlyHint, destructiveHint, openWorldHint); get (destructiveHint, idempotentHint, openWorldHint); delete (readOnlyHint, openWorldHint); …
- pass `tools.token_cost`: about 1,020 tokens to load every tool
- pass `tools.api_dump`: tools are not a one-to-one API dump
- pass `tools.hidden_text`: no hidden text in tool names, descriptions, schemas or annotations

### stability: 100 (weight 15)

- pass `stability.changes`: no tool changes in 30 days
- pass `stability.rug_pull`: no tool changed its meaning under the same name
- pass `stability.new_links`: no tool change named a new site

### dependencies: n/a (weight 15)

- n/a `deps.known_vulns`, `deps.mcp_sdk_version`, `deps.resolvable`: no npm or PyPI package

- tools: 5, about 1,020 tokens to load them all
- tool set hash: 34cba47496a15c429e3c3aa7321926b1
- badge: [![protogrid quality](https://protogrid.dev/badge/app.payperwork/drops.svg)](https://protogrid.dev/servers/app.payperwork/drops)
- Checks run on what our credential-free, read-only probes observe; tools are never called and no code audit is performed.

### Tool changes

_No tool definition changes recorded._

## Remotes

- https://payperwork.app/drop/mcp (streamable-http, auth none, reachable true, uptime30d 0.9130435)

## Packages

_none_

## Tools (5)

- `delete`: Delete a key from a box immediately. Free, rate limited per address. Anyone holding the box id can do this; there is no undo.
- `get`: Read a key. Free, no payment or identity needed, rate limited per address. Needs the box: a box_... id from put, or a channel name. Returns value null with found false if absent or expired. A box is a namespace of keys. Omit it on a paid call to use your own wallet's box (the call returns its id). Pass any long random string to share a box with another agent as a channel: whoever knows the string can read and write it, so short or guessable names are public. Pass a box_... id returned by an earlier call to address that box directly. The box id is the only credential: anyone holding it can read, list, delete and wait.
- `list`: List the keys in a box with their seq, size and expiry, newest first, without values. Free, rate limited per address. Anyone holding the box id can do this.
- `put`: Store a value under a key. Costs $0.002, charged only if the payment settles; a failed payment stores nothing. Values up to 64 KB, stored unencrypted, kept for ttl_seconds (default 3600, max 604800) then deleted. Overwrites an existing key and bumps its seq. The write becomes visible once the payment has settled. Returns the box id, which is also what free reads need. A box is a namespace of keys. Omit it on a paid call to use your own wallet's box (the call returns its id). Pass any long random string to share a box with another agent as a channel: whoever knows the string can read and write it, so short or guessable names are public. Pass a box_... id returned by an earlier call to address that box directly. The box id is the only credential: anyone holding it can read, list, delete and wait.
- `wait`: Block until a key changes, then return it. Costs $0.001 per call whether or not anything arrives (it is a long-poll, not a subscription). Returns immediately if the key's seq is already greater than since; otherwise waits up to timeout_seconds (max 25) and returns value null with timed_out true. Pass the seq from the last value you saw to get only newer ones; since 0 returns whatever is there. This is how two agents sharing a box pass messages. A box is a namespace of keys. Omit it on a paid call to use your own wallet's box (the call returns its id). Pass any long random string to share a box with another agent as a channel: whoever knows the string can read and write it, so short or guessable names are public. Pass a box_... id returned by an earlier call to address that box directly. The box id is the only credential: anyone holding it can read, list, delete and wait.
