Autonomous Agents Network (AANet)
Measured conclusion: Deep-tested. L2 outcome: tools_ok.
Multi-agent coordination outside your LLM context: dedupe parallel work, per-agent budgets, handoff
| Author | space.aanet |
|---|---|
| Access | remote |
| Publisher key required | No |
| Measured state | Deep-tested |
| L1 liveness | alive |
| L1 latency | 2082 ms |
| Last measured | 2026-10-24 |
Add to your agent
Copy this into your MCP client config:
{
"mcpServers": {
"Autonomous Agents Network (AANet)": {
"url": "https://aanet.space/mcp",
"transport": "streamable-http"
}
}
}
Measured tools (34)
aanet_create_workspaceCreate 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.
Parameters:
label(required) — string — A display name for your own reference — free text, not required to be unique.
Hints: read-only not declared · destructive not declared · idempotent not declared · open-world not declared
aanet_create_trial_workspaceCreate 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.
Hints: read-only not declared · destructive not declared · idempotent not declared · open-world not declared
aanet_get_remaining_balanceFree (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.
Parameters:
api_key(required) — 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.
Hints: read-only not declared · destructive not declared · idempotent not declared · open-world not declared
aanet_get_workspaceCheck 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.
Parameters:
api_key(required) — 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(required) — string — The workspace_id from aanet_create_workspace or aanet_create_trial_workspace.
Hints: read-only not declared · destructive not declared · idempotent not declared · open-world not declared
aanet_delete_workspacePermanently 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.
Parameters:
api_key(required) — 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(required) — string — The workspace_id from aanet_create_workspace or aanet_create_trial_workspace.
Hints: read-only not declared · destructive not declared · idempotent not declared · open-world not declared
aanet_depositFund 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.
Parameters:
api_key(required) — 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(required) — string — The workspace_id from aanet_create_workspace or aanet_create_trial_workspace.amount_usd(required) — string — Deposit amount in US dollars as a decimal string, e.g. "1.00". Minimum $0.25.payment_signature— 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.
Hints: read-only not declared · destructive not declared · idempotent not declared · open-world not declared
aanet_mint_subkeyIssue 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.
Parameters:
api_key(required) — 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(required) — string — The workspace_id from aanet_create_workspace or aanet_create_trial_workspace.label(required) — string — Display name for this sub-key, e.g. the sub-agent's role or id.budget_cap— 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.path_scope_prefix— 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— 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— 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— 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.
Hints: read-only not declared · destructive not declared · idempotent not declared · open-world not declared
aanet_list_subkeysList 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.
Parameters:
api_key(required) — 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(required) — string — The workspace_id from aanet_create_workspace or aanet_create_trial_workspace.
Hints: read-only not declared · destructive not declared · idempotent not declared · open-world not declared
aanet_update_subkeyChange 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).
Parameters:
api_key(required) — 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(required) — string — The workspace_id from aanet_create_workspace or aanet_create_trial_workspace.subkey_id(required) — string — The subkey_id from aanet_mint_subkey or aanet_list_subkeys.budget_cap— New spending cap. Leave unset to keep the current value unchanged.path_scope_prefix— New path-scope prefix. Leave unset to keep the current value unchanged.spend_limit_per_day— New 24-hour spend limit in units; 0 removes it. Leave unset to keep the current value.spend_limit_per_hour— New hourly spend limit in units; 0 removes it. Leave unset to keep the current value.rate_limit_per_minute— New requests-per-minute limit; 0 removes it. Leave unset to keep the current value.
Hints: read-only not declared · destructive not declared · idempotent not declared · open-world not declared
aanet_revoke_subkeyPermanently 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.
Parameters:
api_key(required) — 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(required) — string — The workspace_id from aanet_create_workspace or aanet_create_trial_workspace.subkey_id(required) — string — The subkey_id from aanet_mint_subkey or aanet_list_subkeys.
Hints: read-only not declared · destructive not declared · idempotent not declared · open-world not declared
aanet_read_fileRead 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.
Parameters:
api_key(required) — 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(required) — string — The workspace_id from aanet_create_workspace or aanet_create_trial_workspace.path(required) — string — Virtual file path within the workspace, e.g. "notes/progress.md".
Hints: read-only not declared · destructive not declared · idempotent not declared · open-world not declared
aanet_write_fileOverwrite 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}.
Parameters:
api_key(required) — 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(required) — string — The workspace_id from aanet_create_workspace or aanet_create_trial_workspace.path(required) — string — Virtual file path within the workspace.content(required) — string — Full new content of the file — this replaces it entirely.fence— 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.if_match— 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— Name of the lock the fence belongs to; defaults to the file path itself. Needs fence.
Hints: read-only not declared · destructive not declared · idempotent not declared · open-world not declared
aanet_append_fileAppend 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}.
Parameters:
api_key(required) — 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(required) — string — The workspace_id from aanet_create_workspace or aanet_create_trial_workspace.path(required) — string — Virtual file path within the workspace.content(required) — string — Text to append as a new entry — the existing content is kept.fence— 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.if_match— The file's current etag, for the same conflict-detection purpose as on aanet_write_file.fence_lock— Name of the lock the fence belongs to; defaults to the file path itself. Needs fence.idempotency_key— 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).
Hints: read-only not declared · destructive not declared · idempotent not declared · open-world not declared
aanet_delete_filePermanently 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}.
Parameters:
api_key(required) — 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(required) — string — The workspace_id from aanet_create_workspace or aanet_create_trial_workspace.path(required) — string — Virtual file path within the workspace. Must point to a file, not a directory.fence— 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.if_match— The file's current etag, for the same conflict-detection purpose as on aanet_write_file.fence_lock— Name of the lock the fence belongs to; defaults to the file path itself. Needs fence.
Hints: read-only not declared · destructive not declared · idempotent not declared · open-world not declared
aanet_acquire_lockClaim 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.
Parameters:
api_key(required) — 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(required) — string — The workspace_id from aanet_create_workspace or aanet_create_trial_workspace.name(required) — string — Lock name identifying the unit of work, e.g. "process-batch-3".lease_seconds(required) — integer — How long you hold the lock before it becomes reclaimable by anyone else, 1-3600 seconds.idempotency_key— 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).
Hints: read-only not declared · destructive not declared · idempotent not declared · open-world not declared
aanet_renew_lockExtend 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.
Parameters:
api_key(required) — 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(required) — string — The workspace_id from aanet_create_workspace or aanet_create_trial_workspace.name(required) — string — Lock name — must match a lock you currently hold.lease_seconds(required) — integer — New lease duration from now, 1-3600 seconds.idempotency_key— 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).
Hints: read-only not declared · destructive not declared · idempotent not declared · open-world not declared
aanet_release_lockVoluntarily 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.
Parameters:
api_key(required) — 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(required) — string — The workspace_id from aanet_create_workspace or aanet_create_trial_workspace.name(required) — string — Lock name — must match a lock you currently hold.
Hints: read-only not declared · destructive not declared · idempotent not declared · open-world not declared
aanet_get_lock_statusCheck 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.
Parameters:
api_key(required) — 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(required) — string — The workspace_id from aanet_create_workspace or aanet_create_trial_workspace.name(required) — string — Lock name to inspect, e.g. "process-batch-3".
Hints: read-only not declared · destructive not declared · idempotent not declared · open-world not declared
aanet_get_activityRead 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.
Parameters:
api_key(required) — 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(required) — string — The workspace_id from aanet_create_workspace or aanet_create_trial_workspace.limit— integer — Maximum entries to return, newest first, up to 500.since— ISO timestamp — only return entries at or after this time.since_id— 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— Filter to one operation type, e.g. "PUT_FILE", "LOCK_ACQUIRE", "SEND_MESSAGE", "WEBHOOK_DELIVERY". Omit for all operation types.subkey_id— Filter to attempts by this sub-key only. Omit for all.
Hints: read-only not declared · destructive not declared · idempotent not declared · open-world not declared
aanet_get_activity_summarySpend 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.
Parameters:
api_key(required) — 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(required) — string — The workspace_id from aanet_create_workspace or aanet_create_trial_workspace.since— ISO timestamp — only count entries at or after this time.group_by— string — How to group the totals: "subkey_operation" (default), "subkey" or "operation".
Hints: read-only not declared · destructive not declared · idempotent not declared · open-world not declared
aanet_get_activity_headSigned 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.
Parameters:
api_key(required) — 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(required) — string — The workspace_id from aanet_create_workspace or aanet_create_trial_workspace.
Hints: read-only not declared · destructive not declared · idempotent not declared · open-world not declared
aanet_export_activityExport 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.
Parameters:
api_key(required) — 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(required) — string — The workspace_id from aanet_create_workspace or aanet_create_trial_workspace.limit— integer — Max rows per page.since_seq— integer — Return rows with chain_seq greater than this; 0 = from the start.
Hints: read-only not declared · destructive not declared · idempotent not declared · open-world not declared
aanet_get_forecastBurn 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.
Parameters:
api_key(required) — 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(required) — string — The workspace_id from aanet_create_workspace or aanet_create_trial_workspace.
Hints: read-only not declared · destructive not declared · idempotent not declared · open-world not declared
aanet_submit_feedbackReport 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).
Parameters:
api_key(required) — 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(required) — string — One of "bug", "feature", "pricing", "other".title(required) — string — Short one-line summary of the issue or request.description(required) — string — Full detail — what's wrong, or what you'd want and why.pledged_budget_usd(required) — 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.
Hints: read-only not declared · destructive not declared · idempotent not declared · open-world not declared
aanet_request_refundAsk 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.
Parameters:
api_key(required) — 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(required) — string — The workspace_id from aanet_create_workspace or aanet_create_trial_workspace.network(required) — string — Payout network: one of "base", "polygon", "arbitrum", "avalanche", "solana".destination_address(required) — string — Your own wallet address on that network to receive the payout.
Hints: read-only not declared · destructive not declared · idempotent not declared · open-world not declared
aanet_get_refund_statusCheck 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.
Parameters:
api_key(required) — 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(required) — string — The workspace_id from aanet_create_workspace or aanet_create_trial_workspace.
Hints: read-only not declared · destructive not declared · idempotent not declared · open-world not declared
aanet_send_messageSend 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}.
Parameters:
api_key(required) — 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(required) — string — The workspace_id from aanet_create_workspace or aanet_create_trial_workspace.body(required) — string — Message text.topic— Optional free-text label for filtering later with aanet_get_messages.to_subkey_id— subkey_id of the specific recipient. Leave unset to broadcast to every sub-key in the workspace.idempotency_key— 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).
Hints: read-only not declared · destructive not declared · idempotent not declared · open-world not declared
aanet_get_messagesFetch 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.
Parameters:
api_key(required) — 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(required) — string — The workspace_id from aanet_create_workspace or aanet_create_trial_workspace.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— 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— Filter to messages sent with this exact topic. Omit for all topics.since_id— 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.
Hints: read-only not declared · destructive not declared · idempotent not declared · open-world not declared
aanet_register_webhookRegister 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.
Parameters:
api_key(required) — 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(required) — string — The workspace_id from aanet_create_workspace or aanet_create_trial_workspace.url(required) — 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(required) — 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).balance_thresholds— 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.
Hints: read-only not declared · destructive not declared · idempotent not declared · open-world not declared
aanet_list_webhooksList 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.
Parameters:
api_key(required) — 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(required) — string — The workspace_id from aanet_create_workspace or aanet_create_trial_workspace.
Hints: read-only not declared · destructive not declared · idempotent not declared · open-world not declared
aanet_delete_webhookPermanently 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).
Parameters:
api_key(required) — 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(required) — string — The workspace_id from aanet_create_workspace or aanet_create_trial_workspace.webhook_id(required) — string — The webhook_id from aanet_register_webhook or aanet_list_webhooks.
Hints: read-only not declared · destructive not declared · idempotent not declared · open-world not declared
aanet_get_pricingFree, 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.
Hints: read-only not declared · destructive not declared · idempotent not declared · open-world not declared
aanet_estimate_savingsEstimate 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.
Parameters:
agents(required) — integer — Number of agents in the swarm you're planning.rounds_per_agent(required) — integer — Coordination rounds each agent will need (reads/writes/lock cycles).
Hints: read-only not declared · destructive not declared · idempotent not declared · open-world not declared
aanet_get_webhook_deliveriesInspect 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).
Parameters:
api_key(required) — 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(required) — string — The workspace_id from aanet_create_workspace or aanet_create_trial_workspace.webhook_id(required) — string — The webhook_id from aanet_register_webhook or aanet_list_webhooks.limit— integer — Maximum delivery records to return, newest first, up to 200.
Hints: read-only not declared · destructive not declared · idempotent not declared · open-world not declared
Measured by MCPYP probing. Untested fields are omitted, never estimated. Listing is always free; MCPYP never proxies calls or stores user tokens.