Multi-agent coordination outside your LLM context: dedupe parallel work, per-agent budgets, handoff
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.
Claim exclusive ownership of a named unit of work so no other sub-agent starts the same thing — call this before starting work, not after. Returns {lease_expires_at, fence} on success, or a 409 if another sub-agent already holds an unexpired lease on the same name (that conflict is free — you are not charged for losing a race). You do not hold the lock forever: once lease_seconds elapses, anyone can acquire it out from under you, even if you're still working. Call aanet_renew_lock periodically while still working, and aanet_release_lock the moment you're done so others don't wait out the full lease unnecessarily. fence is a monotonically increasing token (it grows with every successful acquire of this name, so a later holder always has a larger one). Pass it to aanet_write_file/ aanet_append_file/aanet_delete_file so the server rejects your write once someone else has taken the lock over - protection against a paused agent waking up after its lease expired.
Lock name identifying the unit of work, e.g. "process-batch-3".
Bearer credential for this workspace: either the owner_key returned once by aanet_create_workspace/aanet_create_trial_workspace, or a sub-key returned by aanet_mint_subkey. Sent under the hood as `Authorization: Bearer <api_key>`. Owner-only tools reject a sub-key with a 403.
The workspace_id from aanet_create_workspace or aanet_create_trial_workspace.
How long you hold the lock before it becomes reclaimable by anyone else, 1-3600 seconds.
Optional retry-safety token (any unique string, e.g. a UUID). If a call times out and you repeat it with the same key and the same arguments, the first successful result is returned again without charging a second time. Keys are remembered for 24 hours, per sub-key. Reusing a key with different arguments is an error (code=IDEMPOTENCY_KEY_REUSED).
This tool isn't marked read-only, so it may change something on the server or in an account you connected.
Claim exclusive ownership of a named unit of work so no other sub-agent starts the same thing — call this before starting work, not after. Returns {lease_expires_at, fence} on success, or a 409 if another sub-agent already holds an unexpired lease on the same name (that conflict is free — you are not charged for losing a race). You do not hold the lock forever: once lease_seconds elapses, anyone can acquire it out from under you, even if you're still working. Call aanet_renew_lock periodically while still working, and aanet_release_lock the moment you're done so others don't wait out the full lease unnecessarily. fence is a monotonically increasing token (it grows with every successful acquire of this name, so a later holder always has a larger one). Pass it to aanet_write_file/ aanet_append_file/aanet_delete_file so the server rejects your write once someone else has taken the lock over - protection against a paused agent waking up after its lease expired.
| Argument | Type | Description |
|---|---|---|
| name* | string | Lock name identifying the unit of work, e.g. "process-batch-3". |
| api_key* | string | Bearer credential for this workspace: either the owner_key returned once by aanet_create_workspace/aanet_create_trial_workspace, or a sub-key returned by aanet_mint_subkey. Sent under the hood as `Authorization: Bearer <api_key>`. Owner-only tools reject a sub-key with a 403. |
| workspace_id* | string | The workspace_id from aanet_create_workspace or aanet_create_trial_workspace. |
| lease_seconds* | integer | How long you hold the lock before it becomes reclaimable by anyone else, 1-3600 seconds. |
| idempotency_key | any | Optional retry-safety token (any unique string, e.g. a UUID). If a call times out and you repeat it with the same key and the same arguments, the first successful result is returned again without charging a second time. Keys are remembered for 24 hours, per sub-key. Reusing a key with different arguments is an error (code=IDEMPOTENCY_KEY_REUSED). |
{
"type": "object",
"title": "aanet_acquire_lockArguments",
"required": [
"api_key",
"workspace_id",
"name",
"lease_seconds"
],
"properties": {
"name": {
"type": "string",
"title": "Name",
"description": "Lock name identifying the unit of work, e.g. \"process-batch-3\"."
},
"api_key": {
"type": "string",
"title": "Api Key",
"description": "Bearer credential for this workspace: either the owner_key returned once by aanet_create_workspace/aanet_create_trial_workspace, or a sub-key returned by aanet_mint_subkey. Sent under the hood as `Authorization: Bearer <api_key>`. Owner-only tools reject a sub-key with a 403."
},
"workspace_id": {
"type": "string",
"title": "Workspace Id",
"description": "The workspace_id from aanet_create_workspace or aanet_create_trial_workspace."
},
"lease_seconds": {
"type": "integer",
"title": "Lease Seconds",
"maximum": 3600,
"description": "How long you hold the lock before it becomes reclaimable by anyone else, 1-3600 seconds.",
"exclusiveMinimum": 0
},
"idempotency_key": {
"anyOf": [
{
"type": "string",
"maxLength": 255
},
{
"type": "null"
}
],
"title": "Idempotency Key",
"default": null,
"description": "Optional retry-safety token (any unique string, e.g. a UUID). If a call times out and you repeat it with the same key and the same arguments, the first successful result is returned again without charging a second time. Keys are remembered for 24 hours, per sub-key. Reusing a key with different arguments is an error (code=IDEMPOTENCY_KEY_REUSED)."
}
}
}Append one entry to a file without touching what's already there, creating the file if it doesn't exist yet — use aanet_write_file instead when you need to replace the whole file. Typical use: a shared log or running notes file multiple sub-agents contribute to. Fires a file_write webhook event on success. Rejected with 413, before writing or charging, if the resulting file (existing content + this append) would exceed 1 MiB. Accepts the same fence guard as aanet_write_file. Returns {path, appended, etag}.
| Argument | Type | Description |
|---|---|---|
| path* | string | Virtual file path within the workspace. |
| fence | any | Fencing token returned by aanet_acquire_lock/aanet_renew_lock. If another sub-agent has acquired that lock since, the call is rejected with 409 STALE_FENCE (free) instead of writing as a stale holder. Omit for an unguarded write. |
| stamp | boolean | Same attribution-comment option as on aanet_write_file, applied to this appended entry. |
| api_key* | string | Bearer credential for this workspace: either the owner_key returned once by aanet_create_workspace/aanet_create_trial_workspace, or a sub-key returned by aanet_mint_subkey. Sent under the hood as `Authorization: Bearer <api_key>`. Owner-only tools reject a sub-key with a 403. |
| content* | string | Text to append as a new entry — the existing content is kept. |
| if_match |
Create a free trial workspace — no payment, no arguments, works immediately. Use this instead of aanet_create_workspace when you want to exercise the API (files, locks, sub-keys, messages) before committing real money. Pre-funded with a small fixed balance (currently 1000 units = $0.01 — enough for a realistic multi-agent round, but NOT for a successful write of a file at the 1 MiB cap, which costs 1029 units; that is a known limit of the trial, not a bug. An oversize write is still rejected with 413 for free, so the cap itself is checkable) and expires exactly 24 hours after creation, regardless of remaining balance or activity — it is then deleted permanently along with everything in it. Returns the same shape as aanet_create_workspace plus trial_expires_at. aanet_deposit and aanet_request_refund both reject a trial workspace outright, since no real money ever entered it. If your task won't fit in 24 hours, create a real workspace instead.
No arguments.
{
"type": "object",
"title": "aanet_create_trial_workspaceArguments",
"properties": {}
}Create a real AANet workspace with a prepaid USDC balance — the entry point for an orchestrator agent starting a new swarm task. Use aanet_create_trial_workspace instead if you want to explore the API before paying anything. On success, returns {workspace_id, label, owner_key, created_at}. Store owner_key immediately: it is generated once, never stored in recoverable form, and there is no "forgot my key" recovery path — losing it means losing control of the workspace. The workspace starts with a balance of 0; fund it with aanet_deposit before any metered operation will succeed.
| Argument | Type | Description |
|---|---|---|
| label* | string | A display name for your own reference — free text, not required to be unique. |
{
"type": "object",
"title": "aanet_create_workspaceArguments",
"required": [
"label"
],
"properties": {
"label": {
"type": "string",
"title": "Label",
"description": "A display name for your own reference — free text, not required to be unique."
}
}
}Permanently remove a file — the missing piece of the file lifecycle alongside aanet_read_file/aanet_write_file/aanet_append_file. There is no undo: to recover, a sub-agent would need its own backup of the content. Fires a file_delete webhook event on success (see aanet_register_webhook). Raises a 404 if the path doesn't exist, a 409 if it's a directory or if_match doesn't match the current etag. Returns {path, deleted}.
| Argument | Type | Description |
|---|---|---|
| path* | string | Virtual file path within the workspace. Must point to a file, not a directory. |
| fence | any | Fencing token returned by aanet_acquire_lock/aanet_renew_lock. If another sub-agent has acquired that lock since, the call is rejected with 409 STALE_FENCE (free) instead of writing as a stale holder. Omit for an unguarded write. |
| api_key* | string | Bearer credential for this workspace: either the owner_key returned once by aanet_create_workspace/aanet_create_trial_workspace, or a sub-key returned by aanet_mint_subkey. Sent under the hood as `Authorization: Bearer <api_key>`. Owner-only tools reject a sub-key with a 403. |
| if_match | any | The file's current etag, for the same conflict-detection purpose as on aanet_write_file. |
| fence_lock | any | Name of the lock the fence belongs to; defaults to the file path itself. Needs fence. |
| workspace_id* | string |
Permanently remove a registered webhook — no further events will be delivered to it, active or auto-disabled. Owner_key required. There is no way to temporarily pause one; delete and re-register with aanet_register_webhook if you want it back later (you'll get a new secret).
| Argument | Type | Description |
|---|---|---|
| api_key* | string | Bearer credential for this workspace: either the owner_key returned once by aanet_create_workspace/aanet_create_trial_workspace, or a sub-key returned by aanet_mint_subkey. Sent under the hood as `Authorization: Bearer <api_key>`. Owner-only tools reject a sub-key with a 403. |
| webhook_id* | string | The webhook_id from aanet_register_webhook or aanet_list_webhooks. |
| workspace_id* | string | The workspace_id from aanet_create_workspace or aanet_create_trial_workspace. |
{
"type": "object",
"title": "aanet_delete_webhookArguments",
"required": [
"api_key",
"workspace_id",
"webhook_id"
],
"properties": {
"api_key": {
"type": "string",
"title": "Api Key",
"description": "Bearer credential for this workspace: either the owner_key returned once by aanet_create_workspace/aanet_create_trial_workspace, or a sub-key returned by aanet_mint_subkey. Sent under the hood as `Authorization: Bearer <api_key>`. Owner-only tools reject a sub-key with a 403."
},
"webhook_id": {
"type": "string",
"title": "Webhook Id",
"description": "The webhook_id from aanet_register_webhook or aanet_list_webhooks."
},
"workspace_id": {
"type": "string",
"title": "Workspace Id",
"description": "The workspace_id from aanet_create_workspace or aanet_create_trial_workspace."
}
}
}Permanently and irreversibly delete a workspace: every sub-key, all files, the activity log, and any registered webhooks are destroyed along with it — there is no undo and no trash/recycle bin. Requires the owner_key; a sub-key gets a 403. Call aanet_request_refund first if the workspace still has balance you want back, and wait for aanet_get_refund_status to show "paid" before deleting — once the workspace is gone, so is any way to claim what was left. Use this when a task is finished or permanently abandoned, not as a way to "reset" a workspace you plan to keep using.
| Argument | Type | Description |
|---|---|---|
| api_key* | string | Bearer credential for this workspace: either the owner_key returned once by aanet_create_workspace/aanet_create_trial_workspace, or a sub-key returned by aanet_mint_subkey. Sent under the hood as `Authorization: Bearer <api_key>`. Owner-only tools reject a sub-key with a 403. |
| workspace_id* | string | The workspace_id from aanet_create_workspace or aanet_create_trial_workspace. |
{
"type": "object",
"title": "aanet_delete_workspaceArguments",
"required": [
"api_key",
"workspace_id"
],
"properties": {
"api_key": {
"type": "string",
"title": "Api Key",
"description": "Bearer credential for this workspace: either the owner_key returned once by aanet_create_workspace/aanet_create_trial_workspace, or a sub-key returned by aanet_mint_subkey. Sent under the hood as `Authorization: Bearer <api_key>`. Owner-only tools reject a sub-key with a 403."
},
"workspace_id": {
"type": "string",
"title": "Workspace Id",
"description": "The workspace_id from aanet_create_workspace or aanet_create_trial_workspace."
}
}
}Fund a real workspace via the x402 protocol — a two-step call using the same tool both times. This does not accept trial workspaces (use aanet_create_workspace for a fundable one) and requires the owner_key. Step 1 — call with only api_key/workspace_id/amount_usd: returns an x402 PaymentRequired challenge offering USDC on Base, Polygon, Arbitrum, Avalanche, and Solana as payment options; nothing is charged yet. Step 2 — sign that challenge with your own wallet/x402 client (this tool cannot sign for you) and call again with the identical amount_usd plus the resulting proof as payment_signature; on success this verifies and settles against the facilitator and returns {workspace_id, deposited_units, tx_hash, network}. A failed or already-used signature raises an error rather than silently no-op'ing.
| Argument | Type | Description |
|---|---|---|
| api_key* | string | Bearer credential for this workspace: either the owner_key returned once by aanet_create_workspace/aanet_create_trial_workspace, or a sub-key returned by aanet_mint_subkey. Sent under the hood as `Authorization: Bearer <api_key>`. Owner-only tools reject a sub-key with a 403. |
| amount_usd* | string | Deposit amount in US dollars as a decimal string, e.g. "1.00". Minimum $0.25. |
| workspace_id* | string | The workspace_id from aanet_create_workspace or aanet_create_trial_workspace. |
| payment_signature | any | Leave unset on your first call to receive the payment challenge. Set this to the signed proof from your own x402-aware wallet client on the follow-up call with the same amount_usd, to actually settle the payment and credit the balance. |
Estimate the cost of coordinating a swarm on AANet versus relaying the same coordination through your orchestrator's LLM context — before you create a workspace or spend anything. Same formula as the calculator at https://aanet.space/#savings. AANet side assumes ~16 units/round (the average measured over an 8-round run: reads, appends, a lock cycle, a message and a poll) at $0.00001/unit. The relay side assumes ~9,600 tokens/round (re-injecting another agent's update into your prompt) at a blended $2-$10 per million token rate. This is a rough estimate, not a quote — real workloads vary; see aanet_get_activity on an actual workspace for your own measured cost once you're running for real.
| Argument | Type | Description |
|---|---|---|
| agents* | integer | Number of agents in the swarm you're planning. |
| rounds_per_agent* | integer | Coordination rounds each agent will need (reads/writes/lock cycles). |
{
"type": "object",
"title": "aanet_estimate_savingsArguments",
"required": [
"agents",
"rounds_per_agent"
],
"properties": {
"agents": {
"type": "integer",
"title": "Agents",
"maximum": 1000,
"description": "Number of agents in the swarm you're planning.",
"exclusiveMinimum": 0
},
"rounds_per_agent": {
"type": "integer",
"title": "Rounds Per Agent",
"maximum": 1000,
"description": "Coordination rounds each agent will need (reads/writes/lock cycles).",
"exclusiveMinimum": 0
}
}
}Export the hash-chained (OK) audit rows in ascending order with prev_hash/entry_hash, plus the signed head of the whole chain. Page forward with since_seq = the last chain_seq you got. Verify it yourself with the ~25-line verify_chain function in AGENTS.md (recompute each entry_hash from its fields, check the links and the head signature). Owner_key required; free.
| Argument | Type | Description |
|---|---|---|
| limit | integer | Max rows per page. |
| api_key* | string | Bearer credential for this workspace: either the owner_key returned once by aanet_create_workspace/aanet_create_trial_workspace, or a sub-key returned by aanet_mint_subkey. Sent under the hood as `Authorization: Bearer <api_key>`. Owner-only tools reject a sub-key with a 403. |
| since_seq | integer | Return rows with chain_seq greater than this; 0 = from the start. |
| workspace_id* | string | The workspace_id from aanet_create_workspace or aanet_create_trial_workspace. |
{
"type": "object",
"title": "aanet_export_activityArguments",
"required": [
"api_key",
"workspace_id"
],
"properties": {
"limit": {
"type": "integer",
"title": "Limit",
"default": 100,
"maximum": 500,
"description": "Max rows per page.",
"exclusiveMinimum": 0
},
"api_key": {
"type": "string",
"title": "Api Key",
"description": "Bearer credential for this workspace: either the owner_key returned once by aanet_create_workspace/aanet_create_trial_workspace, or a sub-key returned by aanet_mint_subkey. Sent under the hood as `Authorization: Bearer <api_key>`. Owner-only tools reject a sub-key with a 403."
},
"since_seq": {
"type": "integer",
"title": "Since Seq",
"default": 0,
"minimum": 0,
"description": "Return rows with chain_seq greater than this; 0 = from the start."
},
"workspace_id": {
"type": "string",
"title": "Workspace Id",
"description": "The workspace_id from aanet_create_workspace or aanet_create_trial_workspace."
}
}
}Read the server-side audit log of every attempt in this workspace, successful or rejected — the authoritative source of what each sub-agent actually did, since sub-agents can't fake or skip this the way they could misreport their own actions. Owner_key required. Each entry has subkey_id, operation, path, cost_charged, status (e.g. OK, INSUFFICIENT_BALANCE, SCOPE_DENIED, CONFLICT), and a free-text detail. Use this to reconstruct what happened after the fact, or to check a sub-agent's spend pattern before adjusting its budget_cap via aanet_update_subkey.
| Argument | Type | Description |
|---|---|---|
| limit | integer | Maximum entries to return, newest first, up to 500. |
| since | any | ISO timestamp — only return entries at or after this time. |
| api_key* | string | Bearer credential for this workspace: either the owner_key returned once by aanet_create_workspace/aanet_create_trial_workspace, or a sub-key returned by aanet_mint_subkey. Sent under the hood as `Authorization: Bearer <api_key>`. Owner-only tools reject a sub-key with a 403. |
| since_id | any | Entry id cursor: only entries with id > since_id (strictly exclusive). The recommended way to poll — pass the highest id you've already seen. Results are newest first. |
| operation | any | Filter to one operation type, e.g. "PUT_FILE", "LOCK_ACQUIRE", "SEND_MESSAGE", "WEBHOOK_DELIVERY". Omit for all operation types. |
| subkey_id | any |
Signed tip of the workspace's tamper-evident activity chain: every successful (OK) audit row is hash-linked to the previous one, and this returns {seq, entry_hash, signed_at, key_id, algorithm, signature} - an Ed25519 signature by the service over that tip. Save it OUTSIDE AANet (any key may read it, it reveals no activity): if the operator later rewrote or deleted earlier rows, a fresh export no longer contains your saved entry_hash at that seq. Public key: GET https://aanet.space/.well-known/aanet-signing-key. Free.
| Argument | Type | Description |
|---|---|---|
| api_key* | string | Bearer credential for this workspace: either the owner_key returned once by aanet_create_workspace/aanet_create_trial_workspace, or a sub-key returned by aanet_mint_subkey. Sent under the hood as `Authorization: Bearer <api_key>`. Owner-only tools reject a sub-key with a 403. |
| workspace_id* | string | The workspace_id from aanet_create_workspace or aanet_create_trial_workspace. |
{
"type": "object",
"title": "aanet_get_activity_headArguments",
"required": [
"api_key",
"workspace_id"
],
"properties": {
"api_key": {
"type": "string",
"title": "Api Key",
"description": "Bearer credential for this workspace: either the owner_key returned once by aanet_create_workspace/aanet_create_trial_workspace, or a sub-key returned by aanet_mint_subkey. Sent under the hood as `Authorization: Bearer <api_key>`. Owner-only tools reject a sub-key with a 403."
},
"workspace_id": {
"type": "string",
"title": "Workspace Id",
"description": "The workspace_id from aanet_create_workspace or aanet_create_trial_workspace."
}
}
}Spend totals from the audit log instead of reading every entry: for each group, total_cost (units) and calls. Use it to see which sub-agent is burning budget before adjusting a budget_cap via aanet_update_subkey. Owner_key required. An unknown group_by is an error.
| Argument | Type | Description |
|---|---|---|
| since | any | ISO timestamp — only count entries at or after this time. |
| api_key* | string | Bearer credential for this workspace: either the owner_key returned once by aanet_create_workspace/aanet_create_trial_workspace, or a sub-key returned by aanet_mint_subkey. Sent under the hood as `Authorization: Bearer <api_key>`. Owner-only tools reject a sub-key with a 403. |
| group_by | string | How to group the totals: "subkey_operation" (default), "subkey" or "operation". |
| workspace_id* | string | The workspace_id from aanet_create_workspace or aanet_create_trial_workspace. |
{
"type": "object",
"title": "aanet_get_activity_summaryArguments",
"required": [
"api_key",
"workspace_id"
],
"properties": {
"since": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Since",
"default": null,
"description": "ISO timestamp — only count entries at or after this time."
},
"api_key": {
"type": "string",
"title": "Api Key",
"description": "Bearer credential for this workspace: either the owner_key returned once by aanet_create_workspace/aanet_create_trial_workspace, or a sub-key returned by aanet_mint_subkey. Sent under the hood as `Authorization: Bearer <api_key>`. Owner-only tools reject a sub-key with a 403."
},
"group_by": {
"type": "string",
"title": "Group By",
"default": "subkey_operation",
"description": "How to group the totals: \"subkey_operation\" (default), \"subkey\" or \"operation\"."
},
"workspace_id": {
"type": "string",
"title": "Workspace Id",
"description": "The workspace_id from aanet_create_workspace or aanet_create_trial_workspace."
}
}
}Burn rate and runway: the workspace balance, spend per hour over the last 1h / 24h / 7d (each window shortened to the workspace's age if it is younger) with the hours the balance would last at that pace, and the top spending sub-keys of the last 24h. Each window states the interval it was measured over (measured_since, covered_seconds, shortened) — a young workspace gives a short span and so a large hourly figure. An estimate from the audit log, not a guarantee. Owner_key required; free. Pair it with a balance_low webhook (aanet_register_webhook) to be warned before a 402.
| Argument | Type | Description |
|---|---|---|
| api_key* | string | Bearer credential for this workspace: either the owner_key returned once by aanet_create_workspace/aanet_create_trial_workspace, or a sub-key returned by aanet_mint_subkey. Sent under the hood as `Authorization: Bearer <api_key>`. Owner-only tools reject a sub-key with a 403. |
| workspace_id* | string | The workspace_id from aanet_create_workspace or aanet_create_trial_workspace. |
{
"type": "object",
"title": "aanet_get_forecastArguments",
"required": [
"api_key",
"workspace_id"
],
"properties": {
"api_key": {
"type": "string",
"title": "Api Key",
"description": "Bearer credential for this workspace: either the owner_key returned once by aanet_create_workspace/aanet_create_trial_workspace, or a sub-key returned by aanet_mint_subkey. Sent under the hood as `Authorization: Bearer <api_key>`. Owner-only tools reject a sub-key with a 403."
},
"workspace_id": {
"type": "string",
"title": "Workspace Id",
"description": "The workspace_id from aanet_create_workspace or aanet_create_trial_workspace."
}
}
}Check a lock WITHOUT trying to take it, and tell "nobody ever took it" apart from "someone took it and released it" — a free lock and an already-finished task look identical from aanet_acquire_lock alone. Returns status held | expired (lease ran out, not yet reclaimed) | free (taken before, not held now) | never_held, plus holder_subkey_id/lease_expires_at while held, last_holder_subkey_id, last_acquired_at, last_released_at, acquire_count and release_count. A release is a signal the holder finished with it, not proof the work succeeded — confirm via the result file. 1 unit; a name nobody ever acquired is a free miss.
| Argument | Type | Description |
|---|---|---|
| name* | string | Lock name to inspect, e.g. "process-batch-3". |
| api_key* | string | Bearer credential for this workspace: either the owner_key returned once by aanet_create_workspace/aanet_create_trial_workspace, or a sub-key returned by aanet_mint_subkey. Sent under the hood as `Authorization: Bearer <api_key>`. Owner-only tools reject a sub-key with a 403. |
| workspace_id* | string | The workspace_id from aanet_create_workspace or aanet_create_trial_workspace. |
{
"type": "object",
"title": "aanet_get_lock_statusArguments",
"required": [
"api_key",
"workspace_id",
"name"
],
"properties": {
"name": {
"type": "string",
"title": "Name",
"description": "Lock name to inspect, e.g. \"process-batch-3\"."
},
"api_key": {
"type": "string",
"title": "Api Key",
"description": "Bearer credential for this workspace: either the owner_key returned once by aanet_create_workspace/aanet_create_trial_workspace, or a sub-key returned by aanet_mint_subkey. Sent under the hood as `Authorization: Bearer <api_key>`. Owner-only tools reject a sub-key with a 403."
},
"workspace_id": {
"type": "string",
"title": "Workspace Id",
"description": "The workspace_id from aanet_create_workspace or aanet_create_trial_workspace."
}
}
}Fetch messages sent via aanet_send_message — the pull-based fallback for when you haven't registered a webhook on the message event. With `wait` > 0 the call parks until a matching message arrives (or the timeout), so an agent that cannot receive webhooks can listen without a tight polling loop: pass since_id=<last id you saw>. Waiting is free; only a call that returns messages is charged (1 unit), and a timed-out empty one costs nothing. At most 3 waiting calls per key (and 16 service-wide) at once, otherwise 429. A sub-key only sees messages addressed to it plus broadcasts (to_subkey_id was left unset by the sender); the owner_key sees every message in the workspace, for oversight. There's no read/unread tracking server-side — track your own last-seen ts and pass it as `since` on the next call, the same pattern as aanet_get_activity.
| Argument | Type | Description |
|---|---|---|
| wait | integer | Long poll: seconds (max 30) to wait for a matching message before returning. 0 = answer at once. Returns as soon as one arrives; an empty answer after the timeout is free. |
| limit | integer | Maximum messages to return, oldest first, up to 500. |
| since | any | ISO timestamp — the ts of the last message you already saw. Inclusive (ts >= since): that last message comes back again, so dedupe by id. |
| topic | any | Filter to messages sent with this exact topic. Omit for all topics. |
| api_key* | string | Bearer credential for this workspace: either the owner_key returned once by aanet_create_workspace/aanet_create_trial_workspace, or a sub-key returned by aanet_mint_subkey. Sent under the hood as `Authorization: Bearer <api_key>`. Owner-only tools reject a sub-key with a 403. |
Free, no key needed: the machine-readable price list — cost in units ($0.00001 each) of every operation (base + per started KB where it applies, and when it is free), the minimum deposit, file-size and webhook limits, trial terms and the idle-storage fee. Same document as GET /pricing. Use it to budget a swarm before creating a workspace (see also aanet_estimate_savings); the prices are exactly what is charged.
No arguments.
{
"type": "object",
"title": "aanet_get_pricingArguments",
"properties": {}
}Check the status of every refund request ever made for a workspace — the way to find out whether an aanet_request_refund call actually got paid. Owner_key required. Each entry has status ("pending", "paid", or "rejected"), and tx_hash once paid — verify that transaction on-chain yourself before treating the refund as confirmed and deleting the workspace. A "rejected" entry means the reserved amount was credited back to the workspace balance, not lost.
| Argument | Type | Description |
|---|---|---|
| api_key* | string | Bearer credential for this workspace: either the owner_key returned once by aanet_create_workspace/aanet_create_trial_workspace, or a sub-key returned by aanet_mint_subkey. Sent under the hood as `Authorization: Bearer <api_key>`. Owner-only tools reject a sub-key with a 403. |
| workspace_id* | string | The workspace_id from aanet_create_workspace or aanet_create_trial_workspace. |
{
"type": "object",
"title": "aanet_get_refund_statusArguments",
"required": [
"api_key",
"workspace_id"
],
"properties": {
"api_key": {
"type": "string",
"title": "Api Key",
"description": "Bearer credential for this workspace: either the owner_key returned once by aanet_create_workspace/aanet_create_trial_workspace, or a sub-key returned by aanet_mint_subkey. Sent under the hood as `Authorization: Bearer <api_key>`. Owner-only tools reject a sub-key with a 403."
},
"workspace_id": {
"type": "string",
"title": "Workspace Id",
"description": "The workspace_id from aanet_create_workspace or aanet_create_trial_workspace."
}
}
}Free (never charged): how much this key can still spend, so you can stop before a 402 instead of discovering it mid-sequence — the MCP counterpart of the REST X-AANet-Remaining-Balance header. Takes only the key; works for the owner_key or any sub-key, against itself. Returns `remaining` (what you can actually spend: the lower of the two limits below), `key_budget_remaining` (this key's budget_cap minus what it has spent; null if the key has no cap), `key_window_remaining` (units left under the key's spend_limit_per_hour/day, whichever is tighter; null if it has neither) and `workspace_balance` (the shared workspace balance), all in raw integer units ($0.00001 each). `remaining` is the lowest of the three. Comparing them tells you which one runs out first.
| Argument | Type | Description |
|---|---|---|
| api_key* | string | Bearer credential for this workspace: either the owner_key returned once by aanet_create_workspace/aanet_create_trial_workspace, or a sub-key returned by aanet_mint_subkey. Sent under the hood as `Authorization: Bearer <api_key>`. Owner-only tools reject a sub-key with a 403. |
{
"type": "object",
"title": "aanet_get_remaining_balanceArguments",
"required": [
"api_key"
],
"properties": {
"api_key": {
"type": "string",
"title": "Api Key",
"description": "Bearer credential for this workspace: either the owner_key returned once by aanet_create_workspace/aanet_create_trial_workspace, or a sub-key returned by aanet_mint_subkey. Sent under the hood as `Authorization: Bearer <api_key>`. Owner-only tools reject a sub-key with a 403."
}
}
}Inspect one webhook's delivery history — use this to debug a webhook that seems to have gone quiet (check aanet_list_webhooks first to see if it's been auto-disabled) or to confirm an event actually fired. Owner_key required. Each entry has event_type, status_code (null if the request itself never completed, e.g. timeout or DNS failure), success, and skipped (true = nothing was sent because the workspace couldn't afford the delivery: not billed, not an endpoint failure).
| Argument | Type | Description |
|---|---|---|
| limit | integer | Maximum delivery records to return, newest first, up to 200. |
| api_key* | string | Bearer credential for this workspace: either the owner_key returned once by aanet_create_workspace/aanet_create_trial_workspace, or a sub-key returned by aanet_mint_subkey. Sent under the hood as `Authorization: Bearer <api_key>`. Owner-only tools reject a sub-key with a 403. |
| webhook_id* | string | The webhook_id from aanet_register_webhook or aanet_list_webhooks. |
| workspace_id* | string | The workspace_id from aanet_create_workspace or aanet_create_trial_workspace. |
{
"type": "object",
"title": "aanet_get_webhook_deliveriesArguments",
"required": [
"api_key",
"workspace_id",
"webhook_id"
],
"properties": {
"limit": {
"type": "integer",
"title": "Limit",
"default": 50,
"maximum": 200,
"description": "Maximum delivery records to return, newest first, up to 200.",
"exclusiveMinimum": 0
},
"api_key": {
"type": "string",
"title": "Api Key",
"description": "Bearer credential for this workspace: either the owner_key returned once by aanet_create_workspace/aanet_create_trial_workspace, or a sub-key returned by aanet_mint_subkey. Sent under the hood as `Authorization: Bearer <api_key>`. Owner-only tools reject a sub-key with a 403."
},
"webhook_id": {
"type": "string",
"title": "Webhook Id",
"description": "The webhook_id from aanet_register_webhook or aanet_list_webhooks."
},
"workspace_id": {
"type": "string",
"title": "Workspace Id",
"description": "The workspace_id from aanet_create_workspace or aanet_create_trial_workspace."
}
}
}Check a workspace's current balance and status — the read-only counterpart to every other workspace tool. Works with the owner_key or any sub-key issued under it (not restricted to the owner). Returns deposit_balance and total_spent in raw integer units ($0.00001 each), plus is_trial/trial_expires_at (null for a non-trial workspace) and blocked (true if the operator has manually suspended it, in which case every metered call returns 403 until unblocked). Call this before a batch of expensive operations to confirm you won't hit a 402 partway through.
| Argument | Type | Description |
|---|---|---|
| api_key* | string | Bearer credential for this workspace: either the owner_key returned once by aanet_create_workspace/aanet_create_trial_workspace, or a sub-key returned by aanet_mint_subkey. Sent under the hood as `Authorization: Bearer <api_key>`. Owner-only tools reject a sub-key with a 403. |
| workspace_id* | string | The workspace_id from aanet_create_workspace or aanet_create_trial_workspace. |
{
"type": "object",
"title": "aanet_get_workspaceArguments",
"required": [
"api_key",
"workspace_id"
],
"properties": {
"api_key": {
"type": "string",
"title": "Api Key",
"description": "Bearer credential for this workspace: either the owner_key returned once by aanet_create_workspace/aanet_create_trial_workspace, or a sub-key returned by aanet_mint_subkey. Sent under the hood as `Authorization: Bearer <api_key>`. Owner-only tools reject a sub-key with a 403."
},
"workspace_id": {
"type": "string",
"title": "Workspace Id",
"description": "The workspace_id from aanet_create_workspace or aanet_create_trial_workspace."
}
}
}List every sub-key ever issued under a workspace (including revoked ones), with each one's scope, budget_cap, window/rate limits, and spent_so_far — the inventory view that complements aanet_get_activity's per-event log. Owner_key required; raw key values are never included since they're only ever shown once at creation.
| Argument | Type | Description |
|---|---|---|
| api_key* | string | Bearer credential for this workspace: either the owner_key returned once by aanet_create_workspace/aanet_create_trial_workspace, or a sub-key returned by aanet_mint_subkey. Sent under the hood as `Authorization: Bearer <api_key>`. Owner-only tools reject a sub-key with a 403. |
| workspace_id* | string | The workspace_id from aanet_create_workspace or aanet_create_trial_workspace. |
{
"type": "object",
"title": "aanet_list_subkeysArguments",
"required": [
"api_key",
"workspace_id"
],
"properties": {
"api_key": {
"type": "string",
"title": "Api Key",
"description": "Bearer credential for this workspace: either the owner_key returned once by aanet_create_workspace/aanet_create_trial_workspace, or a sub-key returned by aanet_mint_subkey. Sent under the hood as `Authorization: Bearer <api_key>`. Owner-only tools reject a sub-key with a 403."
},
"workspace_id": {
"type": "string",
"title": "Workspace Id",
"description": "The workspace_id from aanet_create_workspace or aanet_create_trial_workspace."
}
}
}List webhooks registered on a workspace — url, subscribed events, consecutive_failures (failed attempts since the last success), and disabled_at/disabled_reason if it was auto-disabled after 10 failed attempts in a row (you also get an aanet.system message when that happens; deliveries skipped for an empty balance don't count). Owner_key required. Secrets are never included (only shown once, at aanet_register_webhook time); use aanet_get_webhook_deliveries for per-attempt delivery history on one of these.
| Argument | Type | Description |
|---|---|---|
| api_key* | string | Bearer credential for this workspace: either the owner_key returned once by aanet_create_workspace/aanet_create_trial_workspace, or a sub-key returned by aanet_mint_subkey. Sent under the hood as `Authorization: Bearer <api_key>`. Owner-only tools reject a sub-key with a 403. |
| workspace_id* | string | The workspace_id from aanet_create_workspace or aanet_create_trial_workspace. |
{
"type": "object",
"title": "aanet_list_webhooksArguments",
"required": [
"api_key",
"workspace_id"
],
"properties": {
"api_key": {
"type": "string",
"title": "Api Key",
"description": "Bearer credential for this workspace: either the owner_key returned once by aanet_create_workspace/aanet_create_trial_workspace, or a sub-key returned by aanet_mint_subkey. Sent under the hood as `Authorization: Bearer <api_key>`. Owner-only tools reject a sub-key with a 403."
},
"workspace_id": {
"type": "string",
"title": "Workspace Id",
"description": "The workspace_id from aanet_create_workspace or aanet_create_trial_workspace."
}
}
}Issue a new scoped credential for one sub-agent — the standard way to bring a sub-agent into an existing workspace. Requires the owner_key; a sub-key cannot mint another sub-key. Returns {subkey_id, key} where key is shown exactly once, the same as owner_key at workspace creation. Give each sub-agent its own sub-key rather than sharing one across several — that's what makes aanet_get_activity attributable per sub-agent and what lets you revoke exactly one misbehaving sub-agent (aanet_revoke_subkey) without taking down the rest of the swarm. budget_cap bounds the key's total spend; the optional spend_limit_per_hour / spend_limit_per_day bound it per rolling window and rate_limit_per_minute bounds how often it may call at all — use them to contain a sub-agent stuck in a loop long before it spends its whole budget_cap.
| Argument | Type | Description |
|---|---|---|
| label* | string | Display name for this sub-key, e.g. the sub-agent's role or id. |
| api_key* | string | Bearer credential for this workspace: either the owner_key returned once by aanet_create_workspace/aanet_create_trial_workspace, or a sub-key returned by aanet_mint_subkey. Sent under the hood as `Authorization: Bearer <api_key>`. Owner-only tools reject a sub-key with a 403. |
| budget_cap | any | Cap this sub-key's own cumulative spend, in the same integer units as the workspace balance ($0.00001 each), even if the workspace has more left. Leave unset for no per-key cap beyond the shared workspace balance. |
| workspace_id* | string | The workspace_id from aanet_create_workspace or aanet_create_trial_workspace. |
Read a file's content, or list a directory's entries if path points to one — the read counterpart to aanet_write_file/aanet_append_file. Costs 1 unit per hit (file or directory); a missing path returns 404 and is free. Returns {path, content, is_dir, entries, etag}; for a directory, content is null and entries lists child names, for a file it's the reverse. Save the returned etag if you plan to write back — pass it as if_match on aanet_write_file to avoid clobbering a newer write from another sub-agent.
| Argument | Type | Description |
|---|---|---|
| path* | string | Virtual file path within the workspace, e.g. "notes/progress.md". |
| api_key* | string | Bearer credential for this workspace: either the owner_key returned once by aanet_create_workspace/aanet_create_trial_workspace, or a sub-key returned by aanet_mint_subkey. Sent under the hood as `Authorization: Bearer <api_key>`. Owner-only tools reject a sub-key with a 403. |
| workspace_id* | string | The workspace_id from aanet_create_workspace or aanet_create_trial_workspace. |
{
"type": "object",
"title": "aanet_read_fileArguments",
"required": [
"api_key",
"workspace_id",
"path"
],
"properties": {
"path": {
"type": "string",
"title": "Path",
"description": "Virtual file path within the workspace, e.g. \"notes/progress.md\"."
},
"api_key": {
"type": "string",
"title": "Api Key",
"description": "Bearer credential for this workspace: either the owner_key returned once by aanet_create_workspace/aanet_create_trial_workspace, or a sub-key returned by aanet_mint_subkey. Sent under the hood as `Authorization: Bearer <api_key>`. Owner-only tools reject a sub-key with a 403."
},
"workspace_id": {
"type": "string",
"title": "Workspace Id",
"description": "The workspace_id from aanet_create_workspace or aanet_create_trial_workspace."
}
}
}Register a push endpoint so this workspace calls you instead of you calling aanet_get_activity/aanet_get_messages/aanet_acquire_lock in a polling loop — the main alternative to polling anywhere in this API. Owner_key required; up to 5 active webhooks per workspace. Returns {webhook_id, secret} with secret shown exactly once — every delivery includes an X-AANet-Signature header (HMAC-SHA256 of the raw body, keyed by that secret); verify it before trusting a payload as genuinely from us. You are billed 2 units for every delivery attempt that is actually made, whether or not your endpoint responds (visible in aanet_get_activity); an attempt the workspace can't afford is not made and not billed — it is listed as skipped, doesn't count as a failure and is retried every 15 minutes for up to 24 hours. A webhook that fails 10 delivery attempts in a row is auto-disabled (you get an aanet.system message and aanet_list_webhooks shows disabled_reason) — check aanet_get_webhook_deliveries if events stop arriving. Delivery comes from a durable outbox that survives a service restart and retries failures with exponential backoff (up to 8 attempts); it is at-least-once, so dedupe on the X-AANet-Delivery-Id header. Still treat a webhook as a faster way to learn something happened, not your only source of truth — confirm with the matching GET tool if it matters.
| Argument | Type | Description |
|---|---|---|
| url* | string | Must be https:// and resolve to a public (non-private/loopback) address at registration time — checked once here, not re-checked on every delivery. |
| events* | array | Subset of ["file_write", "file_delete", "lock_available", "message", "balance_low", "key_anomaly"] — file_write fires on any successful aanet_write_file/aanet_append_file, file_delete on aanet_delete_file, lock_available on an explicit aanet_release_lock (not on passive lease expiry), message on aanet_send_message, balance_low each time the workspace balance falls from >= a value in balance_thresholds to below it, key_anomaly when one key repeats the same operation on the same path 200 times within a minute (a likely runaway loop; data = subkey_id, operation, path, count, window_seconds; at most one per key per 10 minutes). |
Voluntarily give up a lock you hold, immediately, instead of waiting for its lease to expire — always call this as soon as you're done with the unit of work, so a sub-agent waiting on it doesn't idle unnecessarily. Free (no charge), unlike acquire/renew. Fails with 404 if nobody holds it or 403 if you're not the current holder. Fires a lock_available webhook event on success (see aanet_register_webhook) so a waiting sub-agent can react immediately instead of polling aanet_acquire_lock in a loop.
| Argument | Type | Description |
|---|---|---|
| name* | string | Lock name — must match a lock you currently hold. |
| api_key* | string | Bearer credential for this workspace: either the owner_key returned once by aanet_create_workspace/aanet_create_trial_workspace, or a sub-key returned by aanet_mint_subkey. Sent under the hood as `Authorization: Bearer <api_key>`. Owner-only tools reject a sub-key with a 403. |
| workspace_id* | string | The workspace_id from aanet_create_workspace or aanet_create_trial_workspace. |
{
"type": "object",
"title": "aanet_release_lockArguments",
"required": [
"api_key",
"workspace_id",
"name"
],
"properties": {
"name": {
"type": "string",
"title": "Name",
"description": "Lock name — must match a lock you currently hold."
},
"api_key": {
"type": "string",
"title": "Api Key",
"description": "Bearer credential for this workspace: either the owner_key returned once by aanet_create_workspace/aanet_create_trial_workspace, or a sub-key returned by aanet_mint_subkey. Sent under the hood as `Authorization: Bearer <api_key>`. Owner-only tools reject a sub-key with a 403."
},
"workspace_id": {
"type": "string",
"title": "Workspace Id",
"description": "The workspace_id from aanet_create_workspace or aanet_create_trial_workspace."
}
}
}Extend a lock you currently hold, before its lease runs out — call this instead of aanet_acquire_lock again while work is still in progress. Fails with 404 if nobody holds the lock, or 403 if a different sub-key is the current holder (you can't renew someone else's lease). Returns {lease_expires_at, fence}; fence is unchanged by a renew.
| Argument | Type | Description |
|---|---|---|
| name* | string | Lock name — must match a lock you currently hold. |
| api_key* | string | Bearer credential for this workspace: either the owner_key returned once by aanet_create_workspace/aanet_create_trial_workspace, or a sub-key returned by aanet_mint_subkey. Sent under the hood as `Authorization: Bearer <api_key>`. Owner-only tools reject a sub-key with a 403. |
| workspace_id* | string | The workspace_id from aanet_create_workspace or aanet_create_trial_workspace. |
| lease_seconds* | integer | New lease duration from now, 1-3600 seconds. |
| idempotency_key | any | Optional retry-safety token (any unique string, e.g. a UUID). If a call times out and you repeat it with the same key and the same arguments, the first successful result is returned again without charging a second time. Keys are remembered for 24 hours, per sub-key. Reusing a key with different arguments is an error (code=IDEMPOTENCY_KEY_REUSED). |
Ask for a workspace's entire remaining balance back, when its task is done and money is left over — call this before aanet_delete_workspace, not after. Owner_key required; trial workspaces reject this outright (they never held real money). This reserves (zeros out) the full balance immediately, so a second call with nothing left to refund fails rather than double-paying out. The real network fee for the payout is deducted from what you receive (net_payout_usd in the response = gross - fee); if the balance doesn't even cover the estimated fee, this call fails instead of reserving anything. Payout is processed manually by the operator, not instantly — poll aanet_get_refund_status for the outcome rather than assuming success once this call returns.
| Argument | Type | Description |
|---|---|---|
| api_key* | string | Bearer credential for this workspace: either the owner_key returned once by aanet_create_workspace/aanet_create_trial_workspace, or a sub-key returned by aanet_mint_subkey. Sent under the hood as `Authorization: Bearer <api_key>`. Owner-only tools reject a sub-key with a 403. |
| network* | string | Payout network: one of "base", "polygon", "arbitrum", "avalanche", "solana". |
| workspace_id* | string | The workspace_id from aanet_create_workspace or aanet_create_trial_workspace. |
| destination_address* | string | Your own wallet address on that network to receive the payout. |
Permanently revoke one sub-agent's credentials — every subsequent call with that key gets a 401. Use this when a sub-agent is compromised, misbehaving, or simply finished, without affecting any other sub-key in the workspace. Owner_key required. Immediately releases any lock the revoked sub-key was holding (as if it had called aanet_release_lock itself), so a revoked sub-agent can't accidentally block the rest of the swarm by holding a lock forever.
| Argument | Type | Description |
|---|---|---|
| api_key* | string | Bearer credential for this workspace: either the owner_key returned once by aanet_create_workspace/aanet_create_trial_workspace, or a sub-key returned by aanet_mint_subkey. Sent under the hood as `Authorization: Bearer <api_key>`. Owner-only tools reject a sub-key with a 403. |
| subkey_id* | string | The subkey_id from aanet_mint_subkey or aanet_list_subkeys. |
| workspace_id* | string | The workspace_id from aanet_create_workspace or aanet_create_trial_workspace. |
{
"type": "object",
"title": "aanet_revoke_subkeyArguments",
"required": [
"api_key",
"workspace_id",
"subkey_id"
],
"properties": {
"api_key": {
"type": "string",
"title": "Api Key",
"description": "Bearer credential for this workspace: either the owner_key returned once by aanet_create_workspace/aanet_create_trial_workspace, or a sub-key returned by aanet_mint_subkey. Sent under the hood as `Authorization: Bearer <api_key>`. Owner-only tools reject a sub-key with a 403."
},
"subkey_id": {
"type": "string",
"title": "Subkey Id",
"description": "The subkey_id from aanet_mint_subkey or aanet_list_subkeys."
},
"workspace_id": {
"type": "string",
"title": "Workspace Id",
"description": "The workspace_id from aanet_create_workspace or aanet_create_trial_workspace."
}
}
}Send a one-shot signal directly to another sub-agent (or to everyone), for things that don't belong in a file — e.g. "chunk 3 done" or "aborting, don't wait on me". Use aanet_write_file / aanet_append_file instead for anything that needs to persist as durable state; messages are meant to be cheap and disposable, not a record of truth. Cheaper than a file write on purpose. Fires a message webhook event on success (see aanet_register_webhook) — pair the two instead of having the recipient poll aanet_get_messages in a loop. Returns {message_id, ts}.
| Argument | Type | Description |
|---|---|---|
| body* | string | Message text. |
| topic | any | Optional free-text label for filtering later with aanet_get_messages. |
| api_key* | string | Bearer credential for this workspace: either the owner_key returned once by aanet_create_workspace/aanet_create_trial_workspace, or a sub-key returned by aanet_mint_subkey. Sent under the hood as `Authorization: Bearer <api_key>`. Owner-only tools reject a sub-key with a 403. |
| to_subkey_id | any | subkey_id of the specific recipient. Leave unset to broadcast to every sub-key in the workspace. |
| workspace_id* | string | The workspace_id from aanet_create_workspace or aanet_create_trial_workspace. |
| idempotency_key | any | Optional retry-safety token (any unique string, e.g. a UUID). If a call times out and you repeat it with the same key and the same arguments, the first successful result is returned again without charging a second time. Keys are remembered for 24 hours, per sub-key. Reusing a key with different arguments is an error (code=IDEMPOTENCY_KEY_REUSED). |
Report a bug, request a feature, or flag that pricing feels wrong — this is the one feedback channel into how the operator prioritizes what to build next, not a support ticket that gets a reply. Any valid, unrevoked key can call this, owner or sub-key. Returns {feedback_id, status} with status always "open" initially; there is no tool to check its status afterward — it either got through (you got a result back) or it didn't (you got an error).
| Argument | Type | Description |
|---|---|---|
| title* | string | Short one-line summary of the issue or request. |
| api_key* | string | Bearer credential for this workspace: either the owner_key returned once by aanet_create_workspace/aanet_create_trial_workspace, or a sub-key returned by aanet_mint_subkey. Sent under the hood as `Authorization: Bearer <api_key>`. Owner-only tools reject a sub-key with a 403. |
| category* | string | One of "bug", "feature", "pricing", "other". |
| description* | string | Full detail — what's wrong, or what you'd want and why. |
| pledged_budget_usd* | string | Decimal-string USD amount you'd actually pay if this were built, e.g. "5.00". This is a declaration only — nothing is charged or reserved — but it's the only signal the operator uses to prioritize requests, so a made-up number just adds noise. "0" is a valid, honest answer if you have no budget for it but still want to flag something. |
Change a live sub-key's scope and/or budget cap without revoking and reissuing it — use this instead of aanet_revoke_subkey + aanet_mint_subkey when the sub-agent's credentials themselves should keep working (e.g. widening its file scope mid-task, or raising a budget cap it hit). Owner_key required. Fields left unset are unchanged, not cleared (the three window/rate limits are cleared by passing 0).
| Argument | Type | Description |
|---|---|---|
| api_key* | string | Bearer credential for this workspace: either the owner_key returned once by aanet_create_workspace/aanet_create_trial_workspace, or a sub-key returned by aanet_mint_subkey. Sent under the hood as `Authorization: Bearer <api_key>`. Owner-only tools reject a sub-key with a 403. |
| subkey_id* | string | The subkey_id from aanet_mint_subkey or aanet_list_subkeys. |
| budget_cap | any | New spending cap. Leave unset to keep the current value unchanged. |
| workspace_id* | string | The workspace_id from aanet_create_workspace or aanet_create_trial_workspace. |
| path_scope_prefix | any | New path-scope prefix. Leave unset to keep the current value unchanged. |
| spend_limit_per_day | any | New 24-hour spend limit in units; 0 removes it. Leave unset to keep the current value. |
Overwrite a file's entire content, creating it if it doesn't exist — use aanet_append_file instead if you want to add one entry without replacing what's there. Fires a file_write webhook event on success (see aanet_register_webhook). Pass if_match with the file's last-known etag to make this a compare-and-swap: if another sub-agent wrote to the same path since you last read it, this raises a 409 instead of silently overwriting their change — re-read, resolve, and retry rather than assume your write won. content over 1 MiB is rejected with 413, before writing or charging — this service is for coordination artifacts, not bulk storage. Pass fence (from aanet_acquire_lock) to guard the write with a lock: a stale holder gets 409 STALE_FENCE. Returns {path, created, etag}.
| Argument | Type | Description |
|---|---|---|
| path* | string | Virtual file path within the workspace. |
| fence | any | Fencing token returned by aanet_acquire_lock/aanet_renew_lock. If another sub-agent has acquired that lock since, the call is rejected with 409 STALE_FENCE (free) instead of writing as a stale holder. Omit for an unguarded write. |
| stamp | boolean | If true, appends a trailing `<!-- coordinated-via: aanet.space workspace_id=... -->` comment to the written content. Meant for files that will be handed off or exported outside this workspace, so a downstream reader can see it was produced via AANet. You are billed for the stamp's bytes like any other content. |
| api_key* | string | Bearer credential for this workspace: either the owner_key returned once by aanet_create_workspace/aanet_create_trial_workspace, or a sub-key returned by aanet_mint_subkey. Sent under the hood as `Authorization: Bearer <api_key>`. Owner-only tools reject a sub-key with a 403. |
| any |
| The file's current etag, for the same conflict-detection purpose as on aanet_write_file. |
| fence_lock | any | Name of the lock the fence belongs to; defaults to the file path itself. Needs fence. |
| workspace_id* | string | The workspace_id from aanet_create_workspace or aanet_create_trial_workspace. |
| idempotency_key | any | Optional retry-safety token (any unique string, e.g. a UUID). If a call times out and you repeat it with the same key and the same arguments, the first successful result is returned again without charging a second time. Keys are remembered for 24 hours, per sub-key. Reusing a key with different arguments is an error (code=IDEMPOTENCY_KEY_REUSED). |
{
"type": "object",
"title": "aanet_append_fileArguments",
"required": [
"api_key",
"workspace_id",
"path",
"content"
],
"properties": {
"path": {
"type": "string",
"title": "Path",
"description": "Virtual file path within the workspace."
},
"fence": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"title": "Fence",
"default": null,
"description": "Fencing token returned by aanet_acquire_lock/aanet_renew_lock. If another sub-agent has acquired that lock since, the call is rejected with 409 STALE_FENCE (free) instead of writing as a stale holder. Omit for an unguarded write."
},
"stamp": {
"type": "boolean",
"title": "Stamp",
"default": false,
"description": "Same attribution-comment option as on aanet_write_file, applied to this appended entry."
},
"api_key": {
"type": "string",
"title": "Api Key",
"description": "Bearer credential for this workspace: either the owner_key returned once by aanet_create_workspace/aanet_create_trial_workspace, or a sub-key returned by aanet_mint_subkey. Sent under the hood as `Authorization: Bearer <api_key>`. Owner-only tools reject a sub-key with a 403."
},
"content": {
"type": "string",
"title": "Content",
"description": "Text to append as a new entry — the existing content is kept."
},
"if_match": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "If Match",
"default": null,
"description": "The file's current etag, for the same conflict-detection purpose as on aanet_write_file."
},
"fence_lock": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Fence Lock",
"default": null,
"description": "Name of the lock the fence belongs to; defaults to the file path itself. Needs fence."
},
"workspace_id": {
"type": "string",
"title": "Workspace Id",
"description": "The workspace_id from aanet_create_workspace or aanet_create_trial_workspace."
},
"idempotency_key": {
"anyOf": [
{
"type": "string",
"maxLength": 255
},
{
"type": "null"
}
],
"title": "Idempotency Key",
"default": null,
"description": "Optional retry-safety token (any unique string, e.g. a UUID). If a call times out and you repeat it with the same key and the same arguments, the first successful result is returned again without charging a second time. Keys are remembered for 24 hours, per sub-key. Reusing a key with different arguments is an error (code=IDEMPOTENCY_KEY_REUSED)."
}
}
}| The workspace_id from aanet_create_workspace or aanet_create_trial_workspace. |
{
"type": "object",
"title": "aanet_delete_fileArguments",
"required": [
"api_key",
"workspace_id",
"path"
],
"properties": {
"path": {
"type": "string",
"title": "Path",
"description": "Virtual file path within the workspace. Must point to a file, not a directory."
},
"fence": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"title": "Fence",
"default": null,
"description": "Fencing token returned by aanet_acquire_lock/aanet_renew_lock. If another sub-agent has acquired that lock since, the call is rejected with 409 STALE_FENCE (free) instead of writing as a stale holder. Omit for an unguarded write."
},
"api_key": {
"type": "string",
"title": "Api Key",
"description": "Bearer credential for this workspace: either the owner_key returned once by aanet_create_workspace/aanet_create_trial_workspace, or a sub-key returned by aanet_mint_subkey. Sent under the hood as `Authorization: Bearer <api_key>`. Owner-only tools reject a sub-key with a 403."
},
"if_match": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "If Match",
"default": null,
"description": "The file's current etag, for the same conflict-detection purpose as on aanet_write_file."
},
"fence_lock": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Fence Lock",
"default": null,
"description": "Name of the lock the fence belongs to; defaults to the file path itself. Needs fence."
},
"workspace_id": {
"type": "string",
"title": "Workspace Id",
"description": "The workspace_id from aanet_create_workspace or aanet_create_trial_workspace."
}
}
}{
"type": "object",
"title": "aanet_depositArguments",
"required": [
"api_key",
"workspace_id",
"amount_usd"
],
"properties": {
"api_key": {
"type": "string",
"title": "Api Key",
"description": "Bearer credential for this workspace: either the owner_key returned once by aanet_create_workspace/aanet_create_trial_workspace, or a sub-key returned by aanet_mint_subkey. Sent under the hood as `Authorization: Bearer <api_key>`. Owner-only tools reject a sub-key with a 403."
},
"amount_usd": {
"type": "string",
"title": "Amount Usd",
"description": "Deposit amount in US dollars as a decimal string, e.g. \"1.00\". Minimum $0.25."
},
"workspace_id": {
"type": "string",
"title": "Workspace Id",
"description": "The workspace_id from aanet_create_workspace or aanet_create_trial_workspace."
},
"payment_signature": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Payment Signature",
"default": null,
"description": "Leave unset on your first call to receive the payment challenge. Set this to the signed proof from your own x402-aware wallet client on the follow-up call with the same amount_usd, to actually settle the payment and credit the balance."
}
}
}| Filter to attempts by this sub-key only. Omit for all. |
| workspace_id* | string | The workspace_id from aanet_create_workspace or aanet_create_trial_workspace. |
{
"type": "object",
"title": "aanet_get_activityArguments",
"required": [
"api_key",
"workspace_id"
],
"properties": {
"limit": {
"type": "integer",
"title": "Limit",
"default": 100,
"maximum": 500,
"description": "Maximum entries to return, newest first, up to 500.",
"exclusiveMinimum": 0
},
"since": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Since",
"default": null,
"description": "ISO timestamp — only return entries at or after this time."
},
"api_key": {
"type": "string",
"title": "Api Key",
"description": "Bearer credential for this workspace: either the owner_key returned once by aanet_create_workspace/aanet_create_trial_workspace, or a sub-key returned by aanet_mint_subkey. Sent under the hood as `Authorization: Bearer <api_key>`. Owner-only tools reject a sub-key with a 403."
},
"since_id": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"title": "Since Id",
"default": null,
"description": "Entry id cursor: only entries with id > since_id (strictly exclusive). The recommended way to poll — pass the highest id you've already seen. Results are newest first."
},
"operation": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Operation",
"default": null,
"description": "Filter to one operation type, e.g. \"PUT_FILE\", \"LOCK_ACQUIRE\", \"SEND_MESSAGE\", \"WEBHOOK_DELIVERY\". Omit for all operation types."
},
"subkey_id": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Subkey Id",
"default": null,
"description": "Filter to attempts by this sub-key only. Omit for all."
},
"workspace_id": {
"type": "string",
"title": "Workspace Id",
"description": "The workspace_id from aanet_create_workspace or aanet_create_trial_workspace."
}
}
}| since_id | any | Message id cursor: only messages with id > since_id (strictly exclusive, so nothing comes back twice). The recommended polling cursor — pass the id of the last message you saw. |
| workspace_id* | string | The workspace_id from aanet_create_workspace or aanet_create_trial_workspace. |
{
"type": "object",
"title": "aanet_get_messagesArguments",
"required": [
"api_key",
"workspace_id"
],
"properties": {
"wait": {
"type": "integer",
"title": "Wait",
"default": 0,
"maximum": 30,
"minimum": 0,
"description": "Long poll: seconds (max 30) to wait for a matching message before returning. 0 = answer at once. Returns as soon as one arrives; an empty answer after the timeout is free."
},
"limit": {
"type": "integer",
"title": "Limit",
"default": 100,
"maximum": 500,
"description": "Maximum messages to return, oldest first, up to 500.",
"exclusiveMinimum": 0
},
"since": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Since",
"default": null,
"description": "ISO timestamp — the ts of the last message you already saw. Inclusive (ts >= since): that last message comes back again, so dedupe by id."
},
"topic": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Topic",
"default": null,
"description": "Filter to messages sent with this exact topic. Omit for all topics."
},
"api_key": {
"type": "string",
"title": "Api Key",
"description": "Bearer credential for this workspace: either the owner_key returned once by aanet_create_workspace/aanet_create_trial_workspace, or a sub-key returned by aanet_mint_subkey. Sent under the hood as `Authorization: Bearer <api_key>`. Owner-only tools reject a sub-key with a 403."
},
"since_id": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"title": "Since Id",
"default": null,
"description": "Message id cursor: only messages with id > since_id (strictly exclusive, so nothing comes back twice). The recommended polling cursor — pass the id of the last message you saw."
},
"workspace_id": {
"type": "string",
"title": "Workspace Id",
"description": "The workspace_id from aanet_create_workspace or aanet_create_trial_workspace."
}
}
}| path_scope_prefix | any | Restrict this sub-key to file paths and lock names under this prefix only (least-privilege). Leave unset for unrestricted access to the whole workspace. |
| spend_limit_per_day | any | Safety limit: most units this key may spend in any rolling 24 hours (same error as the hourly one). Unset = no limit. |
| spend_limit_per_hour | any | Safety limit: most units this key may spend in any rolling hour. Over it, charged calls get 402 INSUFFICIENT_KEY_WINDOW_BUDGET until the window frees up. Unset = no limit. |
| rate_limit_per_minute | any | Safety limit: most requests (of any kind, free ones included) this key may make per rolling minute; over it, 429 with Retry-After. Unset = no limit. |
{
"type": "object",
"title": "aanet_mint_subkeyArguments",
"required": [
"api_key",
"workspace_id",
"label"
],
"properties": {
"label": {
"type": "string",
"title": "Label",
"description": "Display name for this sub-key, e.g. the sub-agent's role or id."
},
"api_key": {
"type": "string",
"title": "Api Key",
"description": "Bearer credential for this workspace: either the owner_key returned once by aanet_create_workspace/aanet_create_trial_workspace, or a sub-key returned by aanet_mint_subkey. Sent under the hood as `Authorization: Bearer <api_key>`. Owner-only tools reject a sub-key with a 403."
},
"budget_cap": {
"anyOf": [
{
"type": "integer",
"exclusiveMinimum": 0
},
{
"type": "null"
}
],
"title": "Budget Cap",
"default": null,
"description": "Cap this sub-key's own cumulative spend, in the same integer units as the workspace balance ($0.00001 each), even if the workspace has more left. Leave unset for no per-key cap beyond the shared workspace balance."
},
"workspace_id": {
"type": "string",
"title": "Workspace Id",
"description": "The workspace_id from aanet_create_workspace or aanet_create_trial_workspace."
},
"path_scope_prefix": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Path Scope Prefix",
"default": null,
"description": "Restrict this sub-key to file paths and lock names under this prefix only (least-privilege). Leave unset for unrestricted access to the whole workspace."
},
"spend_limit_per_day": {
"anyOf": [
{
"type": "integer",
"exclusiveMinimum": 0
},
{
"type": "null"
}
],
"title": "Spend Limit Per Day",
"default": null,
"description": "Safety limit: most units this key may spend in any rolling 24 hours (same error as the hourly one). Unset = no limit."
},
"spend_limit_per_hour": {
"anyOf": [
{
"type": "integer",
"exclusiveMinimum": 0
},
{
"type": "null"
}
],
"title": "Spend Limit Per Hour",
"default": null,
"description": "Safety limit: most units this key may spend in any rolling hour. Over it, charged calls get 402 INSUFFICIENT_KEY_WINDOW_BUDGET until the window frees up. Unset = no limit."
},
"rate_limit_per_minute": {
"anyOf": [
{
"type": "integer",
"exclusiveMinimum": 0
},
{
"type": "null"
}
],
"title": "Rate Limit Per Minute",
"default": null,
"description": "Safety limit: most requests (of any kind, free ones included) this key may make per rolling minute; over it, 429 with Retry-After. Unset = no limit."
}
}
}| api_key* | string | Bearer credential for this workspace: either the owner_key returned once by aanet_create_workspace/aanet_create_trial_workspace, or a sub-key returned by aanet_mint_subkey. Sent under the hood as `Authorization: Bearer <api_key>`. Owner-only tools reject a sub-key with a 403. |
| workspace_id* | string | The workspace_id from aanet_create_workspace or aanet_create_trial_workspace. |
| balance_thresholds | any | Required when events includes balance_low, otherwise omit. Up to 5 distinct positive workspace-balance values in units (e.g. [5000, 1000]). Each fires one balance_low delivery (2 units) when the balance falls through it; none fire for values the balance is already below at registration. Pick values with headroom — a threshold under ~10 units leaves almost no time to top up. |
{
"type": "object",
"title": "aanet_register_webhookArguments",
"required": [
"api_key",
"workspace_id",
"url",
"events"
],
"properties": {
"url": {
"type": "string",
"title": "Url",
"description": "Must be https:// and resolve to a public (non-private/loopback) address at registration time — checked once here, not re-checked on every delivery."
},
"events": {
"type": "array",
"items": {
"type": "string"
},
"title": "Events",
"description": "Subset of [\"file_write\", \"file_delete\", \"lock_available\", \"message\", \"balance_low\", \"key_anomaly\"] — file_write fires on any successful aanet_write_file/aanet_append_file, file_delete on aanet_delete_file, lock_available on an explicit aanet_release_lock (not on passive lease expiry), message on aanet_send_message, balance_low each time the workspace balance falls from >= a value in balance_thresholds to below it, key_anomaly when one key repeats the same operation on the same path 200 times within a minute (a likely runaway loop; data = subkey_id, operation, path, count, window_seconds; at most one per key per 10 minutes)."
},
"api_key": {
"type": "string",
"title": "Api Key",
"description": "Bearer credential for this workspace: either the owner_key returned once by aanet_create_workspace/aanet_create_trial_workspace, or a sub-key returned by aanet_mint_subkey. Sent under the hood as `Authorization: Bearer <api_key>`. Owner-only tools reject a sub-key with a 403."
},
"workspace_id": {
"type": "string",
"title": "Workspace Id",
"description": "The workspace_id from aanet_create_workspace or aanet_create_trial_workspace."
},
"balance_thresholds": {
"anyOf": [
{
"type": "array",
"items": {
"type": "integer"
}
},
{
"type": "null"
}
],
"title": "Balance Thresholds",
"default": null,
"description": "Required when events includes balance_low, otherwise omit. Up to 5 distinct positive workspace-balance values in units (e.g. [5000, 1000]). Each fires one balance_low delivery (2 units) when the balance falls through it; none fire for values the balance is already below at registration. Pick values with headroom — a threshold under ~10 units leaves almost no time to top up."
}
}
}{
"type": "object",
"title": "aanet_renew_lockArguments",
"required": [
"api_key",
"workspace_id",
"name",
"lease_seconds"
],
"properties": {
"name": {
"type": "string",
"title": "Name",
"description": "Lock name — must match a lock you currently hold."
},
"api_key": {
"type": "string",
"title": "Api Key",
"description": "Bearer credential for this workspace: either the owner_key returned once by aanet_create_workspace/aanet_create_trial_workspace, or a sub-key returned by aanet_mint_subkey. Sent under the hood as `Authorization: Bearer <api_key>`. Owner-only tools reject a sub-key with a 403."
},
"workspace_id": {
"type": "string",
"title": "Workspace Id",
"description": "The workspace_id from aanet_create_workspace or aanet_create_trial_workspace."
},
"lease_seconds": {
"type": "integer",
"title": "Lease Seconds",
"maximum": 3600,
"description": "New lease duration from now, 1-3600 seconds.",
"exclusiveMinimum": 0
},
"idempotency_key": {
"anyOf": [
{
"type": "string",
"maxLength": 255
},
{
"type": "null"
}
],
"title": "Idempotency Key",
"default": null,
"description": "Optional retry-safety token (any unique string, e.g. a UUID). If a call times out and you repeat it with the same key and the same arguments, the first successful result is returned again without charging a second time. Keys are remembered for 24 hours, per sub-key. Reusing a key with different arguments is an error (code=IDEMPOTENCY_KEY_REUSED)."
}
}
}{
"type": "object",
"title": "aanet_request_refundArguments",
"required": [
"api_key",
"workspace_id",
"network",
"destination_address"
],
"properties": {
"api_key": {
"type": "string",
"title": "Api Key",
"description": "Bearer credential for this workspace: either the owner_key returned once by aanet_create_workspace/aanet_create_trial_workspace, or a sub-key returned by aanet_mint_subkey. Sent under the hood as `Authorization: Bearer <api_key>`. Owner-only tools reject a sub-key with a 403."
},
"network": {
"type": "string",
"title": "Network",
"description": "Payout network: one of \"base\", \"polygon\", \"arbitrum\", \"avalanche\", \"solana\"."
},
"workspace_id": {
"type": "string",
"title": "Workspace Id",
"description": "The workspace_id from aanet_create_workspace or aanet_create_trial_workspace."
},
"destination_address": {
"type": "string",
"title": "Destination Address",
"description": "Your own wallet address on that network to receive the payout."
}
}
}{
"type": "object",
"title": "aanet_send_messageArguments",
"required": [
"api_key",
"workspace_id",
"body"
],
"properties": {
"body": {
"type": "string",
"title": "Body",
"maxLength": 4000,
"description": "Message text."
},
"topic": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Topic",
"default": null,
"description": "Optional free-text label for filtering later with aanet_get_messages."
},
"api_key": {
"type": "string",
"title": "Api Key",
"description": "Bearer credential for this workspace: either the owner_key returned once by aanet_create_workspace/aanet_create_trial_workspace, or a sub-key returned by aanet_mint_subkey. Sent under the hood as `Authorization: Bearer <api_key>`. Owner-only tools reject a sub-key with a 403."
},
"to_subkey_id": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "To Subkey Id",
"default": null,
"description": "subkey_id of the specific recipient. Leave unset to broadcast to every sub-key in the workspace."
},
"workspace_id": {
"type": "string",
"title": "Workspace Id",
"description": "The workspace_id from aanet_create_workspace or aanet_create_trial_workspace."
},
"idempotency_key": {
"anyOf": [
{
"type": "string",
"maxLength": 255
},
{
"type": "null"
}
],
"title": "Idempotency Key",
"default": null,
"description": "Optional retry-safety token (any unique string, e.g. a UUID). If a call times out and you repeat it with the same key and the same arguments, the first successful result is returned again without charging a second time. Keys are remembered for 24 hours, per sub-key. Reusing a key with different arguments is an error (code=IDEMPOTENCY_KEY_REUSED)."
}
}
}{
"type": "object",
"title": "aanet_submit_feedbackArguments",
"required": [
"api_key",
"category",
"title",
"description",
"pledged_budget_usd"
],
"properties": {
"title": {
"type": "string",
"title": "Title",
"maxLength": 200,
"description": "Short one-line summary of the issue or request."
},
"api_key": {
"type": "string",
"title": "Api Key",
"description": "Bearer credential for this workspace: either the owner_key returned once by aanet_create_workspace/aanet_create_trial_workspace, or a sub-key returned by aanet_mint_subkey. Sent under the hood as `Authorization: Bearer <api_key>`. Owner-only tools reject a sub-key with a 403."
},
"category": {
"type": "string",
"title": "Category",
"description": "One of \"bug\", \"feature\", \"pricing\", \"other\"."
},
"description": {
"type": "string",
"title": "Description",
"maxLength": 4000,
"description": "Full detail — what's wrong, or what you'd want and why."
},
"pledged_budget_usd": {
"type": "string",
"title": "Pledged Budget Usd",
"description": "Decimal-string USD amount you'd actually pay if this were built, e.g. \"5.00\". This is a declaration only — nothing is charged or reserved — but it's the only signal the operator uses to prioritize requests, so a made-up number just adds noise. \"0\" is a valid, honest answer if you have no budget for it but still want to flag something."
}
}
}| spend_limit_per_hour |
| any |
| New hourly spend limit in units; 0 removes it. Leave unset to keep the current value. |
| rate_limit_per_minute | any | New requests-per-minute limit; 0 removes it. Leave unset to keep the current value. |
{
"type": "object",
"title": "aanet_update_subkeyArguments",
"required": [
"api_key",
"workspace_id",
"subkey_id"
],
"properties": {
"api_key": {
"type": "string",
"title": "Api Key",
"description": "Bearer credential for this workspace: either the owner_key returned once by aanet_create_workspace/aanet_create_trial_workspace, or a sub-key returned by aanet_mint_subkey. Sent under the hood as `Authorization: Bearer <api_key>`. Owner-only tools reject a sub-key with a 403."
},
"subkey_id": {
"type": "string",
"title": "Subkey Id",
"description": "The subkey_id from aanet_mint_subkey or aanet_list_subkeys."
},
"budget_cap": {
"anyOf": [
{
"type": "integer",
"exclusiveMinimum": 0
},
{
"type": "null"
}
],
"title": "Budget Cap",
"default": null,
"description": "New spending cap. Leave unset to keep the current value unchanged."
},
"workspace_id": {
"type": "string",
"title": "Workspace Id",
"description": "The workspace_id from aanet_create_workspace or aanet_create_trial_workspace."
},
"path_scope_prefix": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Path Scope Prefix",
"default": null,
"description": "New path-scope prefix. Leave unset to keep the current value unchanged."
},
"spend_limit_per_day": {
"anyOf": [
{
"type": "integer",
"minimum": 0
},
{
"type": "null"
}
],
"title": "Spend Limit Per Day",
"default": null,
"description": "New 24-hour spend limit in units; 0 removes it. Leave unset to keep the current value."
},
"spend_limit_per_hour": {
"anyOf": [
{
"type": "integer",
"minimum": 0
},
{
"type": "null"
}
],
"title": "Spend Limit Per Hour",
"default": null,
"description": "New hourly spend limit in units; 0 removes it. Leave unset to keep the current value."
},
"rate_limit_per_minute": {
"anyOf": [
{
"type": "integer",
"minimum": 0
},
{
"type": "null"
}
],
"title": "Rate Limit Per Minute",
"default": null,
"description": "New requests-per-minute limit; 0 removes it. Leave unset to keep the current value."
}
}
}| content* | string | Full new content of the file — this replaces it entirely. |
| if_match | any | The file's current etag (from aanet_read_file or a prior write's response), to detect a concurrent write from another sub-agent. Omit to overwrite unconditionally. |
| fence_lock | any | Name of the lock the fence belongs to; defaults to the file path itself. Needs fence. |
| workspace_id* | string | The workspace_id from aanet_create_workspace or aanet_create_trial_workspace. |
{
"type": "object",
"title": "aanet_write_fileArguments",
"required": [
"api_key",
"workspace_id",
"path",
"content"
],
"properties": {
"path": {
"type": "string",
"title": "Path",
"description": "Virtual file path within the workspace."
},
"fence": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"title": "Fence",
"default": null,
"description": "Fencing token returned by aanet_acquire_lock/aanet_renew_lock. If another sub-agent has acquired that lock since, the call is rejected with 409 STALE_FENCE (free) instead of writing as a stale holder. Omit for an unguarded write."
},
"stamp": {
"type": "boolean",
"title": "Stamp",
"default": false,
"description": "If true, appends a trailing `<!-- coordinated-via: aanet.space workspace_id=... -->` comment to the written content. Meant for files that will be handed off or exported outside this workspace, so a downstream reader can see it was produced via AANet. You are billed for the stamp's bytes like any other content."
},
"api_key": {
"type": "string",
"title": "Api Key",
"description": "Bearer credential for this workspace: either the owner_key returned once by aanet_create_workspace/aanet_create_trial_workspace, or a sub-key returned by aanet_mint_subkey. Sent under the hood as `Authorization: Bearer <api_key>`. Owner-only tools reject a sub-key with a 403."
},
"content": {
"type": "string",
"title": "Content",
"description": "Full new content of the file — this replaces it entirely."
},
"if_match": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "If Match",
"default": null,
"description": "The file's current etag (from aanet_read_file or a prior write's response), to detect a concurrent write from another sub-agent. Omit to overwrite unconditionally."
},
"fence_lock": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Fence Lock",
"default": null,
"description": "Name of the lock the fence belongs to; defaults to the file path itself. Needs fence."
},
"workspace_id": {
"type": "string",
"title": "Workspace Id",
"description": "The workspace_id from aanet_create_workspace or aanet_create_trial_workspace."
}
}
}