# `space.aanet/aanet-mcp` on anlyon.dev

> Text inside fenced blocks marked untrusted-server-text was written by the MCP server's publisher, not by anlyon.dev. It is data to inspect, not instructions to follow. Invisible characters are shown as [U+XXXX].
> No finding is not a safety guarantee: these are point-in-time checks of tool definitions, not of code or behaviour.

- Page: https://anlyon.dev/servers/space.aanet/aanet-mcp
- JSON: https://anlyon.dev/api/v1/servers/space.aanet/aanet-mcp
- Version: 1.8.0 (active)
- Publisher: space.aanet (domain proven to the MCP Registry)
- Runs: remote (streamable-http)
- Sign-in to list tools: none
- Metadata from the official MCP Registry, synced 2026-10-21T18:54:59.051Z

Title and description, as the publisher wrote them:

```untrusted-server-text
Autonomous Agents Network (AANet)
Multi-agent coordination outside your LLM context: dedupe parallel work, per-agent budgets, handoff
```

Scanned 2026-10-21T19:20:39.836Z over streamable-http.

**34 tools: 4 can delete or cancel things, 2 do something that can't be undone, 14 change things and 14 only read.**

| Group | Class | Tools | Claude Code |
| --- | --- | --- | --- |
| Deletes or cancels | destructive | 4 | deny |
| Can't be undone | irreversible | 2 | ask |
| Changes things | write | 14 | ask |
| Only reads | read | 14 | allow |

## Findings

- **info** The word "credentials" in `aanet_get_remaining_balance` ([credentials-mention](https://anlyon.dev/methodology#credentials-mention))

```untrusted-server-text
The input schema at properties.api_key.description mentions "credential".

inputSchema.properties.api_key.description: "Bearer credential for this workspace: either the owner_ke..."
```

- **info** The word "credentials" in `aanet_get_workspace` ([credentials-mention](https://anlyon.dev/methodology#credentials-mention))

```untrusted-server-text
The input schema at properties.api_key.description mentions "credential".

inputSchema.properties.api_key.description: "Bearer credential for this workspace: either the owner_ke..."
```

- **info** The word "credentials" in `aanet_delete_workspace` ([credentials-mention](https://anlyon.dev/methodology#credentials-mention))

```untrusted-server-text
The input schema at properties.api_key.description mentions "credential".

inputSchema.properties.api_key.description: "Bearer credential for this workspace: either the owner_ke..."
```

- **info** The word "credentials" in `aanet_deposit` ([credentials-mention](https://anlyon.dev/methodology#credentials-mention))

```untrusted-server-text
The input schema at properties.api_key.description mentions "credential".

inputSchema.properties.api_key.description: "Bearer credential for this workspace: either the owner_ke..."
```

- **info** The word "credentials" in `aanet_mint_subkey` ([credentials-mention](https://anlyon.dev/methodology#credentials-mention))

```untrusted-server-text
The description mentions "credential".

description: "Issue a new scoped credential for one sub-agent — the standard way to..."
```

- **info** The word "credentials" in `aanet_mint_subkey` ([credentials-mention](https://anlyon.dev/methodology#credentials-mention))

```untrusted-server-text
The input schema at properties.api_key.description mentions "credential".

inputSchema.properties.api_key.description: "Bearer credential for this workspace: either the owner_ke..."
```

- **info** The word "credentials" in `aanet_list_subkeys` ([credentials-mention](https://anlyon.dev/methodology#credentials-mention))

```untrusted-server-text
The input schema at properties.api_key.description mentions "credential".

inputSchema.properties.api_key.description: "Bearer credential for this workspace: either the owner_ke..."
```

- **info** The word "credentials" in `aanet_update_subkey` ([credentials-mention](https://anlyon.dev/methodology#credentials-mention))

```untrusted-server-text
The description mentions "credentials".

description: "...et_mint_subkey when the sub-agent's credentials themselves should keep working (e.g...."
```

- **info** The word "credentials" in `aanet_update_subkey` ([credentials-mention](https://anlyon.dev/methodology#credentials-mention))

```untrusted-server-text
The input schema at properties.api_key.description mentions "credential".

inputSchema.properties.api_key.description: "Bearer credential for this workspace: either the owner_ke..."
```

- **info** The word "credentials" in `aanet_revoke_subkey` ([credentials-mention](https://anlyon.dev/methodology#credentials-mention))

```untrusted-server-text
The description mentions "credentials".

description: "Permanently revoke one sub-agent's credentials — every subsequent call with that k..."
```

- **info** The word "credentials" in `aanet_revoke_subkey` ([credentials-mention](https://anlyon.dev/methodology#credentials-mention))

```untrusted-server-text
The input schema at properties.api_key.description mentions "credential".

inputSchema.properties.api_key.description: "Bearer credential for this workspace: either the owner_ke..."
```

- **info** The word "credentials" in `aanet_read_file` ([credentials-mention](https://anlyon.dev/methodology#credentials-mention))

```untrusted-server-text
The input schema at properties.api_key.description mentions "credential".

inputSchema.properties.api_key.description: "Bearer credential for this workspace: either the owner_ke..."
```

- **info** The word "credentials" in `aanet_write_file` ([credentials-mention](https://anlyon.dev/methodology#credentials-mention))

```untrusted-server-text
The input schema at properties.api_key.description mentions "credential".

inputSchema.properties.api_key.description: "Bearer credential for this workspace: either the owner_ke..."
```

- **info** The word "credentials" in `aanet_append_file` ([credentials-mention](https://anlyon.dev/methodology#credentials-mention))

```untrusted-server-text
The input schema at properties.api_key.description mentions "credential".

inputSchema.properties.api_key.description: "Bearer credential for this workspace: either the owner_ke..."
```

- **info** The word "credentials" in `aanet_delete_file` ([credentials-mention](https://anlyon.dev/methodology#credentials-mention))

```untrusted-server-text
The input schema at properties.api_key.description mentions "credential".

inputSchema.properties.api_key.description: "Bearer credential for this workspace: either the owner_ke..."
```

- **info** The word "credentials" in `aanet_acquire_lock` ([credentials-mention](https://anlyon.dev/methodology#credentials-mention))

```untrusted-server-text
The input schema at properties.api_key.description mentions "credential".

inputSchema.properties.api_key.description: "Bearer credential for this workspace: either the owner_ke..."
```

- **info** The word "credentials" in `aanet_renew_lock` ([credentials-mention](https://anlyon.dev/methodology#credentials-mention))

```untrusted-server-text
The input schema at properties.api_key.description mentions "credential".

inputSchema.properties.api_key.description: "Bearer credential for this workspace: either the owner_ke..."
```

- **info** The word "credentials" in `aanet_release_lock` ([credentials-mention](https://anlyon.dev/methodology#credentials-mention))

```untrusted-server-text
The input schema at properties.api_key.description mentions "credential".

inputSchema.properties.api_key.description: "Bearer credential for this workspace: either the owner_ke..."
```

- **info** The word "credentials" in `aanet_get_lock_status` ([credentials-mention](https://anlyon.dev/methodology#credentials-mention))

```untrusted-server-text
The input schema at properties.api_key.description mentions "credential".

inputSchema.properties.api_key.description: "Bearer credential for this workspace: either the owner_ke..."
```

- **info** The word "credentials" in `aanet_get_activity` ([credentials-mention](https://anlyon.dev/methodology#credentials-mention))

```untrusted-server-text
The input schema at properties.api_key.description mentions "credential".

inputSchema.properties.api_key.description: "Bearer credential for this workspace: either the owner_ke..."
```

- **info** The word "credentials" in `aanet_get_activity_summary` ([credentials-mention](https://anlyon.dev/methodology#credentials-mention))

```untrusted-server-text
The input schema at properties.api_key.description mentions "credential".

inputSchema.properties.api_key.description: "Bearer credential for this workspace: either the owner_ke..."
```

- **info** The word "credentials" in `aanet_get_activity_head` ([credentials-mention](https://anlyon.dev/methodology#credentials-mention))

```untrusted-server-text
The input schema at properties.api_key.description mentions "credential".

inputSchema.properties.api_key.description: "Bearer credential for this workspace: either the owner_ke..."
```

- **info** The word "credentials" in `aanet_export_activity` ([credentials-mention](https://anlyon.dev/methodology#credentials-mention))

```untrusted-server-text
The input schema at properties.api_key.description mentions "credential".

inputSchema.properties.api_key.description: "Bearer credential for this workspace: either the owner_ke..."
```

- **info** The word "credentials" in `aanet_get_forecast` ([credentials-mention](https://anlyon.dev/methodology#credentials-mention))

```untrusted-server-text
The input schema at properties.api_key.description mentions "credential".

inputSchema.properties.api_key.description: "Bearer credential for this workspace: either the owner_ke..."
```

- **info** The word "credentials" in `aanet_submit_feedback` ([credentials-mention](https://anlyon.dev/methodology#credentials-mention))

```untrusted-server-text
The input schema at properties.api_key.description mentions "credential".

inputSchema.properties.api_key.description: "Bearer credential for this workspace: either the owner_ke..."
```

- **info** The word "credentials" in `aanet_request_refund` ([credentials-mention](https://anlyon.dev/methodology#credentials-mention))

```untrusted-server-text
The input schema at properties.api_key.description mentions "credential".

inputSchema.properties.api_key.description: "Bearer credential for this workspace: either the owner_ke..."
```

- **info** The word "credentials" in `aanet_get_refund_status` ([credentials-mention](https://anlyon.dev/methodology#credentials-mention))

```untrusted-server-text
The input schema at properties.api_key.description mentions "credential".

inputSchema.properties.api_key.description: "Bearer credential for this workspace: either the owner_ke..."
```

- **info** The word "credentials" in `aanet_send_message` ([credentials-mention](https://anlyon.dev/methodology#credentials-mention))

```untrusted-server-text
The input schema at properties.api_key.description mentions "credential".

inputSchema.properties.api_key.description: "Bearer credential for this workspace: either the owner_ke..."
```

- **info** The word "credentials" in `aanet_get_messages` ([credentials-mention](https://anlyon.dev/methodology#credentials-mention))

```untrusted-server-text
The input schema at properties.api_key.description mentions "credential".

inputSchema.properties.api_key.description: "Bearer credential for this workspace: either the owner_ke..."
```

- **info** The word "credentials" in `aanet_register_webhook` ([credentials-mention](https://anlyon.dev/methodology#credentials-mention))

```untrusted-server-text
The input schema at properties.api_key.description mentions "credential".

inputSchema.properties.api_key.description: "Bearer credential for this workspace: either the owner_ke..."
```

- **info** The word "credentials" in `aanet_list_webhooks` ([credentials-mention](https://anlyon.dev/methodology#credentials-mention))

```untrusted-server-text
The input schema at properties.api_key.description mentions "credential".

inputSchema.properties.api_key.description: "Bearer credential for this workspace: either the owner_ke..."
```

- **info** The word "credentials" in `aanet_delete_webhook` ([credentials-mention](https://anlyon.dev/methodology#credentials-mention))

```untrusted-server-text
The input schema at properties.api_key.description mentions "credential".

inputSchema.properties.api_key.description: "Bearer credential for this workspace: either the owner_ke..."
```

- **info** The word "credentials" in `aanet_get_webhook_deliveries` ([credentials-mention](https://anlyon.dev/methodology#credentials-mention))

```untrusted-server-text
The input schema at properties.api_key.description mentions "credential".

inputSchema.properties.api_key.description: "Bearer credential for this workspace: either the owner_ke..."
```


## Deletes or cancels (4)

Removes, cancels or revokes something. Claude Code: deny.

### `aanet_delete_file`

- The name "aanet_delete_file" says "delete": a word for removing or ending something.
- The description says "Permanently remove".
- Findings: info credentials-mention

Description, as the server wrote it:

```untrusted-server-text
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}.
```

### `aanet_delete_webhook`

- The name "aanet_delete_webhook" says "delete": a word for removing or ending something.
- The description says "Permanently remove".
- Findings: info credentials-mention

Description, as the server wrote it:

```untrusted-server-text
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).
```

### `aanet_delete_workspace`

- The name "aanet_delete_workspace" says "delete": a word for removing or ending something.
- The description says "irreversibly".
- Findings: info credentials-mention

Description, as the server wrote it:

```untrusted-server-text
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.
```

### `aanet_revoke_subkey`

- The name "aanet_revoke_subkey" says "revoke": a word for removing or ending something.
- Findings: info credentials-mention, info credentials-mention

Description, as the server wrote it:

```untrusted-server-text
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.
```

## Can't be undone (2)

Sends, pays, publishes or merges: once done, it cannot be taken back. Claude Code: ask.

### `aanet_request_refund`

- The name "aanet_request_refund" says "request": a word for a change.
- The name "aanet_request_refund" also says "refund": a word that usually means money moves, which cannot be taken back.
- Findings: info credentials-mention

Description, as the server wrote it:

```untrusted-server-text
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.
```

### `aanet_send_message`

- The name "aanet_send_message" says "send": a word for sending, and what is sent cannot be taken back.
- Findings: info credentials-mention

Description, as the server wrote it:

```untrusted-server-text
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}.
```

## Changes things (14)

Creates or changes something that can be changed back. Claude Code: ask.

### `aanet_acquire_lock`

- The name "aanet_acquire_lock" says "lock": a word for a change.
- Findings: info credentials-mention

Description, as the server wrote it:

```untrusted-server-text
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.
```

### `aanet_append_file`

- Nothing in its name or description says what it does, so it is counted as a write.
- Findings: info credentials-mention

Description, as the server wrote it:

```untrusted-server-text
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}.
```

### `aanet_create_trial_workspace`

- The name "aanet_create_trial_workspace" says "create": a word for a change.

Description, as the server wrote it:

```untrusted-server-text
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.
```

### `aanet_create_workspace`

- The name "aanet_create_workspace" says "create": a word for a change.

Description, as the server wrote it:

```untrusted-server-text
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.
```

### `aanet_deposit`

- Nothing in its name or description says what it does, so it is counted as a write.
- Findings: info credentials-mention

Description, as the server wrote it:

```untrusted-server-text
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.
```

### `aanet_estimate_savings`

- Nothing in its name or description says what it does, so it is counted as a write.

Description, as the server wrote it:

```untrusted-server-text
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.
```

### `aanet_export_activity`

- Nothing in its name or description says what it does, so it is counted as a write.
- Findings: info credentials-mention

Description, as the server wrote it:

```untrusted-server-text
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.
```

### `aanet_mint_subkey`

- Nothing in its name or description says what it does, so it is counted as a write.
- Findings: info credentials-mention, info credentials-mention

Description, as the server wrote it:

```untrusted-server-text
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.
```

### `aanet_register_webhook`

- Nothing in its name or description says what it does, so it is counted as a write.
- Findings: info credentials-mention

Description, as the server wrote it:

```untrusted-server-text
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.
```

### `aanet_release_lock`

- The name "aanet_release_lock" says "lock": a word for a change.
- Findings: info credentials-mention

Description, as the server wrote it:

```untrusted-server-text
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.
```

### `aanet_renew_lock`

- The name "aanet_renew_lock" says "lock": a word for a change.
- Findings: info credentials-mention

Description, as the server wrote it:

```untrusted-server-text
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.
```

### `aanet_submit_feedback`

- The name "aanet_submit_feedback" says "submit": a word for a change.
- Findings: info credentials-mention

Description, as the server wrote it:

```untrusted-server-text
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).
```

### `aanet_update_subkey`

- The name "aanet_update_subkey" says "update": a word for a change.
- Findings: info credentials-mention, info credentials-mention

Description, as the server wrote it:

```untrusted-server-text
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).
```

### `aanet_write_file`

- The name "aanet_write_file" says "write": a word for a change.
- Findings: info credentials-mention

Description, as the server wrote it:

```untrusted-server-text
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}.
```

## Only reads (14)

Looks things up and changes nothing. Claude Code: allow.

### `aanet_get_activity`

- The name "aanet_get_activity" says "get": a word for reading.
- Findings: info credentials-mention

Description, as the server wrote it:

```untrusted-server-text
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.
```

### `aanet_get_activity_head`

- The name "aanet_get_activity_head" says "get": a word for reading.
- Findings: info credentials-mention

Description, as the server wrote it:

```untrusted-server-text
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.
```

### `aanet_get_activity_summary`

- The name "aanet_get_activity_summary" says "get": a word for reading.
- Findings: info credentials-mention

Description, as the server wrote it:

```untrusted-server-text
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.
```

### `aanet_get_forecast`

- The name "aanet_get_forecast" says "get": a word for reading.
- Findings: info credentials-mention

Description, as the server wrote it:

```untrusted-server-text
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.
```

### `aanet_get_lock_status`

- The name "aanet_get_lock_status" says "get": a word for reading.
- Findings: info credentials-mention

Description, as the server wrote it:

```untrusted-server-text
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.
```

### `aanet_get_messages`

- The name "aanet_get_messages" says "get": a word for reading.
- Findings: info credentials-mention

Description, as the server wrote it:

```untrusted-server-text
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.
```

### `aanet_get_pricing`

- The name "aanet_get_pricing" says "get": a word for reading.

Description, as the server wrote it:

```untrusted-server-text
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.
```

### `aanet_get_refund_status`

- The name "aanet_get_refund_status" says "get": a word for reading.
- Findings: info credentials-mention

Description, as the server wrote it:

```untrusted-server-text
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.
```

### `aanet_get_remaining_balance`

- The name "aanet_get_remaining_balance" says "get": a word for reading.
- Findings: info credentials-mention

Description, as the server wrote it:

```untrusted-server-text
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.
```

### `aanet_get_webhook_deliveries`

- The name "aanet_get_webhook_deliveries" says "get": a word for reading.
- Findings: info credentials-mention

Description, as the server wrote it:

```untrusted-server-text
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).
```

### `aanet_get_workspace`

- The name "aanet_get_workspace" says "get": a word for reading.
- Findings: info credentials-mention

Description, as the server wrote it:

```untrusted-server-text
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.
```

### `aanet_list_subkeys`

- The name "aanet_list_subkeys" says "list": a word for reading.
- Findings: info credentials-mention

Description, as the server wrote it:

```untrusted-server-text
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.
```

### `aanet_list_webhooks`

- The name "aanet_list_webhooks" says "list": a word for reading.
- Findings: info credentials-mention

Description, as the server wrote it:

```untrusted-server-text
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.
```

### `aanet_read_file`

- The name "aanet_read_file" says "read": a word for reading.
- Findings: info credentials-mention

Description, as the server wrote it:

```untrusted-server-text
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.
```

## Claude Code permissions

For `.claude/settings.json`, assuming the server is installed as `aanet`:

```json
{
  "permissions": {
    "allow": [
      "mcp__aanet__aanet_get_remaining_balance",
      "mcp__aanet__aanet_get_workspace",
      "mcp__aanet__aanet_list_subkeys",
      "mcp__aanet__aanet_read_file",
      "mcp__aanet__aanet_get_lock_status",
      "mcp__aanet__aanet_get_activity",
      "mcp__aanet__aanet_get_activity_summary",
      "mcp__aanet__aanet_get_activity_head",
      "mcp__aanet__aanet_get_forecast",
      "mcp__aanet__aanet_get_refund_status",
      "mcp__aanet__aanet_get_messages",
      "mcp__aanet__aanet_list_webhooks",
      "mcp__aanet__aanet_get_pricing",
      "mcp__aanet__aanet_get_webhook_deliveries"
    ],
    "ask": [
      "mcp__aanet__aanet_create_workspace",
      "mcp__aanet__aanet_create_trial_workspace",
      "mcp__aanet__aanet_deposit",
      "mcp__aanet__aanet_mint_subkey",
      "mcp__aanet__aanet_update_subkey",
      "mcp__aanet__aanet_write_file",
      "mcp__aanet__aanet_append_file",
      "mcp__aanet__aanet_acquire_lock",
      "mcp__aanet__aanet_renew_lock",
      "mcp__aanet__aanet_release_lock",
      "mcp__aanet__aanet_export_activity",
      "mcp__aanet__aanet_submit_feedback",
      "mcp__aanet__aanet_request_refund",
      "mcp__aanet__aanet_send_message",
      "mcp__aanet__aanet_register_webhook",
      "mcp__aanet__aanet_estimate_savings"
    ],
    "deny": [
      "mcp__aanet__aanet_delete_workspace",
      "mcp__aanet__aanet_revoke_subkey",
      "mcp__aanet__aanet_delete_file",
      "mcp__aanet__aanet_delete_webhook"
    ]
  }
}
```
