0.0 / 30
What changed in the harness
Selection accuracy 81→70, token cost up 4%, unconfirmed writes 0%→0%.
Category breakdown
Where the score comes from.
Earned points across the four signals Gradable measures. Safety and Legibility are scored out of 30; Economics and Discoverability are scored out of 20.
01Safety
02Legibility
16.7 / 30
03Economics
9.3 / 20
04Discoverability
14.6 / 20
Highest-impact fix
Estimated gain +30 pointsAdd explicit identity and permission preflight tools
Expose machine-readable principal/tenant confirmation and a non-mutating permission check so agents can verify both before destructive actions.
Description evidence
Defects and rewrites.
27 defects found across the exposed tool descriptions. Suggested rewrites make purpose, inputs, boundaries, and returns easier for an agent to understand.
| Tool | Defect types | Suggested rewrite |
|---|---|---|
cancel_task |
no_return_description |
Cancels a queued asynchronous task when cancellation is supported (queued Seedance video tasks: seedance-1.5-pro, seedance-2.0, seedance-2.0-fast) while they are still waiting to run. Tasks that are already processing, completed, failed, expired, or unsupported are not cancelled. Returns the updated task status object reflecting whether cancellation succeeded. |
create_3d_model |
params_unexplained |
Creates a 3D model generation task using Tripo3D from a text prompt or reference image. `model` selects the Tripo3D model variant (default tripo-h3.1); `image_url` supplies a publicly reachable reference image for image-to-3D as an alternative to the base64 `image` field; `format` selects the output mesh format (glb, fbx, obj, or usdz); `quality` selects the generation tier (draft, standard, or high). Returns a task ID for polling via get_task_status. |
create_anthropic_message |
params_unexplained |
Creates a model response using Anthropic's native Messages API request format. Supports Claude models with vision and streaming. `temperature` (0-1) controls sampling randomness, `top_p` (0-1) sets nucleus sampling probability, `top_k` limits sampling to the top K candidate tokens, and `stop_sequences` lists strings that stop generation when produced. Authentication: use the `x-api-key` header or `Authorization: Bearer` header. |
create_chat_completion |
no_return_description |
Creates an OpenAI-compatible chat completion from a list of messages. For inline image_url data URLs, declare the byte-accurate image MIME type; the MCP boundary corrects recognized PNG, JPEG, WebP, and GIF payloads declared as application/octet-stream and rejects unrecognized generic binary image payloads before sending a billable request. Returns a chat completion object containing generated message choices and token usage. |
create_embedding |
name_restates_behavior no_return_description |
Generates a vector embedding representing the given input text or tokens, for use in search, clustering, or similarity comparisons. Returns an object containing the embedding vector(s) and token usage. |
create_gemini_content |
params_unexplained no_return_description |
Generates content using the native Gemini GenerateContent request/response shape, exposed only when the selected model advertises Gemini requests and a same-protocol route is available. `systemInstruction` supplies system-level guidance content parts; `generationConfig` sets sampling and output controls such as temperature, topP, topK, maxOutputTokens, and response format/schema; `safetySettings` lists per-category safety thresholds to apply. ProtoJSON lowerCamelCase and original proto snake_case field names are both accepted, and unknown fields are forwarded best-effort. Returns a Gemini-format GenerateContentResponse with generated candidates and usage metadata. Authentication: use `?key=` query parameter, `x-goog-api-key` header, or `Authorization: Bearer` header. |
create_image |
name_restates_behavior params_unexplained no_return_description |
Generates one or more images from a text prompt, optionally conditioned on reference images for image-to-image or image-edit operations. `response_format` selects whether returned images are delivered as a `url` or as base64-encoded JSON (`b64_json`); support varies by model. Returns image data (URL(s) or base64 JSON per `response_format`), or a task object when `async` is used. |
create_image_file |
params_unexplained no_return_description |
Creates an image from a prompt, accepting local file paths for reference images (multipart-style) rather than URLs. `operation` selects text-to-image, image-to-image, or image-edit; `mask_url` supplies an optional edit mask; `n` sets how many images to generate; `quality`, `size`, `aspect_ratio`, and `resolution` control output quality and dimensions (model-specific); `expand_prompt` asks the model to enhance the prompt; `negative_prompt` lists content to avoid; `seed` sets a deterministic seed where supported; `response_format` selects `url` or `b64_json` output; `async` returns a task before the final image is ready when supported; `background` controls transparency handling; `output_format` and `output_compression`/`compression` control the returned file format and compression; `moderation` sets moderation strictness; `style` hints at a visual style; `user` is an end-user identifier. Returns the generated image data (URL or base64), or a task object when `async` is used. |
create_multimodal_embedding |
params_unexplained no_return_description |
Creates embeddings for one or more multimodal input items. `input` is a single item or array of items, each combining `text` and/or image content (`image_base64` with `image_mime_type`, or `image_url`); text input is generally available while image input may require feature enablement. Returns an object containing the embedding vector(s) for each input item. |
create_music |
params_unexplained |
Creates a music generation task using Suno from a text description or uploaded audio reference. `model` selects the Suno backend (default suno_music); `title` and `tags` label and style the generated track; `action` selects whether to generate full `MUSIC` or only `LYRICS`. Returns a task ID for polling via get_task_status. |
create_response |
params_unexplained |
Creates a response using the native OpenAI Responses API shape. The model details must advertise the Responses request format and a same-protocol route must be currently available; model names and providers do not imply availability. Unknown request fields are forwarded on a best-effort basis and remain subject to the selected provider's support. `temperature` controls sampling randomness for the generated output. |
create_speech |
name_restates_behavior no_return_description |
Synthesizes spoken audio from input text using the selected text-to-speech model and voice. Returns the generated audio content (or an SSE event stream when `stream_format=sse`) in the requested `response_format`. |
delete_file |
no_return_description |
Deletes a batch file or a bound image/reference file identified by `file_id`. When the request includes anthropic-beta: files-api-2025-04-14, the route uses Anthropic Files API mode for the bound workspace. Returns a deletion confirmation object for the removed file. |
edit_image |
params_unexplained no_return_description |
Edits an existing image using JSON image URLs or the official JSON `images` array for supported GPT Image models. `prompt` describes the desired edit; `n` sets how many edited images to generate; `quality`, `size`, `aspect_ratio`, and `resolution` control output quality and dimensions (model-specific); `response_format` selects `url` or `b64_json` output; `background` controls transparency handling; `output_format` and `output_compression`/`compression` control the returned file format and compression; `moderation` sets moderation strictness; `user` is an end-user identifier for abuse detection. Returns the edited image data (URL or base64), or a task object when `async` is used. |
edit_image_file |
params_unexplained no_return_description |
Edits an existing image using local file uploads for the source image and mask, or the official `images` array for supported GPT Image models. `prompt` describes the desired edit; `n` sets how many edited images to generate; `quality`, `size`, `aspect_ratio`, and `resolution` control output quality and dimensions (model-specific); `response_format` selects `url` or `b64_json` output; `background` controls transparency handling; `output_format` and `output_compression`/`compression` control the returned file format and compression; `moderation` sets moderation strictness; `async` returns a task before the edited image is ready when supported; `user` is an end-user identifier. Returns the edited image data (URL or base64), or a task object when `async` is used. |
get_model |
params_unexplained no_return_description |
Retrieves current details for the single model identified by `model`, including supported operations, request parameters, request endpoints, selector limits, and pricing when available. Non-chat integrations should read these current model-specific request details before creating a request. Returns a model detail object describing capabilities and pricing. |
get_model_pricing |
params_unexplained no_return_description |
Retrieves pricing-only details for the single model identified by `model`. Use this endpoint for price explanation, not for non-chat request construction. Returns an object with the model's pricing figures. |
list_files |
name_restates_behavior params_unexplained no_return_description |
Lists uploaded batch and image/reference files for the workspace, with pagination and optional purpose or Anthropic Files cursor filters. `limit` caps the number of files returned per page (default 20, max 1000); `after` is a pagination cursor for the standard/OpenAI-compatible listing mode. Returns a paginated list of file metadata objects. |
list_models |
no_return_description |
Lists the currently available models. Use `view=compact` for model selection and `view=full` for the existing OpenAI-compatible discovery shape. Native API calls default to `full`; integrations may choose `compact` as their default. Non-chat recommendations are available through `recommended_for`. Returns a list of model objects matching the requested view and filters. |
rerank_documents |
params_unexplained no_return_description |
Reranks documents by relevance to a query using semantic similarity. `return_documents` controls whether the original document text is included alongside relevance scores in the response. Returns a ranked list of results with relevance scores (and document text when requested). |
retrieve_file |
name_restates_behavior params_unexplained no_return_description |
Retrieves metadata for a single uploaded file identified by `file_id`. When the request includes anthropic-beta: files-api-2025-04-14, the route uses Anthropic Files API mode. Returns a file metadata object. |
retrieve_file_content |
name_restates_behavior params_unexplained no_return_description |
Downloads the raw content of a previously uploaded file identified by `file_id`. Returns the file's binary or text content. |
transcribe_audio |
params_unexplained no_return_description |
Transcribes audio into text (Speech-to-Text). `response_format` selects the output shape: json, text, srt, verbose_json, or vtt (word-level timestamps require verbose_json). Returns the transcription in the requested format, typically including the recognized text. |
translate_audio |
name_restates_behavior params_unexplained |
Transcribes audio and translates the result to English. `model` selects the transcription/translation model (default whisper-1); `prompt` is optional text to bias the transcription; `response_format` selects the output shape (e.g. json, text, srt); `temperature` controls sampling randomness (0-1) for the transcription. |
translate_text |
name_restates_behavior params_unexplained no_return_description |
Translates text into a target language using the current translation request format. `model` selects the translation model; `text` is the content to translate; `source_language` optionally specifies the source language (auto-detected if omitted); `target_language` specifies the required destination language; `mime_type` indicates whether `text` is plain text or HTML; `user` is an end-user identifier. Returns the translated text. |
compare_models |
name_restates_behavior params_unexplained no_return_description |
Compares public TokenLab model details and pricing across several models. `models` lists 2-8 model IDs to compare; `include_raw` includes the raw underlying model records in the response when true. Returns a comparison object with per-model details and pricing side by side. |
get_api_overview |
no_return_description |
Fetches TokenLab's agent-readable API overview. Returns a document summarizing available endpoints, models, and usage guidance. |
Selection evidence
Confusable tool pairs.
9 pairs where similar names or overlapping descriptions may send an agent toward the wrong tool.
| Tool A | Tool B | Confidence | Why they collide |
|---|---|---|---|
create_image |
create_image_file |
high | Both create an image from a prompt with nearly identical schemas; the only real difference is that create_image_file takes local file paths (image, image[]) while create_image takes URLs (image_url, image_urls). A task like 'generate an image from this prompt' gives no signal about which to pick, and if a local reference image is mentioned an agent could still default to the wrong one. |
edit_image |
edit_image_file |
high | Identical purpose (edit an image via multipart/JSON/images array) with the same parameter set except edit_image uses URLs/file_id references and edit_image_file uses local file paths for image/mask. An agent given a task like 'edit this image with a mask' must correctly infer local-vs-URL context, which is easy to get wrong. |
create_embedding |
create_multimodal_embedding |
medium | Both create embeddings; create_embedding is text-only while create_multimodal_embedding supports text+image input objects. A task like 'create an embedding for this text' could plausibly be routed to either, especially since create_multimodal_embedding also accepts pure text input. |
get_model |
get_model_pricing |
medium | Both take a single model ID and return model info; get_model returns full details including pricing 'when available', so a request like 'what's the pricing for model X' could be sent to either tool since get_model also surfaces pricing. |
get_model_pricing |
get_pricing |
medium | Both are pricing lookups differing mainly in scope (single model vs. list with filters). A task like 'get pricing for model X' could be handled by get_pricing with a tag/provider filter mistaken for exact model filtering, or vice versa, given overlapping naming and purpose. |
retrieve_file |
retrieve_file_content |
medium | Both take file_id and 'retrieve' a file; the distinction between metadata (retrieve_file) and actual content (retrieve_file_content) is subtle and a task like 'get me the file' doesn't clearly indicate which is wanted. |
create_music |
create_video |
low | Both are async generation tasks with a task ID returned, but their domains (music vs video) are distinct enough that a natural-language task ('generate a song' vs 'generate a video') is unlikely to cause confusion despite structural similarity. |
delete_file |
upload_file |
low | Opposite operations sharing 'file' terminology and purpose enum; unlikely to be confused since delete vs upload intents are clearly distinguishable in natural language. |
transcribe_audio |
translate_audio |
medium | Both take an audio file and produce text via Whisper-like models; a task like 'convert this audio to English text' is ambiguous because transcribe_audio (same-language transcription) and translate_audio (translate to English) could both seem applicable if the source language isn't specified, especially for non-English audio where the user wants English output but says 'transcribe'. |
Compare the field