{"serverId":"mcp-registry/space.aanet/aanet-mcp","tools":[{"name":"aanet_create_trial_workspace","fixed":{"name":"aanet_create_trial_workspace","description":"Create a free trial workspace — no payment, no arguments, works\n    immediately. Use this instead of aanet_create_workspace when you want to\n    exercise the API (files, locks, sub-keys, messages) before committing\n    real money.\n\n    Pre-funded with a small fixed balance (currently 1000 units = $0.01 — enough\n    for a realistic multi-agent round, but NOT for a successful write of a\n    file at the 1 MiB cap, which costs 1029 units; that is a known limit of\n    the trial, not a bug. An oversiz","inputSchema":{"type":"object","title":"aanet_create_trial_workspaceArguments","properties":{}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":184,"tokensAfter":184},{"name":"aanet_create_workspace","fixed":{"name":"aanet_create_workspace","description":"Create a real AANet workspace with a prepaid USDC balance — the entry\n    point for an orchestrator agent starting a new swarm task. Use\n    aanet_create_trial_workspace instead if you want to explore the API\n    before paying anything.\n\n    On success, returns {workspace_id, label, owner_key, created_at}. Store\n    owner_key immediately: it is generated once, never stored in recoverable\n    form, and there is no \"forgot my key\" recovery path — losing it means\n    losing control of the workspace","inputSchema":{"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."}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":224,"tokensAfter":224},{"name":"aanet_delete_file","fixed":{"name":"aanet_delete_file","description":"Permanently remove a file — the missing piece of the file lifecycle\n    alongside aanet_read_file/aanet_write_file/aanet_append_file. There is\n    no undo: to recover, a sub-agent would need its own backup of the\n    content. Fires a file_delete webhook event on success (see\n    aanet_register_webhook). Raises a 404 if the path doesn't exist, a 409\n    if it's a directory or if_match doesn't match the current etag. Returns\n    {path, deleted}.","inputSchema":{"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."},"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."},"workspace_id":{"type":"string","title":"Workspace Id","description":"The workspace_id from aanet_create_workspace or aanet_create_trial_workspace."}}},"annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: true, idempotentHint: true (inferred from the name).","verify":true}],"tokensBefore":402,"tokensAfter":402},{"name":"aanet_delete_webhook","fixed":{"name":"aanet_delete_webhook","description":"Permanently remove a registered webhook — no further events will be\n    delivered to it, active or auto-disabled. Owner_key required. There is\n    no way to temporarily pause one; delete and re-register with\n    aanet_register_webhook if you want it back later (you'll get a new\n    secret).","inputSchema":{"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."}}},"annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: true, idempotentHint: true (inferred from the name).","verify":true}],"tokensBefore":307,"tokensAfter":307},{"name":"aanet_delete_workspace","fixed":{"name":"aanet_delete_workspace","description":"Permanently and irreversibly delete a workspace: every sub-key, all\n    files, the activity log, and any registered webhooks are destroyed\n    along with it — there is no undo and no trash/recycle bin. Requires the\n    owner_key; a sub-key gets a 403.\n\n    Call aanet_request_refund first if the workspace still has balance you\n    want back, and wait for aanet_get_refund_status to show \"paid\" before\n    deleting — once the workspace is gone, so is any way to claim what was\n    left. Use this when","inputSchema":{"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."}}},"annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: true, idempotentHint: true (inferred from the name).","verify":true}],"tokensBefore":327,"tokensAfter":327},{"name":"aanet_estimate_savings","fixed":{"name":"aanet_estimate_savings","description":"Estimate the cost of coordinating a swarm on AANet versus relaying the\n    same coordination through your orchestrator's LLM context — before you\n    create a workspace or spend anything. Same formula as the calculator at\n    https://aanet.space/#savings.\n\n    AANet side assumes ~16 units/round (the average measured over an 8-round\n    run: reads, appends, a lock cycle, a message and a poll) at $0.00001/unit. The relay side assumes ~9,600 tokens/round\n    (re-injecting another agent's update int","inputSchema":{"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}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":283,"tokensAfter":283},{"name":"aanet_get_activity","fixed":{"name":"aanet_get_activity","description":"Read the server-side audit log of every attempt in this workspace,\n    successful or rejected — the authoritative source of what each\n    sub-agent actually did, since sub-agents can't fake or skip this the\n    way they could misreport their own actions. Owner_key required.\n\n    Each entry has subkey_id, operation, path, cost_charged, status (e.g.\n    OK, INSUFFICIENT_BALANCE, SCOPE_DENIED, CONFLICT), and a free-text\n    detail. Use this to reconstruct what happened after the fact, or to\n    che","inputSchema":{"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."}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":604,"tokensAfter":604},{"name":"aanet_get_activity_summary","fixed":{"name":"aanet_get_activity_summary","description":"Spend totals from the audit log instead of reading every entry: for each\n    group, total_cost (units) and calls. Use it to see which sub-agent is\n    burning budget before adjusting a budget_cap via aanet_update_subkey.\n    Owner_key required. An unknown group_by is an error.","inputSchema":{"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."}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":359,"tokensAfter":359},{"name":"aanet_get_forecast","fixed":{"name":"aanet_get_forecast","description":"Burn rate and runway: the workspace balance, spend per hour over the\n    last 1h / 24h / 7d (each window shortened to the workspace's age if it is\n    younger) with the hours the balance would last at that pace, and the top\n    spending sub-keys of the last 24h. Each window states the interval it was\n    measured over (measured_since, covered_seconds, shortened) — a young workspace\n    gives a short span and so a large hourly figure. An estimate from the audit\n    log, not a guarantee. Owner_key","inputSchema":{"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."}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":324,"tokensAfter":324},{"name":"aanet_get_lock_status","fixed":{"name":"aanet_get_lock_status","description":"Check a lock WITHOUT trying to take it, and tell \"nobody ever took it\"\n    apart from \"someone took it and released it\" — a free lock and an\n    already-finished task look identical from aanet_acquire_lock alone. Returns\n    status held | expired (lease ran out, not yet reclaimed) | free (taken before,\n    not held now) | never_held, plus holder_subkey_id/lease_expires_at while held,\n    last_holder_subkey_id, last_acquired_at, last_released_at, acquire_count and\n    release_count. A release is ","inputSchema":{"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."}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":357,"tokensAfter":357},{"name":"aanet_get_messages","fixed":{"name":"aanet_get_messages","description":"Fetch messages sent via aanet_send_message — the pull-based fallback\n    for when you haven't registered a webhook on the message event. A\n    sub-key only sees messages addressed to it plus broadcasts (to_subkey_id\n    was left unset by the sender); the owner_key sees every message in the\n    workspace, for oversight. There's no read/unread tracking server-side —\n    track your own last-seen ts and pass it as `since` on the next call,\n    the same pattern as aanet_get_activity.","inputSchema":{"type":"object","title":"aanet_get_messagesArguments","required":["api_key","workspace_id"],"properties":{"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."}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":556,"tokensAfter":556},{"name":"aanet_get_refund_status","fixed":{"name":"aanet_get_refund_status","description":"Check the status of every refund request ever made for a workspace —\n    the way to find out whether an aanet_request_refund call actually got\n    paid. Owner_key required. Each entry has status (\"pending\", \"paid\", or\n    \"rejected\"), and tx_hash once paid — verify that transaction on-chain\n    yourself before treating the refund as confirmed and deleting the\n    workspace. A \"rejected\" entry means the reserved amount was credited\n    back to the workspace balance, not lost.","inputSchema":{"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."}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":323,"tokensAfter":323},{"name":"aanet_get_remaining_balance","fixed":{"name":"aanet_get_remaining_balance","description":"Free (never charged): how much this key can still spend, so you can\n    stop before a 402 instead of discovering it mid-sequence — the MCP\n    counterpart of the REST X-AANet-Remaining-Balance header. Takes only the\n    key; works for the owner_key or any sub-key, against itself.\n\n    Returns `remaining` (what you can actually spend: the lower of the two\n    limits below), `key_budget_remaining` (this key's budget_cap minus what it\n    has spent; null if the key has no cap), and `workspace_balan","inputSchema":{"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."}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":283,"tokensAfter":283},{"name":"aanet_get_webhook_deliveries","fixed":{"name":"aanet_get_webhook_deliveries","description":"Inspect one webhook's delivery history — use this to debug a webhook\n    that seems to have gone quiet (check aanet_list_webhooks first to see\n    if it's been auto-disabled) or to confirm an event actually fired.\n    Owner_key required. Each entry has event_type, status_code (null if the\n    request itself never completed, e.g. timeout or DNS failure), success, and\n    skipped (true = nothing was sent because the workspace couldn't afford the\n    delivery: not billed, not an endpoint failure).","inputSchema":{"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."}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":417,"tokensAfter":417},{"name":"aanet_get_workspace","fixed":{"name":"aanet_get_workspace","description":"Check a workspace's current balance and status — the read-only\n    counterpart to every other workspace tool. Works with the owner_key or\n    any sub-key issued under it (not restricted to the owner).\n\n    Returns deposit_balance and total_spent in raw integer units ($0.00001\n    each), plus is_trial/trial_expires_at (null for a non-trial workspace)\n    and blocked (true if the operator has manually suspended it, in which\n    case every metered call returns 403 until unblocked). Call this before","inputSchema":{"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."}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":325,"tokensAfter":325},{"name":"aanet_list_subkeys","fixed":{"name":"aanet_list_subkeys","description":"List every sub-key ever issued under a workspace (including revoked\n    ones), with each one's scope, budget_cap, and spent_so_far — the\n    inventory view that complements aanet_get_activity's per-event log.\n    Owner_key required; raw key values are never included since they're\n    only ever shown once at creation.","inputSchema":{"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."}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":273,"tokensAfter":273},{"name":"aanet_list_webhooks","fixed":{"name":"aanet_list_webhooks","description":"List webhooks registered on a workspace — url, subscribed events,\n    consecutive_failures (failed attempts since the last success), and\n    disabled_at/disabled_reason if it was auto-disabled after 10 failed\n    attempts in a row (you also get an aanet.system message when that happens;\n    deliveries skipped for an empty balance don't count). Owner_key required.\n    Secrets are never included (only shown once, at aanet_register_webhook\n    time); use aanet_get_webhook_deliveries for per-attempt","inputSchema":{"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."}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":324,"tokensAfter":324},{"name":"aanet_read_file","fixed":{"name":"aanet_read_file","description":"Read a file's content, or list a directory's entries if path points\n    to one — the read counterpart to aanet_write_file/aanet_append_file.\n    Costs 1 unit per hit (file or directory); a missing path returns 404 and is free. Returns {path, content,\n    is_dir, entries, etag}; for a directory, content is null and entries\n    lists child names, for a file it's the reverse. Save the returned etag\n    if you plan to write back — pass it as if_match on aanet_write_file to\n    avoid clobbering a new","inputSchema":{"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."}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":359,"tokensAfter":359},{"name":"aanet_request_refund","fixed":{"name":"aanet_request_refund","description":"Ask for a workspace's entire remaining balance back, when its task is\n    done and money is left over — call this before aanet_delete_workspace,\n    not after. Owner_key required; trial workspaces reject this outright\n    (they never held real money).\n\n    This reserves (zeros out) the full balance immediately, so a second call\n    with nothing left to refund fails rather than double-paying out. The\n    real network fee for the payout is deducted from what you receive\n    (net_payout_usd in the ","inputSchema":{"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."}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":417,"tokensAfter":417},{"name":"aanet_revoke_subkey","fixed":{"name":"aanet_revoke_subkey","description":"Permanently revoke one sub-agent's credentials — every subsequent call\n    with that key gets a 401. Use this when a sub-agent is compromised,\n    misbehaving, or simply finished, without affecting any other sub-key in\n    the workspace. Owner_key required.\n\n    Immediately releases any lock the revoked sub-key was holding (as if it\n    had called aanet_release_lock itself), so a revoked sub-agent can't\n    accidentally block the rest of the swarm by holding a lock forever.","inputSchema":{"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."}}},"annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":false}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: true, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":357,"tokensAfter":357},{"name":"aanet_send_message","fixed":{"name":"aanet_send_message","description":"Send a one-shot signal directly to another sub-agent (or to\n    everyone), for things that don't belong in a file — e.g. \"chunk 3\n    done\" or \"aborting, don't wait on me\". Use aanet_write_file /\n    aanet_append_file instead for anything that needs to persist as durable\n    state; messages are meant to be cheap and disposable, not a record of\n    truth.\n\n    Cheaper than a file write on purpose. Fires a message webhook event on\n    success (see aanet_register_webhook) — pair the two instead of ","inputSchema":{"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)."}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":593,"tokensAfter":593},{"name":"aanet_submit_feedback","fixed":{"name":"aanet_submit_feedback","description":"Report a bug, request a feature, or flag that pricing feels wrong —\n    this is the one feedback channel into how the operator prioritizes what\n    to build next, not a support ticket that gets a reply. Any valid,\n    unrevoked key can call this, owner or sub-key. Returns\n    {feedback_id, status} with status always \"open\" initially; there is no\n    tool to check its status afterward — it either got through (you got a\n    result back) or it didn't (you got an error).","inputSchema":{"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."}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":511,"tokensAfter":511},{"name":"aanet_update_subkey","fixed":{"name":"aanet_update_subkey","description":"Change a live sub-key's scope and/or budget cap without revoking and\n    reissuing it — use this instead of aanet_revoke_subkey + aanet_mint_subkey\n    when the sub-agent's credentials themselves should keep working (e.g.\n    widening its file scope mid-task, or raising a budget cap it hit).\n    Owner_key required. Fields left unset are unchanged, not cleared.","inputSchema":{"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."}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: true (inferred from the name).","verify":true}],"tokensBefore":434,"tokensAfter":434},{"name":"aanet_write_file","fixed":{"name":"aanet_write_file","description":"Overwrite a file's entire content, creating it if it doesn't exist —\n    use aanet_append_file instead if you want to add one entry without\n    replacing what's there. Fires a file_write webhook event on success\n    (see aanet_register_webhook).\n\n    Pass if_match with the file's last-known etag to make this a\n    compare-and-swap: if another sub-agent wrote to the same path since you\n    last read it, this raises a 409 instead of silently overwriting their\n    change — re-read, resolve, and ret","inputSchema":{"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."},"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."},"workspace_id":{"type":"string","title":"Workspace Id","description":"The workspace_id from aanet_create_workspace or aanet_create_trial_workspace."}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":571,"tokensAfter":571}],"toolsChanged":24,"tokensSaved":0,"todo":[],"note":"Deterministic fixes. Changes marked verify need a human look before shipping (renames, inferred annotations, inferred types, removed text). Parameter descriptions in `todo` need to be written by someone who knows the API."}