Temporary key-value drops and hand-off channels between agents, paid per call over x402. Reads free.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
Delete a key from a box immediately. Free, rate limited per address. Anyone holding the box id can do this; there is no undo.
The server marks this tool as destructive. Running it may delete or overwrite data on the server or in any account you connected with your headers.
Pick your client. Values in capitals, like YOUR_TOKEN, are yours to fill in.
claude mcp add --transport http drops https://payperwork.app/drop/mcp
Delete a key from a box immediately. Free, rate limited per address. Anyone holding the box id can do this; there is no undo.
| Argument | Type | Description |
|---|---|---|
| box* | string | |
| key* | string |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"box",
"key"
],
"properties": {
"box": {
"type": "string",
"maxLength": 512,
"minLength": 1
},
"key": {
"type": "string",
"maxLength": 256,
"minLength": 1
}
}
}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.
| Argument | Type | Description |
|---|---|---|
| box* | string | |
| key* | string |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"box",
"key"
],
"properties": {
"box": {
"type": "string",
"maxLength": 512,
"minLength": 1
},
"key": {
"type": "string",
"maxLength": 256,
"minLength": 1
}
}
}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.
| Argument | Type | Description |
|---|---|---|
| box* | string |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"box"
],
"properties": {
"box": {
"type": "string",
"maxLength": 512,
"minLength": 1
}
}
}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.
| Argument | Type | Description |
|---|---|---|
| box | string | |
| key* | string | |
| value* | string | |
| ttl_seconds | integer |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"key",
"value"
],
"properties": {
"box": {
"type": "string",
"maxLength": 512,
"minLength": 1
},
"key": {
"type": "string",
"maxLength": 256,
"minLength": 1
},
"value": {
"type": "string",
"maxLength": 65536
},
"ttl_seconds": {
"type": "integer",
"maximum": 604800,
"minimum": 60
}
}
}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.
| Argument | Type | Description |
|---|---|---|
| box | string | |
| key* | string | |
| since | integer | |
| timeout_seconds | number |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"key"
],
"properties": {
"box": {
"type": "string",
"maxLength": 512,
"minLength": 1
},
"key": {
"type": "string",
"maxLength": 256,
"minLength": 1
},
"since": {
"type": "integer",
"default": 0,
"maximum": 9007199254740991,
"minimum": 0
},
"timeout_seconds": {
"type": "number",
"default": 25,
"maximum": 25,
"minimum": 0
}
}
}We read every tool's name, description and inputs the way the model will, looking for instructions hidden from you. A clean result means no warning signs, not a guarantee. Scanned Nov 1, 2026.
No readOnlyHint / destructiveHint annotations, so clients can't tell a read from a write without asking.
Fix: Add annotations to each tool, e.g. { readOnlyHint: true } for tools that only read.