Skip to main content
Glama

AKB — Agent Knowledge Base

Organizational memory for AI agents. Git-backed knowledge base served over the Model Context Protocol (MCP) — agents read and write directly with hybrid semantic + keyword search, structured tables, files, and a URI graph. Drop-in alternative to Confluence / Notion for Claude Code, Cursor, Windsurf, and any MCP-aware agent.

License: BSL 1.1 npm: akb-mcp MCP

Works with

Any agent client that speaks MCP (Streamable HTTP or stdio):

  • Claude Code — CLI / VS Code / JetBrains

  • Claude Desktop — macOS / Windows

  • Cursor, Windsurf, Cline, Continue — via the akb-mcp stdio proxy

  • Custom agents — direct HTTP POST /mcp/ with a Bearer token

The default flow uses a Personal Access Token. Deployments with the optional MCP OAuth Resource Server path turned on (via Keycloak as the AS — see docs/mcp-clients/web-connectors.md) also accept Claude Code's mcp add --transport http + mcp login flow end-to-end, without a PAT.

Related MCP server: Brainstem

MCP protocol compatibility

AKB keeps one tool and authorization core behind two protocol adapters:

Surface

Modern

Legacy

Direct HTTP /mcp/

2026-07-28 stateless server/discover and per-request _meta with Mcp-Protocol-Version / Mcp-Method (and Mcp-Name for named calls)

2024-11-05, 2025-03-26, 2025-06-18, 2025-11-25 initialize + Mcp-Session-Id lifecycle

akb-mcp stdio proxy

2026-07-28 discovery and per-request metadata

2025-06-18 initialize

The proxy answers either handshake locally and normalizes backend calls to the modern stateless contract when available. Legacy backend sessions are used only during a rolling upgrade when modern discovery is unavailable. A process cannot mix generations, and unsupported revisions or conflicting protocol evidence fail closed before a tool or local-file operation runs.

Plugins

Beyond raw MCP access, AKB ships ready-made agent plugins for Claude Code and Codex that wrap common vault workflows:

  • akb-wiki — ingest a source (local file, web URL, GitHub PR / release / commit, Confluence page, or Jira issue) into the vault as a structured document, and answer questions from the vault with grounded, cited synthesis (read-only).

  • akb-sessions — capture a coding session as structured notes: a session report plus follow-up tasks, learnings, ideas, and decisions.

  • akb-claude-code — a Claude Code lifecycle bridge: hooks anchor each session to your AKB memory vault, injecting preferences and recent learnings at the start and writing a recap at the end.

/plugin marketplace add dnotitia/akb        # Claude Code
codex plugin marketplace add dnotitia/akb   # Codex

Install details and credentials: plugins/.

Try it live

A public demo runs at akb-demo.agent.seahorse.dnotitia.ai. Browse and search a small fictional-organization knowledge base — product docs, a company handbook, agent session notes, and an engineering wiki, cross-linked by the URI graph — right in your browser, no signup. To wire it into your own agent, sign up with any email (a throwaway address is fine) and point the akb-mcp proxy at https://akb-demo.agent.seahorse.dnotitia.ai/mcp/.

⚠️ Throwaway demo. It is public, wiped and re-seeded weekly, and runs on minimal resources with no uptime, privacy, or data guarantees. Don't put anything real or sensitive in it — treat every write as public and ephemeral. For real use, self-host with Docker Compose or Kubernetes.

Why AKB

Most knowledge tools are built for humans clicking through a UI. Agents need a different shape: structured documents, semantic + keyword search in one call, explicit relations, and full version history. AKB gives agents a single set of tools (akb_put, akb_search, akb_browse, akb_relations, …) over a backing store of Git bare repos and a PostgreSQL hybrid index.

Retrieval quality

Memory is only useful if the right note comes back. AKB's hybrid retrieval (dense + BM25, source-level dedup) was benchmarked on LongMemEval-S — 500 long-context questions, ~50 chat sessions per question. Recall@5 = 98.4%, with no reranker in the loop.

System

R@5

n

Reranker

Source

AKB hybrid

98.4%

500

no

this repo

MemPalace hybrid + rerank

98.4%

450

yes

MemPalace

gbrain hybrid

97.6%

500

no

gbrain-evals

gbrain vector

97.4%

500

no

gbrain-evals

Methodology, per-category breakdown, and a one-command reproducible harness live in eval/longmemeval/. The embedding model differs across systems (AKB: bge-m3@1024), so read this as a stack-level comparison.

Design philosophy

Core stays small; flexibility comes from extension, not built-in automation. AKB does not ship its own consolidator, summariser, or "knowledge gardener" — instead every write records a structured event in the PostgreSQL outbox. When redis_url is configured, the publisher fans those events out to a Redis Stream (akb:events). Operators wire any external consumer (periodic synthesis bot, doc-rot reaper, weekly-digest agent, audit trail, …) on top, with no patches to the core. The base contract is a read/write store; opinions about what to do with the knowledge live outside.

Architecture

┌──────────────────────────────────────────────────────────┐
│                  Access Layer                            │
│   MCP Server  │  REST API  │  Web UI                     │
├──────────────────────────────────────────────────────────┤
│                  Core Services                           │
│   Document (Put/Get)  │  Search (Hybrid: dense+BM25)     │
│   Relations (graph)   │  Session  │  Publications        │
├──────────────────────────────────────────────────────────┤
│                  Storage Layer                           │
│   Git bare repos       │  PostgreSQL 16 (text + meta SoT)│
│                        │  Vector store (driver):         │
│                        │    pgvector        (default, PG)│
│                        │    qdrant          (optional)   │
│                        │    seahorse-cloud  (managed)    │
│                        │    seahorse-db     (self-hosted)│
│                        │    seahorse-db-grpc(experimental)│
└──────────────────────────────────────────────────────────┘

PostgreSQL is the source of truth — chunk text + metadata + BM25 vocab. The vector store is a driver-pluggable derived index holding dense embeddings and corpus-side sparse vectors. Full vector-store loss is recoverable from PG by setting chunks.vector_indexed_at = NULL and letting the indexing worker re-populate.

Key Concepts

  • Vault — A Git bare repo. The unit of access control and physical isolation.

  • Collection — A directory inside a vault. Topical grouping of documents.

  • Document — Markdown + YAML frontmatter, optimised for agent read/write.

  • Hybrid Search — Dense (semantic) + BM25 (lexical) fused via RRF in one call.

  • Relationsdepends_on, related_to, implements in frontmatter form an explicit knowledge graph.

  • Vault isolation in akb_sql — Enforced by PostgreSQL ACL. Each AKB user has a corresponding PG role (akb_user_<uid>) and each vault has three group roles (akb_vault_<vid>_{reader,writer,admin}). akb_sql runs the user's SQL inside a transaction with SET LOCAL ROLE; cross-vault references return PG 42501 directly. No application-side regex inspects user SQL for forbidden identifiers. See docs/designs/pg-native-rbac/.

MCP Tools (selection)

Tool

Description

akb_list_vaults / akb_create_vault

Vault management

akb_put / akb_get / akb_update / akb_delete

Document CRUD (Git commit + indexing)

akb_put_file / akb_get_file / akb_update_file / akb_delete_file

File attachments — proxy-side (requires local filesystem)

akb_put_image / akb_discard_image

Validated inline Markdown images — proxy-side in akb-mcp 2.2+

akb_create_table / akb_alter_table / akb_drop_table / akb_sql

Tabular content — per-doc tables + SQL

akb_browse

Tree traversal (collection → docs)

akb_search / akb_grep

Hybrid search (dense + BM25) / literal grep

akb_drill_down

Section-level retrieval

akb_relations / akb_link / akb_unlink / akb_graph

Knowledge graph

akb_edit / akb_diff / akb_history

In-place edit, diff, Git history

akb_grant / akb_revoke / akb_set_public

Permission boundaries — per-user, per-org, public

akb_publish / akb_unpublish

Public publication

Agent memory and session lifecycle are not MCP tools — they live on the dedicated /api/v1/agent-sessions REST surface, driven by AKB lifecycle plugins (akb-claude-code, akb-cursor, …) that hook into the agent's own SessionStart / PreCompact / SessionEnd events. As an agent, your own memory vault (agent-memory-{username}) is browsable through the standard akb_search / akb_browse / akb_get tools exactly like any other vault.

The full tool catalogue is exposed via akb_help() from any MCP client.

Inline document images from MCP

Inline images are hidden document attachments, not browsable Files. Upload a local PNG, JPEG, GIF, or WebP (maximum 10 MiB), then insert the returned Markdown without reconstructing its asset URL:

image = akb_put_image(
  parent="akb://eng/coll/specs",
  file_path="/workspace/architecture.png",
  alt_text="Request processing architecture")

akb_put(
  parent="akb://eng/coll/specs",
  title="Request Processing",
  content="# Architecture\n\n" + image.markdown)

For an existing document, use akb_get followed by a targeted akb_edit(base_commit=...). Do not pass only the image fragment to akb_update(content=...), which replaces the complete body. Image bytes are immutable: replacing an image means uploading a new one and editing the Markdown reference. Remove an image by deleting its Markdown expression; use akb_discard_image only for an upload that never reached a successful document commit. Run akb_help(topic="images") for retention and publication behavior.

The image tools require both the matching backend release and akb-mcp 2.2 or newer. For upgrades, deploy the backend first, then publish/install the proxy and restart existing MCP processes so they load the updated tool list.

Document Format

Every vault resource has a location-aware AKB URI — the canonical handle used by every tool and stored in relations. As of 0.3.0:

akb://{vault}                                          vault root (browse target)
akb://{vault}/coll/{coll_path}                         collection (browse target)
akb://{vault}[/coll/{coll_path}]/doc/{filename}        document
akb://{vault}[/coll/{coll_path}]/table/{name}          table
akb://{vault}[/coll/{coll_path}]/file/{uuid}           file

The /coll/{coll_path} segment is omitted for resources at the vault root. Walking up a URI to its parent collection is a pure string operation — paste the parent into akb_browse(uri=...) to list siblings without an extra lookup.

---
title: "Payment API v2 migration plan"
type: plan              # note | report | decision | spec | plan | session | task | reference
status: active          # draft | active | archived | superseded
tags: [payments, api]
domain: engineering
summary: "REST → gRPC transition plan."
depends_on: ["akb://eng/coll/specs/doc/payment-api-v2.md"]
related_to: ["akb://eng/coll/meetings/doc/2026-05-01-payments.md"]
---

# Payment API v2 migration plan
...

Open Knowledge Format (OKF) compatible

A vault is stored as a git tree of .md + YAML-frontmatter files whose identity is the path — the same model as Google Cloud's Open Knowledge Format (OKF v0.1), which AKB independently arrived at before the spec existed. AKB-authored bundles satisfy all three OKF MUST rules, and AKB can export any vault as a conformant OKF bundle (documents, plus tables/files as concept docs) and validate any bundle:

python -m app.cli okf-export --from-git /data/vaults/_worktrees/<vault> \
    --vault <vault> --out ./okf-out/
python -m app.cli okf-validate ./okf-out/

OKF and AKB are complementary — OKF standardizes how knowledge is written down; AKB stores, versions, searches, governs, and serves it to agents. See okf/ for the mapping and a sample bundle.

Quick Start

The default Docker Compose stack runs four long-lived services: PostgreSQL with pgvector, MinIO, the backend, and the frontend. A one-shot minio-bootstrap service creates the local file bucket before the backend starts. For semantic (dense) search you bring an OpenAI-compatible embedding endpoint (OpenAI, OpenRouter, self-hosted vLLM/TEI, etc.). It is not strictly required: with no embed endpoint (or during an outage) the pgvector and Qdrant drivers degrade to BM25-only lexical search rather than returning nothing — dense is genuinely optional end-to-end (the seahorse-db driver is the exception; see Vector store below). Prefer running a separate Qdrant cluster, or pointing at Seahorse? See Vector store below.

# 1. Configure
cp config/app.yaml.example   config/app.yaml
cp config/secret.yaml.example config/secret.yaml
$EDITOR config/secret.yaml   # set embed_api_key and replace system_hmac_secret

# Generate the installation's persistent RSA-3072 local-session keyset.
# This directory is gitignored; back it up with the other installation secrets.
cd backend
uv run python -m app.cli generate-local-session-keyset \
  --output-dir ../config/local-session
cd ..

# 2. Run
docker compose up -d

# 3. Provision the designated recovery administrator (local mode)
#    The password is read from stdin and is never printed by AKB.
docker compose exec -T backend python -m app.cli provision-recovery-admin local \
  --username recovery-admin --email recovery-admin@example.com \
  --password-file - < /secure/operator/recovery-admin.password

# 4. Open
open http://localhost:3000

config/app.yaml and config/secret.yaml are the single source of application configuration. Mount the config/ directory at /etc/akb/ in any deployment. Process composition is the narrow exception: AKB_PROCESS_ROLE=all|api|worker selects the entrypoint role and AKB_TOKENIZER_PROCESSES=1..4 can lower the per-process tokenizer pool for a deployment container. The Kubernetes base owns those two operational values; business, auth, storage, and provider settings remain in the YAML files.

Ordinary registration always creates a non-admin account, including on an empty database. Administrator bootstrap is available only through the operator CLI; there is no unauthenticated HTTP bootstrap endpoint. The CLI profile must match auth_mode:

# Local: have AKB generate the password only when an operator-owned output
# file is explicitly requested. A new file is created with mode 0600 and the
# password is not written to stdout, stderr, logs, or application config.
python -m app.cli provision-recovery-admin local \
  --username recovery-admin --email recovery-admin@example.com \
  --generate-password-file /secure/operator/recovery-admin.password

# SSO: pre-bind the product administrator to the exact external identity.
# Username and email are snapshots; issuer + subject are the identity key.
python -m app.cli provision-recovery-admin sso \
  --username recovery-admin --email recovery-admin@example.com \
  --issuer https://issuer.example.com/realms/akb \
  --subject exact-provider-subject

The same exact identity is idempotent. A different designation, an existing username/email, or an already-bound external identity fails closed. The SSO command stores no usable local password and does not contact the identity provider. Generated output files are create-only and never overwritten; for a retry after the file exists, pass that file back with --password-file.

The two local forms differ in one further way. --generate-password-file is AKB producing a credential and handing it over, so the account it creates owes a replacement for it: the first session that credential opens can reach the password change and nothing else, exactly as a password reset behaves. --password-file installs a value the caller already holds — AKB delivers it to nobody — so it arms nothing, and an installation that signs in as this account to bootstrap its own service identity keeps working. To force a replacement for a credential supplied that way, rotate it afterwards with the command below; rotation always leaves the account owing a change.

If that credential later leaks, is lost, or has to be taken back, rotate it rather than reprovisioning the account:

# Break-glass: replace the credential and print the new one once. Nothing
# stores or logs the value, and the machine-readable report omits it.
python -m app.cli issue-recovery-admin-credential \
  --expected-username recovery-admin \
  --expected-email recovery-admin@example.com

Rotation names the account it expects and refuses any mismatch, so it cannot act on the wrong one. The credential it replaces stops working immediately, including one currently in use, and sessions held before the rotation are revoked — both are what a compromise response requires. The same operation is available at POST /admin/recovery-admin/issue-credential, which requires an independent service-administrator token rather than a human session. Rotation is not available in sso mode: the identity provider holds the credential, and nothing in a running AKB can replace it.

Open /admin for the separate product-administration surface. In local mode it accepts the provisioned local administrator and returns the same local-session-rs256-v2 profile used by local human authentication, but it refuses non-admin accounts. In sso mode local credentials are absent: /admin uses a dedicated confidential akb-admin Keycloak client with PKCE and nonce, then accepts only the exact pre-bound (issuer, subject) whose AKB account is still active and is_admin=true.

In SSO mode the same /admin surface can configure a built-in upstream IdP, save it disabled, inspect its exact broker redirect URI, and enable or disable its ordinary-login option without redeploying AKB. The option becomes a usable button only when the server-side browser-session capability is ready. Client secrets are write-only, and an enabled provider must be disabled before reconfiguration. See the SSO provider guide, the standards-based generic OIDC integration, and the stricter Keycloak OIDC reference. Existing Kubernetes installations should also follow the local-to-SSO cutover runbook instead of treating auth_mode as a rolling one-line configuration change.

The dedicated admin callback stores no Keycloak access, refresh, or ID token. It creates a short-lived opaque HttpOnly admin cookie plus a CSRF token; PostgreSQL stores only their hashes plus the exact identity snapshot, and rechecks the account, unchanged external binding, and admin flag on every request. Its one-time OIDC state is also bound to a short-lived HttpOnly cookie so a callback copied into another browser fails before token exchange. Configure keycloak_admin_client_secret, register <public_base_url>/api/v1/admin/auth/keycloak/callback and <public_base_url>/admin in the dedicated client, and keep the admin client ID out of every API/MCP resource-client path. Browser-facing AKB and Keycloak URLs must use HTTPS outside the explicit loopback development exception.

Ordinary SSO login uses the separate akb-web client. The browser receives only an opaque HttpOnly AKB session plus a readable CSRF value; SSO does not mint an AKB user JWT. AKB encrypts the Keycloak refresh/ID token set with the independent sso_browser_session_encryption_key and never persists an access token. The client must map Keycloak's identity_provider user-session note into both ID and access tokens with oidc-usersessionmodel-note-mapper; AKB binds that signed broker alias to the selected enabled provider on callback and every refresh. Production HTTPS cookies use the browser-enforced __Host- prefix, Secure, no Domain, and Path=/; loopback HTTP uses isolated development names. Generate the key as 32 random bytes encoded with unpadded base64url and keep it stable across restarts. See the Keycloak boundary for refresh, logout, and back-channel revocation details.

Local login issues only the versioned local-session-rs256-v2 profile: RS256 with an installation-owned RSA-3072 key, an RFC 7638 kid, exact deployment issuer/audience, jti, and a public-only JWKS at GET /api/v1/auth/jwks. AKB never chooses a verifier from an untrusted token alg header. Upgrading from an HS256 release is an intentional forced-login boundary: generate and persist the v2 keyset before rollout, set jwt_algorithm: RS256, and restart all backends together. Existing HS256 user sessions then receive 401 and must sign in again; PATs and service keys are not revoked. The old jwt_secret may be retained for one release only as migration input for short-lived internal HMAC capabilities, or renamed unchanged to system_hmac_secret; it is never accepted as human-session signing material.

For routine v2 key rotation, generate a new directory while retaining the current public JWKS, publish the new immutable Secret/config revision, and roll every backend to that exact pair:

cd backend
uv run python -m app.cli generate-local-session-keyset \
  --output-dir /secure/akb/local-session-next \
  --retain-jwks /secure/akb/local-session-current/jwks.json

Keep a retained public key for at least jwt_expire_hours plus rollout skew, then remove it in a later coordinated keyset revision. Restoring the previous private/JWKS pair is the rollback; never overwrite key files in place.

Vector store (driver-pluggable)

Hybrid search (dense + BM25 sparse, RRF-fused) runs through a driver interface. Five drivers ship; pick at config time:

  • pgvector (default) — uses the same Postgres container that holds application data. The pgvector/pgvector image pre-installs the extension; the driver creates a separate vector_index schema, so the main chunks table stays plain PostgreSQL. RRF fusion runs application-side. No external service to operate.

  • qdrant — runs a separate Qdrant container; native RRF via the Query API. Useful when you already operate Qdrant or want to scale the vector store independently of Postgres.

  • seahorse-cloud — points at a managed Seahorse Cloud table over its BFF management API + per-table data-plane host (Bearer auth). No infrastructure to run on your side; you provision a table in the Seahorse console (or let the driver auto-create one) and AKB stores its chunks there. Native RRF, server-side BM25. See docs/vector-store-seahorse.md for the end-to-end setup walkthrough (sign-up → token → schema → config).

  • seahorse-db — points at a self-hosted SeahorseDB cluster via its Coral coordinator HTTP API. You run Coral + Writer + Reader(s) + Redis + Kafka + a sparse-embedding server yourself (the SeahorseDB monorepo's deploy/docker-compose.yml brings up a minimal single-box stack). Native dense+sparse hybrid. Unlike the other drivers it does not support BM25-only fallback when the embed API is down (its sparse path is server-side and structurally coupled to a live embed step) — keep an embedding endpoint reachable for this driver.

  • seahorse-db-grpc (experimental) — same Coral coordinator as seahorse-db, same seahorsedb_* settings, but talks gRPC instead of REST/JSONL. Coral merges axum + tonic onto a single listener so the port doesn't change; only the wire format does. Trades the JSON parsing path (and a class of foot-guns like INT64 sign mismatch and Arrow JSON decoder edge cases) for typed protobuf messages and an Arrow IPC streaming result. Prefer the REST driver for production until the gRPC variant clears its own QPS / recall benchmark. Same CRUD parity with REST (passes the same 25-scenario hybrid e2e), but it has not yet had the production-scale exposure the REST driver has.

Switching drivers is a config edit (no schema migration on the main DB):

# Default flow targets pgvector.
docker compose up

# Qdrant:
docker compose -f docker-compose.yaml -f docker-compose.qdrant.yaml up
$EDITOR config/app.yaml     # vector_store_driver: qdrant
                            # vector_url: http://qdrant:6333

# Seahorse Cloud (managed; full guide in docs/vector-store-seahorse.md):
docker compose up           # no extra container needed
$EDITOR config/app.yaml     # vector_store_driver: seahorse-cloud
                            # seahorse_cloud_tenant_uuid: <your tenant>
                            # seahorse_cloud_table_name: <your table>
$EDITOR config/secret.yaml  # seahorse_cloud_token: shsk_<...>

# SeahorseDB (self-hosted cluster reached via the Coral coordinator):
docker compose up           # run the SeahorseDB stack separately
$EDITOR config/app.yaml     # vector_store_driver: seahorse-db
                            # seahorsedb_coordinator_url: http://localhost:3003
                            # seahorsedb_table_name: akb_chunks

Embedding model + dimensions are also fully pluggable via embed_base_url / embed_model / embed_dimensions — the codebase has no hard-coded model. For pgvector with HNSW, keep embed_dimensions ≤ 2000 (or 4000 with halfvec); larger models fall back to exact scan. Qdrant / Seahorse (cloud or db) have no such limit (Qdrant up to 65536, Seahorse up to its table-defined dim).

LLM features (optional)

LLM is only used by the metadata_worker to auto-tag documents imported via external git mirroring. Core CRUD/search works without it. To enable, set llm_base_url / llm_model in app.yaml and llm_api_key in secret.yaml.

Standalone deployments default to model_api_governance_mode: external_metering and may point embedding, chat, and rerank at any compatible provider. A managed control plane can instead set platform_hard plus an exact platform_gateway_base_url. In that mode AKB fails startup if an active model route points anywhere else or lacks a credential, and every model call carries a caller-generated Idempotency-Key for durable gateway reservation/settlement. Gateway policy or budget denials are never fanned out into per-item retries.

Event fanout (optional)

The PG events outbox is always written. Set redis_url in app.yaml to have the events_publisher worker drain the outbox to a Redis Stream (akb:events) so external services can subscribe via XREAD / consumer groups. Leave blank to disable; events still accumulate in PG and you can build an SSE endpoint on top of the LISTEN/NOTIFY trigger without Redis.

Audit log (optional)

Off by default. Set audit.enabled: true in app.yaml to emit a structured, append-only, hash-chained JSON-lines audit log at the MCP dispatch chokepoint — every read, write, and auth denial, uniformly. AKB is a producer only: it does not store, query, or retain audit data; your SIEM (Splunk/QRadar/Elastic) scrapes the stream and owns retention under its own compliance regime. Each line carries a monotonic seq plus sha256(prev ‖ line), so the chain can be verified for dropped or altered lines and re-seeds from disk across restarts. Optionally hand the daily rolled file off to a WORM object-storage bucket (audit.bucket — provision with Object Lock and a write-only key for a true immutable trail); the local buffer is pruned only after a confirmed upload. Capture is best-effort and never raises into the serving path. See config/app.yaml.example for the full audit: block.

Production deployment

For Kubernetes, start with the deployment guide. AKB provides standalone local and standalone-SSO resource sets through both Helm and Kustomize.

  • Use the dependency-free AKB Helm chart for a standard helm upgrade --install workflow.

  • Use deploy/k8s for the standalone Kustomization or deploy/k8s/standalone-sso for an installation-owned Keycloak stack.

  • Both paths consume pre-existing, operator-owned Kubernetes Secrets. AKB does not install or operate a credential service or synchronization controller.

Real hostnames, registries, storage classes, TLS issuers, and provider settings belong in Helm values or an operator-owned Kustomize overlay; do not commit production credentials to this repository.

Project Structure

akb/
├── backend/                  # Python 3.14 / FastAPI / asyncpg / GitPython
│   ├── app/
│   │   ├── api/routes/       # REST endpoints
│   │   ├── services/         # Business logic + workers
│   │   └── db/               # PostgreSQL schema + migrations
│   ├── mcp_server/           # Streamable HTTP MCP server
│   └── tests/                # E2E shell tests
├── frontend/                 # React 19 + TypeScript + Vite + Tailwind
├── packages/
│   ├── akb-client/           # REST SDK boundary (npm: @akb/client)
│   └── akb-mcp-client/       # stdio ↔ HTTP MCP proxy (npm: akb-mcp)
├── agents/                   # Reference Python agent runtime (think/act loop over MCP)
├── plugins/                  # Claude Code / Codex agent plugins (ingest, query, session capture, lifecycle)
├── templates/                # Doc templates (ADR, PRD, runbook, …) and vault profiles
├── okf/                      # Open Knowledge Format interop: positioning + sample bundle
├── design-system/            # Frontend design system docs
├── config/
│   ├── app.yaml.example      # Non-secret runtime settings
│   └── secret.yaml.example   # API keys, passwords (gitignored when not .example)
├── deploy/
│   ├── all-in-one/           # Single-container demo image
│   ├── helm/
│   │   └── akb/              # AKB chart with local and standalone-SSO profiles
│   └── k8s/
│       ├── *.yaml            # Standalone AKB + PostgreSQL resources
│       └── standalone-sso/   # Standalone plus owned Keycloak and its database
└── docker-compose.yaml       # Local stack (PG + MinIO + backend + frontend)

Tech Stack

  • Backend: Python 3.14, FastAPI, Uvicorn, asyncpg, GitPython, MCP SDK

  • Database: PostgreSQL 16 (main DB needs no extension; the same pgvector/pgvector image hosts the optional vector_index schema)

  • Vector store: driver-pluggable (pgvector default; Qdrant, Seahorse Cloud, or self-hosted SeahorseDB optional — hybrid dense + BM25 sparse, RRF fusion; BM25-only fallback when embed is down)

  • Event stream (optional): PG events outbox + Redis Streams fanout

  • Audit log (optional): hash-chained append-only JSONL at the MCP dispatch point + optional WORM S3 handoff; producer-only (SIEM owns retention)

  • Frontend: React 19, TypeScript, Vite, Tailwind CSS v4, Radix UI

  • Auth: local RS256 sessions or Keycloak SSO, plus Personal Access Tokens (PATs) for API and MCP access

  • MCP: Streamable HTTP (backend) + stdio proxy (akb-mcp on npm)

Versioning

AKB follows SemVer. The backend product version lives in backend/pyproject.toml ([project].version). A coordinated release uses scripts/bump-version.sh <x.y.z> to update it together with frontend/package.json. With image building enabled, each deploy/k8s/deploy.sh run tags the Docker images with both the explicit backend version (:${VERSION}) and :latest, so historical builds remain pullable for rollback.

packages/akb-mcp-client (the akb-mcp npm proxy) follows its own npm semver lifecycle and is not tied to the product version.

License

The AKB backend, frontend, and deployment manifests are licensed under the Business Source License 1.1 — source-available, with an Additional Use Grant that permits production use (commercial or non-commercial) up to a seat-count threshold, automatically converting to Apache License 2.0 four years after each version's first public release.

The npm akb-mcp proxy (packages/akb-mcp-client/) is separately licensed under the MIT License so it can be freely embedded in any agent client without restriction.

Free production use of the backend — you may deploy AKB in production, commercial or not, provided your aggregate deployment serves fewer than 100 Named Seats (distinct human user accounts in the users table, per deployment; service accounts and 90-day-inactive accounts excluded — see LICENSE for the precise definition).

Commercial license required for any of:

  • Production use of the backend at or above 100 Named Seats.

  • Offering AKB (modified or not) as a hosted service, on-premises product, embedded component, or rebranded distribution to third parties — regardless of seat count.

Trademarks — "AKB", "Dnotitia", and "Seahorse" are trademarks of Dnotitia, Inc. The software license does not grant trademark rights. Forks and derivative works must be distributed under a different name. See TRADEMARKS.md.

For commercial licensing, the rationale behind the BSL transition, or trademark permission requests, see LICENSE-CHANGE.md or contact support@dnotitia.com.

Security

Found a vulnerability? See SECURITY.md — please report privately, not via public issues.

Contributing

See CONTRIBUTING.md.

Available Tools

50 tools
akb_activityA

Get activity history for a vault — who changed what, when, and why. Returns Git commit history with changed file list. Use akb_diff to see the actual content changes for a specific commit.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
sinceNoISO datetime to filter from (e.g. 2026-04-01)
vaultYesVault name
authorNoFilter by author name
collectionNoFilter by collection path prefix

TDQS

A3.8/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided; description does not disclose whether the operation is read-only or any other behavioral traits beyond the return type. More detail needed.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences with core purpose upfront, no wasted words. Efficient and clear.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers main purpose, return value, and alternative tool, but could mention relationship to akb_history and clarify optional parameter usage.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema has descriptions for all parameters (80% coverage, actually all 5 are described). The description does not add new meaning beyond the schema, so baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states it gets activity history for a vault, specifies what it returns (Git commit history with changed file list), and distinguishes from sibling akb_diff.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly suggests using akb_diff for content changes, providing alternative guidance. However, lacks explicit when-not-to-use context for other siblings.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

akb_alter_tableC

Modify a table's schema — add, remove, or rename columns via ALTER TABLE DDL. Requires admin role.

ParametersJSON Schema
NameRequiredDescriptionDefault
uriYesTable URI — akb://{vault}[/coll/{coll_path}]/table/{name}
add_columnsNoColumns to add
add_indexesNoLookup indexes to add: [{name?, columns}]. A column is a bare string or {name, order} (order 'asc'|'desc').
drop_columnsNoColumn names to remove
drop_indexesNoIndex names to drop (as shown in indexes metadata).
alter_columnsNoRich column ops: [{name, set_default?, drop_default?, set_check?, drop_check?, set_not_null?, drop_not_null?, set_enum?/enum?, rename_enum_values?}]
rename_columnsNoRename columns: {old_name: new_name}
add_unique_keysNoUNIQUE keys to add: [{name?, columns}]. Adding a key on a table with existing data preflights for duplicate rows and fails before any DDL if any are found.
_vault_skill_ackNoOpaque acknowledgement returned as vault_skill.ack_token. After applying that guide, retry the unchanged operation with this value. The bundled proxy supplies it automatically.
drop_unique_keysNoUNIQUE-key names to drop (as shown in unique_keys metadata).

TDQS

C2.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full behavioral burden. It discloses that admin role is required and that it executes ALTER TABLE DDL, but it does not mention side effects, transactional behavior, reversibility, locking, or what happens if part of a multi-operation call fails. For a mutating DDL tool this is a significant transparency gap.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is brief and front-loaded: it states the action, the target, and the key operations in a single sentence, then adds the access requirement. There is no filler or repetition of schema details.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

This is a complex tool with 10 parameters, nested objects, no output schema, and no annotations. The minimal description does not explain the variety of schema modifications available (indexes, unique keys, column alterations), when to use them, or what the operation returns. The schema covers parameter details, but the overall tool context is incomplete for an agent to invoke it confidently.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents all parameters, including add_columns, drop_columns, alter_columns, indexes, and unique keys. The description itself adds little beyond the general ALTER TABLE framing, but because the schema fully covers parameter semantics, the baseline of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('Modify') and resource ('a table's schema'), and names the core operations: add, remove, or rename columns. It clearly conveys that this is an ALTER TABLE operation, distinguishing it from table creation/drop tools like akb_create_table and akb_drop_table, though it does not explicitly name those siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives no guidance on when to use this tool versus alternatives. It states that admin role is required, but there is no mention of when to prefer this over akb_sql or create/drop table, nor any exclusions or fallback conditions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

akb_archive_vaultA

Archive a vault (makes it read-only). Only the owner can do this.

ParametersJSON Schema
NameRequiredDescriptionDefault
vaultYesVault name
_vault_skill_ackNoOpaque acknowledgement returned as vault_skill.ack_token. After applying that guide, retry the unchanged operation with this value. The bundled proxy supplies it automatically.

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the behavioral disclosure burden and it does so well by stating both the postcondition (vault becomes read-only) and the authorization requirement (owner-only). It does not mention whether archiving is reversible or what the return value looks like, but the core behavioral traits are clearly disclosed.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two short, focused sentences with no filler or repetition of schema content. The action and effect are front-loaded, and the owner restriction is the only additional fact included, which makes it highly efficient.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with one meaningful required parameter and no output schema, the description provides the essential selection and invocation details: what the tool does, what state change it causes, and who may call it. The main omissions are reversibility and explicit relationships to sibling tools, but those are not critical for a straightforward mutation call with a single required parameter.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3 even though the description adds no parameter-level detail. The vault parameter's meaning is adequately covered by the schema, and while the _vault_skill_ack parameter is documented there too, the tool description does not clarify the 'vault_skill' workflow any further.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific action ('Archive'), a clear target ('a vault'), and the key consequence ('makes it read-only'), which distinguishes it from destructive siblings like akb_delete_vault even without naming them. The owner-only restriction adds a precise scope to the operation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The effect 'makes it read-only' implies when this tool should be used, and 'Only the owner can do this' establishes a clear precondition. However, it does not explicitly name alternatives or state when not to use it versus related tools such as transfer_ownership or delete_vault, so the guidance remains somewhat implicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

akb_browseA

Browse ALL vault content — documents, tables, and files — under a browse root. The browse root can be addressed two ways: pass a canonical uri (akb://V for vault root or akb://V/coll/X for a collection), or the legacy vault + optional collection pair. Use the URI form when drilling down from a previous response — every item carries a uri that can be pasted straight back in.

depth is tree-depth from the browse root, mirroring tree -L N: 0 = direct children only (no descent), N = descend N collection levels, -1 = entire subtree. Collection rows are always emitted as navigation aids regardless of depth.

The response includes metadata for the current browse root in context, and collection items include summary by default so agents understand their intended purpose. Other resource summaries stay opt-in so large vaults fit in the agent's context window. Returns {vault, path, context, items, total, returned, truncated?, hint?}.

ParametersJSON Schema
NameRequiredDescriptionDefault
uriNoCanonical browse target: `akb://{vault}` (vault root) or `akb://{vault}/coll/{path}` (collection-scoped). Takes precedence over `vault` + `collection` when both are given.
depthNoTree depth from the browse root. 0 = direct children only (no descent into any collection). N = descend N collection levels. -1 = unbounded (entire subtree). Collections themselves are always emitted regardless of depth.
limitNoCap returned item count.
vaultNoVault name. Required unless `uri` is given.
filterNoSubstring filter on item name/path (case-insensitive).
offsetNoSkip first N items (default 0).
collectionNoCollection path to use as the browse root (omit for vault root). Ignored when `uri` is given.
content_typeNoFilter by content typeall
include_hashesNoInclude AKB-certified content_hash/hash_algorithm and resource version fields for documents/files.
include_summaryNoInclude document, table, and file summaries. Collection summaries and browse-root context are always included.
include_archivedNoInclude archived documents. Default false — `status: archived` docs are hidden from browse.

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the behavioral burden and does so well: it discloses depth semantics, that collection rows are always emitted, default summary behavior, and the exact response shape including `truncated?` and `hint?`. It does not explicitly confirm that browsing is read-only or discuss permission requirements, but for a browse operation the disclosed behavior is substantial.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is longer than a minimal definition but every sentence earns its place: purpose, addressing modes, depth semantics, summary behavior, and response shape. It is front-loaded with the primary purpose and then structured logically, though it could be tightened slightly by naming sibling exclusions.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For an 11-parameter tool with no output schema, the description is remarkably complete: it covers both addressing modes, depth behavior, summary defaults, and the return object. The remaining omissions, such as explicit pagination semantics or permissions, are minor because the schema already documents offset, limit, filter, and content_type.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema already covers 100% of parameters, so the baseline is 3; the description adds value beyond the schema with the `tree -L N` analogy for depth, the URI-precedence rationale for drilling down, and the context-window rationale for `include_summary`. Not every parameter is enriched, but the key ones gain meaningful context.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb-resource pair: 'Browse ALL vault content — documents, tables, and files — under a browse root.' It clearly indicates the broad traversal scope, which differentiates it from item-level operations like akb_get. However, it never explicitly names or contrasts sibling tools such as akb_drill_down or akb_search, so it falls just short of full sibling differentiation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives concrete in-tool guidance: use the URI form when drilling down from a previous response, and use depth semantics to control how far to descend. It also explains why summaries are opt-in for large vaults, helping the agent decide parameters. It does not explicitly tell the agent when to choose akb_browse over alternatives like akb_drill_down or akb_search, so no exclusions or alternatives are stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

akb_create_collectionA

Create an empty collection (folder) inside a vault. Idempotent — returns {created: false} if the collection already exists. Writer or higher role.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYesCollection path, e.g. 'api-specs' or 'docs/guides'
vaultYesVault name
summaryNoOptional one-line description
_vault_skill_ackNoOpaque acknowledgement returned as vault_skill.ack_token. After applying that guide, retry the unchanged operation with this value. The bundled proxy supplies it automatically.

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the behavioral disclosure burden and covers idempotency, the duplicate-collection outcome ({created: false}), the fact that the collection is empty, and the required role. It does not detail error cases or the success response explicitly, but the core behavior is transparent enough for safe invocation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Every sentence earns its place: the first defines purpose, the second states behavioral guarantees, and the third gives the authorization requirement. The phrasing is direct, front-loaded, and free of filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the simple operation, complete parameter schema, and absence of an output schema, the description covers purpose, idempotency, duplicate behavior, and permissions. The only minor gap is that the successful-creation return value is implied rather than explicitly stated, but it is easily inferred from the idempotency sentence.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the schema already documents all parameters. The description adds no new parameter-level meaning beyond what is in the schema; it neither clarifies summary usage nor the _vault_skill_ack contract beyond the schema text. Baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The opening sentence states the action (Create), the object (empty collection/folder), and the location (inside a vault), which clearly differentiates it from sibling tools like akb_create_vault and akb_create_table. The word 'empty' also sets precise expectations about what this operation does not do.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies the usage context—creating a folder in a vault—and adds a clear prerequisite ('Writer or higher role'), but it never names alternatives or says when not to use this tool. An agent must infer the boundary against akb_create_vault and akb_put.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

akb_create_tableA

Create a structured data table in a vault. The response carries the canonical uriakb://{vault}/coll/{collection}/table/{name} when stored under a collection, or akb://{vault}/table/{name} at the vault root. Tables live alongside documents inside collections and follow the same permissions. Define columns with name and type (text, number, boolean, date, json). Optional collection (e.g. 'sessions/learnings') groups the table under that collection so it appears beside the documents and files there in akb_browse; omit for vault root.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesTable name (unique within the vault)
vaultNoTarget vault name. Required unless `parent` is given.
parentNoParent location as a canonical URI — `akb://{vault}` for the vault root, `akb://{vault}/coll/{path}` for a collection. When given, the table is created there and `vault`/`collection` are derived from the URI.
columnsYesColumn definitions
indexesNoDeclarative lookup (btree) indexes. Each item is {name?, columns}. A column is a bare string or {name, order} where order is 'asc' (default) or 'desc'. Unique indexes are expressed via `unique_keys`, not here.
collectionNoCollection path (e.g. 'specs' or 'sessions/learnings'). Omit for vault root. Ignored when `parent` is given.
descriptionNo
unique_keysNoDeclarative UNIQUE keys. Each item is {name?, columns}. `columns` is a list of existing column names (single or composite). `name` is optional — when omitted AKB generates a deterministic, stable name. Use this (not `indexes`) for unique indexes.
if_not_existsNoWhen true, an existing table is NOT an error: returns created=false instead of a 409 conflict. Nothing is altered either way. If you also hold READ access to the vault the response carries the STORED schema plus matches_request and mismatches[], so divergence from your spec is explicit; a write-only credential gets only {kind, name, created, outcome}. Must be a real boolean — the string "true" is rejected. Default false keeps the 409.
_vault_skill_ackNoOpaque acknowledgement returned as vault_skill.ack_token. After applying that guide, retry the unchanged operation with this value. The bundled proxy supplies it automatically.

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden. It usefully discloses the response URI shape, permission inheritance from collections, and browse visibility. But it does not mention duplicate-name conflict behavior, write permissions required, or other side effects beyond creation, leaving notable gaps.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Every sentence earns its place: purpose, URI shape, placement semantics, column shape, and collection guidance. It is dense but not bloated, and the most essential information is front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 10-parameter creation tool with no annotations and no output schema, the description covers the core action, return URI, permissions, and placement. The detailed schema fills most remaining gaps, but the description could have explicitly guided vault/parent selection and noted conflict behavior to be fully self-sufficient.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 90%, so the baseline is 3. The description adds meaning for `collection` by tying it to the URI path and browse visibility, and it reinforces column structure. It does not substantially clarify `parent`, `indexes`, or `unique_keys` beyond what the schema already says.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Create a structured data table in a vault.' It clearly differentiates this from sibling tools like akb_create_vault, akb_create_collection, and akb_put by naming the artifact type and giving the canonical URI structure.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives clear placement guidance: use `collection` to group the table under a collection, omit it for vault root, and expects tables to live alongside documents. It does not explicitly contrast with akb_alter_table or akb_drop_table, nor state prerequisites like vault existence, so it stops short of a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

akb_create_vaultA

Create a new knowledge base vault (a separate, access-controlled repository for documents). Pass external_git to instead create a read-only mirror of an upstream git repo — the vault tracks the remote on a polling schedule and rejects user writes.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesVault name (lowercase, hyphens allowed)
templateNoVault template to apply (pre-creates collections with guides). Ignored when external_git is set.
descriptionNoWhat this vault is for
external_gitNoOptional: turn the new vault into a read-only mirror of an upstream git repo.
public_accessNoPublic access: none=private, reader=public read, writer=public read+writenone
_vault_skill_ackNoOpaque acknowledgement returned as vault_skill.ack_token. After applying that guide, retry the unchanged operation with this value. The bundled proxy supplies it automatically.

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the behavioral disclosure burden. It is transparent about the access-controlled nature of vaults, and clearly states that external_git mode tracks the remote on a polling schedule and rejects user writes. It could also note permission requirements or default visibility, but the most important behavioral traits are disclosed.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two concise sentences, front-loaded with the main purpose and followed by the key mode distinction. There is no redundant wording or repetition of schema details.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers the core purpose and the externally significant mode. The schema already documents all parameters, including the nested external_git object and the unusual _vault_skill_ack field. A small gap is that it does not mention what the tool returns or any permission prerequisites, but for a creation tool with a rich schema this is adequate.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3. The description adds real semantic value by explaining that external_git changes the entire creation mode to a read-only mirror, with polling and write-rejection behavior, which is not fully obvious from the schema alone.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Create a new knowledge base vault,' and clarifies what a vault is. It also distinguishes the external_git mode from a normal vault, making it easy to separate this from sibling tools like akb_create_collection or akb_delete_vault.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives concrete guidance on when to use the external_git variant: pass it to create a read-only mirror, otherwise create a standard vault. It does not explicitly name alternatives or state when not to use this tool, but the primary use case is clear from the first sentence.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

akb_deleteB

Delete a document. Removes from Git, search index, and knowledge graph.

ParametersJSON Schema
NameRequiredDescriptionDefault
uriYesDocument URI
_vault_skill_ackNoOpaque acknowledgement returned as vault_skill.ack_token. After applying that guide, retry the unchanged operation with this value. The bundled proxy supplies it automatically.

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden for behavioral disclosure. It does reveal the destructive side effects (removing from Git, search index, knowledge graph), which is useful. However, it omits any mention of permissions, reversibility, confirmation requirements, or what happens to dependent data, which are important for a mutation tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two concise sentences with no filler. The primary action is front-loaded, followed by the key side-effect information. Every word adds value, making it an exemplary model of brevity without under-specification.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple delete tool with one required parameter and no output schema, the description covers the essential behavior and cascading effects. It might benefit from mentioning whether the delete is reversible or if there are any prerequisites (e.g., ownership), but overall it is sufficiently complete for an agent to make the call.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents both parameters (uri and _vault_skill_ack). The description adds no extra meaning about the parameters, such as URI format or how the ack token is used. A baseline 3 is appropriate since the schema does the heavy lifting.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb 'Delete' and the resource 'document', and adds the scope of removal (Git, search index, knowledge graph) which differentiates from similar tools like akb_delete_vault or akb_delete_collection. However, it does not explicitly name sibling tools or edge cases, so it stops short of a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is given on when to use this tool versus alternatives. It does not mention that akb_delete_file handles files, akb_delete_vault handles vaults, or when a document delete is appropriate. The agent is left to infer that any 'document' deletion goes here, without reasoning about alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

akb_delete_collectionA

Delete a collection. If empty, removes the metadata row. If non-empty, requires recursive=true to cascade delete every document, file, and table under the path. Cascade emits one git commit for the document batch. Writer or higher role; admin or higher when any table is included.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYesCollection path to delete
vaultYesVault name
recursiveNoRequired when the collection is non-empty.
_vault_skill_ackNoOpaque acknowledgement returned as vault_skill.ack_token. After applying that guide, retry the unchanged operation with this value. The bundled proxy supplies it automatically.

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries full burden and does an excellent job. It discloses destructive behavior (cascade delete), a side effect (one git commit), and role requirements (writer/admin depending on table inclusion). This is more than most tool descriptions provide.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences, no filler. The core action is front-loaded, followed by conditional behavior and role requirements. Every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no annotations and no output schema, the description covers the critical behavioral aspects: empty vs non-empty handling, recursive requirement, cascade scope, git commit side effect, and role prerequisites. It does not explicitly state what happens if recursive=false on a non-empty collection (error vs no-op), but this is strongly implied. Overall quite complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3. The description adds meaningful context beyond the schema: it explains how 'recursive' behaves in practice (cascade deletion) and connects the table condition to elevated role requirements. This elevates it above baseline.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource ('Delete a collection') and differentiates it from sibling tools like akb_delete_vault and akb_delete_file by focusing on collection semantics. It also clarifies the two distinct cases (empty vs non-empty) that define the tool's scope.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear conditions for usage: empty collections delete the metadata row, non-empty require recursive=true. It also gives role-based prerequisites. However, it does not explicitly name alternatives or state when not to use this tool, though the resource-specific naming makes that mostly implicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

akb_delete_fileC

Delete a file from vault storage by its URI.

ParametersJSON Schema
NameRequiredDescriptionDefault
uriYesFile URI (akb://{vault}/file/{id})
_vault_skill_ackNoOpaque acknowledgement from vault_skill.ack_token. Apply the guide, then retry the unchanged operation with this value. The bundled proxy fills it on an exact retry.

TDQS

C2.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

There are no annotations, so the description carries the full burden of behavioral disclosure. It states the destructive action but does not mention irreversibility, permission requirements, impact on linked data, or the retry/ack flow referenced by the _vault_skill_ack parameter.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single front-loaded sentence with no filler. It is concise and direct, though the brevity contributes to the lack of behavioral context.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no annotations and no output schema, the description alone should provide enough context for safe invocation, but it does not. An agent cannot tell whether deletion is permanent, whether special permissions are needed, or how this tool differs from similar sibling tools.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3. The description adds little beyond the schema, only reinforcing that the uri parameter identifies the file. It contributes no additional meaning about the _vault_skill_ack parameter, which is already documented in the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action ('Delete') and the resource ('a file from vault storage'), with the identifying mechanism ('by its URI'). It is unambiguous in isolation, though it does not explicitly differentiate itself from sibling deletion tools such as akb_delete or akb_delete_vault.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is given about when to use this tool versus the many sibling removal operations like akb_delete, akb_delete_vault, akb_delete_collection, or akb_unlink. The description does not mention prerequisites, conditions, or exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

akb_delete_vaultA

Permanently delete a vault and ALL its data — documents, chunks, tables, files, edges, Git repo. This cannot be undone. Owner or admin only.

ParametersJSON Schema
NameRequiredDescriptionDefault
vaultYesVault name to delete
_vault_skill_ackNoOpaque acknowledgement returned as vault_skill.ack_token. After applying that guide, retry the unchanged operation with this value. The bundled proxy supplies it automatically.

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden of behavioral disclosure. It is explicit about what is deleted (documents, chunks, tables, files, edges, Git repo), that deletion is permanent, and that permission is restricted to owner/admin.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is one tightly worded sentence that leads with the action and consequence, then lists the data scope and permission constraint. Every clause adds necessary information without filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For an irreversible destructive operation with no output schema and no annotations, this description gives all critical details: what is deleted, that it cannot be undone, and who is allowed to invoke it. An agent can safely decide whether to call it.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents both parameters. The description does not add meaning beyond the schema, which is acceptable but not enriching, so the baseline of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a strong verb and resource: "Permanently delete a vault." It then enumerates exactly what gets destroyed and emphasizes irreversibility, which clearly distinguishes it from the sibling akb_archive_vault.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear usage context: use this only when you intend permanent destruction, and only as an owner or admin. It does not explicitly name a non-destructive alternative like akb_archive_vault, so it falls short of a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

akb_diffA

Get the content diff for a document at a specific commit. Shows what was added/removed/modified. Use akb_history or akb_activity to find commit hashes first.

ParametersJSON Schema
NameRequiredDescriptionDefault
uriYesDocument URI
commitYesCommit hash (from akb_history or akb_activity)

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description must fully disclose behavior. It mentions the output shows 'what was added/removed/modified,' which conveys the type of information returned. However, it lacks details on output format, pagination, or potential side effects, leaving some ambiguity.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences, each serving a distinct purpose: defining the tool and providing usage guidance. It is front-loaded with the core purpose and contains no redundant information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's simplicity (2 required parameters, no output schema), the description covers the essential aspects: purpose, parameters, and prerequisite tools. It could optionally describe the return format but is adequate for the complexity level.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the description adds little beyond the schema. It does reinforce that the commit hash comes from akb_history or akb_activity, providing slight additional context but no new parameter semantics.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool obtains a content diff for a document at a specific commit, using a specific verb ('Get') and resource. It also distinguishes from siblings by referencing akb_history and akb_activity as prerequisite tools to find commit hashes.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly instructs users to first use akb_history or akb_activity to find commit hashes, providing clear guidance. However, it does not explicitly state when not to use this tool or mention alternatives for other use cases.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

akb_discard_imageA

Discard a document image upload that was never committed in an AKB document. Use this only to clean up after a failed or abandoned akb_put/akb_update. Images already claimed by a document or retained Git revision cannot be discarded through this tool.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlYesStable `/api/assets/{uuid}` URL returned by akb_put_image.
vaultNoVault name. Required unless `parent` is given.
parentNoVault or collection URI used for the upload. The vault is derived from it.
_vault_skill_ackNoOpaque acknowledgement from vault_skill.ack_token. Apply the guide, then retry the unchanged operation with this value. The bundled proxy fills it on an exact retry.

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are present, so the description carries the burden; it discloses the key operational boundary (uncommitted vs. claimed/retained images) and states that already-claimed images cannot be discarded. It doesn't explicitly say the action is permanent or irreversible, but 'Discard' and 'never committed' strongly imply destructive cleanup.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences with no redundant information; the action and primary constraint are front-loaded, the usage condition follows, and the limitation closes. Every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a destructive cleanup tool with no annotations or output schema, the description supplies essential operational context: when to use it, what cannot be discarded, and how to identify the source URL. It could additionally state that the action is irreversible or describe the success/error response, but the core call-correctness information is present.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, and the description does not add parameter-level detail beyond the schema itself. The references to the URL returned by akb_put_image and to akb_put/akb_update provide useful context but don't elaborate on individual parameters.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('Discard') and resource ('document image upload that was never committed'), and distinguishes the tool's scope from the related put/update flows. Among siblings, it is the only cleanup/discard operation for unpublished image uploads.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says 'Use this only to clean up after a failed or abandoned akb_put/akb_update,' giving a precise trigger condition. It also provides an exclusion rule: images already claimed by a document or retained by a Git revision cannot be discarded, so an agent knows when not to call it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

akb_drill_downA

Read section-level (L3) content of a document, or list its section headings. Two modes:

  • mode='sections' (default): return body content of matched sections. Filter with section (heading substring) and/or pattern (substring grep on body). On empty match the response carries an outline so you can retry.

  • mode='outline': return heading paths only (no bodies). Use this to discover the document's structure cheaply before deciding which section to read. Returns {uri, sections|outline, returned, total?, truncated?, hint?}.

ParametersJSON Schema
NameRequiredDescriptionDefault
uriYesDocument URI
modeNo'sections' for body content, 'outline' for heading paths only.sections
patternNoSubstring grep inside matched section bodies (case-insensitive). Used in `sections` mode.
sectionNoSection heading filter (partial match). Used in `sections` mode.

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Discloses that empty match returns outline, and response includes truncated/hint fields. No annotations exist, so description carries full burden; it adequately describes read-only behavior and response traits.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Compact, well-structured, front-loaded with purpose. Every sentence serves a clear function with no redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers both modes, parameter usage, and response shape despite no output schema. Addresses edge case (empty match) and provides complete guidance for a 4-parameter tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema has 100% coverage, but description adds value by explaining mode interaction and filtering behavior (e.g., section substring match, pattern grep) beyond schema descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states it reads section-level (L3) content or lists headings, distinguishing it from siblings like akb_get (full document) and akb_grep (whole-document search).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly describes two modes with use cases: outline for cheap structure discovery, sections for content retrieval. Could mention alternatives but provides strong guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

akb_drop_tableA

Permanently delete a table and all its rows. Cannot be undone. Requires admin role on the vault.

ParametersJSON Schema
NameRequiredDescriptionDefault
uriYesTable URI — akb://{vault}[/coll/{coll_path}]/table/{name}
_vault_skill_ackNoOpaque acknowledgement returned as vault_skill.ack_token. After applying that guide, retry the unchanged operation with this value. The bundled proxy supplies it automatically.

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden, and it clearly discloses irreversibility, scope ('all rows'), and the admin requirement. It stops short of describing cascade effects or what happens to related objects, but the core destructive behavior is explicit.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short clauses deliver action, consequence, and prerequisite with no filler. The warning is front-loaded right after the verb, and the admin requirement closes it efficiently.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers what gets deleted, that it is permanent, and who may perform it, which is sufficient for a two-parameter tool. It doesn't mention effects on related objects, but the schema already documents the URI format and auth token, so the remaining gap is small.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline applies; both uri and _vault_skill_ack are already fully documented in the schema. The description adds no parameter-specific meaning beyond that.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific action (permanently delete) and resource (a table with all rows), which clearly distinguishes it from siblings like akb_delete_vault and akb_delete_collection. It doesn't explicitly contrast with the generic akb_delete, but the table-specific scope is unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Implies use when a table must be removed permanently and states the admin-role prerequisite, but it does not spell out when to prefer this over akb_delete or akb_alter_table. There is no explicit when-not-to-use guidance or named alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

akb_editA

Edit a single document by replacing exact text. Scope is one document. old_string must be unique within the document (or use replace_all). If old_string is not found or appears multiple times, the call fails with a clear error. Use this for inserting, replacing, or removing an inline image without resending the complete document body. For find-and-replace across many documents, use akb_grep with replace instead.

ParametersJSON Schema
NameRequiredDescriptionDefault
uriYesDocument URI
messageNoCommit message describing the change
new_stringYesReplacement text. Can be empty to delete.
old_stringYesExact text to replace. Must be unique in the document body unless replace_all=true. Include surrounding context if needed for uniqueness.
base_commitNoOptional OCC pin — when set, the edit is rejected if the document's current_commit moved. Use after akb_get to fail-fast on concurrent writers.
replace_allNoReplace all occurrences (default: false, requires old_string to be unique)
_vault_skill_ackNoOpaque acknowledgement returned as vault_skill.ack_token. After applying that guide, retry the unchanged operation with this value. The bundled proxy supplies it automatically.

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure. It transparently describes failure behavior ('If old_string is not found or appears multiple times, the call fails with a clear error'), scope limitation, and the effect of replace_all. This is strong behavioral detail for a mutation tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loaded with the core purpose, then constraints, then usage guidance and the alternative. Every sentence contributes value without redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the 7-parameter schema with full coverage, the description is largely complete for selecting and invoking the tool. It could have explicitly named the full-document update alternative (e.g., akb_update or akb_put) and noted result/commit behavior, but what is present covers the main decision points.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3. The description reinforces old_string uniqueness and replace_all behavior, but adds minimal parameter-level meaning beyond the schema, which already documents each parameter thoroughly.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: 'Edit a single document by replacing exact text,' making the tool's core function immediately clear. It also distinguishes it from siblings by explicitly contrasting with akb_grep for multi-document find-and-replace and implying a difference from full-body update tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit guidance: use this tool for targeted single-document edits, including inline image insert/replace/remove, and use akb_grep with replace for find-and-replace across many documents. It also clarifies that old_string must be unique unless replace_all is used, which is a concrete usage condition.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

akb_explain_accessA

Explain why a user holds the role they hold on a vault: every independent basis, and the effective role derived from them. A member list shows the result, never the reasons.

ParametersJSON Schema
NameRequiredDescriptionDefault
userYesTarget username
vaultYesVault name

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the transparency burden. It discloses the conceptual output (independent bases and derived effective role) and implies a read-only analysis behavior. It does not explicitly state that no changes are made, nor does it discuss permissions or edge cases, so it adds moderate but not complete behavioral context.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences deliver the core purpose, output contents, and a key differentiator with no wasted words. The main action is front-loaded, and the contrast with member lists earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a two-parameter read/explain tool, the description covers what the tool does and what it returns (basis and effective role). It lacks explicit notes on errors, permissions, or output formatting, but these are not critical given the simple schema and clear purpose.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents both required parameters adequately. The description adds contextual meaning around 'vault' and 'user' (role relationship) but does not supply additional format or semantics beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific action ('Explain why'), a specific resource (a user's role on a vault), and a concrete deliverable ('every independent basis, and the effective role derived from them'). It also differentiates itself from member-list tools by stating that a member list shows results, not reasons.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear context for when this tool is the right choice: whenever the reasoning behind a role, rather than the resulting membership, is needed. It contrasts with member lists but does not explicitly name the sibling alternative or state when not to use this tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

akb_exportA

Export an entire vault as a portable knowledge bundle. Returns the bundle inline as a {path: content} map. The format parameter selects the on-disk format — currently 'okf' (Open Knowledge Format: markdown + YAML frontmatter, the only required field being type). Documents export 1:1; tables and files become OKF concept documents (schema / metadata + a resource pointer — the rows/bytes stay in AKB). Reader role required. For a downloadable zip, use the REST endpoint GET /api/v1/vaults/{vault}/export.

ParametersJSON Schema
NameRequiredDescriptionDefault
vaultYesVault to export
formatNoBundle format. Currently only 'okf'.okf

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries full responsibility for behavior disclosure. It specifies that documents export 1:1, tables/files become OKF concept documents with resource pointers, reader role is required, and the return format is a {path: content} map. This is detailed and goes well beyond a simple 'export' statement.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise yet information-dense, covering purpose, return format, parameter semantics, conversion behavior, role requirements, and an alternative in four sentences. Every sentence contributes meaningful detail without redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no output schema and moderate complexity, the description thoroughly covers the return value structure, transformation logic, format options, permission requirements, and a fallback path. It is complete enough for an agent to know what to expect and when to reject use.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% so both parameters already have descriptions. The description adds extra meaning by explaining the 'format' parameter's current value ('okf') and its implications (markdown + YAML frontmatter, only required field 'type'). This adds value beyond the schema's brief notes.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool exports an entire vault as a portable knowledge bundle, using a specific verb (Export) and resource (vault). It distinguishes itself from sibling tools by describing the inline return format and mentioning an alternative REST endpoint for zip downloads.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear context on when to use this tool (for inline bundle export) and explicitly points to the REST endpoint for a downloadable zip alternative. However, it doesn't enumerate comparisons with all sibling tools, though the alternative is sufficient for key use cases.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

akb_getA

Retrieve a document by its URI. Returns full content with metadata. Use akb_browse or akb_search first to obtain the URI. Optionally pass a commit hash (from akb_history) to read a previous version.

ParametersJSON Schema
NameRequiredDescriptionDefault
uriYesDocument URI — akb://{vault}[/coll/{coll_path}]/doc/{filename}
versionNoGit commit hash for a specific version (from akb_history)

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Discloses that the tool returns full content with metadata and supports version retrieval. No annotations provided, so description carries full burden; it accurately describes the tool's behavior without contradiction.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences that are direct and front-loaded with the primary purpose. No unnecessary words, efficient communication.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's simplicity (2 parameters, no output schema), the description fully covers usage preconditions (obtain URI via browsing/searching), optional versioning, and return value. Complete for its complexity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema covers both parameters with 100% coverage. Description adds meaning by explaining the version parameter's purpose (reading a previous version from akb_history), going beyond schema details.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states 'Retrieve a document by its URI' and specifies it returns full content with metadata. Differentiates from browsing and searching by indicating that akb_browse or akb_search should be used first to obtain the URI.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly tells when to use this tool (after akb_browse or akb_search) and how to retrieve previous versions using a commit hash from akb_history. Provides clear guidance with alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

akb_get_fileA

Download a file from vault storage to a local path. Pass the file URI — akb://{vault}[/coll/{coll_path}]/file/{uuid} — from akb_browse or akb_put_file.

ParametersJSON Schema
NameRequiredDescriptionDefault
uriYesFile URI (akb://{vault}/file/{id})
save_toYesLocal directory or file path to save to

TDQS

A4.3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden. It describes a download (read) operation without mentioning side effects. It does not elaborate on behavior beyond the basic action, but it is not misleading.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, front-loaded with the action, no unnecessary words. Every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple download tool with clear parameters and no output schema, the description is complete. It covers purpose, source of URI, and destination.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% with descriptions for both parameters. The description adds value by specifying the URI format and source, which goes beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb 'Download', the resource 'file from vault storage', and the destination 'to a local path'. It distinguishes from sibling tools like akb_browse and akb_put_file by referencing them as sources for the URI.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description tells the agent to pass the URI from akb_browse or akb_put_file, providing clear context for when to use this tool. It does not explicitly state when not to use it, but the guidance is sufficient.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

akb_grantA

Grant vault access to a user. You must be owner or admin of the vault. A rule-driven grantor should name its own source_key so it can later withdraw its own reason without deleting anybody else's.

ParametersJSON Schema
NameRequiredDescriptionDefault
roleYesRole to grant
userYesTarget username
vaultYesVault name
revisionNoMonotonic per (vault, user, source). A retry carrying a revision no newer than the stored one is a no-op rather than an overwrite.
source_keyNoThe basis on which the role is held, as '<namespace>:<id>'. Omit it and the grant is 'direct', which is what every grant was before bases could coexist.
_vault_skill_ackNoOpaque acknowledgement returned as vault_skill.ack_token. After applying that guide, retry the unchanged operation with this value. The bundled proxy supplies it automatically.

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the burden and does disclose a key behavioral trait: only owner/admin can grant, and rule-driven grants should carry a source_key to allow future self-withdrawal without affecting others. It does not describe overwrite semantics, but the schema's revision field covers retry behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences are used efficiently: the action, the permission gate, and the one nuanced parameter guidance are all front-loaded. No filler or repetition of schema content.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the six-parameter schema with full descriptions, the tool is adequately specified for selection and invocation: purpose, permission requirement, and source_key rationale are present. No annotations or output schema exist, but the description plus rich schema covers the essential operation-level context.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3. The description adds meaningful semantics for source_key beyond the schema: "so it can later withdraw its own reason without deleting anybody else's." It does not describe revision/_vault_skill_ack behavior, but those are already documented in the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: "Grant vault access to a user," which clearly identifies the operation and target. The owner/admin prerequisite further sharpens the intended context, and the name/role make sibling confusion unlikely.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives explicit context by requiring owner/admin status and by advising rule-driven grantors to set source_key. It does not explicitly enumerate alternatives such as akb_revoke, but for a straightforward grant operation the use case is clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

akb_graphA

Get a same-vault knowledge graph — nodes (documents, tables, files) and edges (relations). Provide uri to get a subgraph centered on any resource with BFS traversal. Provide vault (without uri) to get the full vault graph.

ParametersJSON Schema
NameRequiredDescriptionDefault
uriNoCenter resource URI (omit + pass vault for full vault graph)
hopsNoBFS traversal radius in edge hops. Disambiguated from `akb_browse.depth` (which is collection-tree depth) — hops here counts relations followed, not folder levels.
limitNoMax nodes
vaultNoVault name (only when uri is omitted — for full vault graph)

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the behavioral disclosure burden and does so well: it states the traversal strategy (BFS), the two graph scopes (centered subgraph vs full vault graph), and the returned element types (nodes and edges). It stops short of describing output shape or pagination, but the essentials are present.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, front-loaded with the core resource and action, and free of filler. Every clause adds useful information about graph scope or traversal behavior.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

There is no output schema, but the description covers the return shape at a high level (nodes for documents/tables/files and edges for relations), plus both invocation modes. It is complete enough for an optional-parameter retrieval tool, though it omits behavior when neither `uri` nor `vault` is provided.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the parameters are already documented. The description reinforces the `uri`/`vault` mode distinction but does not add material meaning beyond the schema, so the baseline score of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly identifies the resource (same-vault knowledge graph) and the action (get), enumerating node types and edge meaning. It does not explicitly contrast with sibling graph-adjacent tools like akb_relations or akb_browse, so it misses the top score for sibling differentiation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit within-tool usage guidance: pass `uri` for a BFS-centered subgraph, or pass `vault` without `uri` for the full vault graph. It also leverages schema text to disambiguate `hops` from `akb_browse.depth`, but it does not discuss when to choose this tool over alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

akb_grepA

Search for exact text or regex patterns across document content. On a native Document backend, optionally include admitted searchable text Files with measurement_include_text_files=true; binary Files remain excluded. Unlike akb_search (semantic/meaning-based), this finds exact string matches — use it for specific terms, URLs, code snippets, version numbers, etc. Returns matching documents (each with its uri) and matched lines. Optionally pass replace to find-and-replace across all matching documents; the call writes nothing if the scope exceeds max_replacements. Three response shapes (mutually exclusive): default lines, count_only=true (grep -c — per-doc counts + total, no snippets), files_with_matches=true (grep -l — just the URIs that contain the pattern). The default shape always reports BOTH returned_* (what fit under limit) and total_* (full corpus matches) plus a truncated flag. When response safety bounds truncate snippets, the truncation object names the applied resource, match, and byte limits; use count_only for exact counts without snippets.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMax documents to return; does not limit replacement writes
regexNoTreat pattern as PostgreSQL regex. REQUIRED to use alternation (|), wildcards (.*), character classes, anchors, etc. When false (default), the entire pattern including any metacharacters is matched literally.
vaultNoLimit to a specific vault
patternYesNon-empty search pattern. By default matched as literal text (ILIKE) — metacharacters like |, ., *, (), [], +, ? are treated as literal characters. Set regex=true to enable PostgreSQL regex (required for alternation and wildcards).
replaceNoReplacement string. If provided and the full scope fits max_replacements, replaces all matches in EVERY matching document (git commit + re-index per doc); otherwise writes nothing. Treated literally when regex=false; supports regex backreferences (\1, \2) only when regex=true. For precise edits to a single known document, prefer akb_edit instead.
collectionNoLimit to a specific collection
count_onlyNoReturn counts only (grep -c semantics). Response: {pattern, total_matches, total_docs, by_doc:{uri:count,...}}. Use for 'how many X are there?' questions — much cheaper than fetching every line.
case_sensitiveNoCase-sensitive matching (default: case-insensitive)
_vault_skill_ackNoOpaque acknowledgement returned as vault_skill.ack_token. After applying that guide, retry the unchanged operation with this value. The bundled proxy supplies it automatically.
max_replacementsNoMaximum documents a replace call may rewrite, independent of the response limit. If the full scope matches more documents, the call fails before writing anything. Preview with count_only or files_with_matches, then set this budget to cover the intended scope.
files_with_matchesNoReturn only the URIs that contain matches (grep -l semantics). Response: {pattern, n_files, files:[uri,...]}. Use for 'which documents mention X?' questions.
measurement_include_text_filesNoNative mode: include admitted searchable text Files as well as Documents. File results include resource_type=file, their canonical akb:// URI, revision, and content_hash; native results also report payload_placement, the body placement their bytes were read from. Binary Files are never searchable. Rejected unless postgres_native or the exact guarded native measurement backend is active.

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure. It covers replacement safety ('writes nothing if the scope exceeds max_replacements'), the three mutually exclusive response shapes, the returned_*/total_*/truncated fields, and the truncation object. This is unusually complete for a tool with no annotation metadata.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense but well organized: purpose first, backend nuance second, sibling comparison third, then output modes and truncation behavior. Every sentence earns its place, and the most decision-relevant information is front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 12-parameter tool with no output schema, the description covers the key behaviors an agent needs: exact vs semantic search, file inclusion rules, replacement semantics, response shape selection, and truncation. The schema handles parameter-level details, so nothing critical is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3. The description goes beyond the schema by explaining how count_only and files_with_matches alter the response shape, and by advising count_only when truncation may hide exact counts. This adds meaningful cross-parameter context even though individual parameter details live in the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The first sentence states a specific verb and resource: 'Search for exact text or regex patterns across document content.' It explicitly contrasts with akb_search ('Unlike akb_search... this finds exact string matches'), so an agent can distinguish it from the closest sibling without inspecting schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly names the alternative (akb_search) and gives the selection condition: semantic/meaning-based vs exact string matches. It also provides concrete use cases ('specific terms, URLs, code snippets, version numbers'), making it clear when this tool is appropriate.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

akb_helpA

Get help on AKB tools and workflows. Call with no arguments for an overview. Drill down into categories or specific tools for details and examples. START HERE if you're new to AKB.

ParametersJSON Schema
NameRequiredDescriptionDefault
topicNoWhat to get help on. Options: categories (quickstart, documents, search, tables, files, access, history, publishing, relations), tool names (akb_put, akb_search, etc.), or workflow names (link-resources, research, onboarding, data-tracking, vault-skill)
vaultNoVault name. Required for topic='vault-skill' — returns that vault's full skill text (the auto-attached `vault_skill` payload may be truncated). Read-only mirror vaults have no skill; a fallback guide is returned instead.

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and does disclose expected behavior: no-argument calls return an overview, and drill-downs return details and examples. It stops short of describing output format, but the core behavior is clearly communicated.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short, purposeful sentences. The core purpose is front-loaded, followed directly by actionable invocation instructions. 'START HERE' is high-value guidance, not filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool is simple, the schema already covers topic and vault semantics including the vault-skill edge case, and the description covers invocation modes. The only minor gap is lack of output-presentation detail, but that is not essential for selecting or invoking a help tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the schema already documents both parameters thoroughly. The description echoes the category/tool/workflow distinction that matches the topic parameter, adding slight orientation, but does not need to repeat schema details. Baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('Get help') and resource ('AKB tools and workflows'), making it clear this is a meta/help tool distinct from the operational sibling tools. It also signals its role as the entry point for new AKB users.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly tells the agent how to invoke it: call with no arguments for an overview, then drill down into categories or specific tools. 'START HERE if you're new to AKB' provides clear selection guidance, and since this is the only help tool, exclusions are unnecessary.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

akb_historyA

Get version history of a document — who changed it, when, and why. Each entry is a Git commit. Use the commit hash with akb_get to read a previous version.

ParametersJSON Schema
NameRequiredDescriptionDefault
uriYesDocument URI
limitNoMax entries

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description bears full responsibility. It states that each entry is a Git commit and describes the content (who, when, why), implying a read-only operation. It does not mention side effects, auth requirements, or error handling, but the core behavior is clear.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise at two sentences. The first sentence states the purpose and content, the second provides actionable guidance linking to a sibling tool. No unnecessary words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the absence of an output schema, the description gives a good overview: each entry is a Git commit with who, when, why. It also mentions using the commit hash with akb_get. However, it lacks details on pagination, ordering, or whether all versions are included.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has 100% description coverage, so the baseline is 3. The description adds no additional meaning beyond what is in the schema parameters (uri and limit). It does not explain URI format or limit context, which might be helpful.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: retrieving version history of a document, including who changed it, when, and why. It distinguishes itself from sibling tools by mentioning the use of commit hashes with akb_get, indicating a specific role.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides context for usage by linking to akb_get and implying that this tool is for history retrieval. However, it does not explicitly exclude other scenarios or mention alternatives like akb_diff or akb_provenance, which could be used for similar purposes.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

akb_importA

Import a knowledge bundle into a vault. Pass files as a {path: content} map (the shape akb_export returns). format selects the bundle format — currently 'okf'. Concept documents are imported as AKB documents; a type: table/file concept doc (which carries only schema/metadata, not rows/bytes) imports as a regular document describing that asset. Existing paths are skipped, not overwritten. Records targeting the reserved 'overview' collection or carrying type='skill' are skipped per-record and reported in the response's 'reserved' list. Writer role required.

ParametersJSON Schema
NameRequiredDescriptionDefault
filesYesBundle as a {bundle-relative-path: markdown-content} map.
vaultYesTarget vault
formatNoBundle format. Currently only 'okf'.okf
statusNoOptional: override status for every imported document.
_vault_skill_ackNoOpaque acknowledgement returned as vault_skill.ack_token. After applying that guide, retry the unchanged operation with this value. The bundled proxy supplies it automatically.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden, and it delivers: it explains concept-document handling, the special table/file concept case, that existing paths are skipped rather than overwritten, that reserved records are skipped and reported, and that writer role is required. This is substantial behavioral disclosure beyond the schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense but every sentence earns its place: purpose, input shape, format, concept-doc behavior, conflict policy, reserved-record behavior, and auth requirement. It is front-loaded with the core purpose and does not repeat schema details.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with no annotations and no output schema, the description is remarkably complete. It covers the input contract, special cases, idempotency behavior, per-record failures, response reporting for reserved items, and auth. An agent has enough to select and invoke the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3. The description adds real value beyond the schema by explaining that `files` takes the exact map shape akb_export returns, that `format` currently only supports 'okf', and how concept documents map to imports. It doesn't elaborate on `status` or `_vault_skill_ack`, but those are already well described in the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: 'Import a knowledge bundle into a vault.' It also differentiates itself from siblings by referencing the bundle shape akb_export returns, making clear it is the bulk-import counterpart to export rather than a single-document tool like akb_put.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides clear usage context: the input must be a {path: content} map in the shape akb_export returns, which strongly implies the tool is for importing exported bundles. It also gives a prerequisite (writer role) and describes edge cases. However, it does not explicitly name alternatives like akb_put or state 'use this instead of X,' so it falls just short of full exclusion guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

akb_list_vaultsA

List accessible vaults as {name, description} pairs. Response is slim — no metadata (id/role/created_at) — to fit large tenants in agent context. Returns {vaults, total, returned, truncated?, hint?}. Optional args:

  • filter: substring match on name+description (case-insensitive). Use to narrow to a domain (e.g. filter='finance').

  • limit / offset: pagination when there are many matches.

  • include_archived: include archived vaults (default false).

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoCap result count.
filterNoSubstring filter against name+description (case-insensitive).
offsetNoSkip first N (default 0).
include_archivedNoInclude archived vaults (default false).

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Discloses that response is slim and explains optional args, but does not explicitly state it is read-only or non-destructive. Since no annotations exist, the description carries full burden; it is adequate but not comprehensive.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Extremely concise and well-structured. First sentence states main action and output, second describes response format, then a clear list of optional args. Every sentence serves a purpose with no redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a list tool, it covers essential behavior: response structure, filtering, pagination, and archived inclusion. However, it could be more complete by mentioning when to use this tool over siblings like akb_search or akb_browse, given the large sibling set.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3. The description adds minimal value: for filter, it gives a usage example, but limit/offset and include_archived repeat schema info. Does not expand on parameter constraints or behavior.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states it lists accessible vaults with name and description, and specifies output format. However, it does not explicitly differentiate from sibling tools like akb_vault_info or akb_vault_members, which could cause confusion when to use this tool over others.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides usage guidance for parameters (filter, pagination, include_archived) with examples like filter='finance'. But no guidance on when to use this tool vs alternatives (e.g., for detailed vault info use akb_vault_info), nor any exclusions or prerequisites.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

akb_moveA

Move or rename a document — change its collection and/or slug while keeping its identity and full git history. The old akb:// URI keeps resolving (a redirect is recorded), and graph links/publications are rewritten. Provide collection and/or slug (at least one must change). The title is unchanged; use akb_update to change the displayed title.

ParametersJSON Schema
NameRequiredDescriptionDefault
uriYesDocument URI to move
slugNoNew slug / filename base, e.g. 'final-spec' (omit to keep the current slug)
messageNoCommit message describing the move
collectionNoNew collection path (omit to keep the current collection)
_vault_skill_ackNoOpaque acknowledgement returned as vault_skill.ack_token. After applying that guide, retry the unchanged operation with this value. The bundled proxy supplies it automatically.

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the transparency burden and does this well: it discloses redirect behavior for the old URI, rewriting of graph links/publications, git-history preservation, and unchanged title. It stops short of mentioning permissions, failure modes, or return value, which would make it fully transparent.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Each of the four sentences adds distinct value: what moves, what is preserved, redirect/rewrite behavior, and the constraint plus alternative tool. The critical constraints are front-loaded before the pointer to akb_update.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a mutation tool with no annotations and no output schema, the description covers the essential call-time decisions and side effects well. It does not describe the response format or authorization requirement, but all selection and invocation criteria are substantially present.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description adds the key constraint that collection and slug are optional yet at least one must change. It also adds meaning to slug ('filename base'), complementing the schema's basic descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb-resource pair ('Move or rename a document') and the exact dimensions that change (collection and/or slug), immediately setting it apart from content-editing tools. It explicitly distinguishes itself from akb_update by noting the title is unchanged.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives a concrete when-to-use rule: change a document's collection/slug while preserving identity and history. It also provides a when-not-to-use direction by pointing at akb_update for title changes, plus the precondition that at least one of collection/slug must change.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

akb_provenanceA

Get provenance for a document — who created it, when, which entities were extracted, and its visible same-vault relations.

ParametersJSON Schema
NameRequiredDescriptionDefault
uriYesDocument URI

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden of explaining behavior. It usefully discloses the return categories and scoping ('visible same-vault relations'), but does not clarify whether the operation has side effects, requires specific permissions, or what the response format looks like. 'Get' implies a read operation, which mitigates some of the ambiguity.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, well-structured sentence that front-loads the core action and then efficiently enumerates the returned data. Every clause contributes meaningful information, with no redundancy or filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple one-parameter read tool with no output schema and no annotations, the description covers the essential purpose and return scope well. It could be more complete by stating explicit use alternatives or permission implications, but nothing critical is missing for an agent to invoke the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema already documents the only parameter 'uri' at 100% coverage, so the baseline is 3. The description adds no additional detail about URI format, required scheme, or accepted value patterns beyond what the schema provides.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description provides a clear active verb ('Get') and resource ('document'), and enumerates the specific provenance information returned: creator, timestamp, extracted entities, and visible same-vault relations. It does not explicitly name sibling tools to contrast against, but the described content is specific enough to differentiate it from generic retrieval tools like akb_get, akb_relations, or akb_history.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The intended use is implied: call this tool when you need provenance metadata for a document. However, the description does not explicitly state when to use this tool versus alternatives, nor does it mention exclusions or preconditions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

akb_publicationsA

List every publication in a vault. Each item is the canonical publication dict (same shape as akb_publish returns).

ParametersJSON Schema
NameRequiredDescriptionDefault
vaultYesVault name
resource_typeNoFilter by resource type

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the burden. It discloses the return shape (same as akb_publish) but omits safety traits, side effects, pagination, or error behavior. The 'list' verb implies read-only, but this is not explicit. Score reflects minimal but non-contradictory transparency.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, no filler. The first sentence states the core action, the second adds return value detail. Every word earns its place; highly efficient and front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple list tool without output schema, the description provides return shape context but lacks details on ordering, pagination, error handling, or the optional filter. Adequate but leaves gaps for a production tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3. The description adds no meaning beyond schema: it does not elaborate on 'vault' or the 'resource_type' filter. The return shape note is useful but not parameter-specific.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool lists every publication in a vault, using a specific verb ('List') and resource ('publications'). It distinguishes itself from sibling tools like akb_publish (creates) or akb_unpublish (removes) by focusing on reading, with no ambiguity.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance on when to use this tool versus alternatives (e.g., akb_search or akb_publication_snapshot). The description only states what it does, without context about prerequisites, exclusions, or comparative advantages.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

akb_publication_snapshotA

Freeze a table_query publication's current result to S3 and flip its mode to 'snapshot' (subsequent visits return the cached result). Identified by slug alone — the vault is resolved from the publication. Returns the updated publication dict.

ParametersJSON Schema
NameRequiredDescriptionDefault
slugYesPublication slug
_vault_skill_ackNoOpaque acknowledgement returned as vault_skill.ack_token. After applying that guide, retry the unchanged operation with this value. The bundled proxy supplies it automatically.

TDQS

A4.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure. It does explain the core side effects: freezing the result to S3, flipping the mode to snapshot, and caching behavior for subsequent visits. However, it omits details about reversibility, potential data loss, permissions required, or error conditions (e.g., if the publication is not a table_query publication), leaving some behavioral ambiguity.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise and front-loaded, with two sentences that convey the core action, the identification method, and the return value without any filler. Every sentence earns its place, and the structure is efficient.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers the essential aspects: the operation, the mode change, the caching behavior, identification, and the return type. It could mention prerequisites (e.g., the publication must be a table_query publication) and whether the operation is reversible, but for a tool with no output schema and moderate complexity, it is largely complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema already has 100% coverage, so the baseline is 3. The description adds value by clarifying that slug alone is sufficient and that the vault is resolved from the publication, which is not obvious from the schema's simple 'Publication slug'. This extra context makes the parameter semantics clearer, warranting a 4.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: it freezes a table_query publication's current result to S3 and flips its mode to 'snapshot', which differentiates it from siblings like akb_publish and akb_unpublish. The verb 'freeze' and resource 'publication' are specific, and it clarifies that the vault is resolved from the slug, eliminating ambiguity about required parameters.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear context on when to use the tool: when you want a publication to serve a cached result instead of re-querying, and that it applies specifically to table_query publications. It notes that the vault is derived from the publication, but does not explicitly mention alternatives or when not to use it (e.g., for non-table_query publications), so it falls short of a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

akb_publishA

Create a public, no-auth share URL for a document, file, or table query. Document/file: pass the resource uri. Table query: pass query_sql plus vault (and query_vault_names if the query touches more than one). Returns the canonical publication dict — slug is the only identifier you need; share_url is always an absolute URL ready to paste.

ParametersJSON Schema
NameRequiredDescriptionDefault
uriNoResource URI to publish — required when resource_type is document or file. Omit for table_query.
titleNoOverride the display title (defaults to the resource's own title).
vaultNoVault name. Required only for resource_type=table_query (doc/file vault is inferred from the URI).
passwordNoRequire this password to view the share.
max_viewsNoAuto-expire after N views.
query_sqlNoSELECT/WITH SQL with :param placeholders. resource_type=table_query only.
expires_inNoExpiration window: '1h', '7d', '30d', or 'never' (default).
allow_embedNoAllow the share to be embedded via iframe/oEmbed.
query_paramsNoParameter declarations: {name: {type, default, required}}. resource_type=table_query only.
resource_typeNoKind of resource. document/file → pass `uri`. table_query → pass `query_sql` + `vault`.document
section_filterNoFilter to a specific heading section. resource_type=document only.
_vault_skill_ackNoOpaque acknowledgement returned as vault_skill.ack_token. After applying that guide, retry the unchanged operation with this value. The bundled proxy supplies it automatically.
query_vault_namesNoVaults the query reads from. Defaults to [vault]. resource_type=table_query only.

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations present, the description carries the full burden and covers the two most operationally significant behaviors: the created share is publicly viewable with no authentication, and the return contract is a canonical publication dict where slug is the only identifier needed and share_url is always absolute. It could disclose idempotency-on-republish or caller permissions, but the core side effect is clearly stated.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences, front-loaded with the action, then parameter-selection logic, then return-value guidance. Every sentence earns its place with zero filler and no restatement of the schema.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 13-parameter, three-mode tool with no output schema and no annotations, the description covers the highest-risk decision (parameter selection per resource_type) and the essentials of the return contract (slug, share_url). Remaining details like expiry/password effects and re-publishing behavior are left to the schema or implicit, which is acceptable at this complexity level.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description adds cross-parameter meaning that per-parameter schema entries cannot convey: resource_type conditionally determines which of uri vs query_sql+vault must be supplied, and vault is inferred from the URI for doc/file yet must be passed explicitly for table_query. The slug guidance also reduces the agent's post-call burden.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb-action pairing — 'Create a public, no-auth share URL' — and enumerates the three publishable resource kinds (document, file, table query). The 'no-auth share URL' framing clearly differentiates it from near-siblings like akb_set_public or the publication-management tools akb_unpublish and akb_publications.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It states exactly when to call it (whenever a public, unauthenticated share is needed) and how to structure the call by resource type: document/file → uri; table_query → query_sql + vault, with a conditional note on query_vault_names for multi-vault queries. It stops short of explicitly naming excluded alternatives or when-not-to-use conditions, so not a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

akb_putB

Store a new document. The response carries the canonical uriakb://{vault}/coll/{collection}/doc/{filename} when stored under a collection, or akb://{vault}/doc/{filename} at the vault root. Use that URI to address the document from every other tool. Automatically chunked and indexed for semantic search.

ParametersJSON Schema
NameRequiredDescriptionDefault
fileNoLocal file path to read as document body (alternative to content). Provide either file or content, not both.
slugNoOptional explicit slug for the document filename. When stored under a collection the URI is `akb://{vault}/coll/{collection}/doc/{slug}.md`; at the vault root it is `akb://{vault}/doc/{slug}.md`. When omitted, the slug is derived from the title. Pass it to keep the path stable and meaningful when the title is friendly, changeable text (e.g. slug `github-issue-123` with a human-readable title).
tagsNoTags for classification
typeNoDocument type. Free-form — any string is accepted, EXCEPT 'skill', which is reserved for the system-managed vault-skill document. Recommended vocabulary: note (default), report, decision, spec, plan, session, task, reference. Use a custom value when none fit (e.g. an OKF concept type).note
titleYesDocument title
vaultNoTarget vault name. Required unless `parent` is given.
domainNoDomain: engineering, product, ops, legal, etc.
parentNoParent location as a canonical URI — `akb://{vault}` for the vault root, `akb://{vault}/coll/{path}` for a collection. When given, the doc is placed there and `vault`/`collection` are derived from the URI. Use this in drill-down chains: paste the `uri` from an `akb_browse` response straight back in.
statusNoLifecycle status. Defaults to 'draft'; pass 'active' to publish on create instead of promoting later with akb_update. Descriptive metadata only — it does not gate search, browse, or access.draft
contentYesDocument body in Markdown
summaryNoBrief summary (auto-generated if omitted)
collectionNoCollection (directory) path, e.g. 'api-specs' or 'meeting-notes'. Ignored when `parent` is given. 'overview' is a reserved system collection (vault-skill only).
depends_onNoSame-vault akb:// URIs this depends on. Use an ordinary Markdown link for a cross-vault reference.
related_toNoSame-vault akb:// URIs of related resources. Use an ordinary Markdown link for a cross-vault reference.
_vault_skill_ackNoOpaque acknowledgement returned as vault_skill.ack_token. After applying that guide, retry the unchanged operation with this value. The bundled proxy supplies it automatically.

TDQS

B3.3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

It usefully discloses that documents are 'automatically chunked and indexed for semantic search' and that the response carries a canonical URI. However, with no annotations present, the description does not cover other important behavioral traits like overwrite behavior for an existing URI, required permissions, or whether the vault/collection must already exist.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences with no filler: the purpose is first, followed by the canonical response behavior, then the indexing side effect. Every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 15-parameter tool with no annotations and no output schema, the description covers key behavioral outcomes but leaves gaps around failure modes, duplicate-document handling, and prerequisites for vault/collection targets. The rich input schema compensates for parameter understanding, but runtime behavior is only partially disclosed.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3 even without parameter guidance in the tool description. The description reinforces the URI-return behavior which complements the schema, but it adds no parameter-specific meaning beyond what the schema already documents.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource ('Store a new document') and clarifies where the document lands via canonical URI forms. It is clear, but it does not explicitly distinguish this tool from siblings like akb_put_file or akb_update beyond the word 'new'.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explains what to do with the returned URI, but does not state when to prefer this tool over alternatives such as akb_update, akb_edit, or akb_put_file. No exclusions or conditions are given, leaving tool selection largely to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

akb_put_fileA

Upload a local file to a vault's file storage (S3-backed). Use for PDFs, images, datasets, or any binary content too large for akb_put. Response includes the canonical uriakb://{vault}/coll/{collection}/file/{uuid} when stored under a collection, or akb://{vault}/file/{uuid} at the vault root — pass that to akb_get_file / akb_update_file / akb_delete_file. MIME type is auto-detected from the filename extension unless overridden.

ParametersJSON Schema
NameRequiredDescriptionDefault
vaultNoVault name. Required unless `parent` is given.
parentNoParent location as a canonical URI — `akb://{vault}` for the vault root, `akb://{vault}/coll/{path}` for a collection. When given, the file is uploaded there and `vault`/`collection` are derived from the URI.
file_pathYesAbsolute path to the local file to upload
mime_typeNoMIME type of the file (e.g. 'text/html', 'application/pdf', 'image/png'). Optional — if omitted, it is auto-detected from the filename extension. Override only when the extension is missing, ambiguous, or wrong.
collectionNoLogical grouping (like document collections). Ignored when `parent` is given.
descriptionNoBrief description of the file
_vault_skill_ackNoOpaque acknowledgement from vault_skill.ack_token. Apply the guide, then retry the unchanged operation with this value. The bundled proxy fills it on an exact retry.

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations exist, so the description carries the full disclosure burden — and it delivers: it reveals the S3 backing, the exact response contract (`akb://{vault}/coll/{collection}/file/{uuid}` vs `akb://{vault}/file/{uuid}`), the recommended follow-up tools (akb_get_file / akb_update_file / akb_delete_file), and MIME auto-detection behavior. It falls short only on edge behaviors like overwrite semantics or permission prerequisites.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences with zero filler. The primary action is front-loaded in sentence one, the response contract and chaining strategy are compactly packed into sentence two, and the MIME behavior closes it out. Every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 7-parameter upload tool with no output schema and no annotations, the description is unusually complete: it covers purpose, selection criteria, return contract, follow-up routing, and a default-behavior override. The only notable gaps are preconditions (vault existence, write access) and whether re-uploading to the same location overwrites — minor for a tool whose params are already fully documented in the schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3. The description elevates this by illustrating how the parent/vault/collection parameters map to the two possible canonical uri shapes, which the individual schema entries don't tie together. The MIME sentence partly duplicates the mime_type parameter description, so the net added value is moderate rather than large.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Upload a local file to a vault's file storage (S3-backed).' It distinguishes itself from the closest sibling akb_put by targeting 'any binary content too large for akb_put,' so an agent can tell them apart without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

'Use for PDFs, images, datasets, or any binary content too large for akb_put' explicitly names the alternative tool and the condition that selects this one. The 'too large' qualifier implies the exclusion case (small or textual content belongs in akb_put), giving clear when-to-use guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

akb_put_imageA

Upload a local PNG, JPEG, GIF, or WebP (maximum 10 MiB) for inline use in an AKB Markdown document. Returns a stable /api/assets/{uuid} URL and a ready-to-paste markdown image expression. For a new document, place it with akb_put. For an existing document, prefer a targeted akb_edit; akb_update(content=...) replaces the entire body and must never receive only an image fragment. Images are immutable: upload a replacement and edit the Markdown reference. This creates a hidden document attachment, not a standalone File; use akb_put_file when the binary should appear in browse/search. If the document write fails, call akb_discard_image with the returned URL.

ParametersJSON Schema
NameRequiredDescriptionDefault
vaultNoVault name. Required unless `parent` is given.
parentNoVault or collection URI (`akb://{vault}` or `akb://{vault}/coll/{path}`). The image is owned by that vault; the collection portion only identifies the vault.
alt_textNoAccessible Markdown alt text. Defaults to the filename without its extension.
file_pathYesAbsolute path to the local image file (maximum 10 MiB).
mime_typeNoOptional MIME override for extensionless or unusually named files. The server verifies it against decoded bytes.
_vault_skill_ackNoOpaque acknowledgement from vault_skill.ack_token. Apply the guide, then retry the unchanged operation with this value. The bundled proxy fills it on an exact retry.

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full behavioral burden. It discloses key traits: images are immutable, the upload creates a hidden attachment rather than a standalone File, the returned URL is stable, and a failed document write requires cleanup via akb_discard_image. It does not mention auth or rate limits, but for this tool the operational consequences are well covered.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core purpose and return values, then moves through usage alternatives, behavioral caveats, and failure handling. Every sentence earns its place, and the prose is dense without being bloated.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

There is no output schema, so the description correctly explains the return: 'a stable `/api/assets/{uuid}` URL and a ready-to-paste `markdown` image expression.' It also covers prerequisites, alternatives, immutability, browse/search visibility, and cleanup on failure. Nothing an agent needs to invoke this correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents all six parameters in detail. The description adds useful context around supported file types, the 10 MiB limit, and the return value, but does not materially enrich parameter meaning beyond what the schema already states. Baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States the specific action and resource: 'Upload a local PNG, JPEG, GIF, or WebP ... for inline use in an AKB Markdown document.' It also distinguishes itself from akb_put_file by clarifying this creates 'a hidden document attachment, not a standalone File,' so an agent can tell the two upload tools apart immediately.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit routing guidance: use akb_put for a new document, prefer akb_edit for an existing document, and warns that akb_update 'must never receive only an image fragment.' It also names akb_put_file as the alternative when browse/search visibility is needed, and gives the failure fallback of calling akb_discard_image. This is strong when/when-not guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

akb_relationsA

Get relations for any resource (document, table, or file). Shows same-vault cross-type connections: doc→table, doc→file, table→file, etc. Each row identifies whether it is an explicit link or implicit document-derived edge.

ParametersJSON Schema
NameRequiredDescriptionDefault
uriYesResource URI (akb://vault/doc/path, akb://vault/table/name, akb://vault/file/uuid)
typeNoFilter by relation type (depends_on, related_to, implements, references, attached_to, derived_from)
directionNoboth

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the behavioral burden. It does disclose the scope (same-vault only), the cross-type nature of results, and the explicit/implicit classification per row. It doesn't mention auth needs, rate limits, or potential absence of results, which leaves some transparency gap for a read operation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences, front-loaded with the core purpose, then output details, then the edge-classification nuance. Every sentence contributes value with no filler or repetition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only filtering tool of this complexity, the description covers what the tool returns, the scope, and the key distinction between explicit and implicit links. With no output schema, the description partially explains the return shape. It is complete enough for an agent to call the tool correctly, though a brief note on when no relations are expected would make it fully complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 67%, so the schema already documents uri, type, and direction. The description adds useful context about resource categories ('document, table, or file') but does not explain the semantics of each relation type or direction values beyond what the schema provides. Baseline 3 is appropriate given the moderate coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource scope ('Get relations for any resource (document, table, or file)') and adds differentiating detail: same-vault cross-type connections and explicit vs implicit edges. This sets it apart from siblings like akb_graph and akb_provenance.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied by the description: call this when you need relations for a resource. However, it does not explicitly state when to prefer this tool over related siblings (e.g., akb_graph, akb_provenance) or when not to use it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

akb_revokeA

Revoke a user's vault access. You must be owner or admin. Omit source_key and the person is out of the vault entirely; name one and only that basis is withdrawn, which may downgrade rather than remove.

ParametersJSON Schema
NameRequiredDescriptionDefault
userYesTarget username
vaultYesVault name
revisionNoMonotonic per (vault, user, source); a stale one is a no-op.
source_keyNoWithdraw only this basis. Omit it and EVERY basis goes — an administrator's revoke, which must not leave the person holding rule-given access.
_vault_skill_ackNoOpaque acknowledgement returned as vault_skill.ack_token. After applying that guide, retry the unchanged operation with this value. The bundled proxy supplies it automatically.

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the burden of behavioral disclosure. It reveals the permission requirement, the destructive all-basis behavior when source_key is omitted, and the nuanced 'may downgrade rather than remove' outcome. This is meaningful behavioral context beyond the raw schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two dense sentences deliver the action, permission requirement, and behavioral branch without filler. The most important facts are front-loaded and every phrase earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given rich schema descriptions for all five parameters, the description's permission and mode distinction cover the essential non-schema context. A response/return-value note would help, but the tool remains safely callable with the information provided.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3. The description rephrases the source_key semantics already present in the schema without adding new parameter-level details; it adds operational context rather than parameter meaning.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific action—'Revoke a user's vault access'—and immediately clarifies the two distinct behaviors depending on whether source_key is present. This makes it easy to distinguish from inverse and ownership tools like akb_grant and akb_transfer_ownership.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear operational context: owner/admin is required, and the tool revokes vault access. It does not explicitly name alternatives or when-not-to-use cases, but the coarse-vs-fine-grained revocation distinction is enough for an agent to select it appropriately.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

akb_search_usersA

Search for users by username, display name, or email. Use this to find users before granting vault access.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
queryNoSearch query (name, email, etc.)

TDQS

A4.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided, so description carries full burden. It mentions search fields but lacks details on result format, case sensitivity, or match behavior, adding only basic info beyond the schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, no redundancy, front-loaded with purpose and usage. Every sentence is informative.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Sufficient for a simple search tool, but missing output schema details like return format. Could hint at results (e.g., user IDs) for completeness.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description expands the query parameter's meaning beyond the schema (adding 'username, display name') but doesn't elaborate on limit. For 50% schema coverage, it compensates partially.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states this tool searches for users by username, display name, or email, and distinguishes it from sibling tools like akb_grant and akb_search.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states when to use the tool: before granting vault access, providing clear context and implying when not to use alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

akb_set_publicA

Set vault public access level. Owner only. 'none'=private, 'reader'=public read, 'writer'=public read+write.

ParametersJSON Schema
NameRequiredDescriptionDefault
levelYesPublic access level
vaultYesVault name
_vault_skill_ackNoOpaque acknowledgement returned as vault_skill.ack_token. After applying that guide, retry the unchanged operation with this value. The bundled proxy supplies it automatically.

TDQS

A3.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the burden of behavioral disclosure and does state the ownership restriction plus the precise semantics of each access level. It does not mention reversibility, effects on existing member permissions, or return/error behavior, which is a meaningful gap for a sensitive mutation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single dense sentence that front-loads the verb and resource, then packs ownership and enum semantics into a compact, readable format. Every clause earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple three-parameter setter, the definition supplies the essential context: action, ownership prerequisite, and level consequences, while the schema fully covers parameters including the ack token. Absence of an output schema is acceptable for this kind of mutation, though a note on side effects would push it higher.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, but the description enriches the level parameter by mapping enum values to concrete behavior ('none'=private, 'reader'=public read, 'writer'=public read+write). The vault and ack parameters are adequately documented by the schema itself.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific action on a specific resource ('Set vault public access level') and enumerates the three level meanings. It does not explicitly reference sibling tools like akb_grant or akb_publish, so differentiation is implicit rather than explicit.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Adds a clear prerequisite ('Owner only') and defines each level, making it evident this sets vault-wide public access rather than per-user grants. It doesn't spell out when-not-to-use or name alternatives such as akb_grant or akb_revoke.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

akb_sqlA

Execute SQL on vault tables. Tables are real PostgreSQL tables. Use table names directly (e.g. 'pipeline', 'partners') — they are auto-resolved to the vault's tables. For cross-vault queries, list all vaults in the vaults parameter. Prefix table names with vault name for cross-vault: sales__pipeline, external_projects__partners. SELECT requires reader role. INSERT/UPDATE/DELETE requires writer role. Add a LIMIT to SELECTs unless you truly need every row — the full result set is returned (nothing is silently truncated), so an unbounded SELECT on a large table can send back a very large response.

ParametersJSON Schema
NameRequiredDescriptionDefault
sqlYesSQL query to execute. For large tables, add a LIMIT to cap the rows returned unless you need the full set.
vaultNoSingle vault shorthand (instead of vaults array)
vaultsNoVault names whose tables are referenced (default: single vault)
_vault_skill_ackNoOpaque acknowledgement returned as vault_skill.ack_token. After applying that guide, retry the unchanged operation with this value. The bundled proxy supplies it automatically.

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations present, the description carries the full safety and behavior burden, and it does a solid job: it discloses that tables are real PostgreSQL tables, that SELECT needs a reader role while writes need a writer role, and that results are never silently truncated so unbounded SELECTs can return very large payloads. It does not fully specify behavior around DDL support, transaction/commit semantics, or the exact result shape, which prevents a perfect score.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core purpose, then proceeds logically through naming, cross-vault usage, roles, and the LIMIT warning. Every sentence earns its place, and no information is redundant with the schema. Despite covering multiple important caveats, it is compact and easy to parse.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Considering the moderate complexity of a SQL execution tool with auth, cross-vault, and large-result concerns, the description covers the most operationally critical details well. The main gaps are that it never states whether DDL statements are supported (and if not, which sibling tool to use) and it does not describe the structure of the returned result set, which matters more because there is no output schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema already documents all four parameters, so the baseline is 3, but the description adds meaningful semantics on top: it explains that table names are auto-resolved to vault tables and introduces the sales__pipeline-style prefix convention for the vaults/vault parameters. It also reinforces the LIMIT guidance already present in the sql parameter description. The _vault_skill_ack parameter is not further elaborated beyond the schema, but it is already clearly described there.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a clear verb and resource: 'Execute SQL on vault tables.' It further specifies that these are real PostgreSQL tables and explains table-name resolution, which distinguishes this tool from sibling table-management tools like akb_create_table and akb_drop_table. An agent can immediately tell this is for running queries/DML against vault data rather than for more general data access.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides strong practical context: when to use the vaults parameter, how to prefix table names for cross-vault queries, role requirements for SELECT vs. INSERT/UPDATE/DELETE, and a clear LIMIT instruction to avoid oversized responses. However, it does not explicitly name sibling alternatives or state when not to use this tool (e.g., for DDL or object-level access), so it stops short of full when/when-not guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

akb_transfer_ownershipA

Transfer vault ownership to another user. The current owner or a system admin can do this.

ParametersJSON Schema
NameRequiredDescriptionDefault
vaultYesVault name
new_ownerYesUsername of the new owner
_vault_skill_ackNoOpaque acknowledgement returned as vault_skill.ack_token. After applying that guide, retry the unchanged operation with this value. The bundled proxy supplies it automatically.

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations exist, so the description carries the full disclosure burden. It does add one meaningful behavioral fact — the permission requirement (current owner or system admin). However, it does not disclose what happens to the previous owner after transfer, whether the new owner must already be a vault member, or whether the operation is reversible, all of which are material for a mutation tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences totaling roughly 15 words with the core action front-loaded ('Transfer vault ownership to another user') and the authorization note in a short second sentence. Zero filler; every word earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple two-required-parameter mutation with no output schema and no annotations, the description covers the basic what and who. But it omits the post-transfer state of the previous owner, any prerequisites for the new owner, and the return value — gaps an agent would need to resolve before confidently invoking the tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% (vault = 'Vault name', new_owner = 'Username of the new owner'), so the baseline is 3. The description adds no extra parameter detail beyond what the schema already provides, such as format, lookup behavior, or constraints on the username.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description states a specific verb (Transfer), resource (vault ownership), and destination (another user) in a single crisp sentence. This clearly distinguishes the tool from access-management siblings like akb_grant, akb_revoke, and akb_vault_members, which operate on permissions rather than ownership.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description conveys the authorization context ('The current owner or a system admin can do this'), which tells the agent when the call is permitted. However, it offers no explicit guidance on when to prefer this over related siblings such as akb_grant or akb_vault_members, nor does it state when not to use it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

akb_unpublishA

Remove publication(s). Pass slug to remove one specific publication, OR uri to remove every publication of that document/file resource (handy when re-publishing). table_query publications have no resource URI, so remove them by slug. Returns {deleted: N}.

ParametersJSON Schema
NameRequiredDescriptionDefault
uriNoDocument or file URI — remove every publication tied to that resource.
slugNoPublication slug — remove exactly this publication.
_vault_skill_ackNoOpaque acknowledgement returned as vault_skill.ack_token. After applying that guide, retry the unchanged operation with this value. The bundled proxy supplies it automatically.

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description supplies the behavioral context: the operation is destructive, uri mode is broader than slug mode, table_query publications behave differently, and the return shape is {deleted: N}. It doesn't discuss irreversibility or permissions, but the removal semantics are clearly stated.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences with no filler. The action, parameter choice, edge case, and return value are all packed efficiently, with the core instruction front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description includes the return format, both invocation modes, and the exceptional table_query case, which is sufficient for normal use. It could be slightly more explicit that exactly one of slug or uri is expected, but 'Pass slug ... OR uri' conveys this reasonably.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema already covers all parameters, so the baseline is 3. The description contributes extra meaning by explaining the OR relationship, the resource-wide effect of uri, and the table_query no-URI edge case.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a precise verb and object, 'Remove publication(s)', and immediately distinguishes two scopes: slug for one specific publication, uri for all publications of a resource. This makes the tool's purpose obvious and separates it from sibling publication tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives explicit conditions for choosing slug vs. uri, including the table_query exception ('remove them by slug'). It does not name alternative sibling tools, but the in-tool guidance is unambiguous and practical.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

akb_updateA

Update an existing document. Only provide fields you want to change. The content field replaces the complete Markdown body; never pass a partial fragment such as a newly uploaded image. Use a targeted akb_edit for inline insertion or replacement.

ParametersJSON Schema
NameRequiredDescriptionDefault
uriYesDocument URI
fileNoLocal file path to read as document body (alternative to content). Provide either file or content, not both.
tagsNo
typeNoNew document type
titleNoNew title
domainNoNew document domain
statusNo
contentNoNew document body (replaces existing)
messageNoCommit message describing the change
summaryNo
depends_onNoUpdate the same-vault dependency list (akb:// URIs). Use an ordinary Markdown link in content for a cross-vault reference.
related_toNoUpdate the same-vault related list (akb:// URIs). Use an ordinary Markdown link in content for a cross-vault reference.
expected_commitNoOptional OCC pin — reject if the document current_commit moved.
_vault_skill_ackNoOpaque acknowledgement returned as vault_skill.ack_token. After applying that guide, retry the unchanged operation with this value. The bundled proxy supplies it automatically.
expected_content_hashNoOptional body hash pin — reject if the current document body hash moved.

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full disclosure burden. It clearly warns that `content` replaces the entire Markdown body and should never receive a partial fragment, which is the most important behavioral trap. It does not disclose commit/versioning behavior or failure modes, so it is strong but not exhaustive.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences, front-loaded with the purpose, and every sentence carries operational weight. There is no filler or repetition of schema details.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a mutation tool with 15 parameters, no annotations, and no output schema, the description covers the core usage pitfalls and sibling routing well. It does not explain what the operation returns or the optimistic-concurrency pins, but those are partially described in the schema, so the definition is strong but not fully comprehensive.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 80%, so most parameter semantics already exist in the schema. The description adds real value by explaining the partial-update model ('Only provide fields you want to change') and by clarifying that `content` is a complete replacement, not an incremental edit.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a clear verb and resource: 'Update an existing document'. It also distinguishes itself from the sibling akb_edit by noting that akb_edit is for targeted inline insertion or replacement, which helps an agent pick the right tool.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives concrete usage guidance: only provide fields to change, and use akb_edit for targeted inline edits instead. This explicitly routes the agent to the correct alternative, which is exactly what this dimension asks for.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

akb_update_fileA

Replace the bytes of an existing vault file while preserving its URI. The local file is hashed before transfer; identical content is skipped. Pass expected_content_hash and/or expected_version from akb_get_file to reject stale writes with HTTP 409 instead of overwriting a concurrent change.

ParametersJSON Schema
NameRequiredDescriptionDefault
uriYesExisting file URI (`akb://{vault}[/coll/{path}]/file/{uuid}`)
file_pathYesAbsolute path to the local replacement file
mime_typeNoOptional replacement MIME type. The existing file type is preserved when omitted.
_vault_skill_ackNoOpaque acknowledgement from vault_skill.ack_token. Apply the guide, then retry the unchanged operation with this value. The bundled proxy fills it on an exact retry.
expected_versionNoOptional opaque `version` returned by akb_get_file; stale values are rejected with 409
expected_content_hashNoOptional sha256 returned by akb_get_file; stale values are rejected with 409

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations to supply a safety or side-effect profile, the description carries this burden and does so well: the local file is hashed before transfer, identical content is skipped, URI is preserved, and stale writes are rejected with HTTP 409 rather than overwriting. This makes the tool's mutation semantics and failure mode transparent.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences, front-loaded with the core operation, then behavioral and concurrency guidance. Every sentence carries distinct information and there is no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a six-parameter mutating tool with no output schema and no annotations, the description is nearly complete: it explains the operation, skip behavior, and 409 conflict handling. It does not describe the return value or mention permissions, but these are secondary to correct invocation and the schema covers all parameters.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and each parameter already has a solid description, so the description does not need to repeat definitions. It adds value by explaining the workflow rationale behind expected_content_hash and expected_version (concurrency protection from akb_get_file) and by noting that identical content is skipped, which clarifies the role of file_path.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a concrete action and resource: 'Replace the bytes of an existing vault file while preserving its URI.' This distinguishes it from file creation or URI-changing tools like akb_put_file and akb_move, so an agent can tell what it is for without opening a schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives clear context by stressing the target is an existing file whose URI is preserved. It also instructs when to use the optimistic-concurrency parameters ('Pass expected_content_hash and/or expected_version from akb_get_file to reject stale writes'), but it does not explicitly name sibling tools for alternative cases such as creating a new file or updating metadata.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

akb_vault_infoA

Get detailed vault information: owner, member count, document/table/file/edge counts, last activity.

ParametersJSON Schema
NameRequiredDescriptionDefault
vaultYesVault name

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries full burden. It indicates a read operation returning counts and last activity, but does not explicitly state it is read-only, required permissions, or behavior for missing vaults. This is adequate but leaves minor gaps.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single sentence that efficiently lists key outputs without unnecessary words. It is front-loaded with the core purpose and specific details.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's simplicity (one parameter, no output schema), the description is fairly complete, listing returned fields. It lacks information on error handling or permissions, but for an info retrieval tool, this is sufficient.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema description coverage is 100% for the single 'vault' parameter. The description adds no additional semantic information about the parameter beyond what the schema already provides, which is baseline acceptable.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool retrieves detailed vault information, listing specific data points like owner, member count, and file counts. This distinguishes it from sibling tools such as akb_list_vaults (which lists vaults without details) and akb_vault_members (focused solely on members).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage for obtaining detailed stats on a single vault, contrasted with siblings like akb_list_vaults for overview. However, it does not explicitly state when not to use this tool or mention alternatives for member-specific or activity-specific queries.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

akb_vault_membersA

List all members of a vault with their roles (owner, admin, writer, reader).

ParametersJSON Schema
NameRequiredDescriptionDefault
vaultYesVault name

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided, so description carries full burden. It explicitly states it is a read-only listing operation with roles, which is transparent. It does not disclose permissions or pagination, but for a simple list tool, this is sufficient.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Single sentence, no redundant words, front-loaded with action and resource. Highly efficient.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's simplicity (single parameter, no output schema, straightforward purpose), the description fully covers necessary context. Sibling tools provide alternatives but do not require additional detail here.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% (vault parameter described as 'Vault name'). Description adds no new semantics beyond restating that it lists members for a vault. Baseline of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description clearly states the action 'list' and the resource 'members of a vault', specifying the roles (owner, admin, writer, reader). This directly distinguishes it from sibling tools like akb_list_vaults (lists vaults) and akb_vault_info (vault metadata).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied (when you need to list members of a vault), but no explicit guidance on when not to use or alternatives. For example, adding members would require akb_grant, and listing vaults would use akb_list_vaults, but these are not mentioned.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

akb_whoamiA

Get your current profile — username, email, display name, role. Use this to check who you are authenticated as.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden. It implies a read operation without side effects, but does not disclose any additional behavioral traits. For a simple profile check, this is adequate but minimal.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single, concise sentence with an action verb and context. Perfectly front-loaded and efficient.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given zero parameters and no output schema, the description fully captures the tool's behavior and use case. No gaps remain.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

No parameters, so schema coverage is 100%. The description adds value by enumerating the profile fields returned, providing meaning beyond the empty schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool gets your current profile and lists specific fields (username, email, display name, role). This is distinct from sibling tools like akb_search_users or akb_grant, which deal with other users or permissions.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says 'Use this to check who you are authenticated as,' providing clear context. While it doesn't list exclusions or alternatives, the purpose is self-contained and obvious.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.

  1. 33 tool updatesv2.0.14
    • Changedakb_alter_table11 fields changed
      • addedInput schema / properties / _vault_skill_ack
        Added value: +{
        +  "description": "Opaque acknowledgement returned as vault_skill.ack_token. After applying that guide, retry the unchanged operation with this value. The bundled proxy supplies it automatically.",
        +  "maxLength": 128,
        +  "type": "string"
        +}
      • addedInput schema / properties / add_columns / items / properties / check
        Added value: +{
        +  "type": "object"
        +}
      • addedInput schema / properties / add_columns / items / properties / default
        Added value: +{}
      • addedInput schema / properties / add_columns / items / properties / enum
        Added value: +{
        +  "type": "array"
        +}
      • addedInput schema / properties / add_columns / items / properties / index
        Added value: +{
        +  "type": "boolean"
        +}
      • addedInput schema / properties / add_columns / items / properties / on_delete
        Added value: +{
        +  "type": "string"
        +}
      • addedInput schema / properties / add_columns / items / properties / references
        Added value: +{
        +  "type": "object"
        +}
      • addedInput schema / properties / add_columns / items / properties / required
        Added value: +{
        +  "type": "boolean"
        +}
      • changedInput schema / properties / add_columns / items / properties / type / enum
        Previous value: -[
        -  "text",
        -  "number",
        -  "boolean",
        -  "date",
        -  "json"
        -]New value: +[
        +  "text",
        +  "int",
        +  "float",
        +  "numeric",
        +  "number",
        +  "boolean",
        +  "uuid",
        +  "date",
        +  "timestamp",
        +  "jsonb",
        +  "json",
        +  "text[]",
        +  "enum"
        +]
      • addedInput schema / properties / add_columns / items / properties / unique
        Added value: +{
        +  "type": "boolean"
        +}
      • addedInput schema / properties / alter_columns
        Added value: +{
        +  "description": "Rich column ops: [{name, set_default?, drop_default?, set_check?, drop_check?, set_not_null?, drop_not_null?, set_enum?/enum?, rename_enum_values?}]",
        +  "items": {
        +    "type": "object"
        +  },
        +  "type": "array"
        +}
    • Changedakb_archive_vault1 field changed
      • addedInput schema / properties / _vault_skill_ack
        Added value: +{
        +  "description": "Opaque acknowledgement returned as vault_skill.ack_token. After applying that guide, retry the unchanged operation with this value. The bundled proxy supplies it automatically.",
        +  "maxLength": 128,
        +  "type": "string"
        +}
    • Changedakb_browse1 field changed
      • changedInput schema / properties / include_summary / description
        Previous value: -"Include the per-item summary field (default false, drops to keep payload small)."New value: +"Include document, table, and file summaries. Collection summaries and browse-root context are always included."
    • Changedakb_create_collection1 field changed
      • addedInput schema / properties / _vault_skill_ack
        Added value: +{
        +  "description": "Opaque acknowledgement returned as vault_skill.ack_token. After applying that guide, retry the unchanged operation with this value. The bundled proxy supplies it automatically.",
        +  "maxLength": 128,
        +  "type": "string"
        +}
    • Changedakb_create_table2 fields changed
      • addedInput schema / properties / _vault_skill_ack
        Added value: +{
        +  "description": "Opaque acknowledgement returned as vault_skill.ack_token. After applying that guide, retry the unchanged operation with this value. The bundled proxy supplies it automatically.",
        +  "maxLength": 128,
        +  "type": "string"
        +}
      • addedInput schema / properties / if_not_exists
        Added value: +{
        +  "default": false,
        +  "description": "When true, an existing table is NOT an error: returns created=false instead of a 409 conflict. Nothing is altered either way. If you also hold READ access to the vault the response carries the STORED schema plus matches_request and mismatches[], so divergence from your spec is explicit; a write-only credential gets only {kind, name, created, outcome}. Must be a real boolean — the string \"true\" is rejected. Default false keeps the 409.",
        +  "type": "boolean"
        +}
    • Changedakb_create_vault1 field changed
      • addedInput schema / properties / _vault_skill_ack
        Added value: +{
        +  "description": "Opaque acknowledgement returned as vault_skill.ack_token. After applying that guide, retry the unchanged operation with this value. The bundled proxy supplies it automatically.",
        +  "maxLength": 128,
        +  "type": "string"
        +}
    • Changedakb_delete1 field changed
      • addedInput schema / properties / _vault_skill_ack
        Added value: +{
        +  "description": "Opaque acknowledgement returned as vault_skill.ack_token. After applying that guide, retry the unchanged operation with this value. The bundled proxy supplies it automatically.",
        +  "maxLength": 128,
        +  "type": "string"
        +}
    • Changedakb_delete_collection1 field changed
      • addedInput schema / properties / _vault_skill_ack
        Added value: +{
        +  "description": "Opaque acknowledgement returned as vault_skill.ack_token. After applying that guide, retry the unchanged operation with this value. The bundled proxy supplies it automatically.",
        +  "maxLength": 128,
        +  "type": "string"
        +}
    • Changedakb_delete_file1 field changed
      • addedInput schema / properties / _vault_skill_ack
        Added value: +{
        +  "description": "Opaque acknowledgement from vault_skill.ack_token. Apply the guide, then retry the unchanged operation with this value. The bundled proxy fills it on an exact retry.",
        +  "maxLength": 128,
        +  "type": "string"
        +}
    • Changedakb_delete_vault1 field changed
      • addedInput schema / properties / _vault_skill_ack
        Added value: +{
        +  "description": "Opaque acknowledgement returned as vault_skill.ack_token. After applying that guide, retry the unchanged operation with this value. The bundled proxy supplies it automatically.",
        +  "maxLength": 128,
        +  "type": "string"
        +}
    • Addedakb_discard_image
    • Changedakb_drop_table1 field changed
      • addedInput schema / properties / _vault_skill_ack
        Added value: +{
        +  "description": "Opaque acknowledgement returned as vault_skill.ack_token. After applying that guide, retry the unchanged operation with this value. The bundled proxy supplies it automatically.",
        +  "maxLength": 128,
        +  "type": "string"
        +}
    • Changedakb_edit1 field changed
      • addedInput schema / properties / _vault_skill_ack
        Added value: +{
        +  "description": "Opaque acknowledgement returned as vault_skill.ack_token. After applying that guide, retry the unchanged operation with this value. The bundled proxy supplies it automatically.",
        +  "maxLength": 128,
        +  "type": "string"
        +}
    • Addedakb_explain_access
    • Changedakb_grant3 fields changed
      • addedInput schema / properties / _vault_skill_ack
        Added value: +{
        +  "description": "Opaque acknowledgement returned as vault_skill.ack_token. After applying that guide, retry the unchanged operation with this value. The bundled proxy supplies it automatically.",
        +  "maxLength": 128,
        +  "type": "string"
        +}
      • addedInput schema / properties / revision
        Added value: +{
        +  "description": "Monotonic per (vault, user, source). A retry carrying a revision no newer than the stored one is a no-op rather than an overwrite.",
        +  "type": "integer"
        +}
      • addedInput schema / properties / source_key
        Added value: +{
        +  "description": "The basis on which the role is held, as '<namespace>:<id>'. Omit it and the grant is 'direct', which is what every grant was before bases could coexist.",
        +  "type": "string"
        +}
    • Changedakb_grep7 fields changed
      • addedInput schema / properties / _vault_skill_ack
        Added value: +{
        +  "description": "Opaque acknowledgement returned as vault_skill.ack_token. After applying that guide, retry the unchanged operation with this value. The bundled proxy supplies it automatically.",
        +  "maxLength": 128,
        +  "type": "string"
        +}
      • changedInput schema / properties / limit / description
        Previous value: -"Max documents to return"New value: +"Max documents to return; does not limit replacement writes"
      • addedInput schema / properties / max_replacements
        Added value: +{
        +  "default": 50,
        +  "description": "Maximum documents a replace call may rewrite, independent of the response limit. If the full scope matches more documents, the call fails before writing anything. Preview with count_only or files_with_matches, then set this budget to cover the intended scope.",
        +  "maximum": 1000,
        +  "minimum": 1,
        +  "type": "integer"
        +}
      • addedInput schema / properties / measurement_include_text_files
        Added value: +{
        +  "default": false,
        +  "description": "Native mode: include admitted searchable text Files as well as Documents. File results include resource_type=file, their canonical akb:// URI, revision, and content_hash; native results also report payload_placement, the body placement their bytes were read from. Binary Files are never searchable. Rejected unless postgres_native or the exact guarded native measurement backend is active.",
        +  "type": "boolean"
        +}
      • changedInput schema / properties / pattern / description
        Previous value: -"Search pattern. By default matched as literal text (ILIKE) — metacharacters like |, ., *, (), [], +, ? are treated as literal characters. Set regex=true to enable PostgreSQL regex (required for alternation and wildcards)."New value: +"Non-empty search pattern. By default matched as literal text (ILIKE) — metacharacters like |, ., *, (), [], +, ? are treated as literal characters. Set regex=true to enable PostgreSQL regex (required for alternation and wildcards)."
      • addedInput schema / properties / pattern / minLength
        Added value: +1
      • changedInput schema / properties / replace / description
        Previous value: -"Replacement string. If provided, replaces all matches in EVERY matching document across the search scope (git commit + re-index per doc). Supports regex backreferences (\\1, \\2) when regex=true. For precise edits to a single known document, prefer akb_edit instead."New value: +"Replacement string. If provided and the full scope fits max_replacements, replaces all matches in EVERY matching document (git commit + re-index per doc); otherwise writes nothing. Treated literally when regex=false; supports regex backreferences (\\1, \\2) only when regex=true. For precise edits to a single known document, prefer akb_edit instead."
    • Changedakb_help1 field changed
      • changedInput schema / properties / vault / description
        Previous value: -"Vault name. Required for topic='vault-skill' — returns that vault's skill doc body if it exists."New value: +"Vault name. Required for topic='vault-skill' — returns that vault's full skill text (the auto-attached `vault_skill` payload may be truncated). Read-only mirror vaults have no skill; a fallback guide is returned instead."
    • Changedakb_import1 field changed
      • addedInput schema / properties / _vault_skill_ack
        Added value: +{
        +  "description": "Opaque acknowledgement returned as vault_skill.ack_token. After applying that guide, retry the unchanged operation with this value. The bundled proxy supplies it automatically.",
        +  "maxLength": 128,
        +  "type": "string"
        +}
    • Changedakb_link1 field changed
      • addedInput schema / properties / _vault_skill_ack
        Added value: +{
        +  "description": "Opaque acknowledgement returned as vault_skill.ack_token. After applying that guide, retry the unchanged operation with this value. The bundled proxy supplies it automatically.",
        +  "maxLength": 128,
        +  "type": "string"
        +}
    • Changedakb_move1 field changed
      • addedInput schema / properties / _vault_skill_ack
        Added value: +{
        +  "description": "Opaque acknowledgement returned as vault_skill.ack_token. After applying that guide, retry the unchanged operation with this value. The bundled proxy supplies it automatically.",
        +  "maxLength": 128,
        +  "type": "string"
        +}
    • Changedakb_publication_snapshot1 field changed
      • addedInput schema / properties / _vault_skill_ack
        Added value: +{
        +  "description": "Opaque acknowledgement returned as vault_skill.ack_token. After applying that guide, retry the unchanged operation with this value. The bundled proxy supplies it automatically.",
        +  "maxLength": 128,
        +  "type": "string"
        +}
    • Changedakb_publish1 field changed
      • addedInput schema / properties / _vault_skill_ack
        Added value: +{
        +  "description": "Opaque acknowledgement returned as vault_skill.ack_token. After applying that guide, retry the unchanged operation with this value. The bundled proxy supplies it automatically.",
        +  "maxLength": 128,
        +  "type": "string"
        +}
    • Changedakb_put5 fields changed
      • addedInput schema / properties / _vault_skill_ack
        Added value: +{
        +  "description": "Opaque acknowledgement returned as vault_skill.ack_token. After applying that guide, retry the unchanged operation with this value. The bundled proxy supplies it automatically.",
        +  "maxLength": 128,
        +  "type": "string"
        +}
      • changedInput schema / properties / collection / description
        Previous value: -"Collection (directory) path, e.g. 'api-specs' or 'meeting-notes'. Ignored when `parent` is given."New value: +"Collection (directory) path, e.g. 'api-specs' or 'meeting-notes'. Ignored when `parent` is given. 'overview' is a reserved system collection (vault-skill only)."
      • changedInput schema / properties / depends_on / description
        Previous value: -"akb:// URIs this depends on"New value: +"Same-vault akb:// URIs this depends on. Use an ordinary Markdown link for a cross-vault reference."
      • changedInput schema / properties / related_to / description
        Previous value: -"akb:// URIs of related resources"New value: +"Same-vault akb:// URIs of related resources. Use an ordinary Markdown link for a cross-vault reference."
      • changedInput schema / properties / type / description
        Previous value: -"Document type. Free-form — any string is accepted. Recommended vocabulary: note (default), report, decision, spec, plan, session, task, reference, skill. Use a custom value when none fit (e.g. an OKF concept type)."New value: +"Document type. Free-form — any string is accepted, EXCEPT 'skill', which is reserved for the system-managed vault-skill document. Recommended vocabulary: note (default), report, decision, spec, plan, session, task, reference. Use a custom value when none fit (e.g. an OKF concept type)."
    • Changedakb_put_file1 field changed
      • addedInput schema / properties / _vault_skill_ack
        Added value: +{
        +  "description": "Opaque acknowledgement from vault_skill.ack_token. Apply the guide, then retry the unchanged operation with this value. The bundled proxy fills it on an exact retry.",
        +  "maxLength": 128,
        +  "type": "string"
        +}
    • Addedakb_put_image
    • Changedakb_revoke3 fields changed
      • addedInput schema / properties / _vault_skill_ack
        Added value: +{
        +  "description": "Opaque acknowledgement returned as vault_skill.ack_token. After applying that guide, retry the unchanged operation with this value. The bundled proxy supplies it automatically.",
        +  "maxLength": 128,
        +  "type": "string"
        +}
      • addedInput schema / properties / revision
        Added value: +{
        +  "description": "Monotonic per (vault, user, source); a stale one is a no-op.",
        +  "type": "integer"
        +}
      • addedInput schema / properties / source_key
        Added value: +{
        +  "description": "Withdraw only this basis. Omit it and EVERY basis goes — an administrator's revoke, which must not leave the person holding rule-given access.",
        +  "type": "string"
        +}
    • Changedakb_set_public1 field changed
      • addedInput schema / properties / _vault_skill_ack
        Added value: +{
        +  "description": "Opaque acknowledgement returned as vault_skill.ack_token. After applying that guide, retry the unchanged operation with this value. The bundled proxy supplies it automatically.",
        +  "maxLength": 128,
        +  "type": "string"
        +}
    • Changedakb_sql2 fields changed
      • addedInput schema / properties / _vault_skill_ack
        Added value: +{
        +  "description": "Opaque acknowledgement returned as vault_skill.ack_token. After applying that guide, retry the unchanged operation with this value. The bundled proxy supplies it automatically.",
        +  "maxLength": 128,
        +  "type": "string"
        +}
      • changedInput schema / properties / sql / description
        Previous value: -"SQL query to execute"New value: +"SQL query to execute. For large tables, add a LIMIT to cap the rows returned unless you need the full set."
    • Changedakb_transfer_ownership1 field changed
      • addedInput schema / properties / _vault_skill_ack
        Added value: +{
        +  "description": "Opaque acknowledgement returned as vault_skill.ack_token. After applying that guide, retry the unchanged operation with this value. The bundled proxy supplies it automatically.",
        +  "maxLength": 128,
        +  "type": "string"
        +}
    • Changedakb_unlink2 fields changed
      • addedInput schema / properties / _vault_skill_ack
        Added value: +{
        +  "description": "Opaque acknowledgement returned as vault_skill.ack_token. After applying that guide, retry the unchanged operation with this value. The bundled proxy supplies it automatically.",
        +  "maxLength": 128,
        +  "type": "string"
        +}
      • changedInput schema / properties / relation / description
        Previous value: -"Specific relation type to remove, one of: depends_on, related_to, implements, references, attached_to, derived_from (omit to remove all)"New value: +"Specific explicit relation type to remove, one of: depends_on, related_to, implements, references, attached_to, derived_from (omit to remove all explicit relations)"
    • Changedakb_unpublish1 field changed
      • addedInput schema / properties / _vault_skill_ack
        Added value: +{
        +  "description": "Opaque acknowledgement returned as vault_skill.ack_token. After applying that guide, retry the unchanged operation with this value. The bundled proxy supplies it automatically.",
        +  "maxLength": 128,
        +  "type": "string"
        +}
    • Changedakb_update5 fields changed
      • addedInput schema / properties / _vault_skill_ack
        Added value: +{
        +  "description": "Opaque acknowledgement returned as vault_skill.ack_token. After applying that guide, retry the unchanged operation with this value. The bundled proxy supplies it automatically.",
        +  "maxLength": 128,
        +  "type": "string"
        +}
      • changedInput schema / properties / depends_on / description
        Previous value: -"Update dependency list (akb:// URIs)"New value: +"Update the same-vault dependency list (akb:// URIs). Use an ordinary Markdown link in content for a cross-vault reference."
      • addedInput schema / properties / domain
        Added value: +{
        +  "description": "New document domain",
        +  "type": "string"
        +}
      • changedInput schema / properties / related_to / description
        Previous value: -"Update related list (akb:// URIs)"New value: +"Update the same-vault related list (akb:// URIs). Use an ordinary Markdown link in content for a cross-vault reference."
      • addedInput schema / properties / type
        Added value: +{
        +  "description": "New document type",
        +  "type": "string"
        +}
    • Addedakb_update_file
  2. 7 tool updatesv2.0.13
    • Changedakb_alter_table4 fields changed
      • addedInput schema / properties / add_indexes
        Added value: +{
        +  "description": "Lookup indexes to add: [{name?, columns}]. A column is a bare string or {name, order} (order 'asc'|'desc').",
        +  "items": {
        +    "properties": {
        +      "columns": {
        +        "items": {
        +          "oneOf": [
        +            {
        +              "type": "string"
        +            },
        +            {
        +              "properties": {
        +                "name": {
        +                  "type": "string"
        +                },
        +                "order": {
        +                  "enum": [
        +                    "asc",
        +                    "desc"
        +                  ],
        +                  "type": "string"
        +                }
        +              },
        +              "required": [
        +                "name"
        +              ],
        +              "type": "object"
        +            }
        +          ]
        +        },
        +        "minItems": 1,
        +        "type": "array"
        +      },
        +      "name": {
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "columns"
        +    ],
        +    "type": "object"
        +  },
        +  "type": "array"
        +}
      • addedInput schema / properties / add_unique_keys
        Added value: +{
        +  "description": "UNIQUE keys to add: [{name?, columns}]. Adding a key on a table with existing data preflights for duplicate rows and fails before any DDL if any are found.",
        +  "items": {
        +    "properties": {
        +      "columns": {
        +        "items": {
        +          "type": "string"
        +        },
        +        "minItems": 1,
        +        "type": "array"
        +      },
        +      "name": {
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "columns"
        +    ],
        +    "type": "object"
        +  },
        +  "type": "array"
        +}
      • addedInput schema / properties / drop_indexes
        Added value: +{
        +  "description": "Index names to drop (as shown in indexes metadata).",
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • addedInput schema / properties / drop_unique_keys
        Added value: +{
        +  "description": "UNIQUE-key names to drop (as shown in unique_keys metadata).",
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
    • Changedakb_create_table2 fields changed
      • addedInput schema / properties / indexes
        Added value: +{
        +  "description": "Declarative lookup (btree) indexes. Each item is {name?, columns}. A column is a bare string or {name, order} where order is 'asc' (default) or 'desc'. Unique indexes are expressed via `unique_keys`, not here.",
        +  "items": {
        +    "properties": {
        +      "columns": {
        +        "items": {
        +          "oneOf": [
        +            {
        +              "type": "string"
        +            },
        +            {
        +              "properties": {
        +                "name": {
        +                  "type": "string"
        +                },
        +                "order": {
        +                  "enum": [
        +                    "asc",
        +                    "desc"
        +                  ],
        +                  "type": "string"
        +                }
        +              },
        +              "required": [
        +                "name"
        +              ],
        +              "type": "object"
        +            }
        +          ]
        +        },
        +        "minItems": 1,
        +        "type": "array"
        +      },
        +      "name": {
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "columns"
        +    ],
        +    "type": "object"
        +  },
        +  "type": "array"
        +}
      • addedInput schema / properties / unique_keys
        Added value: +{
        +  "description": "Declarative UNIQUE keys. Each item is {name?, columns}. `columns` is a list of existing column names (single or composite). `name` is optional — when omitted AKB generates a deterministic, stable name. Use this (not `indexes`) for unique indexes.",
        +  "items": {
        +    "properties": {
        +      "columns": {
        +        "items": {
        +          "type": "string"
        +        },
        +        "minItems": 1,
        +        "type": "array"
        +      },
        +      "name": {
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "columns"
        +    ],
        +    "type": "object"
        +  },
        +  "type": "array"
        +}
    • Addedakb_export
    • Addedakb_import
    • Addedakb_move
    • Changedakb_put3 fields changed
      • addedInput schema / properties / slug
        Added value: +{
        +  "description": "Optional explicit slug for the document filename. When stored under a collection the URI is `akb://{vault}/coll/{collection}/doc/{slug}.md`; at the vault root it is `akb://{vault}/doc/{slug}.md`. When omitted, the slug is derived from the title. Pass it to keep the path stable and meaningful when the title is friendly, changeable text (e.g. slug `github-issue-123` with a human-readable title).",
        +  "type": "string"
        +}
      • changedInput schema / properties / type / description
        Previous value: -"Document type"New value: +"Document type. Free-form — any string is accepted. Recommended vocabulary: note (default), report, decision, spec, plan, session, task, reference, skill. Use a custom value when none fit (e.g. an OKF concept type)."
      • removedInput schema / properties / type / enum
        Removed value: -[
        -  "note",
        -  "report",
        -  "decision",
        -  "spec",
        -  "plan",
        -  "session",
        -  "task",
        -  "reference",
        -  "skill"
        -]
    • Changedakb_search2 fields changed
      • changedInput schema / properties / type / description
        Previous value: -"Filter by document type"New value: +"Filter by document type (any string). Common values: note, report, decision, spec, plan, session, task, reference, skill."
      • removedInput schema / properties / type / enum
        Removed value: -[
        -  "note",
        -  "report",
        -  "decision",
        -  "spec",
        -  "plan",
        -  "session",
        -  "task",
        -  "reference",
        -  "skill"
        -]
  3. 3 tool updatesv2.0.8
    • Changedakb_relations1 field changed
      • changedInput schema / properties / type / description
        Previous value: -"Filter by relation type (depends_on, related_to, implements, references, attached_to)"New value: +"Filter by relation type (depends_on, related_to, implements, references, attached_to, derived_from)"
    • Changedakb_search1 field changed
      • addedInput schema / properties / source_uris
        Added value: +{
        +  "description": "Restrict the search to a specific set of already-known resources by their canonical akb:// URIs (e.g. from a previous akb_search / akb_browse). Hybrid retrieval (dense + BM25 + ranking) runs only inside this set, intersected with the other filters and your access. Omit for the normal whole-vault search.",
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
    • Changedakb_unlink2 fields changed
      • changedInput schema / properties / relation / description
        Previous value: -"Specific relation type to remove (omit to remove all)"New value: +"Specific relation type to remove, one of: depends_on, related_to, implements, references, attached_to, derived_from (omit to remove all)"
      • addedInput schema / properties / relation / enum
        Added value: +[
        +  "depends_on",
        +  "related_to",
        +  "implements",
        +  "references",
        +  "attached_to",
        +  "derived_from"
        +]
  4. 17 tool updatesv2.0.7
    • Changedakb_alter_table1 field changed
      • changedInput schema / properties / uri / description
        Previous value: -"Table URI (akb://{vault}/table/{name})"New value: +"Table URI — akb://{vault}[/coll/{coll_path}]/table/{name}"
    • Changedakb_browse10 fields changed
      • changedInput schema / properties / collection / description
        Previous value: -"Collection path to browse into (omit for top-level)"New value: +"Collection path to use as the browse root (omit for vault root). Ignored when `uri` is given."
      • changedInput schema / properties / depth / description
        Previous value: -"1=collections only, 2=collections+documents"New value: +"Tree depth from the browse root. 0 = direct children only (no descent into any collection). N = descend N collection levels. -1 = unbounded (entire subtree). Collections themselves are always emitted regardless of depth."
      • removedInput schema / properties / depth / maximum
        Removed value: -2
      • changedInput schema / properties / depth / minimum
        Previous value: -1New value: +-1
      • addedInput schema / properties / include_archived
        Added value: +{
        +  "default": false,
        +  "description": "Include archived documents. Default false — `status: archived` docs are hidden from browse.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / include_hashes
        Added value: +{
        +  "description": "Include AKB-certified content_hash/hash_algorithm and resource version fields for documents/files.",
        +  "type": "boolean"
        +}
      • removedInput schema / properties / query
        Removed value: -{
        -  "description": "DEPRECATED alias for `filter`. Use `filter` in new code.",
        -  "type": "string"
        -}
      • addedInput schema / properties / uri
        Added value: +{
        +  "description": "Canonical browse target: `akb://{vault}` (vault root) or `akb://{vault}/coll/{path}` (collection-scoped). Takes precedence over `vault` + `collection` when both are given.",
        +  "type": "string"
        +}
      • changedInput schema / properties / vault / description
        Previous value: -"Vault name"New value: +"Vault name. Required unless `uri` is given."
      • removedInput schema / required
        Removed value: -[
        -  "vault"
        -]
    • Changedakb_create_table4 fields changed
      • changedInput schema / properties / collection / description
        Previous value: -"Collection path (e.g. 'specs' or 'sessions/learnings'). Omit for vault root."New value: +"Collection path (e.g. 'specs' or 'sessions/learnings'). Omit for vault root. Ignored when `parent` is given."
      • addedInput schema / properties / parent
        Added value: +{
        +  "description": "Parent location as a canonical URI — `akb://{vault}` for the vault root, `akb://{vault}/coll/{path}` for a collection. When given, the table is created there and `vault`/`collection` are derived from the URI.",
        +  "type": "string"
        +}
      • addedInput schema / properties / vault / description
        Added value: +"Target vault name. Required unless `parent` is given."
      • changedInput schema / required
        Previous value: -[
        -  "vault",
        -  "name",
        -  "columns"
        -]New value: +[
        +  "name",
        +  "columns"
        +]
    • Changedakb_drop_table1 field changed
      • changedInput schema / properties / uri / description
        Previous value: -"Table URI (akb://{vault}/table/{name})"New value: +"Table URI — akb://{vault}[/coll/{coll_path}]/table/{name}"
    • Removedakb_forget
    • Changedakb_get1 field changed
      • changedInput schema / properties / uri / description
        Previous value: -"Document URI (akb://{vault}/doc/{path})"New value: +"Document URI — akb://{vault}[/coll/{coll_path}]/doc/{filename}"
    • Changedakb_graph2 fields changed
      • removedInput schema / properties / depth
        Removed value: -{
        -  "default": 2,
        -  "description": "BFS depth",
        -  "maximum": 5,
        -  "minimum": 1,
        -  "type": "integer"
        -}
      • addedInput schema / properties / hops
        Added value: +{
        +  "default": 2,
        +  "description": "BFS traversal radius in edge hops. Disambiguated from `akb_browse.depth` (which is collection-tree depth) — hops here counts relations followed, not folder levels.",
        +  "maximum": 5,
        +  "minimum": 1,
        +  "type": "integer"
        +}
    • Changedakb_help1 field changed
      • changedInput schema / properties / topic / description
        Previous value: -"What to get help on. Options: categories (quickstart, documents, search, tables, access, memory, sessions, publishing), tool names (akb_put, akb_search, etc.), or workflow names (link-documents, research, onboarding, data-tracking)"New value: +"What to get help on. Options: categories (quickstart, documents, search, tables, files, access, history, publishing, relations), tool names (akb_put, akb_search, etc.), or workflow names (link-resources, research, onboarding, data-tracking, vault-skill)"
    • Changedakb_list_vaults1 field changed
      • removedInput schema / properties / query
        Removed value: -{
        -  "description": "DEPRECATED alias for `filter`. Use `filter` in new code.",
        -  "type": "string"
        -}
    • Changedakb_publication_snapshot2 fields changed
      • removedInput schema / properties / vault
        Removed value: -{
        -  "description": "Vault name",
        -  "type": "string"
        -}
      • changedInput schema / required
        Previous value: -[
        -  "vault",
        -  "slug"
        -]New value: +[
        +  "slug"
        +]
    • Changedakb_publish14 fields changed
      • changedInput schema / properties / allow_embed / description
        Previous value: -"Whether the share can be embedded via iframe/oEmbed"New value: +"Allow the share to be embedded via iframe/oEmbed."
      • changedInput schema / properties / expires_in / description
        Previous value: -"Expiration: '1h', '7d', '30d', or 'never' (default)"New value: +"Expiration window: '1h', '7d', '30d', or 'never' (default)."
      • changedInput schema / properties / max_views / description
        Previous value: -"Auto-expire after N views"New value: +"Auto-expire after N views."
      • removedInput schema / properties / mode
        Removed value: -{
        -  "default": "live",
        -  "description": "live=query each request, snapshot=cache result in S3",
        -  "enum": [
        -    "live",
        -    "snapshot"
        -  ],
        -  "type": "string"
        -}
      • changedInput schema / properties / password / description
        Previous value: -"Password to protect the share"New value: +"Require this password to view the share."
      • changedInput schema / properties / query_params / description
        Previous value: -"Parameter declarations: {name: {type, default, required}}"New value: +"Parameter declarations: {name: {type, default, required}}. resource_type=table_query only."
      • changedInput schema / properties / query_sql / description
        Previous value: -"SELECT SQL with :param placeholders (for resource_type=table_query)"New value: +"SELECT/WITH SQL with :param placeholders. resource_type=table_query only."
      • changedInput schema / properties / query_vault_names / description
        Previous value: -"Vaults referenced by the query (defaults to [vault])"New value: +"Vaults the query reads from. Defaults to [vault]. resource_type=table_query only."
      • changedInput schema / properties / resource_type / description
        Previous value: -"Type of resource to share. For document/file, also pass uri. For table_query, pass query_sql + vault."New value: +"Kind of resource. document/file → pass `uri`. table_query → pass `query_sql` + `vault`."
      • removedInput schema / properties / section
        Removed value: -{
        -  "description": "(document) Filter to a specific heading section",
        -  "type": "string"
        -}
      • addedInput schema / properties / section_filter
        Added value: +{
        +  "description": "Filter to a specific heading section. resource_type=document only.",
        +  "type": "string"
        +}
      • changedInput schema / properties / title / description
        Previous value: -"Override display title"New value: +"Override the display title (defaults to the resource's own title)."
      • changedInput schema / properties / uri / description
        Previous value: -"Resource URI to publish (document or file). Omit for table_query."New value: +"Resource URI to publish — required when resource_type is document or file. Omit for table_query."
      • changedInput schema / properties / vault / description
        Previous value: -"Vault name (required for resource_type=table_query)"New value: +"Vault name. Required only for resource_type=table_query (doc/file vault is inferred from the URI)."
    • Changedakb_put5 fields changed
      • changedInput schema / properties / collection / description
        Previous value: -"Collection (directory) path, e.g. 'api-specs' or 'meeting-notes'"New value: +"Collection (directory) path, e.g. 'api-specs' or 'meeting-notes'. Ignored when `parent` is given."
      • addedInput schema / properties / parent
        Added value: +{
        +  "description": "Parent location as a canonical URI — `akb://{vault}` for the vault root, `akb://{vault}/coll/{path}` for a collection. When given, the doc is placed there and `vault`/`collection` are derived from the URI. Use this in drill-down chains: paste the `uri` from an `akb_browse` response straight back in.",
        +  "type": "string"
        +}
      • addedInput schema / properties / status
        Added value: +{
        +  "default": "draft",
        +  "description": "Lifecycle status. Defaults to 'draft'; pass 'active' to publish on create instead of promoting later with akb_update. Descriptive metadata only — it does not gate search, browse, or access.",
        +  "enum": [
        +    "draft",
        +    "active",
        +    "archived"
        +  ],
        +  "type": "string"
        +}
      • changedInput schema / properties / vault / description
        Previous value: -"Target vault name"New value: +"Target vault name. Required unless `parent` is given."
      • changedInput schema / required
        Previous value: -[
        -  "vault",
        -  "collection",
        -  "title",
        -  "content"
        -]New value: +[
        +  "title",
        +  "content"
        +]
    • Removedakb_recall
    • Removedakb_remember
    • Changedakb_search1 field changed
      • addedInput schema / properties / include_archived
        Added value: +{
        +  "default": false,
        +  "description": "Include archived documents. Default false — `status: archived` docs are hidden from search.",
        +  "type": "boolean"
        +}
    • Changedakb_unpublish2 fields changed
      • changedInput schema / properties / slug / description
        Previous value: -"Publication slug — deletes that specific publication"New value: +"Publication slug — remove exactly this publication."
      • changedInput schema / properties / uri / description
        Previous value: -"Resource URI — deletes all publications for this resource"New value: +"Document or file URI — remove every publication tied to that resource."
    • Changedakb_update3 fields changed
      • addedInput schema / properties / expected_commit
        Added value: +{
        +  "description": "Optional OCC pin — reject if the document current_commit moved.",
        +  "type": "string"
        +}
      • addedInput schema / properties / expected_content_hash
        Added value: +{
        +  "description": "Optional body hash pin — reject if the current document body hash moved.",
        +  "type": "string"
        +}
      • changedInput schema / properties / status / enum
        Previous value: -[
        -  "draft",
        -  "active",
        -  "archived",
        -  "superseded"
        -]New value: +[
        +  "draft",
        +  "active",
        +  "archived"
        +]
  5. 1 tool updatev2.0.6
    • Changedakb_put_file4 fields changed
      • changedInput schema / properties / collection / description
        Previous value: -"Logical grouping (like document collections)"New value: +"Logical grouping (like document collections). Ignored when `parent` is given."
      • addedInput schema / properties / parent
        Added value: +{
        +  "description": "Parent location as a canonical URI — `akb://{vault}` for the vault root, `akb://{vault}/coll/{path}` for a collection. When given, the file is uploaded there and `vault`/`collection` are derived from the URI.",
        +  "type": "string"
        +}
      • changedInput schema / properties / vault / description
        Previous value: -"Vault name (new files are not URI-addressable yet, so the placement vault is named explicitly)"New value: +"Vault name. Required unless `parent` is given."
      • changedInput schema / required
        Previous value: -[
        -  "vault",
        -  "file_path"
        -]New value: +[
        +  "file_path"
        +]
  6. 46 tool updatesv2.0.4
    • Addedakb_activity
    • Addedakb_alter_table
    • Addedakb_archive_vault
    • Addedakb_browse
    • Addedakb_create_collection
    • Addedakb_create_table
    • Addedakb_create_vault
    • Addedakb_delete
    • Addedakb_delete_collection
    • Addedakb_delete_file
    • Addedakb_delete_vault
    • Addedakb_diff
    • Addedakb_drill_down
    • Addedakb_drop_table
    • Addedakb_edit
    • Addedakb_forget
    • Addedakb_get
    • Addedakb_get_file
    • Addedakb_grant
    • Addedakb_graph
    • Addedakb_grep
    • Addedakb_help
    • Addedakb_history
    • Addedakb_link
    • Addedakb_list_vaults
    • Addedakb_provenance
    • Addedakb_publication_snapshot
    • Addedakb_publications
    • Addedakb_publish
    • Addedakb_put
    • Addedakb_put_file
    • Addedakb_recall
    • Addedakb_relations
    • Addedakb_remember
    • Addedakb_revoke
    • Addedakb_search
    • Addedakb_search_users
    • Addedakb_set_public
    • Addedakb_sql
    • Addedakb_transfer_ownership
    • Addedakb_unlink
    • Addedakb_unpublish
    • Addedakb_update
    • Addedakb_vault_info
    • Addedakb_vault_members
    • Addedakb_whoami
  7. 52 tool updatesv2.0.1
    • Removedakb_activity
    • Removedakb_alter_table
    • Removedakb_archive_vault
    • Removedakb_browse
    • Removedakb_create_collection
    • Removedakb_create_table
    • Removedakb_create_vault
    • Removedakb_delete
    • Removedakb_delete_collection
    • Removedakb_delete_file
    • Removedakb_delete_vault
    • Removedakb_diff
    • Removedakb_drill_down
    • Removedakb_drop_table
    • Removedakb_edit
    • Removedakb_forget
    • Removedakb_get
    • Removedakb_get_file
    • Removedakb_grant
    • Removedakb_graph
    • Removedakb_grep
    • Removedakb_help
    • Removedakb_history
    • Removedakb_link
    • Removedakb_list_vaults
    • Removedakb_provenance
    • Removedakb_publication_snapshot
    • Removedakb_publications
    • Removedakb_publish
    • Removedakb_put
    • Removedakb_put_file
    • Removedakb_recall
    • Removedakb_relations
    • Removedakb_remember
    • Removedakb_revoke
    • Removedakb_search
    • Removedakb_search_users
    • Removedakb_session_end
    • Removedakb_session_start
    • Removedakb_set_public
    • Removedakb_sql
    • Removedakb_todo
    • Removedakb_todo_update
    • Removedakb_todos
    • Removedakb_transfer_ownership
    • Removedakb_unlink
    • Removedakb_unpublish
    • Removedakb_update
    • Removedakb_update_profile
    • Removedakb_vault_info
    • Removedakb_vault_members
    • Removedakb_whoami
  8. 52 tool updatesv0.1.0
    • First observedakb_activity
    • First observedakb_alter_table
    • First observedakb_archive_vault
    • First observedakb_browse
    • First observedakb_create_collection
    • First observedakb_create_table
    • First observedakb_create_vault
    • First observedakb_delete
    • First observedakb_delete_collection
    • First observedakb_delete_file
    • First observedakb_delete_vault
    • First observedakb_diff
    • First observedakb_drill_down
    • First observedakb_drop_table
    • First observedakb_edit
    • First observedakb_forget
    • First observedakb_get
    • First observedakb_get_file
    • First observedakb_grant
    • First observedakb_graph
    • First observedakb_grep
    • First observedakb_help
    • First observedakb_history
    • First observedakb_link
    • First observedakb_list_vaults
    • First observedakb_provenance
    • First observedakb_publication_snapshot
    • First observedakb_publications
    • First observedakb_publish
    • First observedakb_put
    • First observedakb_put_file
    • First observedakb_recall
    • First observedakb_relations
    • First observedakb_remember
    • First observedakb_revoke
    • First observedakb_search
    • First observedakb_search_users
    • First observedakb_session_end
    • First observedakb_session_start
    • First observedakb_set_public
    • First observedakb_sql
    • First observedakb_todo
    • First observedakb_todo_update
    • First observedakb_todos
    • First observedakb_transfer_ownership
    • First observedakb_unlink
    • First observedakb_unpublish
    • First observedakb_update
    • First observedakb_update_profile
    • First observedakb_vault_info
    • First observedakb_vault_members
    • First observedakb_whoami

TDQS

A3.6/5.0
Disambiguation3/5

The resource-specific variants (put/put_file/put_image, get/get_file, delete/delete_file/delete_collection/delete_vault, update/update_file/edit) have overlapping verbs and could be misselected without close reading, but the descriptions carefully distinguish semantic search from grep, document content from file bytes, and vault-scoped activity from per-document history. Overall, an agent can disambiguate with effort, but the boundaries are not immediately obvious from names alone.

Naming Consistency5/5

All 50 tools use a consistent akb_ + snake_case verb_noun pattern (list_vaults, create_table, delete_file) with only a few bare verbs (put, get, update, delete, sql, grep) that still fit the naming system. There is no mixing of conventions or unpredictable style.

Tool Count2/5

At 50 tools this is a very large surface even for a comprehensive knowledge-base server; the count dimension explicitly treats 25+ as too many. The breadth of domains (vaults, docs, tables, files, graph, publications, access) explains some of the size, but the surface could be consolidated (e.g. file/image variants, publication helpers).

Completeness4/5

The server covers the full lifecycle for vaults, documents, tables, files, collections, access control, publications, and import/export, plus search, graph, history, and help. Minor gaps exist—no vault metadata/rename tool, no collection rename, and table row management is only via raw SQL—but they are workable.

Maintenance

ActivityActive
ResponsivenessResponsive

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    A
    maintenance
    Local-first, file-based memory layer for AI agents — one shared Markdown vault across Claude, Codex, Gemini, Cursor and any MCP client. Provides read/write memory tools with an audit trail, per-agent trust levels, and Git sync; no cloud and no lock-in.
    2
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    Local-first knowledge backend for AI agents that connects MCP hosts to an Obsidian-compatible vault with indexed retrieval, token-budgeted memory recall, and secure ingestion.
    1
    MIT
  • A
    license
    Not graded
    quality
    A
    maintenance
    Governed knowledge base for AI agents via the Model Context Protocol (MCP), enabling agents to search, read, and contribute persisted knowledge with versioning, audit trails, and approval workflows.
    80
    MIT

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/dnotitia/akb'

If you have feedback or need assistance with the MCP directory API, please join our Discord server