Skip to main content
Glama
backblaze-labs

Backblaze B2 MCP Server

Official

Backblaze B2 MCP Server

CI CodeQL npm License: MIT TypeScript Node.js MCP API docs Coverage floors Runtime dependencies

MCP Registry Glama Verified by M8ven LobeHub

A Model Context Protocol server for Backblaze B2 Cloud Storage. It lets any MCP-compatible AI client (Claude, and others) operate B2 through a focused, safe set of tools, currently incubating in Backblaze-Labs.

This is the official Backblaze B2 MCP serverbackblaze-labs/b2-mcp, published as @backblaze-labs/b2-mcp on npm and listed in the Official MCP Registry as io.github.backblaze-labs/b2-mcp. Community forks and third-party wrappers are not maintained by Backblaze.

40 tools, assigned by backing category:

  • Native B2 SDK (@backblaze-labs/b2-sdk) (17) — B2 control-plane operations the S3 API has no equivalent for: buckets, application keys, Object Lock, event notifications, and Partner/Groups operations.

  • AWS S3 SDK (@aws-sdk/client-s3) (19) — the S3-compatible data plane: object upload/download/copy/list/delete, multipart, bucket reachability, lifecycle, and presigned URL paths.

  • Neither SDK (custom MCP code) (4) — repository-owned analytics over B2 reports and bounded live listings: storage growth, egress leaders, largest files, and abandoned uploads.

Destructive actions are gated, durable B2 secrets stay out of the model's context in the default/file/off modes, and registration is capability-aware so a key only ever sees tools it can use. The server also exposes read-only MCP resources: b2://server-config (non-secret, registered even during credential-less discovery), plus capability-gated b2://capabilities and b2://bucket/{bucketName}.

Contents


Quick start

Prerequisites: A supported Node.js runtime and a Backblaze B2 application key. A non-master key is all you need. The package engine range is ^22.22.2 || ^24 || ^26; CI runs on Node.js 22.23.1, 24, and 26. One non-master application key covers normal storage work (B2 native, S3, and key management); the Partner/Groups tools additionally need B2_MASTER_KEY_ID / B2_MASTER_KEY.

Option A — npx (Claude Desktop config)

Edit claude_desktop_config.json (macOS: ~/Library/Application Support/Claude/, Windows: %APPDATA%\Claude\, Linux: ~/.config/Claude/) and add:

{
  "mcpServers": {
    "backblaze-b2": {
      "command": "npx",
      "args": ["-y", "@backblaze-labs/b2-mcp"],
      "env": {
        "B2_APPLICATION_KEY_ID": "your-application-key-id",
        "B2_APPLICATION_KEY": "your-application-key-secret"
      }
    }
  }
}

Restart Claude Desktop and the B2 tools appear. If you need an explicit fallback region before authorization, add B2_REGION to the same env block (S3/report tools otherwise derive their region from the authorized B2 account response):

{
  "B2_APPLICATION_KEY_ID": "your-application-key-id",
  "B2_APPLICATION_KEY": "your-application-key-secret",
  "B2_REGION": "us-east-005"
}

The canonical package name is @backblaze-labs/b2-mcp and the canonical binary is b2-mcp (b2-mcp-server is a transition alias); npx -y @backblaze-labs/b2-mcp runs it directly. See Configuration for the full variable list, and docs/product-specs/clients.md for a source-checkout setup and copy-paste configs for Cursor, VS Code, Cline, Windsurf, Zed, Continue, Goose, Claude.ai, and hosted (Streamable HTTP).

Option B — Claude Desktop extension (MCPB)

Available once a release publishes the b2-mcp.mcpb asset (0.2.1 onward); earlier releases carry no bundle, so use Option A until the asset appears on the releases page.

Prefer no JSON editing? Download b2-mcp.mcpb from the latest release, then in Claude Desktop open Settings → Extensions → Advanced settings → Extension Developer → Install Extension… and select the downloaded file. Claude Desktop prompts for your Application Key ID and Application Key (Region and Master keys optional) — no config file to hand-edit. The bundle launches a version-pinned npx -y @backblaze-labs/b2-mcp@<version> (npm resolves the server on first run) so it always runs the exact published version. A one-click Claude Connectors Directory listing is in progress.

Then just ask:

"List the buckets this key can access." · "Upload ./data.csv to reports/may-2026.csv." · "Give me a 1-hour download link for backups/latest.tar.gz." · "List files under logs/2026/."

Why your client may show fewer than 40 tools: registration is capability-aware. With a non-master key and no master key configured, the three Partner/Groups tools that require a master key are not surfaced, so tools/list reports 37; add B2_MASTER_KEY_ID / B2_MASTER_KEY on a Partner-entitled account for the full 40. A read-only key trims the surface further. Credential-free scanners see the full advertised surface, but every tools/call returns missing_credentials until valid B2 credentials are supplied.

Docker

The published image defaults to the HTTP transport and reads configuration only from environment variables (no mutable latest tag — pin the release version):

B2_MCP_VERSION=VERSION # replace with the release version you want
B2_MCP_IMAGE="ghcr.io/backblaze-labs/b2-mcp:${B2_MCP_VERSION}"
docker run --rm --name b2-mcp \
  --stop-timeout 20 \
  -p 127.0.0.1:3000:3000 \
  -e B2_HTTP_CREDENTIAL_MODE=server \
  -e B2_APPLICATION_KEY_ID=your-application-key-id \
  -e B2_APPLICATION_KEY=your-application-key-secret \
  -e B2_ALLOWED_HOSTS=localhost,127.0.0.1 \
  -e B2_DESTRUCTIVE_POLICY=block \
  -e B2_REGISTER_ALL_TOOLS=false \
  -e B2_SECRET_SINK=off \
  -e B2_ALLOW_INLINE_SECRETS=false \
  -e B2_ALLOW_LOCAL_FILES=false \
  "$B2_MCP_IMAGE"

For stdio clients inside a container, pass the transport explicitly and keep stdin open:

B2_MCP_VERSION=VERSION # replace with the release version you want
B2_MCP_IMAGE="ghcr.io/backblaze-labs/b2-mcp:${B2_MCP_VERSION}"
docker run --rm -i \
  --no-healthcheck \
  -e B2_APPLICATION_KEY_ID=your-application-key-id \
  -e B2_APPLICATION_KEY=your-application-key-secret \
  "$B2_MCP_IMAGE" stdio

Deploying to hosted HTTP? See the deployment matrix and provider guides (Docker, Vercel, Cloudflare, AWS, GCP, Azure, Render, Railway, Fly.io) linked from Security & self-hosting, and docs/references/deployment/docker.md for hardened HTTP examples.

Related MCP server: mcp-s3-server

B2 Skills pack

This repo bundles a client-side Backblaze B2 skills pack under skills/ (manifest: skills/pack.json) — Markdown playbooks for common workflows (backup/restore, least-privilege keys, Object Lock, lifecycle and cost hygiene, migration, incident response). The MCP server is the action layer; these are the expertise layer. They add no endpoints or permissions — they only sequence existing tools and reinforce the same byte-path and destructive-action guardrails the server enforces.

Optional but recommended for clients that support Markdown skills. Load them by placing each skills/b2-*/ directory under ~/.claude/skills/ (Claude Code), or upload per-skill ZIPs via Settings → Capabilities → Skills (Claude.ai / Claude Desktop). Validate the pack locally:

pnpm run validate:skills

Configuration

Variable

Required

Default

Description

B2_APPLICATION_KEY_ID

stdio / HTTP server

Application key ID (non-master) — the workhorse for native B2 and S3-compatible tools

B2_APPLICATION_KEY

stdio / HTTP server

Application key secret

B2_MASTER_KEY_ID / B2_MASTER_KEY

falls back to app key

Master credential for SDK-backed Partner/Groups tools; required with Partner API entitlement for those operations

B2_REGION

us-west-004

Fallback/default S3-compatible endpoint region; authorized B2 responses override this for S3/report tools

B2_MCP_UA_SUFFIX

Optional operator token appended after the built-in b2-mcp/<version> product token on the outbound User-Agent (tag a deployment)

B2_MCP_OUTPUT_FORMAT

json

LLM-facing TextContent.text format for structured successes: compact json or opt-in toon

B2_ENABLE_MCP_PROMPTS

false

MCP workflow prompts (prompts/list, prompts/get) are off by default; set true once every replica runs prompt-capable code. Gates registration and advertisement together, so flip it atomically across the fleet (or use sticky routing)

B2_MCP_TRANSPORT

stdio

CLI default transport when no stdio / http argument or --transport flag is passed; Docker images set this to http

B2_HTTP_HOST

HTTP only

Node listen default

Standalone Node HTTP listen host; set to 127.0.0.1 when binding behind a same-host reverse proxy

B2_LOG_FILE

stderr

Optional absolute path for redacted structured JSON logs (POSIX only). When set, the file replaces stderr; stdout is never used for logs. See docs/product-specs/clients.md for rename/create + SIGHUP rotation guidance

B2_SECRET_SINK

stdio: file; HTTP: off

Durable-secret output mode: file, inline, or off. File mode supports b2_create_key and b2_create_group_member; b2_reserve_trial_create_account requires explicit inline mode because it has no file-mode recovery path

B2_SECRET_SINK_FILE

file override

~/.b2-mcp/secrets.jsonl on stdio

Append-only plaintext JSONL credential ledger for file sink mode. HTTP/serverless file mode requires this explicit absolute path and B2_ALLOW_LOCAL_FILES=true

B2_ALLOW_INLINE_SECRETS

HTTP inline only

false

Dedicated HTTP/serverless opt-in required before B2_SECRET_SINK=inline can return durable secrets in MCP responses

B2_HTTP_CREDENTIAL_MODE

HTTP only

headers

headers, server, or principal; unset preserves existing header-based clients. Set explicitly for hosted deployments

B2_PRINCIPAL_CREDENTIAL_MAP

HTTP principal

JSON map from verified MCP principal to a customer-managed credential reference

B2_CREDENTIAL_<REF>_APPLICATION_KEY_ID / _APPLICATION_KEY

HTTP principal

Env-backed secret-broker material for the mapped reference

Security / policy (safe defaults; override as needed):

Variable

Default

Description

B2_DESTRUCTIVE_POLICY

stdio: confirm; HTTP: block

Gate on destructive tools: confirm requires MCP form elicitation approval on compatible 2026 clients, or confirm: true when elicitation is unavailable/disabled; elicit requires human elicitation approval and refuses when no human can be prompted; block refuses before elicitation; allow skips both gates

B2_DESTRUCTIVE_ELICITATION

on

Set to off, false, or 0 to disable MCP form elicitation and rely only on B2_DESTRUCTIVE_POLICY

B2_MAX_KEY_DURATION_SECONDS

Optional maximum for b2_create_key; when set, non-expiring keys and longer durations are refused before any B2 create call

B2_ALLOW_KEY_MGMT_GRANTS / B2_ALLOW_UNSCOPED_KEYS

false

Explicitly allow b2_create_key to mint key-management-capable, or unscoped write/delete, keys

B2_ALLOWED_HOSTS / B2_ALLOWED_ORIGINS

none

HTTP transport: Host/Origin allowlists (DNS-rebinding protection) — set these for any internet-facing HTTP deployment

B2_HTTP_REQUEST_TIMEOUT_MS / B2_HTTP_HEADERS_TIMEOUT_MS

30000 / 10000

Standalone Node HTTP transport request timeout and headers timeout

B2_TRUST_PROXY_HEADERS

false

HTTP transport: trust X-Forwarded-For / X-Real-IP for unauthenticated admission keys only behind a trusted proxy

B2_MCP_RATE_LIMIT_RPS / B2_MCP_RATE_LIMIT_BURST

60 / 120

HTTP transport: per-credential request throttling

B2_MAX_SESSIONS / B2_MAX_SESSIONS_PER_KEY

1000 / 20

HTTP transport: global and per-credential concurrent in-flight request caps

B2_STDIO_CAPABILITY_TIMEOUT_MS

10000

Stdio bootstrap capability-discovery deadline; local expiry starts with a fail-closed tool surface

B2_CAPABILITY_CACHE_TTL_MS / B2_CAPABILITY_CACHE_MAX_ENTRIES

300000 / 10000

Bounded capability-discovery cache TTL and size; cache identity is secret-bound, log labels are non-secret fingerprints

B2_S3_SAVE_TO_PATH_IDLE_TIMEOUT_MS

60000

Idle timeout while streaming s3_get_object results to saveToPath

A ready-to-copy .env.example lists the local variables, and deploy/customer-hosted/b2-mcp.env.example lists the hosted container baseline. HTTP-only file-access vars (B2_ALLOW_LOCAL_FILES, B2_FILE_ROOT) are covered in docs/DEPLOY.md; the capability/cache tuning knobs above are documented inline here.


Tools

The server exposes 40 tools (registration is capability-aware, so a given key sees only the subset it can use). 40 total — 17 Native B2 SDK + 19 AWS S3 SDK + 4 Neither SDK/custom MCP tools. Prefix counts remain 21 native b2_* names + 19 data-plane s3_* names. Under stdio's default confirm policy, fifteen destructive, durable-secret-producing, or protection-weakening tools require confirmation before execution; HTTP defaults to block. The per-profile, availability-annotated tool lists (per capability set) live in the generated docs/generated/tool-profiles.md; the destructive-gate policy and durable-secret handling (secret sinks, idempotency keys, POSIX vs. Windows behavior) are documented in docs/AUTHENTICATION.md.

Native B2 SDK (17):

  • b2_authorize_account — Verify credentials and return account info

  • b2_list_buckets — List buckets (optional filters)

  • b2_create_bucket — Create a persistent bucket with initial policy settings

  • b2_delete_bucket — Delete an empty bucket

  • b2_update_bucket — Update persistent bucket settings; risky changes are gated

  • b2_get_bucket_notification_rules — Read webhook notification rules with secrets redacted

  • b2_set_bucket_notification_rules — Replace webhook notification rules; public HTTPS targets only

  • b2_list_keys — List application keys

  • b2_delete_key — Irreversibly revoke an application key

  • b2_create_key — Create a scoped application key through the configured secret sink

  • b2_update_file_legal_hold — Set/clear legal hold on an object

  • b2_update_file_retention — Set/clear retention on an object

  • b2_list_groups — List partner groups (Partner API credential)

  • b2_eject_group_member — Remove a member from a partner group (Partner API credential)

  • b2_list_group_members — List group members (Partner API credential)

  • b2_create_group_member — Create a Partner group member (Partner API credential)

  • b2_reserve_trial_create_account — Reserve a trial account (Partner API credential)

AWS S3 SDK — data plane (19):

  • s3_put_object — Inline upload of a small (≤1 MiB) control-plane object

  • s3_get_object — Inline download of a small (≤1 MiB) control-plane object

  • s3_delete_object — Delete current object or exact version; destructive gate applies

  • s3_delete_objects — Bulk-delete objects

  • s3_head_object — Object metadata

  • s3_copy_object — Server-side copy

  • s3_list_objects_v2 — List objects

  • s3_list_object_versions — List object versions and delete markers (paginated)

  • s3_create_multipart_upload — Begin a multipart upload

  • s3_get_presigned_upload_part_url — Mint a presigned PUT URL for a part

  • s3_complete_multipart_upload — Complete multipart upload from ordered part ETags

  • s3_abort_multipart_upload — Abort a multipart upload

  • s3_list_parts — List uploaded parts

  • s3_list_multipart_uploads — List in-progress multipart uploads (paginated)

  • s3_upload_part_copy — Server-side copy of a part

  • s3_get_presigned_url — Short-lived presigned PUT/GET bearer URL

  • s3_head_bucket — Check a bucket is reachable on the S3 endpoint

  • s3_get_bucket_location — Bucket region / location constraint

  • s3_put_bucket_lifecycle — Set S3 lifecycle rules

Custom MCP analytics (4):

  • b2_report_usage_growth — Rank accounts by stored-data growth between two dates

  • b2_rank_egress_leaders — Top egress by account or bucket over a period

  • b2_list_largest_files — A bucket's largest objects via bounded live listing

  • b2_unfinished_uploads — Abandoned multipart uploads consuming storage

MCP workflow prompts (opt-in): off by default; set B2_ENABLE_MCP_PROMPTS=true to advertise five guided workflows through prompts/list / prompts/get. Prompts are parameterized message templates — they do not execute tools or approve destructive actions — and are filtered against the same tool surface and capability map as tools. Flip the flag atomically across the fleet (it gates registration and advertisement together).


Package API Surface

The npm package intentionally supports only the root CommonJS entry (require("@backblaze-labs/b2-mcp")), which exposes startStdio(): Promise<void>, plus ./package.json for metadata. TypeScript consumers may compile against that same root CommonJS surface:

import b2Mcp = require("@backblaze-labs/b2-mcp");

const start: () => Promise<void> = b2Mcp.startStdio;

Programmatic TypeScript imports beyond that root entry are not a supported public API. ESM named imports are not part of the contract. Deep imports such as @backblaze-labs/b2-mcp/dist/server.js are private implementation details closed by the package exports map. Use the CLI/bin entry or the root startStdio export instead.


CLI Reference

The source entry point and installed package binary share the same CLI:

Usage: b2-mcp [stdio|http] [options]

Options:
  --transport <stdio|http>  Transport to serve (default: B2_MCP_TRANSPORT or stdio)
  --port <port>             HTTP listen port (default: PORT or 3000)
  --host <host>             HTTP listen host (default: Node listen default)
  --version                 Print the package version
  --help                    Show this help

Tool results carry the lossless value in structuredContent; the LLM-facing text block is selected by B2_MCP_OUTPUT_FORMAT (json default, or opt-in toon). See docs/design-docs/tool-contract.md#structured-result-text-contract for the output-format contract.


Resources

Read-only MCP resources expose stable control-plane state without a tool call:

  • b2://server-config — non-secret server configuration (transport, credential mode, destructive policy, secret-sink mode, public URL, version).

  • b2://capabilities — the current credential's B2 capability set and active tool profile.

  • b2://bucket/{bucketName} — bucket type/visibility, lifecycle, Object Lock, retention, encryption, CORS, replication, and notification rules when the caller can read them (webhook secrets redacted).

resources/list is capped at 100 concrete bucket resources; use the template URI directly for a known authorized bucket. Bucket reads omit a client cache hint because visibility and notification targets are security-relevant after writes.


Security & self-hosting

Built-in safeguards (on by default): destructive-action gating (B2_DESTRUCTIVE_POLICY), MCP form elicitation for destructive tools on 2026-capable clients, sink-backed durable-secret creation for local stdio with hosted HTTP fail-closed defaults, central recursive response sanitization, explicit credential-provider modes, capability-aware registration that fails closed, rate limiting, and a values-redacted audit log (non-secret credential fingerprints only). The server never phones home.

  • Local use → stdio. Credentials stay in your client config / environment; the default confirm policy asks before destructive actions.

  • Internet-facing HTTP → B2_DESTRUCTIVE_POLICY=block is the required wall (the HTTP default). Elicitation is relayed by the client, so it is human-in-the-loop friction, not an independent authorization boundary.

  • Choose a credential mode. headers (default, compatibility), server (one B2 credential held in the process / a secret manager), or principal (map verified MCP authInfo to customer-held credentials). Credential-free discovery (initialize, tools/list, resources/list, prompts/list, server/discover, ping) runs without keys so scanners can enumerate; real tools/call still requires credentials.

  • Use a least-privilege key. A non-master key is correct for normal storage. b2_create_key refuses key-management grants, unscoped write/delete grants, and over-long or non-expiring keys unless the matching override is set.

  • Presigned URLs are not durable secrets. s3_get_presigned_url / s3_get_presigned_upload_part_url return short-lived bearer capabilities (expiresIn / expiresAt) — sensitive until expiry, but not long-lived B2 keys.

  • Never commit credentials — use env vars / a secrets manager. .env* is gitignored.

Supported deployments: deploy/customer-hosted (portable container, compose, nginx/OAuth edge) and deploy/vercel (OAuth-secured adapter). Provider guides: Docker/OCI, Vercel, Cloudflare Workers, Cloudflare Containers, Google Cloud Run, AWS ECS Fargate, Azure Container Apps, Render, Railway, and Fly.io — all sharing the security & credential contract.

Full hosted runbook (nginx, Let's Encrypt, hardened systemd, fail2ban, monitoring, and a security baseline checklist): deploy/customer-hosted/README.md (indexed from the docs/DEPLOY.md matrix). Authentication, credential custody, and OAuth details are in docs/AUTHENTICATION.md.


Privacy

b2-mcp runs locally over stdio or in a self-hosted HTTP deployment controlled by the user or operator. The publisher does not receive runtime B2 credentials, object data, prompts, logs, or telemetry from normal use. Object-byte workflows should use presigned URLs so bytes move directly between the client or worker and Backblaze B2, and logs are structured with secret redaction.

Read the canonical PRIVACY.md source or the hosted privacy policy published by GitHub Pages.


Development

From a fresh source checkout, enable the pinned package manager and install dependencies first, then run any of the scripts below:

corepack enable pnpm
corepack prepare 'pnpm@11.20.0+sha256.34e198cb1e43237517ecedfd31f9ae26a6c0a3e5366ce58a2d05f4b21fb5f19a' --activate
pnpm install --frozen-lockfile
pnpm run build              # clean + compile to dist/
pnpm run typecheck          # type-check src + tests (no emit)
pnpm test                   # typecheck, then fast unit tests
pnpm run test:contract      # deterministic MCP/package/schema contracts
pnpm run test:protocol      # modern + legacy MCP protocol behavior
pnpm run test:coverage      # deterministic source-covering suites + coverage summary
pnpm run test:package       # packed-package installation test
pnpm run verify             # fast no-credential quality gate
pnpm run test:live:b2       # both protected live B2 suites; requires B2 credentials
pnpm run evals              # deterministic LLM eval harness; live provider cases skip by default
pnpm run docs               # TypeDoc API docs plus hosted privacy page
pnpm start                  # stdio transport
pnpm run start:http --port 3000   # MCP 2026-07-28 HTTP transport
pnpm run smoke:local        # deterministic local MCP smoke; no endpoint or B2 credentials

The full script list (diagnostics, slow tests, provider-comparison evals, inspector smoke) is in docs/TESTING.md. Compatible MCP Inspector: @modelcontextprotocol/inspector@2.4.0 (Node.js 22.19.0+), run via pnpm run smoke:inspector.

Documentation

License

MIT — © 2026 Backblaze, Inc.

Available Tools

40 tools
b2_authorize_accountA
Read-onlyIdempotent

Authorize with B2 and return account info including accountId, apiUrl, and downloadUrl. The server handles authorization automatically, but this tool is useful for verifying credentials and retrieving account details.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.6/5.0
Behavior4/5

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

The description states that the tool returns account info and lists the specific fields. It does not explicitly mention side effects, but the annotations indicate readOnlyHint and idempotentHint, which are consistent with a read operation. The behavior is generally 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?

The description is concise, consisting of two sentences that convey the purpose and usage. It is focused and free of unnecessary detail, making it easy to read and understand.

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 that there is no output schema, the description adequately explains what the tool returns (accountId, apiUrl, downloadUrl). It also provides context on how authorization is handled. There is no missing essential information for an agent to use this tool correctly.

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?

The input schema is empty ({}), so there are no parameters to describe. The description does not add any parameter information, but since there are none, this is fully appropriate. Schema coverage is 100% with no gaps.

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: authorize with B2 and return account info including accountId, apiUrl, and downloadUrl. It specifies the action and the output, leaving no ambiguity about what the tool does.

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 guidance on when to use the tool: it notes that the server handles authorization automatically, but the tool is useful for verifying credentials and retrieving account details. It doesn't explicitly mention alternatives, but the context is clear enough.

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

b2_create_bucketA

Create a persistent B2 bucket with optional metadata, CORS, lifecycle, default encryption, and Object Lock enablement. Use for initial provisioning with a key that has writeBuckets; use b2_update_bucket for later settings changes and s3_head_bucket to check S3 reachability. Bucket names are globally unique, case-insensitive, 6-63 characters, letters/digits/hyphens/periods, and cannot start with 'b2-', begin/end with a period, contain '..', or look like an IPv4 address. Because names are unique across all of B2, requesting a name already in use (by this or any other account) fails with a duplicate-name error instead of returning the existing bucket; reuse the existing bucket only if it belongs to your own account, otherwise choose a different globally unique name.

ParametersJSON Schema
NameRequiredDescriptionDefault
corsRulesNoCORS rules: <=100. allowedOrigins/allowedOperations require 1-100 non-empty strings; allowedHeaders/exposeHeaders allow <=100. Strings <=999 chars. Per-rule UTF-8 total <1,000. Names unique. Omit to create the bucket without CORS rules.
bucketInfoNoCustom metadata: <=10 pairs. Keys: 1-50 UTF-8 bytes, chars A-Z a-z 0-9 . _ ` ~ ! # $ % ^ & * ' | + -, no b2- prefix. Values total <=10,000 UTF-8 bytes. Omit to create the bucket without custom metadata.
bucketNameYesGlobally unique bucket name: 6-63 characters, letters/digits/hyphens/periods, case-insensitive, no b2- prefix, no leading/trailing period, no '..', and not an IPv4 address.
bucketTypeYesVisibility for file downloads: allPrivate requires authorization; allPublic makes objects world-readable by URL.
lifecycleRulesNoOptional B2 lifecycle rules applied after creation. Use for automatic hiding, deletion of hidden versions, or cancellation of unfinished large-file uploads; use s3_put_bucket_lifecycle only when you need the S3 lifecycle API shape.
fileLockEnabledNoEnable Object Lock (file lock) on the bucket at creation. (Object Lock can also be enabled later on an existing bucket via b2_update_bucket.) Must be true before any retention or legal hold can be applied to files in this bucket.
defaultServerSideEncryptionNoOptional default server-side encryption for new files in this bucket. Omit to create the bucket without a bucket default encryption setting.

TDQS

A4.7/5.0
Behavior5/5

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

Beyond the annotations, the description adds important behavioral context: bucket names are globally unique, duplicate-name requests fail with an error instead of returning the existing bucket, and the existing bucket may only be reused if it belongs to the caller's own account. It also discloses the required writeBuckets permission and the persistent nature of the created bucket. No contradiction with annotations.

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 front-loaded with the core purpose and then routes to alternatives. It is somewhat longer than necessary because the bucket-name character rules partly repeat the schema's bucketName description, but the duplicate-name behavior and reuse guidance justify the third sentence. Overall it is economical and well-structured.

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 complex 7-parameter creation tool with nested objects and no output schema, the description covers the key operational concerns: when to use it, required permission, alternatives, naming constraints, and duplicate-name behavior. It does not describe the success response format, but the rich schema compensates for most gaps.

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 schema already documents parameters in detail. The description adds value by explaining global uniqueness, duplicate-name failure semantics, and permission requirements beyond the schema. It does not deeply explain every optional parameter, but the schema covers those, so this is more than the 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 starts with a specific verb and resource: 'Create a persistent B2 bucket', and enumerates the optional capabilities (metadata, CORS, lifecycle, encryption, Object Lock). It also distinguishes itself from siblings by naming b2_update_bucket for later changes and s3_head_bucket for S3 reachability, so an agent can tell them apart.

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 states when to use this tool: 'initial provisioning with a key that has writeBuckets'. It also names the alternatives and their conditions: b2_update_bucket for later settings changes and s3_head_bucket for S3 reachability. It even gives conditional guidance for duplicate-name scenarios, which is actionable and complete.

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

b2_create_group_memberA
Destructive

Create a Backblaze account for a new Partner group member. In file sink mode, the one-time application key secret is written to the configured out-of-band secret sink and the MCP response contains only redacted metadata plus a secretSink pointer. In inline mode, the secret is returned with an explicit warning.

ParametersJSON Schema
NameRequiredDescriptionDefault
regionNoOptional data region for the new account.
confirmNoFallback confirmation for this destructive/irreversible operation when the effective server destructive policy is 'confirm' and MCP elicitation cannot run.
groupIdYesThe Group ID that the new member will join.
memberEmailYesEmail address for the new group member account.
adminAccountIdYesThe accountId of the Group admin. Must be authorized for the Partner API.
idempotencyKeyYesCaller-generated idempotency key. Reuse the same value only when retrying the identical group-member creation request.

TDQS

A4.4/5.0
Behavior5/5

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

Beyond the annotations (destructiveHint, openWorldHint), the description discloses critical runtime behavior: secret handling differs by mode. It explains that file sink mode writes the one-time application key secret out-of-band and returns only redacted metadata plus a secretSink pointer, while inline mode returns the secret with an explicit warning. This is valuable, non-obvious behavior that annotations alone do not convey.

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 primary action, then efficiently explains the two secret-handling modes. Every sentence adds necessary information, and there is no filler or repetition of schema fields.

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 outcome, the secret-handling modes, and the response shape despite lacking an output schema. It leaves minor details such as failure behavior and billing implications unstated, but the schema and annotations fill most remaining gaps. Overall it is complete enough for correct invocation.

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 input schema already documents all parameters including adminAccountId, groupId, memberEmail, idempotencyKey, region, and confirm. The description adds context about the generated one-time application key but does not add parameter-level meaning beyond the schema. 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?

The description opens with a specific verb and resource: 'Create a Backblaze account for a new Partner group member.' This clearly identifies the operation and distinguishes it from sibling tools like b2_eject_group_member or b2_reserve_trial_create_account. The account creation intent 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 Guidelines4/5

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

The description gives clear context for when the tool applies: when a new Partner group member account must be created. It does not explicitly name alternatives or exclusions, but the context is specific enough that an agent can route to this tool for group-member creation versus other create/eject operations.

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

b2_create_keyA
Destructive

Create a B2 application key and route its one-time secret through the configured secret sink. Use for least-privilege scoped credentials; use b2_list_keys to inspect existing keys and b2_delete_key to revoke retired keys. Requires writeKeys, idempotencyKey, and destructive confirmation by policy. File sink mode returns redacted metadata plus a secretSink pointer; inline mode returns the secret only when explicitly enabled. Policy refuses key-management grants and unscoped write/delete grants unless explicit environment overrides are enabled; when B2_MAX_KEY_DURATION_SECONDS is set, it also refuses non-expiring keys or durations above that limit.

ParametersJSON Schema
NameRequiredDescriptionDefault
confirmNoFallback confirmation for this durable credential creation when the effective server destructive policy is 'confirm' and MCP elicitation cannot run.
keyNameYesHuman-readable key name for audits and b2_list_keys output.
bucketIdNoDeprecated single-bucket restriction. Use bucketIds for new integrations; do not provide both.
bucketIdsNoOptional bucket ID restrictions. Required by default for keys with write*/delete* capabilities; omit only for intentional account-wide access, and do not combine with bucketId.
namePrefixNoOptional file-name prefix restriction for file capabilities; omit for no prefix restriction.
capabilitiesYesB2 capabilities to grant. They must be allowed by the creating key; listKeys/writeKeys/deleteKeys are refused unless B2_ALLOW_KEY_MGMT_GRANTS=true.
idempotencyKeyYesCaller-generated idempotency key. Reuse the same value only for an identical retry by the same caller; conflicting reuse is rejected.
validDurationInSecondsNoOptional positive key lifetime in seconds. Omit for no expiration only when B2_MAX_KEY_DURATION_SECONDS is not configured.

TDQS

A4.9/5.0
Behavior5/5

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

Annotations already mark the tool as destructive and non-idempotent, but the description adds substantial context: the one-time secret handling, file-sink versus inline output modes, idempotency requirements, destructive confirmation by policy, and environment-override restrictions. This goes well beyond the structured annotations.

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, usage routing, output behavior, and policy constraints. The main action is front-loaded, and there is no redundant restatement of the tool name or schema fields.

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 8-parameter, side-effectful creation tool with no output schema, the description covers the critical non-obvious behavior: secret sink routing, redacted metadata versus inline secret, and policy-driven refusals. Combined with the fully documented input schema, an agent has enough to call the tool correctly in most scenarios.

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 detailed per-parameter descriptions, so the baseline is 3. The description adds value by highlighting idempotencyKey as a requirement, the policy refusal of key-management/unscoped grants, and the B2_MAX_KEY_DURATION_SECONDS constraint that affects validDurationInSeconds and omission 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 states a precise verb and resource: 'Create a B2 application key' and adds the specific behavior of routing the one-time secret through a secret sink. It is clearly distinguishable from sibling tools like b2_list_keys and b2_delete_key by naming them as complementary operations.

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 says to use this tool for least-privilege scoped credentials and names the sibling tools for inspecting and revoking keys. It also gives policy-based constraints on when grants are refused, giving an agent clear routing and precondition guidance.

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

b2_delete_bucketA
DestructiveIdempotent

Delete a B2 bucket. The bucket must be empty — all files and file versions must be deleted first.

ParametersJSON Schema
NameRequiredDescriptionDefault
confirmNoFallback confirmation for this destructive/irreversible operation when the effective server destructive policy is 'confirm' and MCP elicitation cannot run.
bucketIdYesThe ID of the bucket to delete.

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true and readOnlyHint=false. The description adds the key behavioral constraint that the bucket must be empty before deletion, which is not encoded in the annotations or schema. It does not discuss irreversibility in prose, but the schema's confirm parameter already covers that aspect.

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 sentences with no filler. The core action and the essential precondition are stated directly and upfront, making it easy for an agent 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?

For a simple destructive tool with full schema coverage and destructive annotations, the description includes the one non-obvious operational requirement: the bucket must be empty. It does not describe the failure mode for a non-empty bucket, but that is reasonably inferable from the stated precondition.

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 bucketId and confirm thoroughly. The description adds no parameter-level meaning beyond the empty-bucket precondition, which is an operation-level constraint rather than a parameter detail.

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: 'Delete a B2 bucket.' It also adds the critical prerequisite about emptiness, which helps an agent understand the operation's scope and distinguishes it from siblings like b2_update_bucket or b2_delete_key.

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 clearly states when the tool is usable: only when the bucket is empty, and it explicitly says files and file versions must be deleted first. It does not name alternative tools or say when to prefer them, but the precondition provides meaningful usage guidance.

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

b2_delete_keyA
DestructiveIdempotent

Permanently delete a B2 application key. Use b2_list_keys first to verify applicationKeyId, keyName, capabilities, and dependent systems; use b2_create_key before deletion when rotating credentials. Requires deleteKeys and destructive confirmation by policy. The key secret cannot be recovered, and anything still using the deleted key loses access immediately.

ParametersJSON Schema
NameRequiredDescriptionDefault
confirmNoFallback confirmation for this destructive/irreversible operation when the effective server destructive policy is 'confirm' and MCP elicitation cannot run.
applicationKeyIdYesExact application key ID to delete; use b2_list_keys to look it up.

TDQS

A4.7/5.0
Behavior4/5

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

Annotations already indicate destructiveHint and readOnlyHint=false, and the description adds valuable behavioral context: the key secret cannot be recovered, dependent systems lose access immediately, and deleteKeys permission plus destructive confirmation are required. This goes beyond the structured hints and informs the agent of irreversible external impact.

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 first states the action, the second provides the prerequisite workflow and alternatives, and the third explains consequences and requirements. Every sentence earns its place and the most important warning 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 destructive delete operation with no output schema, the description is complete enough: it covers prerequisites, permission requirements, the irreversible nature of the action, and immediate impact on dependents. Combined with the detailed parameter schemas and annotations, an agent has everything needed to invoke this tool safely.

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 descriptive parameter entries for applicationKeyId and confirm. The description reinforces the source of applicationKeyId via b2_list_keys and clarifies the confirm parameter's role under destructive policy, adding workflow context beyond the raw 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: 'Permanently delete a B2 application key.' This clearly distinguishes the tool from sibling operations like b2_delete_bucket or s3_delete_object by naming the exact resource type and the destructive nature of the action.

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 workflow guidance: use b2_list_keys first to verify the applicationKeyId and dependencies, and use b2_create_key before deletion when rotating credentials. It also states the permission requirement and policy confirmation, so an agent knows both prerequisites and recommended alternatives.

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

b2_eject_group_memberA
DestructiveIdempotent

Eject a member from a Group. The account is NOT deleted — just removed (the member resets their password on next login). Optionally change their email on eject. Cannot be re-added via API (only the Group Management page).

ParametersJSON Schema
NameRequiredDescriptionDefault
emailNoNew email for the ejected account. If omitted, the existing email is kept. Must not already be a Backblaze account.
confirmNoFallback confirmation for this destructive/irreversible operation when the effective server destructive policy is 'confirm' and MCP elicitation cannot run.
groupIdYesThe Group ID from which to eject the member.
adminAccountIdYesThe accountId of the Group admin. Must be authorized for the Partner API.
memberAccountIdYesThe accountId of the Group member to eject. Must be a member of the specified Group.

TDQS

A4.5/5.0
Behavior5/5

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

Beyond annotations already marking the call destructive, the description reveals meaningful consequences: the account is not deleted, the member resets their password at next login, and the change is irreversible through the API. The 'cannot be re-added via API' warning is exactly the kind of behavioral context annotations cannot convey.

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-load the core action and then add high-value caveats: no account deletion, password reset, optional email change, and API re-add restriction. There is 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.

Completeness5/5

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

For a destructive operation with no output schema, the description covers what the agent most needs to know: outcome scope, side effects, optional behavior, and irreversibility. Combined with comprehensive parameter schemas and annotations, nothing critical is missing for correct invocation.

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 input schema already documents every parameter, including the meaning and constraints for email, confirm, groupId, adminAccountId, and memberAccountId. The description adds only the small clarification that email change is optional on eject, which does not lift it above the 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 opens with a specific verb and resource, 'Eject a member from a Group,' and immediately clarifies the scope by stating the account is NOT deleted, only removed. This distinguishes the operation from general account deletion and from the sibling create/list group member 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?

The description makes the usage context clear: use this to remove a group member, with the caveat that the saved account remains and the member must reset their password. It also warns that re-adding via API is impossible, giving an implicit when-not-to-use signal, though it does not explicitly name alternatives such as b2_create_group_member.

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

b2_get_bucket_notification_rulesA
Read-onlyIdempotent

Read the B2 event-notification webhook rules for a bucket. Use before b2_set_bucket_notification_rules to diff or preserve existing rules, because set replaces the complete rule set. Requires readBucketNotifications or writeBucketNotifications, has no side effects, and redacts webhook URL host/path/query, HMAC secrets, and custom-header values in the MCP response.

ParametersJSON Schema
NameRequiredDescriptionDefault
bucketIdYesExact bucket ID whose notification rules should be read.

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, but the description adds valuable behavioral context beyond them: required permissions (readBucketNotifications or writeBucketNotifications), explicit 'no side effects', and redaction of sensitive webhook fields in the MCP response. This is meaningful transparency not available from structured fields alone.

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 purpose, and every sentence adds value: usage context, authorization, side effects, and response redaction. There is no redundant or filler wording.

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 low complexity (one parameter, no output schema), the description covers everything an agent needs: what it does, when to use it, required permissions, safety profile, and sensitive data redaction behavior. Nothing essential 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% and the single bucketId parameter is already well documented ('Exact bucket ID whose notification rules should be read'). The description does not need to add parameter detail, so the 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 description states a specific verb ('Read'), a specific resource ('B2 event-notification webhook rules for a bucket'), and explicitly distinguishes this tool from its sibling b2_set_bucket_notification_rules. An agent can immediately understand what the tool does and which sibling it complements.

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 says to use this tool before b2_set_bucket_notification_rules to diff or preserve existing rules, because the set operation replaces the complete rule set. This gives clear when-to-use guidance and names the natural alternative, earning full credit.

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

b2_list_bucketsA
Read-onlyIdempotent

List B2 buckets for the authorized account. Optionally filter by bucket ID, name, or type. When the key is bucket-scoped and no bucketId/bucketName filter is supplied, requests are automatically narrowed to the authorized bucket IDs. Returns bucket ID, name, type, CORS rules, and lifecycle rules for each bucket. Capped to limit buckets (default 100, max 1000) to keep the response small for accounts with many buckets; if more exist the result is truncated with total_bucket_count and a note — raise limit or filter to target specific buckets.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of buckets to return (default 100, max 1000). The B2 API returns every bucket in one response; this caps how many are surfaced to keep the payload and token cost bounded. If the account has more buckets than the limit, the result is truncated with total_bucket_count and a note — raise limit (up to 1000) or filter by bucketName / bucketId / bucketTypes.
bucketIdNoFilter to a specific bucket by its ID
bucketNameNoFilter to a specific bucket by its name
bucketTypesNoFilter by bucket types. Defaults to all types.

TDQS

A4.4/5.0
Behavior4/5

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

The annotations already provide readOnlyHint and openWorldHint, indicating a safe, non-destructive operation. The description adds valuable behavioral details beyond the annotations: it explicitly states that requests are automatically narrowed to authorized bucket IDs when bucket-scoped, that results are truncated if exceeding the limit, and it describes the return fields (ID, name, type, CORS rules, lifecycle rules). This enhances transparency beyond what the annotations alone convey, though it does not fully describe edge cases like error handling.

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 moderately concise, but it is well-structured with two main sentences: one stating the core action and filters, another explaining the cap and truncation. It front-loads the primary purpose and includes necessary details without excessive verbosity. It could be slightly tightened (e.g., merging repeated 'filter' mentions), but it remains clear 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 that there is no output schema, the description compensates by explicitly listing the returned fields (ID, name, type, CORS rules, lifecycle rules). It also covers important context such as the automatic authorization narrowing and the truncation behavior, which are essential for a user to understand the tool's behavior in a real-world B2 account scenario. The description is complete for the complexity of a simple list operation.

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 provides descriptions for all four parameters with 100% coverage, including default values and enums for bucketTypes. The description reinforces these by explaining the purpose of the limit (to keep response small) and the consequence of exceeding it (truncation with a note). This adds semantic value, particularly around the limit parameter, going slightly beyond the schema's own 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?

The description clearly states the tool lists B2 buckets for the authorized account, using a specific verb ('List') and resource ('B2 buckets'). It distinguishes itself from other list tools by mentioning optional filters (by bucket ID, name, or type) and the automatic narrowing to authorized bucket IDs when bucket-scoped. This makes its purpose unambiguous and distinct from sibling 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?

The description provides context on when to use the tool: it is the primary listing operation, and it explains that the response is capped and how to handle truncation (raise the limit or add filters). While it does not explicitly mention alternative tools (e.g., b2_list_keys or s3_list_objects_v2), the context is clear enough for typical usage. It falls just short of explicit 'when-not-to-use' guidance, hence a 4.

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

b2_list_group_membersA
Read-onlyIdempotent

List active (ACCEPTED) Group members for a specific Group. Returns up to 1,000 members per call; use nextEmail for pagination. Includes B2 storage stats per member.

ParametersJSON Schema
NameRequiredDescriptionDefault
groupIdYesThe groupId whose members to list.
startEmailNoPagination cursor — the first member email to return. If no exact match, starts from the next email alphabetically.
adminAccountIdYesThe accountId of the Group admin. Must be authorized for the Partner API.
maxMemberCountNoMaximum number of members to return (1-1000). Defaults to 100.

TDQS

A4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, covering the safety profile. The description adds value by disclosing pagination limits (up to 1,000 per call), the use of nextEmail for continuation, and that storage stats per member are included. These details go beyond annotations and help the agent understand response volume and pagination flow. No contradiction with annotations.

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 with no filler. The core purpose is front-loaded, followed by essential behavioral details (pagination limit and response content). Every word earns its place; it is compact and well-structured.

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 list operation with no output schema, the description provides sufficient context: it defines the resource scope, pagination mechanism, and return content (members with storage stats). It does not enumerate member fields, but that is not essential for invocation. Combined with annotations covering safety, the description is complete enough for correct use.

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% (all 4 parameters have descriptions). The description does not add new semantic meaning beyond the schema—it restates pagination and the 1,000 limit, which are already in parameter descriptions (maxMemberCount maximum and startEmail as cursor). With high schema coverage, baseline 3 is appropriate; no additional parameter context is provided.

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 ('List'), resource ('Group members'), and scope ('for a specific Group'). It also specifies the active (ACCEPTED) state, distinguishing it from siblings like b2_list_groups (lists groups) and b2_create_group_member (adds a member). The tool's purpose is unambiguous and clearly differentiated.

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 usage context by stating it lists accepted members for a specific group, and mentions pagination behavior. However, it does not explicitly name alternatives or state when not to use this tool versus others like b2_list_groups. There is no explicit when/when-not guidance, though the purpose is clear enough for basic selection.

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

b2_list_groupsA
Read-onlyIdempotent

List active Groups administered by a Group admin account. Returns up to 100 groups per call; use nextGroupId for pagination. Requires the account to be authorized for the Partner API.

ParametersJSON Schema
NameRequiredDescriptionDefault
groupNameNoFilter by Group name. Returns all Groups with this exact name.
startGroupIdNoPagination cursor — the groupId to begin listing from.
maxGroupCountNoMaximum number of Groups to return (1-100). Defaults to 100.
adminAccountIdYesThe accountId of the Group admin. Must be authorized for the Partner API.

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so the safety profile is covered. The description adds valuable behavioral detail beyond that: it specifies a 100-group limit, pagination via nextGroupId, and the authorization requirement. These are not in the annotations and help the agent understand expected 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 with zero wasted words. The main action is front-loaded, and the critical details (limit, pagination, authorization) are included without redundancy. It is a model of efficient writing.

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 list operation with no output schema, the description covers the key points: the scope ('active Groups'), the cap and pagination mechanism, and a prerequisite (authorization). It does not describe the response shape, but that is a minor gap given the tool's simplicity and the presence of a pagination hint.

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 all four parameters are already documented. The description's mention of 'Returns up to 100 groups' and 'use nextGroupId for pagination' loosely relates to maxGroupCount and startGroupId but does not add new semantic meaning beyond the schema. Per the rubric, a baseline of 3 is appropriate when the schema carries the full 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 uses a specific verb ('List') and a clear resource ('active Groups'), and adds the qualifier 'administered by a Group admin account,' which distinguishes it from sibling tools like b2_list_group_members (which lists members) and b2_list_buckets. It is unambiguous and immediately conveys the tool's core function.

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 states the required context (Group admin account, Partner API authorization) and implies the tool is for listing groups, but it does not explicitly name alternatives or state when not to use it. The distinction from b2_list_group_members is inferable but not spelled out, so guidance is present but not exhaustive.

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

b2_list_keysA
Read-onlyIdempotent

List the application keys associated with the B2 account. Does not return the actual key secrets — only key IDs, names, capabilities, and restrictions.

ParametersJSON Schema
NameRequiredDescriptionDefault
maxKeyCountNoMaximum number of keys to return (1-1000).
startApplicationKeyIdNoPagination cursor from a previous response's nextApplicationKeyId.

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already establish read-only, idempotent, and non-destructive behavior. The description adds valuable behavioral context by explicitly stating that key secrets are not returned and exactly which fields are included (IDs, names, capabilities, restrictions). This goes beyond the schema and informs the agent about data sensitivity.

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 zero redundancy. The primary purpose is front-loaded, and the important caveat about key secrets is placed immediately after, giving the agent the most decision-relevant information 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?

For a straightforward list tool with no required parameters, the description covers the key details: what is listed, what is returned, and what is deliberately excluded. Pagination mechanics are handled by the schema's parameter descriptions, so nothing critical 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%, with both maxKeyCount and startApplicationKeyId fully described in the schema itself. The description adds no additional parameter-level detail, but the schema already provides sufficient semantics for correct invocation.

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 uses a specific verb ('List') and resource ('application keys associated with the B2 account'), making the tool's function immediately clear. It also distinguishes itself from sibling tools like b2_create_key and b2_delete_key by focusing on listing rather than mutation.

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 clearly identifies this as a listing operation for application keys, which gives the agent enough context to select it over creation or deletion siblings. It does not explicitly state 'use this instead of X', but the read-only listing intent and the security-focused caveat provide clear situational context.

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

b2_list_largest_filesA
Read-onlyIdempotent

List a bucket's largest objects by size via a live listing. For 'largest files', 'what's taking up space in '. Give the bucket by name or bucketId; optional path prefix. Sorting by size requires a full listing, so on very large buckets the scan is bounded by max_scan and a time budget — it then returns the largest among the objects scanned with truncated=true; pass a prefix to focus on a subtree for a complete ranking. Returns name, size, and upload time — never contents.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoHow many of the largest files to return (default 10, max 100).
bucketYesBucket name or bucketId to inspect.
prefixNoOptional path prefix, e.g. "checkpoints/".
max_scanNoSafety cap on objects scanned (default 50,000, max 500,000). Buckets with millions of files cannot be fully sorted by size in one live call; the scan stops at this cap (or a time budget) and returns truncated=true. Narrow with prefix for an exhaustive ranking of a subtree.

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already mark the tool as read-only and idempotent. The description adds non-obvious behavior beyond that: the scan is bounded by max_scan and a time budget, results may come back as truncated=true, and the tool returns only name/size/upload time, never contents. This is excellent disclosure of live-listing 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?

Four sentences with a clear progression: purpose, intended queries, caveat and workaround, return contract. Every sentence adds useful information and there is no filler or restatement of the tool name.

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 read-only listing tool with fully documented parameters and annotations covering safety, the description supplies the missing output details (name, size, upload time, never contents) and the truncation caveat. An agent has everything needed 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 meaning by noting bucket accepts a name or bucketId, explaining that prefix can focus on a subtree for a complete ranking, and tying max_scan to the truncation behavior. Only the limit parameter is left entirely to 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: 'List a bucket's largest objects by size'. It also gives natural-language triggers ('largest files', 'what's taking up space') and closes with a clear boundary ('never contents'), so an agent can distinguish this from listing buckets or fetching object content.

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 contexts for use, including quoted user intents, and provides a prefix-based strategy for large buckets. It does not explicitly name a sibling alternative or state when not to use it, but no close sibling exists for this capability, so the guidance is strong.

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

b2_rank_egress_leadersA
Read-onlyIdempotent

Rank top egress (downloaded bytes) by account or bucket over a period — default month-to-date. For 'who's downloading the most', 'where is egress concentrated'. Returns leaders with each one's share of total egress, from the daily usage reports. Scope follows the caller's key. Needs Usage Reports enabled.

ParametersJSON Schema
NameRequiredDescriptionDefault
byNoRank by 'account' (default) or 'bucket'.account
daysNoRolling window in days (1–90). Omit for current month to date.
limitNoLeaders to return (15).

TDQS

A4.4/5.0
Behavior5/5

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

Beyond the readOnly/idempotent annotations, the description adds meaningful behavioral context: it relies on daily usage reports, defaults to month-to-date, returns shares of total egress, scopes to the caller's key, and explicitly requires Usage Reports to be enabled. This is exactly the kind of operational detail an agent needs.

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 action and resource, then delivers use cases, output semantics, scoping, and a prerequisite. Every sentence contributes useful information with no filler or 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 simple read-only ranking tool with no required parameters and no output schema, the description covers the source data, default window, result content, scope, and prerequisite. It could be slightly stronger by describing the exact response fields or ordering, but nothing essential is missing for a correct invocation.

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 fully documents by, days, and limit. The description mostly restates what the schema says, such as ranking by account or bucket and month-to-date defaults, and does not add substantial parameter-level meaning 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 uses a specific verb-resource pairing: rank top egress leaders by account or bucket over a period. It also describes the exact use cases ('who's downloading the most', 'where is egress concentrated'), which makes it easy to distinguish from sibling reporting tools like b2_report_usage_growth.

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 to use the tool through intended questions and prerequisites like needing Usage Reports enabled. It does not explicitly name an alternative or when-not-to-use condition, but the use cases are specific enough that an agent can select it appropriately among the siblings.

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

b2_report_usage_growthA
Read-onlyIdempotent

Rank accounts by how much STORED data grew or shrank between two points in time, from the daily B2 usage reports (uses stored_gb, the end-of-day snapshot). For 'which customers grew the most/least', 'who's moving data off'. Compares the latest snapshot against one month/quarter/year earlier and fetches only those two days, so it stays fast even on large report buckets. Returns the two dates compared and per-account start vs current GB and % growth (new accounts flagged). Scope follows the caller's key (a partner key sees all its sub-accounts). Needs Usage Reports enabled.

ParametersJSON Schema
NameRequiredDescriptionDefault
daysNoCustom trailing window in days that overrides `period` (e.g. 7 for week-over-week).
limitNoMax accounts (default 50).
orderNoRanking. Default most_grown.most_grown
periodNoCompare the latest snapshot against one month, quarter, or year ago. Default month.month

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already declare readOnly/idempotent/non-destructive, and the description adds substantial behavior beyond that: it fetches only the two compared snapshots for speed, returns the two dates plus per-account start/current GB and % growth, flags new accounts, scopes by the caller's key, and requires Usage Reports enabled. Nothing contradicts the annotations.

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?

Five dense sentences, front-loaded with the core purpose; each sentence earns its place (purpose, use-cases, mechanism/efficiency, output shape, scope+precondition). No filler and no repetition of what the schema already states.

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?

With no output schema, the description supplies the needed return-shape info (dates compared, per-account start vs current GB, % growth, new-account flag). It also covers the prerequisite, scope, data source, and performance behavior, so an agent can select and invoke the tool correctly with no gaps.

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 earns a 4 by giving the period/days parameters operational meaning — the comparison against 'one month/quarter/year earlier' using end-of-day stored_gb snapshots and the 'fetches only those two days' performance rationale — context the schema's per-parameter descriptions don't provide.

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 ('Rank accounts by how much STORED data grew or shrank between two points in time') and names its data source (daily B2 usage reports, stored_gb end-of-day snapshot). The example queries ('which customers grew the most/least', 'who's moving data off') make its niche unmistakable, and it is clearly distinguished from sibling b2_rank_egress_leaders, which ranks by egress rather than stored-data growth.

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?

Gives explicit use-case phrasing ('For "which customers grew the most/least", "who's moving data off"'), a hard precondition ('Needs Usage Reports enabled'), and scope semantics ('Scope follows the caller's key'). However, it never names an alternative tool or states a when-not condition, so it stops just 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.

b2_reserve_trial_create_accountA
Destructive

Reserve and create a B2 Reserve trial account through the Partner API, returning a durable application key for the new account. Requires a Partner-entitled master key, and is a billable, irreversible account creation governed by the destructive-operation gate. Available only in explicit inline secret-sink mode because Reserve Trial has no provider-side recovery path if a file-sink write fails after account creation; the minted key is shown once, so capture it. Retries are not deduplicated server-side, so repeating the call can create another account regardless of idempotencyKey; verify whether the account already exists and reconcile before retrying. Use b2_create_group_member to add an account to an existing Partner group instead of provisioning a standalone trial.

ParametersJSON Schema
NameRequiredDescriptionDefault
termYesTrial duration in days (7-30).
emailYesEmail address for the new B2 Reserve trial account.
regionNoOptional data region for the new account; omit to use the Partner default.
confirmNoFallback confirmation for this destructive/irreversible operation when the effective server destructive policy is 'confirm' and MCP elicitation cannot run.
storageYesTrial storage amount in TB (1-50).
idempotencyKeyYesCaller-generated idempotency key recorded with the request. Note: in inline mode retries are not deduplicated server-side, so reconcile before retrying rather than relying on this key to prevent a duplicate account.

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already flag destructive=true and idempotent=false, but the description adds crucial context: the operation is billable, irreversible, gated by the destructive-operation confirmation, has no provider-side recovery path in file-sink mode, and the minted key is shown only once. It also explains that idempotencyKey will not prevent duplicate accounts, which directly elaborates on the idempotentHint=false annotation.

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?

Five focused sentences, each carrying essential operational or routing information. Critical caveats are front-loaded: purpose, return value, prerequisites, irreversibility, secret-sink constraint, retry behavior, and alternative tool. No filler or repetition.

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 complex, destructive, no-output-schema tool, the description covers prerequisites, side effects, retry semantics, secret handling, and the alternative pathway. It also names the return value (durable application key). Combined with 100% schema parameter coverage, an agent has enough context to invoke this tool correctly and avoid dangerous duplicate provisioning.

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 of 3 applies. The description reinforces the idempotencyKey caveat already documented in the schema, but it does not add new meaning to email, term, storage, region, or confirm beyond what the property descriptions already provide.

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 ('Reserve and create') plus the exact resource ('B2 Reserve trial account through the Partner API') and the key output (a durable application key). The final sentence also distinguishes it from b2_create_group_member, so an agent can tell this tool apart from its closest sibling.

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 this tool (standalone trial provisioning) and names the alternative (b2_create_group_member) for adding an account to an existing Partner group. It also gives prerequisites (Partner-entitled master key), operational constraints (inline secret-sink mode only), and retry guidance (verify before retrying), leaving little to inference.

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

b2_set_bucket_notification_rulesA
DestructiveIdempotent

Replace the complete B2 event-notification webhook rule set for a bucket. Use b2_get_bucket_notification_rules first and submit the full desired rule set; this is not a patch or append API. Requires writeBucketNotifications and destructive confirmation by policy. Each webhook URL must be a public HTTPS endpoint, and echoed URL details, HMAC secrets, and custom-header values are redacted from the response.

ParametersJSON Schema
NameRequiredDescriptionDefault
confirmNoFallback confirmation for replacing persistent outbound webhook notification rules when the effective server destructive policy is 'confirm' and MCP elicitation cannot run.
bucketIdYesExact bucket ID whose notification rules should be replaced.
eventNotificationRulesYesComplete replacement rule set for the bucket. Include every rule that should remain; omitted existing rules are removed.

TDQS

A4.9/5.0
Behavior5/5

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

Beyond the annotations (destructiveHint=true, readOnlyHint=false), the description adds meaningful behavioral context: confirmation is enforced by policy, webhook URLs are validated for public HTTPS reachability, and echoed URL details, HMAC secrets, and custom-header values are redacted from the response. These behaviors are not derivable from annotations and materially shape agent expectations. The description is consistent with all annotations, so no 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?

Three sentences, each earning its place: the first states the core action, the second gives the read-first workflow and the patch/append warning, and the third discloses permissions, confirmation, URL validation, and response redaction. Critical information is front-loaded and there is zero 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 a destructive write tool with no output schema, the description covers everything an agent needs to invoke it correctly: full-replace semantics, the prerequisite read call, permission and confirmation requirements, URL validation, and response redaction behavior. The schema fully documents all three parameters, so no material gap remains.

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 adds value by reinforcing the semantics of eventNotificationRules as a complete desired set ('submit the full desired rule set; this is not a patch or append API'), which tells the agent that omitting a rule deletes it and that a read-first call is required to assemble the payload. The URL-publicity and redaction notes also echo and reinforce the schema's url and secret parameter 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?

The description opens with a specific verb and resource: 'Replace the complete B2 event-notification webhook rule set for a bucket.' It clearly differentiates from the read sibling b2_get_bucket_notification_rules by emphasizing this is a full replacement, not a patch or append API, so an agent can select it correctly 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?

It explicitly prescribes the workflow ('Use b2_get_bucket_notification_rules first and submit the full desired rule set') and names the exclusion condition ('this is not a patch or append API'), so the agent knows partial edits are out of scope. It also states the required permission (writeBucketNotifications) and the destructive-confirmation precondition, leaving no ambiguity about when this tool applies.

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

b2_unfinished_uploadsA
Read-onlyIdempotent

Find abandoned multipart uploads that silently consume storage in a bucket. For 'bucket bloat', 'stuck/incomplete uploads', 'wasted storage'. Returns count, oldest upload age, and wasted bytes. Give the bucket by name or bucketId. Live listing, bounded by max_uploads and an internal time budget — on a very bloated bucket it returns a truncated result (and wasted_gb may be a lower bound) and recommends a lifecycle rule.

ParametersJSON Schema
NameRequiredDescriptionDefault
bucketYesBucket name or bucketId to inspect.
max_uploadsNoSafety cap on how many unfinished uploads to scan (default 1000, max 10,000). A bucket bloated with abandoned uploads would otherwise trigger an unbounded walk plus a per-upload parts fan-out that times out. If the cap or an internal time budget is hit, the result is truncated and wasted_gb may be a lower bound — add a lifecycle rule to auto-cancel unfinished large files.
older_than_daysNoOnly count uploads started more than this many days ago (optional).

TDQS

A4.5/5.0
Behavior5/5

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

Annotations already declare readOnly, idempotent, and non-destructive behavior, so the baseline burden is lower. The description adds meaningful behavior beyond annotations: it is a live listing bounded by max_uploads and an internal time budget, may truncate results on bloated buckets, and wasted_gb may be a lower bound. It also discloses that the tool recommends a lifecycle rule.

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: use case, return metrics, invocation, and truncation caveat are each given distinct content. The most important scoping 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?

Even without an output schema, the description tells the agent what will be returned: count, oldest upload age, and wasted bytes. It also covers the key failure mode and mitigation recommendation. Combined with rich annotations, this is complete enough for correct invocation and result interpretation.

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 little parameter-level meaning beyond restating that the bucket can be given by name or bucketId, which duplicates the schema. 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 description states a specific verb and resource: 'Find abandoned multipart uploads that silently consume storage in a bucket.' It also includes use-case keywords like 'bucket bloat' and 'wasted storage', which help distinguish it from generic listing tools such as s3_list_multipart_uploads and from size-focused siblings like b2_largest_files.

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 invocation contexts: 'bucket bloat', 'stuck/incomplete uploads', and 'wasted storage'. It does not explicitly name alternative tools or state when not to use this tool, so it stops short of full exclusionary guidance.

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

b2_update_bucketA
DestructiveIdempotent

Update persistent settings on an existing B2 bucket: visibility, metadata, CORS, lifecycle, default encryption, replication, Object Lock, and default retention. Requires the writeBuckets capability. Use b2_list_buckets first to inspect the current bucketId/revision and use ifRevisionIs for safer retries; use s3_put_bucket_lifecycle only when you specifically need the S3 lifecycle API shape. Gated cases: bucketType allPublic, fileLockEnabled false, defaultRetention.mode null, lifecycleRules with daysFromHidingToDeleting, and any replicationConfiguration update.

ParametersJSON Schema
NameRequiredDescriptionDefault
confirmNoFallback confirmation for a gated bucket update when the effective server destructive policy is 'confirm' and MCP elicitation cannot run. Gated cases: bucketType allPublic, fileLockEnabled false, defaultRetention.mode null, lifecycleRules with daysFromHidingToDeleting, or any replicationConfiguration. Non-gated updates do not need it.
bucketIdYesThe exact bucket ID to update, not the bucket name.
corsRulesNoCORS rules: <=100. allowedOrigins/allowedOperations require 1-100 non-empty strings; allowedHeaders/exposeHeaders allow <=100. Strings <=999 chars. Per-rule UTF-8 total <1,000. Names unique. On update, provided rules replace the existing set; omit to leave unchanged.
bucketInfoNoCustom metadata: <=10 pairs. Keys: 1-50 UTF-8 bytes, chars A-Z a-z 0-9 . _ ` ~ ! # $ % ^ & * ' | + -, no b2- prefix. Values total <=10,000 UTF-8 bytes. Omit to leave current metadata unchanged.
bucketTypeNoOptional visibility change. allPublic makes objects world-readable by URL and is governed by the configured destructive policy; omit to leave unchanged.
ifRevisionIsNoConditional update — only update if the bucket revision matches this value.
lifecycleRulesNoWhen provided, replaces the bucket's B2 lifecycle rule set; omit to leave unchanged. Rules that delete hidden versions are destructive in effect and are governed by the configured destructive policy.
fileLockEnabledNoEnable Object Lock on the bucket. Unlike S3's PutObjectLockConfiguration (which only enables lock at bucket creation), the B2 native API allows enabling Object Lock on an existing bucket here. Requires the writeBucketRetentions capability.
defaultRetentionNoDefault Object Lock retention for newly uploaded objects. Requires Object Lock enabled on the bucket. Send { mode: null, period: null } to clear.
replicationConfigurationNoOptional replication configuration. Omit to leave unchanged; any provided value changes persistent copy behavior and is confirmation-gated.
defaultServerSideEncryptionNoDefault server-side encryption for new files in this bucket. Omit on update to leave unchanged.

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already carry readOnlyHint=false and destructiveHint=true; the description adds value beyond them by naming the required capability (writeBuckets), enumerating the confirmation-gated cases (bucketType allPublic, fileLockEnabled false, defaultRetention.mode null, lifecycleRules with daysFromHidingToDeleting, replicationConfiguration updates), and flagging that delete-rule lifecycle updates are destructive in effect. No contradiction with the annotations.

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 paragraph, front-loaded with purpose, followed by capability, precondition, alternative routing, and gated cases. Every clause carries distinct information, and nothing in the description repeats what the schema already documents.

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, confirmation-gated, destructive mutation tool with no output schema, the description covers capability requirements, precondition workflow, gated cases, and sibling differentiation — most of what an agent needs before invoking. The remaining gap is the response shape on success (e.g., updated bucket object and changed revision value), which would strengthen ifRevisionIs retry logic.

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 of 3 applies and the schema does the heavy lifting. The description adds only light operational context for two parameters (bucketId must be the exact ID, ifRevisionIs enables safer retries), which is useful but not new semantic meaning 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 opens with a specific verb and resource — 'Update persistent settings on an existing B2 bucket' — and enumerates the scope (visibility, metadata, CORS, lifecycle, default encryption, replication, Object Lock, default retention). This cleanly distinguishes it from siblings like b2_create_bucket, b2_delete_bucket, and s3_put_bucket_lifecycle without requiring schema inspection.

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 an explicit precondition ('Use b2_list_buckets first to inspect the current bucketId/revision'), a safer retry pattern via ifRevisionIs, and a named alternative with a selection condition ('use s3_put_bucket_lifecycle only when you specifically need the S3 lifecycle API shape'). When-to-use, when-not-to-use, and alternatives are all spelled out.

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

b2_update_file_retentionA
DestructiveIdempotent

Set or modify the retention policy on a specific file version in B2. Supports governance and compliance retention modes. In compliance mode, the retain-until date can only be extended. Requires the writeFileRetentions capability.

ParametersJSON Schema
NameRequiredDescriptionDefault
fileIdYesThe B2 file ID of the file to update.
confirmNoFallback confirmation for this irreversible/protection-removing operation when the effective server destructive policy is 'confirm' and MCP elicitation cannot run.
fileNameYesThe name of the file (required by the B2 API alongside fileId).
fileRetentionYesRetention policy to apply, or { mode: null, retainUntilTimestamp: null } to clear. This is the flat shape B2's write API expects — do NOT include the read-only isClientAuthorizedToRead/value wrapper that b2_get_file_info returns.
bypassGovernanceNoIf true, allows overriding governance-mode retention. Requires bypassGovernance capability.

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already flag destructiveHint=true, readOnlyHint=false, and idempotentHint=true. The description adds meaningful behavioral context beyond annotations: the capability requirement, the compliance-mode extension-only rule, and the condition that clearing only works in governance mode with bypassGovernance. This gives the agent a clearer safety/behavior model without contradicting annotations.

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 three purposeful sentences: the primary action, the supported modes, and the critical constraint plus capability requirement. It is front-loaded and contains no filler or redundant restatement of the tool name.

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 nested fileRetention object, the confirm flag, and no output schema, the description plus schema covers what an agent needs to invoke this correctly: required parameters, mode semantics, capability requirements, and destructive implications. A return-shape note would be nice but is not essential for a mutating update 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%, so the schema already documents all five parameters, including the nested fileRetention object. The tool description itself adds little parameter-level detail beyond naming the modes and capability. Baseline 3 is appropriate because the schema carries the parameter semantic 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 and resource: 'Set or modify the retention policy on a specific file version in B2.' It names the two retention modes and clearly differentiates this from the sibling b2_update_file_legal_hold, whose subject is legal hold rather than retention.

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 operational constraints: governance vs compliance modes, compliance retention can only be extended, clearing requires governance mode, and the writeFileRetentions capability is required. It does not explicitly name alternatives or say 'use X instead,' but the context is sufficient for an agent to decide when this tool applies.

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

s3_abort_multipart_uploadA
DestructiveIdempotent

Abort an in-progress S3-compatible multipart upload and release all associated storage.

ParametersJSON Schema
NameRequiredDescriptionDefault
keyYesThe object key.
bucketYesThe bucket name.
confirmNoFallback confirmation for this destructive/irreversible operation when the effective server destructive policy is 'confirm' and MCP elicitation cannot run.
uploadIdYesThe UploadId to abort.

TDQS

A3.8/5.0
Behavior3/5

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

Annotations already declare destructiveHint=true and readOnlyHint=false, so the description's core safety profile is covered. The phrase 'release all associated storage' adds a useful consequence, but the description does not elaborate on irreversibility or the idempotent behavior beyond what annotations 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?

A single sentence that is direct, front-loaded with the verb and object, and contains no filler or redundant phrasing. It conveys the essential information 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?

Given the annotations and full schema coverage, the description is largely complete for a destructive operation. It states the primary effect and the annotations cover safety semantics. It does not mention the confirm parameter's fallback behavior, but the schema already describes it, so the description need not repeat 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 baseline is 3. The description does not add any parameter-specific meaning beyond what the schema already documents for bucket, key, and uploadId.

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 action ('Abort'), the specific resource ('in-progress S3-compatible multipart upload'), and the consequence ('release all associated storage'). It distinguishes this tool from sibling tools like s3_complete_multipart_upload and s3_create_multipart_upload without ambiguity.

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 this tool is for canceling an in-progress upload rather than completing it, but it does not explicitly name alternatives or state when not to use it. The context is clear enough for an agent to infer the primary use case, but explicit routing guidance is missing.

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

s3_complete_multipart_uploadA
Idempotent

Finalize an S3-compatible multipart upload in B2 by assembling uploaded parts. Use only after s3_create_multipart_upload and s3_get_presigned_upload_part_url (or s3_upload_part_copy) have produced every required part; use s3_list_parts to verify uploaded parts before retrying. Requires writeFiles. Completion is idempotent only when B2 already committed the exact same part list; if the response is lost, reconcile with s3_head_object or s3_list_object_versions before retrying.

ParametersJSON Schema
NameRequiredDescriptionDefault
keyYesDestination object key used to create the multipart upload.
partsYesComplete ordered part manifest. Include every part in ascending partNumber order (part numbers are 1-10000); missing or stale ETags fail the completion call.
bucketYesDestination bucket name used to create the multipart upload.
uploadIdYesUploadId returned by s3_create_multipart_upload.

TDQS

A4.7/5.0
Behavior5/5

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

Beyond the annotations, the description adds meaningful behavioral context: the writeFiles permission requirement, the qualified idempotency condition ('idempotent only when B2 already committed the exact same part list'), and the recovery path if the response is lost. It refines the idempotentHint annotation without contradicting it.

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 dense sentences front-load the core purpose and sequential constraints, then cover verification, permission, and failure recovery. Every sentence carries essential operational guidance 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 a complex multipart finalization flow with no output schema, the description covers prerequisites, ordering, verification, permissions, idempotency caveats, and retry reconciliation. This is sufficient for an agent to invoke the tool correctly in context.

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 input schema already thoroughly documents bucket, key, uploadId, and parts. The description adds orchestration context around the part manifest but does not need to repeat parameter 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?

The description states a specific verb ('Finalize') and resource ('S3-compatible multipart upload in B2'), clarifying it assembles uploaded parts into the final object. It is clearly distinguished from sibling operations like s3_abort_multipart_upload, s3_create_multipart_upload, and s3_list_parts.

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 says 'Use only after s3_create_multipart_upload and s3_get_presigned_upload_part_url (or s3_upload_part_copy) have produced every required part,' and instructs the agent to verify with s3_list_parts before retrying. It also names reconciliation alternatives (s3_head_object, s3_list_object_versions) for lost responses, leaving little to inference.

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

s3_copy_objectA
Idempotent

Copy an object within B2 or between B2 buckets via B2's S3-compatible CopyObject API. The acl input is retained as a no-op S3 compatibility hint; B2 access follows the destination bucket policy.

ParametersJSON Schema
NameRequiredDescriptionDefault
aclNoAccepted as a no-op S3 compatibility hint; B2 access follows the destination bucket policy.
metadataNoNew metadata (only used with REPLACE).
sourceKeyYesThe source object key.
contentTypeNoNew content type (only used with REPLACE).
sourceBucketYesThe source bucket name.
destinationKeyYesThe destination object key.
sourceVersionIdNoCopy a specific version of the source object.
destinationBucketYesThe destination bucket name.
metadataDirectiveNoCOPY copies metadata from source; REPLACE uses the provided metadata.COPY

TDQS

A4/5.0
Behavior4/5

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

The description adds useful behavioral context beyond the annotations: the acl parameter is called out as a no-op S3 compatibility hint, and B2 access is tied to the destination bucket policy. This helps the agent understand side effects and authorization behavior that the annotations do not convey. There is no contradiction with annotations.

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 with no filler. It front-loads the core operation and scope, then places the important acl caveat and access-policy note. Every sentence earns its place and the structure is easy for an agent to scan.

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 9-parameter tool with full schema coverage and useful annotations, the description is reasonably complete: it clarifies bucket scope and the acl no-op. It does not describe the return value or error behavior, but the absence of an output schema and the schema's thorough parameter documentation keeps this from being a major gap.

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 parameter meanings. The description repeats the acl no-op behavior that the schema already states, adding no new param-level insight. Baseline 3 is appropriate because the schema does the heavy lifting and the description does not need to compensate.

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 operation: 'Copy an object within B2 or between B2 buckets via B2's S3-compatible CopyObject API.' It names a specific verb, resource, and scope, and the phrase 'CopyObject API' distinguishes it from sibling upload/part-copy tools without requiring schema inspection.

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 gives clear context for the operation and its cross-bucket scope, but it never explicitly tells the agent when to choose this over alternatives like s3_put_object or s3_upload_part_copy. Usage is implied by the semantics of 'copy' rather than stated with exclusions or sibling comparisons.

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

s3_create_multipart_uploadA

Initiate an S3-compatible multipart upload for a large object in B2 and return an UploadId. Requires the writeFiles capability. This starts an unfinished large-file upload that accrues storage for each uploaded part until you finalize with s3_complete_multipart_upload or discard it with s3_abort_multipart_upload; use s3_list_multipart_uploads to enumerate abandoned uploads, or b2_unfinished_uploads for storage-cost analysis of a selected bucket. Initiating the upload does not reserve or lock the destination key, so concurrent writes may still target it. Use s3_put_object only for tiny (≤1 MiB) inline payloads; prefer a single-object presigned PUT (s3_get_presigned_url) for most single-object transfers, including large ones; use multipart when an object is uploaded or copied as parallel parts. Flow: s3_create_multipart_upload → s3_get_presigned_upload_part_url → PUT each part directly to B2 (capture each ETag) → s3_complete_multipart_upload with those ETags. Parts are numbered 1–10000 and every part except the last must be ≥5 MiB, and no part may exceed 5 GiB.

ParametersJSON Schema
NameRequiredDescriptionDefault
aclNoAccepted as a no-op S3 compatibility hint; B2 access follows the destination bucket policy.
keyYesThe object key for the final assembled file.
bucketYesThe destination bucket name.
metadataNoCustom metadata stored on the final object.
contentTypeNoMIME type recorded on the final assembled object.
serverSideEncryptionNoServer-side encryption. B2 supports SSE-B2 (AES256) only — not SSE-KMS.

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already indicate a mutating, non-idempotent operation, and the description adds meaningful behavioral context: it requires the writeFiles capability, accrues storage for uploaded parts, does not reserve or lock the destination key, and explains the consequences of not finalizing or aborting. This goes well beyond the structured annotations.

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, lifecycle, concurrency caveat, alternative routing, orchestration flow, and part-number limits are all present. The most important identifying information is front-loaded in the first sentence.

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?

This is a complex stateful operation with significant side effects, and the description covers prerequisites, follow-up steps, alternatives, concurrency implications, and size constraints. The absence of an output schema is mitigated by explicitly stating that the tool returns an UploadId, and the full lifecycle is described.

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 fully documents all six parameters, meeting the baseline. The description does not add field-level parameter meaning beyond the schema, though it does provide useful context about part size constraints that informs how the multipart flow should be used.

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: 'Initiate an S3-compatible multipart upload for a large object in B2 and return an UploadId.' It clearly distinguishes this tool from siblings by naming the complete/abort counterparts and contrasting it with s3_put_object and presigned URLs.

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 when-to-use guidance: use s3_put_object only for tiny ≤1 MiB payloads, prefer presigned PUT for most transfers, and use multipart for parallel-part uploads or copies. It also lays out the full orchestration flow with sibling tools, leaving no ambiguity about how this step fits.

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

s3_delete_objectA
Destructive

Delete one B2 object through the S3-compatible API. Use s3_list_object_versions first when you need to target a specific version or delete marker; use s3_delete_objects for batches up to 1000. Requires deleteFiles and destructive confirmation by policy; targeting a specific versionId additionally requires readFiles, because native B2 version binding is verified first. Omitting versionId applies normal S3 delete semantics and can create a delete marker in versioned buckets; providing versionId permanently removes that version after that binding check.

ParametersJSON Schema
NameRequiredDescriptionDefault
keyYesExact object key to delete.
bucketYesBucket name containing the object to delete.
confirmNoFallback confirmation for this destructive/irreversible operation when the effective server destructive policy is 'confirm' and MCP elicitation cannot run.
versionIdNoExact version ID to delete. Omit to delete the current object by S3 semantics, which may create a delete marker for versioned buckets.

TDQS

A4.9/5.0
Behavior5/5

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

Annotations already indicate destructiveHint=true, but the description adds crucial behavioral nuance: omitting versionId can create a delete marker in versioned buckets, while providing versionId permanently removes that version after a native B2 binding check. It also discloses permission requirements beyond the annotation flags, which is highly valuable for a destructive 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?

The description is dense but every sentence earns its place: core action first, then alternative routing, then permissions, then versioning semantics. It is front-loaded and contains no filler or repetition of schema fields.

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 destructive single-object delete with no output schema, this description is complete: it covers the operation, the aliasing through S3-compatible API, versioning consequences, permission requirements, and the key sibling alternatives. An agent has everything needed to invoke the tool correctly and safely.

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 adds meaningful semantics beyond the schema by explaining the behavioral consequences of omitting versus providing versionId, and by tying versionId usage to an additional readFiles permission. This goes beyond simply restating parameter names.

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 ('Delete'), a specific resource ('one B2 object'), and the exact interface ('S3-compatible API'). It also distinguishes itself from the sibling tools s3_delete_objects and s3_list_object_versions, so an agent can tell them 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?

Explicitly tells the agent when to use s3_list_object_versions first (targeting a specific version or delete marker) and when to use s3_delete_objects (batches up to 1000). It also states the permission prerequisites for the base operation and for versionId targeting, leaving no ambiguity about invocation context.

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

s3_delete_objectsA
Destructive

Delete multiple objects from a B2 bucket with bounded SDK concurrency (up to 1000 objects).

ParametersJSON Schema
NameRequiredDescriptionDefault
quietNoIf true, only return errors (not successes) in the response.
bucketYesThe bucket name.
confirmNoFallback confirmation for this destructive/irreversible operation when the effective server destructive policy is 'confirm' and MCP elicitation cannot run.
objectsYesArray of objects to delete.
bypassGovernanceNoIf true, bypass governance-mode Object Lock retention when deleting specific versions. Requires bypassGovernance capability.

TDQS

A3.6/5.0
Behavior2/5

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

The annotations already mark this as destructive (destructiveHint: true), but the description does not elaborate on permanence, potential failures (e.g., governance restrictions), or the need for confirmation. The bypassGovernance parameter is not mentioned in the description, leaving the agent unaware of conditions that may affect the 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?

The description is a single concise sentence, directly stating the purpose without fluff. It includes the key constraint ('up to 1000 objects') efficiently. 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 does not explain return formats, but it adequately covers the tool's core purpose and key operational bound. It does not mention error handling or prerequisites, but these are not critical for the agent's initial selection. The description is sufficiently complete for a simple deletion operation.

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 covers 100% of parameters, so the baseline is 3. The description adds no additional semantic detail about parameters; it only restates the action. No extra value is provided 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 action: 'Delete multiple objects from a B2 bucket' with a specific bound ('up to 1000 objects'). It distinguishes itself from singular deletion (s3_delete_object) by emphasizing multiple objects and the concurrency bound.

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 usage for bulk deletion ('multiple objects'), but does not explicitly state when to choose this tool over alternatives like s3_delete_object or when not to use it (e.g., for single-object deletion). The concurrency bound is mentioned but not framed as a selection criterion.

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

s3_get_bucket_locationA
Read-onlyIdempotent

Get the region (location constraint) of a B2 bucket via the S3-compatible API. No native b2_* equivalent — used to verify region/endpoint pairing.

ParametersJSON Schema
NameRequiredDescriptionDefault
bucketYesThe bucket name.

TDQS

A4/5.0
Behavior3/5

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

Annotations already declare the tool read-only, idempotent, and non-destructive, lowering the disclosure burden. The description adds useful context about the S3-compatible API and its verification purpose, but does not describe the return payload or failure behavior. This is adequate but not rich.

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 operation and resource, and every clause adds value. The parenthetical and dash clause pack in API family and purpose without any 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 one-parameter, read-only, idempotent tool with complete schema coverage and rich annotations, the description covers the essential context: API family, purpose, and lack of native alternative. It does not explicitly state the return value, but the operation name and purpose make it mostly inferable.

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% with a single required bucket parameter, so the schema fully documents the input. The description mentions 'B2 bucket' and 'location constraint' but adds no parameter-level meaning beyond what the schema already provides.

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 opens with a specific verb ('Get') and resource ('region (location constraint) of a B2 bucket'), and distinguishes itself from b2_* siblings by explicitly stating there is no native equivalent. This makes it clearly identifiable among the many S3 and B2 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?

The description provides a clear use case ('verify region/endpoint pairing') and notes that no native b2_* equivalent exists, guiding the agent away from the b2_* family. It does not explicitly name alternatives like s3_head_bucket, so the guidance is useful but not exhaustive.

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

s3_get_objectA

Read a SMALL object inline (≤1 MiB, returned base64) — for manifests, sidecars, and configs the agent must inspect — or stream any size to a local path with saveToPath. saveToPath writes the fetched bytes to the local filesystem (creating parent directories), removes the partial file if the stream fails (cleanup of its own output only), and performs no mutation of B2 or any remote data. For real object data, generate a GetObject URL with s3_get_presigned_url and download directly from B2 (bytes never pass through the server or the model context).

ParametersJSON Schema
NameRequiredDescriptionDefault
keyYesThe object key.
rangeNoByte range, e.g. 'bytes=0-1048575'.
bucketYesThe bucket name.
versionIdNoSpecific version of the object to retrieve.
saveToPathNoIf provided, save the file to this local path.

TDQS

A4.9/5.0
Behavior5/5

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

Adds meaningful behavioral detail beyond the annotations: inline returns base64, saveToPath creates parent directories, partial files are removed on stream failure, and no remote B2 mutation occurs. This is especially valuable because readOnlyHint=false could otherwise leave an agent uncertain about side effects.

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 dense, purposeful sentences with no filler. The core usage choice is front-loaded, followed by side-effect disclaimers and the alternative routing. 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?

The tool has no output schema, but the description explains the return format for inline reads and the local-path behavior for saveToPath. Combined with full schema coverage for parameters, an agent has everything needed to invoke it correctly, including edge-case cleanup and the alternative for large real data.

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 covers all 5 parameters at 100%, so the baseline is already strong. The description goes further by explaining the practical semantics of saveToPath (local write, parent directory creation, cleanup) and the inline/base64 return behavior, which the schema alone does not convey.

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 uses a specific verb and resource: 'Read a SMALL object inline' or stream to a local path, with named use cases (manifests, sidecars, configs). It also distinguishes itself from s3_get_presigned_url, so a selecting agent can tell them 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?

Explicitly states when to use inline reads (small objects ≤1 MiB to inspect), when to use saveToPath (any size), and when to use the alternative s3_get_presigned_url for real object data. This gives clear selection criteria without relying on inference.

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

s3_get_presigned_upload_part_urlA
Idempotent

Generate short-lived presigned PUT URL bearer capabilities for parts of an S3-compatible multipart upload, so the client/worker uploads each part DIRECTLY to B2. Prefer this over s3_get_presigned_url for multipart uploads; use s3_get_presigned_url for single-object PUT/GET transfers. The response includes expiresIn/expiresAt; treat each URL as sensitive until it expires. Flow: s3_create_multipart_upload → s3_get_presigned_upload_part_url → PUT each part to its URL (capture the ETag from each response header) → s3_complete_multipart_upload with those ETags. Parts except the last must be ≥5 MiB, and no part may exceed 5 GiB.

ParametersJSON Schema
NameRequiredDescriptionDefault
keyYesThe object key.
bucketYesThe bucket name.
uploadIdYesThe UploadId from s3_create_multipart_upload.
expiresInNoURL expiry in seconds (default: 3600 = 1 hour, max: 604800 = 7 days).
partNumbersYesPart numbers to presign (each 1–10000). Mint all parts at once, or only the missing ones to resume.

TDQS

A4.7/5.0
Behavior5/5

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

Beyond the annotations, the description adds valuable behavioral context: URLs are sensitive bearer capabilities, the response contains expiresIn/expiresAt, the client must capture ETags from PUT responses, and part size constraints apply. This clarifies that the tool itself only mints URLs while the upload happens externally, consistent with openWorldHint=true.

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, alternative routing, security caveat, workflow sequence, and size constraints. The most important scoping information is front-loaded, and the flow is compact but complete.

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?

The description fully equips an agent to use the tool correctly within the multipart lifecycle: prerequisite create call, direct PUT usage, ETag capture, subsequent complete call, part size limits, and expiry behavior. No output schema exists, but the key response fields are stated.

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 already covers all parameters with detailed descriptions (100% coverage), so the baseline is 3. The description adds useful flow context around uploadId and partNumbers, but it does not substantially explain parameter formats 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 opens with a specific verb and resource: 'Generate short-lived presigned PUT URL bearer capabilities for parts of an S3-compatible multipart upload.' It clearly distinguishes itself from s3_get_presigned_url, which is for single-object transfers, so an agent can immediately tell which tool to use.

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?

Explicit guidance is provided: 'Prefer this over s3_get_presigned_url for multipart uploads; use s3_get_presigned_url for single-object PUT/GET transfers.' It also gives the full sequence with related sibling tools and states resumability by minting only missing part numbers.

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

s3_get_presigned_urlA
DestructiveIdempotent

Generate a short-lived presigned URL bearer capability for one B2 object — GetObject (download) or PutObject (upload). Prefer this for single-object transfers; use s3_create_multipart_upload and s3_get_presigned_upload_part_url for multipart uploads. The response includes the URL, operation, expiresIn, and expiresAt; treat the URL as sensitive until it expires. This is the preferred path for moving real object data: bytes flow directly between the client/worker and B2 and never pass through the MCP server. Note: presigned POST (browser form uploads) is NOT supported by B2; use a PutObject URL instead.

ParametersJSON Schema
NameRequiredDescriptionDefault
keyYesThe object key.
bucketYesThe bucket name.
confirmNoFallback confirmation for minting a PutObject presigned URL bearer capability when the effective server destructive policy is 'confirm' and MCP elicitation cannot run.
expiresInNoURL expiry in seconds (default: 3600 = 1 hour, max: 604800 = 7 days).
operationYesThe operation the URL allows: GetObject to download or PutObject to upload.
versionIdNoFor GetObject: the specific version ID to target.
contentTypeNoFor PutObject: restrict the upload to this content type.

TDQS

A4.6/5.0
Behavior5/5

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

Even though annotations already mark destructiveHint=true and readOnlyHint=false, the description adds substantial behavioral context: the URL is a sensitive 'bearer capability' to treat as secret until expiry, the response shape (URL, operation, expiresIn, expiresAt), and the crucial data-flow fact that bytes bypass the MCP server entirely. It also discloses the B2 platform limitation on presigned POST, which an agent could not infer from the schema or annotations.

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?

Five sentences with no filler; the core purpose is front-loaded in the first phrase, followed by usage routing, response/security details, and a constraint note. It is denser than the minimal two-sentence ideal, but each sentence earns its place given the security implications and missing output schema.

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, the description compensates by enumerating the response fields. With 7 parameters, the 100% schema coverage handles parameter semantics while the description addresses what an agent cannot infer elsewhere: security handling, expiry behavior, data-path architecture, multipart alternative routing, and a platform-specific limitation. Nothing critical 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 baseline of 3 applies — every parameter already carries its own description. The tool description adds modest framing value by tying expiresIn to the 'short-lived' concept and clarifying that operation selects download vs upload capability, but it does not meaningfully elaborate on versionId, contentType, or confirm 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 opens with a specific verb and resource: 'Generate a short-lived presigned URL bearer capability for one B2 object', and immediately disambiguates the two modes (GetObject download vs PutObject upload). It differentiates from sibling tools by framing this as URL-based transfer rather than server-mediated access, which separates it from s3_get_object, s3_put_object, and the multipart family.

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?

Explicit routing is provided: 'Prefer this for single-object transfers; use s3_create_multipart_upload and s3_get_presigned_upload_part_url for multipart uploads.' It also states this is 'the preferred path for moving real object data' and gives a hard exclusion (presigned POST unsupported by B2, use PutObject URL instead). An agent receives clear when-to-use and when-not-to-use guidance with named alternatives.

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

s3_head_bucketA
Read-onlyIdempotent

Check whether a B2 bucket exists and is reachable on the S3-compatible endpoint with the current credentials. Use this to validate S3-surface reachability (the native b2_list_buckets confirms existence but not S3 reachability).

ParametersJSON Schema
NameRequiredDescriptionDefault
bucketYesThe bucket name to check.

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and destructiveHint=false. The description adds valuable behavioral context: it operates on the S3-compatible endpoint, checks both existence and reachability, and depends on current credentials. This goes beyond what the annotations convey, though it could mention explicit error/status outcomes.

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 tight sentences with no filler. The primary purpose is first, followed by a precise usage directive. Every phrase earns its place and nothing needs to be trimmed.

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 one-parameter, read-only tool with full annotations and complete schema coverage, this description supplies all necessary context: what it checks, what credentials it uses, and when to prefer it over a sibling. No missing information blocks an agent from selecting or invoking it 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?

Schema description coverage is 100% and the only parameter, 'bucket', is already described as 'The bucket name to check.' The description reinforces this by referencing the bucket but does not add new semantic details such as name format or restrictions. Baseline 3 is appropriate given full schema 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?

States a specific verb ('Check whether') and resource ('B2 bucket') with the precise scope: exists and is reachable on the S3-compatible endpoint with current credentials. It also distinguishes itself from b2_list_buckets, removing any ambiguity with sibling 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?

Explicitly gives the use case: 'Use this to validate S3-surface reachability' and directly names the alternative (b2_list_buckets) that does not cover S3 reachability. This tells an agent exactly when to choose this tool over a similar sibling.

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

s3_head_objectA
Read-onlyIdempotent

Get metadata for a B2 object without downloading it. Returns content type, size, last modified, ETag, and custom metadata.

ParametersJSON Schema
NameRequiredDescriptionDefault
keyYesThe object key.
bucketYesThe bucket name.
versionIdNoSpecific version of the object.

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the read-only safety profile is established. The description adds value beyond those by disclosing that the operation returns metadata only and by listing the response fields (content type, size, last modified, ETag, custom metadata), which is genuinely useful given there is no output 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 with zero filler: the core purpose and differentiator are front-loaded in the first sentence, and the response summary follows directly. 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 metadata-retrieval tool with rich annotations and fully documented parameters, the description is nearly complete, and it partially compensates for the missing output schema by enumerating the returned metadata fields. Minor gaps remain around failure behavior (e.g., 404 for a missing object) and versionId semantics, but these are not blocking for correct invocation.

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% — bucket, key, and versionId each already carry descriptive entries, so the baseline 3 applies. The description adds no parameter-specific detail, but none is required given that the schema does the heavy lifting.

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 ('Get metadata for a B2 object') and the key differentiator 'without downloading it', which distinguishes it from s3_get_object and s3_head_bucket. The second sentence enumerates the response contents, making the tool's scope unambiguous.

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 phrase 'without downloading it' provides clear context for when to choose this tool over the object-download sibling: when only metadata is needed and the body is not. However, no alternative is named explicitly and no exclusionary conditions are stated, so it stops short of the strongest routing guidance.

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

s3_list_multipart_uploadsA
Read-onlyIdempotent

List in-progress S3-compatible multipart uploads for a B2 bucket. Use to resume or audit unfinished uploads before s3_get_presigned_upload_part_url, s3_complete_multipart_upload, or s3_abort_multipart_upload; use b2_unfinished_uploads when you need storage-cost analysis across bounded listings. Requires listFiles. Results are paginated with maxUploads (default 100, range 1-1000) and key/upload markers; delimiter responses include commonPrefixes.

ParametersJSON Schema
NameRequiredDescriptionDefault
bucketYesBucket name whose in-progress multipart uploads to list.
prefixNoOnly return multipart uploads whose object keys start with this prefix.
delimiterNoOptional delimiter, usually '/', to group common key prefixes.
keyMarkerNoPagination cursor: nextKeyMarker from a previous response.
maxUploadsNoMaximum uploads to return (default 100, range 1-1000).
uploadIdMarkerNoPagination cursor paired with keyMarker: nextUploadIdMarker from a previous response.

TDQS

A4.6/5.0
Behavior5/5

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

Annotations already mark this as readOnly, idempotent, and non-destructive; the description adds useful behavioral context beyond that: the required listFiles permission, pagination semantics with maxUploads limits and markers, and the commonPrefixes behavior for delimiters. No contradiction with annotations.

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 dense sentences with no filler: purpose first, then usage guidance and alternative, then permission and pagination details. Every clause 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.

Completeness4/5

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

For a six-parameter listing tool with no output schema, the description covers permissions, pagination, default/range values, and delimiter behavior. It does not enumerate the full response shape, but the S3 semantics are standard and the key operational details are 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%, so each parameter is already documented in the schema. The description reinforces pagination and delimiter behavior but does not add substantial new meaning beyond what the schema provides, so the 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 description states a specific action ('List in-progress S3-compatible multipart uploads') on a specific resource ('B2 bucket'), and differentiates itself from b2_unfinished_uploads by naming the exact use cases. An agent can clearly tell what this tool does and how it differs from nearby siblings.

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 says when to use this tool ('resume or audit unfinished uploads'), names the downstream operations it precedes, and gives a concrete alternative (b2_unfinished_uploads) with the condition for choosing it ('storage-cost analysis across bounded listings'). It also states the required permission, listFiles.

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

s3_list_objects_v2A
Read-onlyIdempotent

List objects in a B2 bucket via the S3-compatible ListObjectsV2 API. Supports prefix filtering, delimiter-based folder listings, and pagination.

ParametersJSON Schema
NameRequiredDescriptionDefault
bucketYesThe bucket name.
prefixNoOnly return objects whose keys start with this prefix.
maxKeysNo
delimiterNoUse '/' to list like a folder tree.
startAfterNoReturn objects after this key (exclusive S3 StartAfter semantics).
continuationTokenNoPagination token from a previous response.

TDQS

A4/5.0
Behavior3/5

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

Annotations already cover the read-only, idempotent, non-destructive behavior, so the description does not need to repeat safety traits. It adds useful functional detail about filtering, delimiter folder views, and pagination, but it does not disclose truncation behavior or the need to follow continuation tokens.

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?

One well-structured sentence that front-loads the primary action and resource, then lists the key capabilities. Every clause adds information, and there is no redundant or filler 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?

The description, combined with rich annotations and a well-documented schema, gives an agent enough to invoke the tool correctly. It covers filtering, folder-style listing, and pagination; the only notable gap is not explicitly explaining that results can be truncated and require a continuation token, though the word 'pagination' hints at this.

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 high at 83%, providing a solid baseline. The description goes further by giving semantic meaning to key parameters: 'prefix filtering' maps to prefix, 'delimiter-based folder listings' maps to delimiter, and 'pagination' maps to continuationToken. Only maxKeys lacks prose explanation, though the schema defines its bounds.

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?

Begins with the specific verb-object pair 'List objects in a B2 bucket' and names the exact S3-compatible ListObjectsV2 API. This clearly identifies the operation and distinguishes it from siblings like s3_list_object_versions and s3_list_parts.

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 use cases by mentioning prefix filtering, delimiter-based folder listings, and pagination, but it never states when to choose this tool over alternatives such as s3_list_object_versions or s3_list_parts. There is no explicit when-to-use or when-not-to-use guidance.

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

s3_list_object_versionsA
Read-onlyIdempotent

List object versions and delete markers in a B2 bucket using the S3-compatible API. Use before version-targeted s3_get_object, s3_head_object, s3_copy_object, or s3_delete_object calls; use s3_list_objects_v2 when current live objects are enough. Requires listFiles. Results are paginated with maxKeys (default 1000, max 1000) and paired key/version markers.

ParametersJSON Schema
NameRequiredDescriptionDefault
bucketYesBucket name whose object versions should be listed.
prefixNoOnly list versions and delete markers for keys that start with this prefix.
maxKeysNoMaximum versions/delete markers to return (default 1000, range 1-1000).
delimiterNoOptional delimiter, usually '/', to group common key prefixes.
keyMarkerNoPagination cursor: nextKeyMarker from a previous response.
versionIdMarkerNoPagination cursor paired with keyMarker: nextVersionIdMarker from a previous response.

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already provide readOnly, openWorld, idempotent, and non-destructive hints. The description adds useful behavioral context beyond that: pagination behavior with maxKeys default/max of 1000, paired key/version markers, and the listFiles permission requirement. No contradiction with annotations.

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 dense sentences with no filler. It front-loads the action and resource, then gives usage guidance and pagination details, earning every sentence's 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 read-only listing tool with rich schema coverage and annotations, the description is complete: it covers purpose, when to use versus alternatives, required permission, and key pagination behavior. No output schema is present, but the description sufficiently conveys what the call returns.

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 maxKeys limits and the paired keyMarker/versionIdMarker pagination scheme, but these details are already fully documented in the schema, so it adds limited new semantic value.

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: listing object versions and delete markers in a B2 bucket via the S3-compatible API. It also distinguishes itself from s3_list_objects_v2 by name, so an agent can tell them 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?

Explicitly says when to use this tool: before version-targeted s3_get_object, s3_head_object, s3_copy_object, or s3_delete_object calls. It also names the alternative s3_list_objects_v2 for when current live objects are sufficient, and states the required listFiles permission.

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

s3_list_partsA
Read-onlyIdempotent

List the parts that have been uploaded for an in-progress S3-compatible multipart upload.

ParametersJSON Schema
NameRequiredDescriptionDefault
keyYesThe object key.
bucketYesThe bucket name.
maxPartsNo
uploadIdYesThe UploadId.
partNumberMarkerNoPagination cursor.

TDQS

A4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint false, so the description does not need to restate safety. It adds the useful context that the upload must be in-progress, but it does not disclose pagination behavior, response shape, or any error conditions, so it stays at the baseline.

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, front-loaded sentence communicates the operation, resource, and required state with no redundant wording. Every word contributes to the agent's understanding.

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 read-only list operation, the description plus schema annotations cover the essential invocation details: the operation, the target resource, and the in-progress state. It does not describe the return object, but a list operation of this kind is still sufficiently callable without that detail.

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 covers 80% of parameters, documentating bucket, key, uploadId, and partNumberMarker, leaving only maxParts without a description. The description does not add meaning to any parameter beyond the schema, so the 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?

The description uses a specific verb ('List'), a clear resource ('parts'), and a scoping condition ('an in-progress S3-compatible multipart upload'). This clearly distinguishes it from sibling tools like s3_list_multipart_uploads, which list uploads rather than parts, and from s3_upload_part_copy.

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 phrase 'in-progress' provides clear context that this tool is for active multipart uploads, implying it is not for completed uploads. It does not explicitly name alternatives or exclusions, but the intended use case is clear enough without additional guidance.

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

s3_put_bucket_lifecycleA
DestructiveIdempotent

Set S3 lifecycle rules on a B2 bucket; pass rules: [] to clear the S3 lifecycle configuration. Supports AbortIncompleteMultipartUpload, Expiration, and NoncurrentVersionExpiration. B2 does not support Transition/storage-class rules.

ParametersJSON Schema
NameRequiredDescriptionDefault
rulesYesRules to set; [] clears the configuration.
bucketYesThe bucket name.
confirmNoFallback confirmation under 'confirm' when rules is [] or rules expire objects and MCP elicitation cannot run. Not needed for abort-incomplete-upload-only rules.

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already mark the tool as destructive and idempotent, so no contradiction exists. The description adds valuable behavioral context by explaining that passing an empty rules array clears the S3 lifecycle configuration and by listing which lifecycle actions are supported versus unsupported. It does not explicitly state whether non-empty rules replace or merge with existing rules, but the clear/set framing largely covers this.

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 three sentences with no filler. The primary action and clear-behavior caveat are front-loaded, followed by supported rule types and the B2-specific limitation. 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?

The description covers the operation's core semantics, the clearing mechanism, supported rule types, and a B2-specific limitation. There is no output schema, but return-value details are typically minor for this kind of set operation. The confirm parameter's purpose is documented in the schema, so the description does not need to repeat it. A minor gap is lack of explicit statement about whether setting new rules replaces all existing rules.

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 has 100% description coverage, including the bucket name, the rules array with '[] clears the configuration', and the confirm fallback behavior. The tool description adds extra semantic meaning by clarifying which rule types are valid on B2 and that Transition/storage-class rules are not supported, giving the agent additional constraints not fully spelled out 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 states a specific action ('Set S3 lifecycle rules on a B2 bucket') with a clear resource and purpose. It also distinguishes itself by explaining the supported lifecycle actions and explicitly noting B2 does not support Transition/storage-class rules, which separates it from any lifecycle-related sibling 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?

The description gives explicit usage context: use it to set lifecycle rules, pass rules: [] to clear the configuration, and do not use Transition/storage-class rules because B2 does not support them. It does not explicitly name alternative sibling tools, but the constraints and clear-vs-set guidance are sufficient for tool selection.

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

s3_put_objectA
Idempotent

Upload a SMALL object inline (≤1 MiB) to a B2 bucket — for manifests, sidecars, and tiny configs. Provide base64-encoded content or a local file path. For real object data, generate a PutObject URL with s3_get_presigned_url and upload directly to B2 (bytes never pass through the server), or use the multipart tools for large objects.

ParametersJSON Schema
NameRequiredDescriptionDefault
aclNoAccepted as a no-op S3 compatibility hint; B2 bucket policy is unchanged.
keyYesThe object key (file path within the bucket).
bucketYesThe destination bucket name.
contentNoBase64-encoded content to upload.
filePathNoAbsolute local path to the file to upload.
metadataNoCustom metadata key-value pairs.
contentTypeNoMIME type of the object.
storageClassNoAccepted as a no-op S3 compatibility hint; B2 storage class is unchanged.
serverSideEncryptionNoServer-side encryption. B2 supports SSE-B2 (AES256) only — not SSE-KMS.

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already cover read-only status, idempotency, and destructiveness. The description adds useful behavioral context beyond annotations: the 1 MiB size limit, the inline nature of the upload, and the fact that presigned URLs keep bytes from passing through the server. It does not detail overwrite/versioning behavior, but the annotations lower the burden here.

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 three compact sentences with no filler. The purpose and size constraint are front-loaded, followed by parameter options and routing to alternatives. 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 high schema coverage, present annotations, and no output schema, the description covers the core decision space well: size threshold, inline vs. presigned, and multipart alternative. It could be slightly more explicit that content or filePath must actually be supplied despite only bucket and key being marked required in the schema, but the imperative 'Provide base64-encoded content or a local file path' substantially mitigates that gap.

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 nine parameters. The description adds marginal value by clarifying that content is base64-encoded and that either base64 content or a local file path can be provided, but it does not need to compensate for missing schema documentation.

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 ('Upload'), a specific resource ('a SMALL object inline (≤1 MiB) to a B2 bucket'), and the intended use cases ('manifests, sidecars, and tiny configs'). It distinguishes this tool from s3_get_presigned_url and multipart upload tools, so an agent can tell them apart without opening 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 states when to use this tool (SMALL inline objects ≤1 MiB) and when not to ('For real object data, generate a PutObject URL... or use the multipart tools for large objects'). It names the specific alternative tools and the condition that selects between them, leaving little to inference.

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

s3_upload_part_copyA
Idempotent

Copy a byte range from an existing B2 object into a part of an in-progress S3-compatible multipart upload, without downloading or re-uploading the data. Requires the writeFiles capability on the destination and read access to the source object. The source must be a bucket reachable within the same B2 account and region as the destination; cross-account sources cannot be copied this way. Use this to assemble large objects from data already in B2; use s3_get_presigned_upload_part_url instead when the client must upload new bytes. The copied part belongs to the upload created by s3_create_multipart_upload, so it obeys the 1–10000 part numbering, the ≥5 MiB minimum for every part except the last, and the 5 GiB per-part maximum. A missing or inaccessible source, or a range outside the source object, fails the part copy. Returns the part ETag to pass to s3_complete_multipart_upload.

ParametersJSON Schema
NameRequiredDescriptionDefault
keyYesThe destination object key.
bucketYesThe destination bucket name.
uploadIdYesThe UploadId from s3_create_multipart_upload.
copySourceYesThe source object in 'bucket/key' format, e.g. 'my-bucket/path/to/file.dat'. URL-encode special characters in the key.
partNumberYesThe part number (1-10000).
copySourceRangeNoByte range to copy from the source, e.g. 'bytes=0-104857599' for the first 100 MiB; omit to copy the entire source object. The copied range must be ≥5 MiB unless this is the last part, and at most 5 GiB.
copySourceVersionIdNoVersion ID of the source object to copy; set to copy that exact version, or omit to copy the current version.

TDQS

A4.7/5.0
Behavior5/5

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

Beyond the annotations, the description discloses permission requirements, same-account/region constraints, part-size limits, failure conditions for missing/inaccessible sources or invalid ranges, and the returned ETag. This is substantial behavioral context that annotations do not 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?

The description is dense but every sentence earns its place: purpose, permissions, constraints, alternatives, failure modes, and return value. It is front-loaded with the core action and avoids redundant 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?

With no output schema, the description still explains the return value (part ETag) and its downstream use. It also covers prerequisites, constraints, failure behavior, and alternatives, so an agent has everything needed 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?

Schema coverage is 100%, so the schema already documents every parameter. The description adds helpful constraints around part size and source behavior, but most of that is also reflected in the schema. It meets the baseline for a fully covered schema without significantly enhancing parameter-level 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 uses a specific verb ('copy a byte range') and names the exact resource ('a part of an in-progress S3-compatible multipart upload'). It also differentiates this tool from s3_get_presigned_upload_part_url and s3_copy_object by scope, making the purpose unmistakable.

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 explicitly states when to use this tool ('assemble large objects from data already in B2') and names the alternative for new bytes ('s3_get_presigned_upload_part_url'). It also gives exclusions, such as cross-account sources not being copyable, so an agent can route correctly.

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. 30 tool updates
    • Changedb2_create_bucket12 fields changed
      • changedInput schema / properties / bucketInfo / description
        Previous value: -"Custom metadata: <=10 pairs. Keys: 1-50 UTF-8 bytes, chars A-Z a-z 0-9 . _ ` ~ ! # $ % ^ & * ' | + -, no b2- prefix. Values total <=10,000 UTF-8 bytes."New value: +"Custom metadata: <=10 pairs. Keys: 1-50 UTF-8 bytes, chars A-Z a-z 0-9 . _ ` ~ ! # $ % ^ & * ' | + -, no b2- prefix. Values total <=10,000 UTF-8 bytes. Omit to create the bucket without custom metadata."
      • changedInput schema / properties / bucketName / description
        Previous value: -"The name for the new bucket. Must be globally unique."New value: +"Globally unique bucket name: 6-63 characters, letters/digits/hyphens/periods, case-insensitive, no b2- prefix, no leading/trailing period, no '..', and not an IPv4 address."
      • changedInput schema / properties / bucketType / description
        Previous value: -"allPublic allows unauthenticated downloads; allPrivate requires authorization."New value: +"Visibility for file downloads: allPrivate requires authorization; allPublic makes objects world-readable by URL."
      • changedInput schema / properties / corsRules / description
        Previous value: -"CORS rules: <=100. allowedOrigins/allowedOperations require 1-100 non-empty strings; allowedHeaders/exposeHeaders allow <=100. Strings <=999 chars. Per-rule UTF-8 total <1,000. Names unique."New value: +"CORS rules: <=100. allowedOrigins/allowedOperations require 1-100 non-empty strings; allowedHeaders/exposeHeaders allow <=100. Strings <=999 chars. Per-rule UTF-8 total <1,000. Names unique. Omit to create the bucket without CORS rules."
      • changedInput schema / properties / defaultServerSideEncryption / description
        Previous value: -"Default server-side encryption for new files in this bucket."New value: +"Optional default server-side encryption for new files in this bucket. Omit to create the bucket without a bucket default encryption setting."
      • addedInput schema / properties / defaultServerSideEncryption / properties / algorithm / description
        Added value: +"Encryption algorithm. B2 supports AES256 for SSE-B2."
      • addedInput schema / properties / defaultServerSideEncryption / properties / mode / description
        Added value: +"Use SSE-B2 to make AES256 the bucket default; use none for no bucket default encryption."
      • changedInput schema / properties / lifecycleRules / description
        Previous value: -"Lifecycle rules for automatic file management."New value: +"Optional B2 lifecycle rules applied after creation. Use for automatic hiding, deletion of hidden versions, or cancellation of unfinished large-file uploads; use s3_put_bucket_lifecycle only when you need the S3 lifecycle API shape."
      • addedInput schema / properties / lifecycleRules / items / properties / daysFromHidingToDeleting / description
        Added value: +"Optional days after a file is hidden before B2 permanently deletes it; minimum 1."
      • addedInput schema / properties / lifecycleRules / items / properties / daysFromStartingToCancelingUnfinishedLargeFiles / description
        Added value: +"Optional days before B2 cancels unfinished large-file uploads; minimum 1."
      • addedInput schema / properties / lifecycleRules / items / properties / daysFromUploadingToHiding / description
        Added value: +"Optional days after upload before B2 hides the current file version; minimum 1."
      • addedInput schema / properties / lifecycleRules / items / properties / fileNamePrefix / description
        Added value: +"Object-key prefix this rule matches; use an empty string to match the bucket."
    • Changedb2_create_group_member1 field changed
      • changedInput schema / properties / confirm / description
        Previous value: -"Confirm this destructive/irreversible operation. Required when the server destructive policy is 'confirm' (the default)."New value: +"Fallback confirmation for this destructive/irreversible operation when the effective server destructive policy is 'confirm' and MCP elicitation cannot run."
    • Changedb2_create_key7 fields changed
      • changedInput schema / properties / bucketIds / description
        Previous value: -"Optional bucket restrictions. Omit for account-wide access."New value: +"Optional bucket ID restrictions. Required by default for keys with write*/delete* capabilities; omit only for intentional account-wide access, and do not combine with bucketId."
      • changedInput schema / properties / capabilities / description
        Previous value: -"B2 capabilities to grant to the new key."New value: +"B2 capabilities to grant. They must be allowed by the creating key; listKeys/writeKeys/deleteKeys are refused unless B2_ALLOW_KEY_MGMT_GRANTS=true."
      • changedInput schema / properties / confirm / description
        Previous value: -"Confirm this durable credential creation. Required when the server destructive policy is 'confirm' (the default)."New value: +"Fallback confirmation for this durable credential creation when the effective server destructive policy is 'confirm' and MCP elicitation cannot run."
      • changedInput schema / properties / idempotencyKey / description
        Previous value: -"Caller-generated idempotency key. Reuse the same value only when retrying the identical durable-key creation request."New value: +"Caller-generated idempotency key. Reuse the same value only for an identical retry by the same caller; conflicting reuse is rejected."
      • changedInput schema / properties / keyName / description
        Previous value: -"Human-readable name for the new key."New value: +"Human-readable key name for audits and b2_list_keys output."
      • changedInput schema / properties / namePrefix / description
        Previous value: -"Optional file-name prefix restriction for file capabilities."New value: +"Optional file-name prefix restriction for file capabilities; omit for no prefix restriction."
      • changedInput schema / properties / validDurationInSeconds / description
        Previous value: -"Optional key lifetime in seconds. Omit for no expiration."New value: +"Optional positive key lifetime in seconds. Omit for no expiration only when B2_MAX_KEY_DURATION_SECONDS is not configured."
    • Changedb2_delete_bucket1 field changed
      • changedInput schema / properties / confirm / description
        Previous value: -"Confirm this destructive/irreversible operation. Required when the server destructive policy is 'confirm' (the default)."New value: +"Fallback confirmation for this destructive/irreversible operation when the effective server destructive policy is 'confirm' and MCP elicitation cannot run."
    • Changedb2_delete_key2 fields changed
      • changedInput schema / properties / applicationKeyId / description
        Previous value: -"The ID of the application key to delete."New value: +"Exact application key ID to delete; use b2_list_keys to look it up."
      • changedInput schema / properties / confirm / description
        Previous value: -"Confirm this destructive/irreversible operation. Required when the server destructive policy is 'confirm' (the default)."New value: +"Fallback confirmation for this destructive/irreversible operation when the effective server destructive policy is 'confirm' and MCP elicitation cannot run."
    • Removedb2_egress_leaders
    • Changedb2_eject_group_member1 field changed
      • changedInput schema / properties / confirm / description
        Previous value: -"Confirm this destructive/irreversible operation. Required when the server destructive policy is 'confirm' (the default)."New value: +"Fallback confirmation for this destructive/irreversible operation when the effective server destructive policy is 'confirm' and MCP elicitation cannot run."
    • Changedb2_get_bucket_notification_rules1 field changed
      • changedInput schema / properties / bucketId / description
        Previous value: -"The bucket ID to get notification rules for."New value: +"Exact bucket ID whose notification rules should be read."
    • Removedb2_largest_files
    • Addedb2_list_largest_files
    • Addedb2_rank_egress_leaders
    • Addedb2_report_usage_growth
    • Changedb2_reserve_trial_create_account3 fields changed
      • changedInput schema / properties / confirm / description
        Previous value: -"Confirm this destructive/irreversible operation. Required when the server destructive policy is 'confirm' (the default)."New value: +"Fallback confirmation for this destructive/irreversible operation when the effective server destructive policy is 'confirm' and MCP elicitation cannot run."
      • changedInput schema / properties / idempotencyKey / description
        Previous value: -"Caller-generated idempotency key. Reuse the same value only when retrying the identical reserve-trial account creation request."New value: +"Caller-generated idempotency key recorded with the request. Note: in inline mode retries are not deduplicated server-side, so reconcile before retrying rather than relying on this key to prevent a duplicate account."
      • changedInput schema / properties / region / description
        Previous value: -"Optional data region for the new account."New value: +"Optional data region for the new account; omit to use the Partner default."
    • Changedb2_set_bucket_notification_rules13 fields changed
      • changedInput schema / properties / bucketId / description
        Previous value: -"The bucket ID to set notification rules for."New value: +"Exact bucket ID whose notification rules should be replaced."
      • changedInput schema / properties / confirm / description
        Previous value: -"Confirm replacing persistent outbound webhook notification rules. Required when the server destructive policy is 'confirm' (the default)."New value: +"Fallback confirmation for replacing persistent outbound webhook notification rules when the effective server destructive policy is 'confirm' and MCP elicitation cannot run."
      • addedInput schema / properties / eventNotificationRules / description
        Added value: +"Complete replacement rule set for the bucket. Include every rule that should remain; omitted existing rules are removed."
      • changedInput schema / properties / eventNotificationRules / items / properties / eventTypes / description
        Previous value: -"Event types to trigger notification, e.g. b2:ObjectCreated:*, b2:ObjectDeleted:*."New value: +"B2 event types that trigger delivery, for example b2:ObjectCreated:* or b2:ObjectDeleted:*."
      • changedInput schema / properties / eventNotificationRules / items / properties / isEnabled / description
        Previous value: -"Whether this rule is active."New value: +"Whether B2 should deliver events for this rule."
      • changedInput schema / properties / eventNotificationRules / items / properties / name / description
        Previous value: -"A name for this notification rule."New value: +"Name for this notification rule; must be unique per bucket."
      • changedInput schema / properties / eventNotificationRules / items / properties / objectNamePrefix / description
        Previous value: -"Only objects whose names start with this prefix trigger the rule. Empty string ('') matches all objects. Required by B2 on every rule."New value: +"Object-key prefix that triggers the rule. Defaults to empty string, which matches every object in the bucket."
      • addedInput schema / properties / eventNotificationRules / items / properties / targetConfiguration / properties / customHeaders / description
        Added value: +"Optional custom headers sent with webhook deliveries."
      • addedInput schema / properties / eventNotificationRules / items / properties / targetConfiguration / properties / customHeaders / items / properties / name / description
        Added value: +"Custom header name sent with webhook deliveries."
      • addedInput schema / properties / eventNotificationRules / items / properties / targetConfiguration / properties / customHeaders / items / properties / value / description
        Added value: +"Custom header value; treated as sensitive and redacted."
      • changedInput schema / properties / eventNotificationRules / items / properties / targetConfiguration / properties / hmacSha256SigningSecret / description
        Previous value: -"Optional secret for HMAC-SHA256 request signing."New value: +"Optional HMAC-SHA256 signing secret. Treated as sensitive input and redacted from outputs/logs."
      • addedInput schema / properties / eventNotificationRules / items / properties / targetConfiguration / properties / targetType / description
        Added value: +"Only webhook targets are supported."
      • changedInput schema / properties / eventNotificationRules / items / properties / targetConfiguration / properties / url / description
        Previous value: -"The HTTPS URL to deliver notifications to."New value: +"Public https:// webhook URL. localhost, credentials in URLs, private IPs, and non-public DNS targets are rejected before B2 is called."
    • Changedb2_update_bucket24 fields changed
      • changedInput schema / properties / bucketId / description
        Previous value: -"The ID of the bucket to update."New value: +"The exact bucket ID to update, not the bucket name."
      • changedInput schema / properties / bucketInfo / description
        Previous value: -"Custom metadata: <=10 pairs. Keys: 1-50 UTF-8 bytes, chars A-Z a-z 0-9 . _ ` ~ ! # $ % ^ & * ' | + -, no b2- prefix. Values total <=10,000 UTF-8 bytes."New value: +"Custom metadata: <=10 pairs. Keys: 1-50 UTF-8 bytes, chars A-Z a-z 0-9 . _ ` ~ ! # $ % ^ & * ' | + -, no b2- prefix. Values total <=10,000 UTF-8 bytes. Omit to leave current metadata unchanged."
      • addedInput schema / properties / bucketType / description
        Added value: +"Optional visibility change. allPublic makes objects world-readable by URL and is governed by the configured destructive policy; omit to leave unchanged."
      • changedInput schema / properties / confirm / description
        Previous value: -"Confirm a destructive change (making the bucket public, weakening Object Lock/lifecycle, or changing replication). Required when the server destructive policy is 'confirm' (the default); non-destructive updates do not need it."New value: +"Fallback confirmation for a gated bucket update when the effective server destructive policy is 'confirm' and MCP elicitation cannot run. Gated cases: bucketType allPublic, fileLockEnabled false, defaultRetention.mode null, lifecycleRules with daysFromHidingToDeleting, or any replicationConfiguration. Non-gated updates do not need it."
      • changedInput schema / properties / corsRules / description
        Previous value: -"CORS rules: <=100. allowedOrigins/allowedOperations require 1-100 non-empty strings; allowedHeaders/exposeHeaders allow <=100. Strings <=999 chars. Per-rule UTF-8 total <1,000. Names unique."New value: +"CORS rules: <=100. allowedOrigins/allowedOperations require 1-100 non-empty strings; allowedHeaders/exposeHeaders allow <=100. Strings <=999 chars. Per-rule UTF-8 total <1,000. Names unique. On update, provided rules replace the existing set; omit to leave unchanged."
      • addedInput schema / properties / defaultServerSideEncryption / description
        Added value: +"Default server-side encryption for new files in this bucket. Omit on update to leave unchanged."
      • addedInput schema / properties / defaultServerSideEncryption / properties / algorithm / description
        Added value: +"Encryption algorithm. B2 supports AES256 for SSE-B2."
      • addedInput schema / properties / defaultServerSideEncryption / properties / mode / description
        Added value: +"Use SSE-B2 to make AES256 the bucket default; use none to clear the bucket default."
      • addedInput schema / properties / lifecycleRules / description
        Added value: +"When provided, replaces the bucket's B2 lifecycle rule set; omit to leave unchanged. Rules that delete hidden versions are destructive in effect and are governed by the configured destructive policy."
      • addedInput schema / properties / lifecycleRules / items / properties / daysFromHidingToDeleting / description
        Added value: +"Optional days after a file is hidden before B2 permanently deletes it; minimum 1."
      • addedInput schema / properties / lifecycleRules / items / properties / daysFromStartingToCancelingUnfinishedLargeFiles / description
        Added value: +"Optional days before B2 cancels unfinished large-file uploads; minimum 1."
      • addedInput schema / properties / lifecycleRules / items / properties / daysFromUploadingToHiding / description
        Added value: +"Optional days after upload before B2 hides the current file version; minimum 1."
      • addedInput schema / properties / lifecycleRules / items / properties / fileNamePrefix / description
        Added value: +"Object-key prefix this rule matches; use an empty string to match the bucket."
      • addedInput schema / properties / replicationConfiguration / description
        Added value: +"Optional replication configuration. Omit to leave unchanged; any provided value changes persistent copy behavior and is confirmation-gated."
      • addedInput schema / properties / replicationConfiguration / properties / asReplicationDestination / description
        Added value: +"Destination replication settings for buckets receiving replicated data."
      • addedInput schema / properties / replicationConfiguration / properties / asReplicationDestination / properties / sourceToDestinationKeyMapping / description
        Added value: +"Mapping from source key IDs to destination key IDs."
      • addedInput schema / properties / replicationConfiguration / properties / asReplicationSource / description
        Added value: +"Source replication settings. Provided rules replace the source config."
      • addedInput schema / properties / replicationConfiguration / properties / asReplicationSource / properties / replicationRules / items / properties / destinationBucketId / description
        Added value: +"Destination bucket ID that receives replicated objects."
      • addedInput schema / properties / replicationConfiguration / properties / asReplicationSource / properties / replicationRules / items / properties / fileNamePrefix / description
        Added value: +"Optional object-key prefix to replicate; omit for all objects."
      • addedInput schema / properties / replicationConfiguration / properties / asReplicationSource / properties / replicationRules / items / properties / includeExistingFiles / description
        Added value: +"If true, B2 also queues existing matching files for replication."
      • addedInput schema / properties / replicationConfiguration / properties / asReplicationSource / properties / replicationRules / items / properties / isEnabled / description
        Added value: +"Whether this replication rule is active."
      • addedInput schema / properties / replicationConfiguration / properties / asReplicationSource / properties / replicationRules / items / properties / priority / description
        Added value: +"Rule priority used by B2 when rules overlap."
      • addedInput schema / properties / replicationConfiguration / properties / asReplicationSource / properties / replicationRules / items / properties / replicationRuleName / description
        Added value: +"Unique name for this rule."
      • addedInput schema / properties / replicationConfiguration / properties / asReplicationSource / properties / sourceApplicationKeyId / description
        Added value: +"Application key ID B2 uses as the replication source credential."
    • Changedb2_update_file_legal_hold1 field changed
      • changedInput schema / properties / confirm / description
        Previous value: -"Confirm this irreversible/protection-removing operation. Required when the server destructive policy is 'confirm' (the default)."New value: +"Fallback confirmation for this irreversible/protection-removing operation when the effective server destructive policy is 'confirm' and MCP elicitation cannot run."
    • Changedb2_update_file_retention1 field changed
      • changedInput schema / properties / confirm / description
        Previous value: -"Confirm this irreversible/protection-removing operation. Required when the server destructive policy is 'confirm' (the default)."New value: +"Fallback confirmation for this irreversible/protection-removing operation when the effective server destructive policy is 'confirm' and MCP elicitation cannot run."
    • Removedb2_usage_growth
    • Changeds3_abort_multipart_upload1 field changed
      • changedInput schema / properties / confirm / description
        Previous value: -"Confirm this destructive/irreversible operation. Required when the server destructive policy is 'confirm' (the default)."New value: +"Fallback confirmation for this destructive/irreversible operation when the effective server destructive policy is 'confirm' and MCP elicitation cannot run."
    • Changeds3_complete_multipart_upload6 fields changed
      • changedInput schema / properties / bucket / description
        Previous value: -"The bucket name."New value: +"Destination bucket name used to create the multipart upload."
      • changedInput schema / properties / key / description
        Previous value: -"The object key."New value: +"Destination object key used to create the multipart upload."
      • changedInput schema / properties / parts / description
        Previous value: -"All uploaded parts in ascending part number order."New value: +"Complete ordered part manifest. Include every part in ascending partNumber order (part numbers are 1-10000); missing or stale ETags fail the completion call."
      • changedInput schema / properties / parts / items / properties / etag / description
        Previous value: -"The ETag from this part's direct PUT response (the s3_presign_upload_part flow)."New value: +"The ETag from this part's direct PUT response (the s3_get_presigned_upload_part_url flow)."
      • changedInput schema / properties / parts / items / properties / partNumber / description
        Previous value: -"The part number."New value: +"Provider-valid multipart part number from 1-10000 for this ETag; provide each uploaded part once."
      • changedInput schema / properties / uploadId / description
        Previous value: -"The UploadId."New value: +"UploadId returned by s3_create_multipart_upload."
    • Changeds3_create_multipart_upload3 fields changed
      • addedInput schema / properties / acl / description
        Added value: +"Accepted as a no-op S3 compatibility hint; B2 access follows the destination bucket policy."
      • changedInput schema / properties / contentType / description
        Previous value: -"MIME type of the object."New value: +"MIME type recorded on the final assembled object."
      • changedInput schema / properties / metadata / description
        Previous value: -"Custom metadata for the object."New value: +"Custom metadata stored on the final object."
    • Changeds3_delete_object4 fields changed
      • changedInput schema / properties / bucket / description
        Previous value: -"The bucket name."New value: +"Bucket name containing the object to delete."
      • changedInput schema / properties / confirm / description
        Previous value: -"Confirm this destructive/irreversible operation. Required when the server destructive policy is 'confirm' (the default)."New value: +"Fallback confirmation for this destructive/irreversible operation when the effective server destructive policy is 'confirm' and MCP elicitation cannot run."
      • changedInput schema / properties / key / description
        Previous value: -"The object key to delete."New value: +"Exact object key to delete."
      • changedInput schema / properties / versionId / description
        Previous value: -"Version ID of the specific version to delete."New value: +"Exact version ID to delete. Omit to delete the current object by S3 semantics, which may create a delete marker for versioned buckets."
    • Changeds3_delete_objects1 field changed
      • changedInput schema / properties / confirm / description
        Previous value: -"Confirm this destructive/irreversible operation. Required when the server destructive policy is 'confirm' (the default)."New value: +"Fallback confirmation for this destructive/irreversible operation when the effective server destructive policy is 'confirm' and MCP elicitation cannot run."
    • Addeds3_get_presigned_upload_part_url
    • Changeds3_get_presigned_url1 field changed
      • changedInput schema / properties / confirm / description
        Previous value: -"Confirm minting a PutObject presigned URL bearer capability that can create or overwrite object data. Required when operation is PutObject and the server destructive policy is 'confirm' (the default)."New value: +"Fallback confirmation for minting a PutObject presigned URL bearer capability when the effective server destructive policy is 'confirm' and MCP elicitation cannot run."
    • Changeds3_list_multipart_uploads6 fields changed
      • changedInput schema / properties / bucket / description
        Previous value: -"The bucket name."New value: +"Bucket name whose in-progress multipart uploads to list."
      • addedInput schema / properties / delimiter / description
        Added value: +"Optional delimiter, usually '/', to group common key prefixes."
      • changedInput schema / properties / keyMarker / description
        Previous value: -"Pagination cursor."New value: +"Pagination cursor: nextKeyMarker from a previous response."
      • addedInput schema / properties / maxUploads / description
        Added value: +"Maximum uploads to return (default 100, range 1-1000)."
      • changedInput schema / properties / prefix / description
        Previous value: -"Only list uploads for keys with this prefix."New value: +"Only return multipart uploads whose object keys start with this prefix."
      • changedInput schema / properties / uploadIdMarker / description
        Previous value: -"Pagination cursor."New value: +"Pagination cursor paired with keyMarker: nextUploadIdMarker from a previous response."
    • Changeds3_list_object_versions6 fields changed
      • changedInput schema / properties / bucket / description
        Previous value: -"The bucket name."New value: +"Bucket name whose object versions should be listed."
      • addedInput schema / properties / delimiter / description
        Added value: +"Optional delimiter, usually '/', to group common key prefixes."
      • changedInput schema / properties / keyMarker / description
        Previous value: -"Pagination cursor — key from a previous response."New value: +"Pagination cursor: nextKeyMarker from a previous response."
      • addedInput schema / properties / maxKeys / description
        Added value: +"Maximum versions/delete markers to return (default 1000, range 1-1000)."
      • changedInput schema / properties / prefix / description
        Previous value: -"Only list versions for objects with this prefix."New value: +"Only list versions and delete markers for keys that start with this prefix."
      • changedInput schema / properties / versionIdMarker / description
        Previous value: -"Pagination cursor — version ID from a previous response."New value: +"Pagination cursor paired with keyMarker: nextVersionIdMarker from a previous response."
    • Removeds3_presign_upload_part
    • Changeds3_put_bucket_lifecycle1 field changed
      • changedInput schema / properties / confirm / description
        Previous value: -"Required under 'confirm' when rules is [] or rules expire objects. Not needed for abort-incomplete-upload-only rules."New value: +"Fallback confirmation under 'confirm' when rules is [] or rules expire objects and MCP elicitation cannot run. Not needed for abort-incomplete-upload-only rules."
    • Changeds3_upload_part_copy3 fields changed
      • changedInput schema / properties / copySourceRange / description
        Previous value: -"Byte range to copy from the source, e.g. 'bytes=0-104857599' for the first 100MB."New value: +"Byte range to copy from the source, e.g. 'bytes=0-104857599' for the first 100 MiB; omit to copy the entire source object. The copied range must be ≥5 MiB unless this is the last part, and at most 5 GiB."
      • changedInput schema / properties / copySourceVersionId / description
        Previous value: -"Version ID of the source object to copy from."New value: +"Version ID of the source object to copy; set to copy that exact version, or omit to copy the current version."
      • changedInput schema / properties / partNumber / description
        Previous value: -"The part number (1–10000)."New value: +"The part number (1-10000)."
  2. 40 tool updatesv0.2.0
    • First observedb2_authorize_account
    • First observedb2_create_bucket
    • First observedb2_create_group_member
    • First observedb2_create_key
    • First observedb2_delete_bucket
    • First observedb2_delete_key
    • First observedb2_egress_leaders
    • First observedb2_eject_group_member
    • First observedb2_get_bucket_notification_rules
    • First observedb2_largest_files
    • First observedb2_list_buckets
    • First observedb2_list_group_members
    • First observedb2_list_groups
    • First observedb2_list_keys
    • First observedb2_reserve_trial_create_account
    • First observedb2_set_bucket_notification_rules
    • First observedb2_unfinished_uploads
    • First observedb2_update_bucket
    • First observedb2_update_file_legal_hold
    • First observedb2_update_file_retention
    • First observedb2_usage_growth
    • First observeds3_abort_multipart_upload
    • First observeds3_complete_multipart_upload
    • First observeds3_copy_object
    • First observeds3_create_multipart_upload
    • First observeds3_delete_object
    • First observeds3_delete_objects
    • First observeds3_get_bucket_location
    • First observeds3_get_object
    • First observeds3_get_presigned_url
    • First observeds3_head_bucket
    • First observeds3_head_object
    • First observeds3_list_multipart_uploads
    • First observeds3_list_object_versions
    • First observeds3_list_objects_v2
    • First observeds3_list_parts
    • First observeds3_presign_upload_part
    • First observeds3_put_bucket_lifecycle
    • First observeds3_put_object
    • First observeds3_upload_part_copy

TDQS

A3.9/5.0
Disambiguation4/5

The b2_/s3_ prefix split plus verb_noun naming makes most tools clearly distinct. The main overlap risk is b2_unfinished_uploads vs s3_list_multipart_uploads, which both enumerate in-progress multipart uploads, and the three analytics tools (largest files, egress leaders, usage growth) sit close together, though their descriptions and cross-references draw clear boundaries.

Naming Consistency4/5

Nearly all 40 tools follow a consistent family_verb_noun pattern in snake_case, with b2_* marking the native API and s3_* the S3-compatible surface. The one outlier, b2_reserve_trial_create_account, awkwardly stacks two verbs, and the analytics tools use descriptive noun phrases, but these are minor deviations from an otherwise highly predictable scheme.

Tool Count2/5

40 tools is well above the 25+ threshold for a heavy surface, and the dual native/S3 API families double up on several operations (bucket checking, lifecycle, multipart listing). The breadth is partly defensible given two API surfaces plus partner management and analytics, but an agent must sift through a very large tool set to select correctly.

Completeness4/5

Bucket, object, key, multipart, notification, retention, legal-hold, and analytics workflows are all well covered with no dead ends. Minor gaps include no S3 get-bucket-lifecycle reader (mitigated by b2_list_buckets returning lifecycle rules), no group-creation/update tool in the Partner API, and file retention/legal-hold state only being readable via S3 metadata headers.

Maintenance

ActivityActive
ResponsivenessUnresponsive

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    D
    maintenance
    A Model Context Protocol (MCP) server for AWS S3 integration using FastMCP and boto3. This server provides access to S3 functionality through MCP-compatible tools.
    10
    1
    MIT
  • F
    license
    Not graded
    quality
    D
    maintenance
    A Model Context Protocol (MCP) server that provides a bridge between MCP-compatible clients and MinIO object storage. It exposes MinIO operations as MCP tools for seamless bucket management and object operations.
    4
    -
  • F
    license
    A
    quality
    C
    maintenance
    Enables file operations (upload, download, list, delete) on Cloudflare R2 (S3-compatible) storage, with dedicated APK upload tool.
    5
    -

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/backblaze-labs/b2-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server