Idempotency keys, locks, timers, and inboxes for agents over MCP. No payments.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
Start an idempotency key or return the prior outcome. fingerprint is a hex hash.
This tool isn't marked read-only, so it may change something on the server or in an account you connected.
Pick your client. Values in capitals, like YOUR_TOKEN, are yours to fill in.
claude mcp add --transport http holdkit https://holdkit.peerfoundry.ai/mcp
Start an idempotency key or return the prior outcome. fingerprint is a hex hash.
| Argument | Type | Description |
|---|---|---|
| key* | string | |
| scope* | string | |
| ttl_s | integer | |
| fingerprint* | string |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"key",
"scope",
"fingerprint"
],
"properties": {
"key": {
"type": "string",
"maxLength": 200,
"minLength": 1
},
"scope": {
"type": "string",
"maxLength": 64,
"minLength": 1
},
"ttl_s": {
"type": "integer",
"maximum": 86400,
"minimum": 1
},
"fingerprint": {
"type": "string",
"pattern": "^[a-f0-9]{32,128}$"
}
}
}Store the outcome reference for an idempotency key. scope (max 64) and owner are optional. When owner is omitted, the caller key hash is sent.
| Argument | Type | Description |
|---|---|---|
| key* | string | |
| owner | string | |
| scope | string | |
| result_ref* | string |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"key",
"result_ref"
],
"properties": {
"key": {
"type": "string"
},
"owner": {
"type": "string"
},
"scope": {
"type": "string",
"maxLength": 64
},
"result_ref": {
"type": "string"
}
}
}Mark inbox events done.
| Argument | Type | Description |
|---|---|---|
| inbox_id* | string | |
| event_ids* | array |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"inbox_id",
"event_ids"
],
"properties": {
"inbox_id": {
"type": "string"
},
"event_ids": {
"type": "array",
"items": {
"type": "string"
},
"maxItems": 50
}
}
}Create an inbox. Returns webhook and A2A URLs.
No arguments.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {}
}Read inbox events after a cursor.
| Argument | Type | Description |
|---|---|---|
| limit | integer | |
| cursor | integer | |
| inbox_id* | string |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"inbox_id"
],
"properties": {
"limit": {
"type": "integer",
"maximum": 50,
"exclusiveMinimum": 0
},
"cursor": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 0
},
"inbox_id": {
"type": "string"
}
}
}Poll an inbox. block_ms is accepted and capped at 0 in this MVP, so the call returns current events.
| Argument | Type | Description |
|---|---|---|
| cursor | integer | |
| block_ms | integer | |
| inbox_id* | string |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"inbox_id"
],
"properties": {
"cursor": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 0
},
"block_ms": {
"type": "integer",
"maximum": 25000,
"minimum": 0
},
"inbox_id": {
"type": "string"
}
}
}Mint a pf_ caller key bound to one HoldKit namespace.
No arguments.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {}
}Delete a value.
| Argument | Type | Description |
|---|---|---|
| key* | string |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"key"
],
"properties": {
"key": {
"type": "string"
}
}
}Read a small value.
| Argument | Type | Description |
|---|---|---|
| key* | string |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"key"
],
"properties": {
"key": {
"type": "string"
}
}
}Write a small value with a TTL. Emails and card numbers are rejected.
| Argument | Type | Description |
|---|---|---|
| key* | string | |
| ttl_s* | integer | |
| value* | string |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"key",
"value",
"ttl_s"
],
"properties": {
"key": {
"type": "string"
},
"ttl_s": {
"type": "integer",
"maximum": 9007199254740991,
"exclusiveMinimum": 0
},
"value": {
"type": "string"
}
}
}Take a lease lock. Returns a fencing token.
| Argument | Type | Description |
|---|---|---|
| name* | string | |
| owner | string | |
| ttl_s* | integer |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"name",
"ttl_s"
],
"properties": {
"name": {
"type": "string"
},
"owner": {
"type": "string"
},
"ttl_s": {
"type": "integer",
"maximum": 3600,
"exclusiveMinimum": 0
}
}
}Release a lock with its fencing token.
| Argument | Type | Description |
|---|---|---|
| name* | string | |
| fencing* | integer |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"name",
"fencing"
],
"properties": {
"name": {
"type": "string"
},
"fencing": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991
}
}
}Cancel a timer.
| Argument | Type | Description |
|---|---|---|
| timer_id* | string |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"timer_id"
],
"properties": {
"timer_id": {
"type": "string"
}
}
}Schedule a durable timer. Delivery URLs must be public https.
| Argument | Type | Description |
|---|---|---|
| url | string | |
| delay_s* | integer | |
| payload* | string | |
| inbox_id | string |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"delay_s",
"payload"
],
"properties": {
"url": {
"type": "string"
},
"delay_s": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 0
},
"payload": {
"type": "string"
},
"inbox_id": {
"type": "string"
}
}
}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 Oct 31, 2026.