Skip to main content
Glama
cintelis

Ads Optimiser MCP server

Official
by cintelis

Ads Optimiser MCP server

Connects Claude (Desktop, Code, or any MCP client) to Ads Optimiser so you can generate TikTok ad images and videos from a chat, using files on your own computer.

Sign-in is SSO, not keys. The first connection starts an OAuth device flow (RFC 8628): Claude shows you a URL and a short code, you approve in a browser where you are already signed in to Ads Optimiser, and a workspace-scoped token is delivered back automatically. Nothing is typed, pasted, or stored in any config file.

Setup

Requires Node.js 18.17 or later. The package is a single self-contained file with no dependencies, so npx has one small download to make and starts in well under Claude Desktop's start-up limit.

Claude Desktop

Add to claude_desktop_config.json (Settings > Developer > Edit Config), then restart Claude Desktop from the system tray:

{
  "mcpServers": {
    "adsoptimiser": {
      "command": "npx",
      "args": ["-y", "@cintelisai/adsoptimiser-mcp@latest"]
    }
  }
}

On Windows, if npx fails to launch, use "command": "cmd", "args": ["/c", "npx", "-y", "@cintelisai/adsoptimiser-mcp@latest"].

Troubleshooting on Windows

If Ads Optimiser does not appear in Claude Desktop, or shows as failed:

  1. Check the server log at %LOCALAPPDATA%\Claude\Logs\mcp-server-adsoptimiser.log. The Microsoft Store version of Claude Desktop logs there; other installs log to %APPDATA%\Claude\logs. Claude Desktop gives a server about 30 seconds to answer, so a log that ends with the transport closing shortly after initialize means the server started too slowly.

  2. Version 0.2.0 and later start in well under a second once downloaded. If you are on an older version, @latest in the config picks up the fix on the next restart.

  3. To take npx out of the picture entirely, install the package once and point Claude Desktop at it with node:

    npm install -g @cintelisai/adsoptimiser-mcp
    npm root -g

    npm root -g prints the global folder, for example C:\Users\you\AppData\Roaming\npm\node_modules. Then use:

    {
      "mcpServers": {
        "adsoptimiser": {
          "command": "node",
          "args": ["C:\\Users\\you\\AppData\\Roaming\\npm\\node_modules\\@cintelisai\\adsoptimiser-mcp\\dist\\server.mjs"]
        }
      }
    }

    A global install does not update itself: run npm install -g @cintelisai/adsoptimiser-mcp again to upgrade.

Claude Code

claude mcp add adsoptimiser -- npx -y @cintelisai/adsoptimiser-mcp@latest

The @latest tag makes npx check for updates on each launch, so you never stay stuck on an old cached copy.

Related MCP server: io.github.pvliesdonk/image-generation-mcp

Connecting

In any chat: "connect to Ads Optimiser". Claude will call adsoptimiser_connect and give you a URL and code.

  1. Open the URL and sign in to Ads Optimiser if asked.

  2. Check the code on the page matches the one Claude showed you. If it does not, do not approve.

  3. Choose the workspace this connection should use, then approve. The token only works in that workspace; to use another one later, disconnect and connect again. You need to be a member (not a viewer) of the workspace.

  4. Tell Claude you've approved; it calls adsoptimiser_finish_connect and you're connected.

Tools

Tool

What it does

adsoptimiser_connect

Start the SSO device flow

adsoptimiser_finish_connect

Collect the token after you approve

adsoptimiser_status

Show the connected user, workspace and role

adsoptimiser_disconnect

Revoke the token on the server and delete it from this machine

adsoptimiser_list_models

List image and video models, their options and indicative cost

adsoptimiser_enhance_prompt

Expand a rough idea into a detailed ad prompt (uses no allowance)

adsoptimiser_generate_image

Generate an image, with a preview of the result; accepts local reference images (reference_image_paths), URLs, earlier jobs or a saved character_id

adsoptimiser_generate_video

Start a video; text-to-video, or image-to-video from a local image (source_image_path), URL or earlier job; character_id and script for talking clips

adsoptimiser_lip_sync

Make the person in a finished clip (a job, a URL or a local video_path) say a new line in a designed voice, lip-synced by Kling

adsoptimiser_add_overlays

Burn timed text cards or captions into any finished video (a job, a URL or a local video_path), or captions timed to the speech with auto_captions; place text with y, size and max_width

adsoptimiser_get_job

Status and result URL of one job, with a preview once it is finished

adsoptimiser_list_jobs

Recent jobs, filterable by status and type; previews with include_thumbnails

adsoptimiser_list_pipelines

Pipeline templates and saved pipelines

adsoptimiser_get_pipeline_nodes

The pipeline node catalogue: node types, inputs, outputs, params, graph rules and an example

adsoptimiser_get_pipeline

A saved pipeline's graph, node count and estimated cost per run

adsoptimiser_validate_pipeline

Check a pipeline graph: errors by node, node count, estimated cost, whether it needs a prompt (uses no allowance)

adsoptimiser_save_pipeline

Save a pipeline graph to the workspace, or update a saved one by graph_id, and link to the pipeline editor

adsoptimiser_run_pipeline

Start a pipeline run from a template, a saved pipeline or an inline graph, optionally with a character_id

adsoptimiser_get_pipeline_run

Status and results of each pipeline step

adsoptimiser_list_characters

Saved characters with their images, description, style and voice

adsoptimiser_get_character

One character with every reference image (previewed) and the job it came from, plus counts of what was made with it, the latest items and the latest voice previews

adsoptimiser_list_character_assets

Everything made with a character, filterable by type and paged; previews with include_thumbnails; with download_to the finished files and speech mp3s are saved locally

adsoptimiser_view_image

One image (a job, a media key or a character's reference image) at 768, 1024 or 1536 px, optionally cropped to zoom into a region, for checking detail; with save_to it is also saved locally

adsoptimiser_create_character

Save a character from 1 to 5 images: local files (image_paths), URLs or finished jobs, with an optional voice (uses no allowance)

adsoptimiser_update_character

Change a character's name, description, style, voice or images (uses no allowance)

adsoptimiser_list_voices

xAI preset voices and OpenAI voices, and whether OpenAI voices are available

adsoptimiser_preview_voice

A short sample in any voice as a playable URL, optionally filed in a character's preview history, and with save_to an mp3 saved locally (uses no allowance)

adsoptimiser_upload_file

Upload a local image or video and get its hosted URL (uses no allowance)

adsoptimiser_download_job

Save a finished job's image or video to a local folder

adsoptimiser_batch_generate

One job per image in a folder (image-to-video or image edit) or per line of a prompts file, up to 10 per call

Every generation uses your workspace's monthly plan allowance, exactly as in the app. When the allowance runs out, the tools say so and link to Billing (https://app.adsoptimiser.com.au/#/billing) where you can upgrade. Videos also count toward a daily video quota.

Image models

adsoptimiser_generate_image (and adsoptimiser_batch_generate, and a pipeline's generate_image step) takes a model. adsoptimiser_list_models shows what your deployment offers, with sizes and indicative cost.

Model

Id

Good for

Options

Grok Image 2.0 (default)

grok-imagine-image-2.0

General ad images

quality low (fastest, about 13s), medium or auto (45 to 50s); resolution 1k or 2k; wide ratios such as 21:9

Grok Image

grok-imagine-image

The fastest Grok images

No quality

GPT Image 2.5 Sunburst (precise, fast)

gpt-image-2.5-sunburst

Detailed specs followed exactly, in about 12 seconds

quality low, medium (default), high or auto

GPT Image 2.5 Flare (fast)

gpt-image-2.5-flare

Quick drafts in about 9 seconds, less precise on detail

quality low, medium (default), high or auto

When to pick Sunburst: when the image has to match a detailed brief. For example exact colours ("four buttons: green, teal, amber, coral"), exact counts of objects, a character sheet (the same person from set angles, a full-body shot and a close-up), or a thumbnail with layout constraints (a title in the top third, the face on the right, room left for a logo). Grok suits open-ended scenes; Sunburst is the one to use when the details matter.

The GPT Image 2.5 models are OpenAI models, offered only where the deployment has an OpenAI key (otherwise the tools say so and suggest a Grok model). They take aspect_ratio 1:1 (1024x1024), 2:3 or 9:16 (both delivered at 1024x1536), 3:2 or 16:9 (both delivered at 1536x1024), or auto. Any other ratio, and any resolution, is refused on your machine before anything is sent, as is quality high on a Grok model. Up to 5 reference images work with them, the same as Grok, as does character_id. A finished job made by OpenAI shows its provider cost (about US$0.011 at medium quality). Each image uses one image generation from the plan allowance, whichever model makes it.

Automatic fallback. When Grok fails upstream (a 5xx error or a timeout) the deployment retries the image once on GPT Image 2.5 Sunburst, with the same prompt and references. It never retries a refused request or a moderation block, and the retry still counts as one generation. The job's model is then the model that made the image, and adsoptimiser_get_job says what happened, for example "Generated with GPT Image 2.5 Sunburst after Grok failed (500)", or for a job that failed both ways "Grok timed out; retried once on GPT Image 2.5 Sunburst". adsoptimiser_list_jobs marks these jobs too.

Previews: Claude can see the images

Tools attach small preview images (384 px) to their results, so Claude can look at what was generated instead of working from URLs alone: check a new image, pick the best shots of a character sheet, or compare recent results. The include_thumbnails flag controls this per call:

Tool

Previews

Default

adsoptimiser_generate_image

the finished image, when it is ready in time

on

adsoptimiser_get_job

the finished image, or a video's poster frame

on

adsoptimiser_get_character

up to 5 reference images

on

adsoptimiser_list_jobs

up to 6 finished jobs

off

adsoptimiser_list_character_assets

up to 6 finished images on the page

off

To keep results small, each preview is at most 600,000 bytes (base64) and one result carries at most 1,500,000 bytes of images; anything over is left out and named in the reply. Videos are previewed only when a poster frame is stored. Reference images hosted elsewhere are not previewed. A preview that fails never fails the tool: the reply says what was not previewed and why. On an Ads Optimiser deployment that predates previews, the reply says the deployment doesn't serve previews yet. Previews use no allowance.

To check detail (colours, small features, text, the views on a character sheet), ask Claude to look closer: adsoptimiser_view_image returns one image at 768, 1024 or 1536 px (default 1024), and its crop zooms into a region given as fractions of the original, for example { x: 0.3, y: 0.5, width: 0.4, height: 0.3 }. Each image is at most 2,000,000 bytes (base64); a larger one is fetched again one size smaller. For characters, separate images per view show far more detail than one sheet holding many views. On an older deployment it says view_image isn't supported yet.

Claude Code limits how large a tool result may be (the MAX_MCP_OUTPUT_TOKENS setting). If a result with several previews is cut off or refused, ask Claude to call the tool with include_thumbnails set to false, or raise that limit.

Building pipelines

A pipeline is a small graph of steps (up to 12 nodes): for example refine a prompt, generate an image, then animate it into a video. Ask Claude to design one, for example "build a pipeline that turns my product photo into three 9:16 videos with different voices". Claude reads the node catalogue with adsoptimiser_get_pipeline_nodes, checks its graph with adsoptimiser_validate_pipeline (which reports problems by node, the estimated cost per run and whether a prompt is needed), then saves it with adsoptimiser_save_pipeline or runs it directly with adsoptimiser_run_pipeline. Saved pipelines open in the app's pipeline editor at https://app.adsoptimiser.com.au/#/pipeline-editor.

Where a graph needs one of your own images (an input_image node), give its local path as the node's image_url (or image_path). The file is checked and uploaded, and the hosted URL is put in its place before the graph is validated, saved or run.

A pipeline can also start from a video you already have, with an input_video node ("Your video (library)"). It has no inputs and one video output, is free and creates no job, and takes exactly one of video_job_id (a ready video job in the workspace) or video_url (the workspace's own /media URL). With this package you can also give a local .mp4 or .mov, as video_path or as a video_url that is a file path: it is checked and uploaded the same way. Wire its video into add_captions, add_voiceover, strip_audio, lip_sync or extend_video. The "Re-caption a video (your video -> captions)" template is this pair: input_video then add_captions. adsoptimiser_list_pipelines marks templates that start from your video; run them with adsoptimiser_run_pipeline and video_job_id, video_url or a local video_path, for example template_id: "video-recaption". To caption a single finished video, adsoptimiser_add_overlays is simpler. On an older deployment the pipeline tools say it doesn't support the input_video node yet.

Validating and saving use no allowance. Running does: each generation step uses allowance like a single job. Pipeline building needs an Ads Optimiser deployment that allows it for API tokens; on an older one these tools say so and templates and saved pipelines still run.

Characters and voices

A character is a saved person (an AI influencer, a brand ambassador) that keeps the same face across images and videos. A typical influencer workflow:

  1. Generate a character sheet. Ask for the same person from several angles, a full-body shot and a close-up, on a neutral white background with realistic, unretouched skin.

  2. Save the best shots as a character with adsoptimiser_create_character: finished jobs (job_ids), URLs, or your own photos (image_paths, checked and uploaded for you), 5 images at most. Add a description (age, face, hair, build, persona) and a voice.

  3. Preview the voice. adsoptimiser_list_voices lists the xAI presets and the OpenAI voices; adsoptimiser_preview_voice plays a short sample, and with save_to saves the mp3 so you can listen locally. OpenAI voices take instructions such as accent, pacing and tone.

  4. Make content. Pass character_id to adsoptimiser_generate_image for new scenes (porch, kitchen, garden), to adsoptimiser_generate_video with a script for a 9:16 talking-to-camera clip, or to a pipeline. For captioned b-roll, animate a scene image and add text with adsoptimiser_add_overlays or an add_captions step in a pipeline.

Talking clips in a designed voice now work through lip-sync. There are two ways:

  • One go: run the "Character talking clip (designed voice)" template (character-lip-sync) with adsoptimiser_run_pipeline, a character_id, and the exact line as the prompt (about 20 words). It places the character in a fitting scene, animates an 8 second 720p clip, lip-syncs your line in the character's own voice (OpenAI or xAI) and adds captions. That is about US$0.72 per run in provider costs.

  • Step by step: make a 2 to 10 second clip at 720p or 1080p (not 480p) with adsoptimiser_generate_video, then call adsoptimiser_lip_sync with its job id (or a URL, or a local .mp4 or .mov up to 100 MB as video_path) and the script. The line must fit the clip: speech runs about 15 characters a second, so about 20 words for an 8 second clip. The voice is voice, else the character's voice, else eve.

Each lip-sync uses one video generation from the plan allowance and counts toward the daily video quota. It takes 2 to 5 minutes; follow it with adsoptimiser_get_job.

Everything made with a character is gathered on its page in the app's Characters section: images, videos, talking clips, lip-syncs, voiceovers and captioned clips, the lines it has spoken and its voice previews. From Claude, adsoptimiser_get_character gives the counts per kind, the latest items and the latest voice previews, and adsoptimiser_list_character_assets lists the whole gallery, filtered by type and paged with cursor. Ask for "save everything Amos has made to my Desktop" and Claude passes download_to: the finished images and videos, and the speech mp3 kept with each lip-sync and voiceover, are saved to that folder, up to 20 files per call, without replacing existing files. Pass character_id to adsoptimiser_preview_voice to keep a preview in that character's history; to save a preview locally, preview the same voice and text again with save_to (a repeat is served from cache). On an older Ads Optimiser deployment without the Characters hub, adsoptimiser_get_character still returns the character and adsoptimiser_list_character_assets says the hub is not available.

adsoptimiser_generate_video with a script still speaks only xAI preset voices: a character with an OpenAI voice uses its xai_voice_id (else eve) there, and the job's Voice: note says so. OpenAI voices also narrate: an add_voiceover step speaks over a finished video in the character's voice. Characters are edited with adsoptimiser_update_character and deleted only in the app. Saving characters and previewing voices use no allowance.

Overlays and captions

adsoptimiser_add_overlays burns text into any finished video (a video job, an https URL, or a local .mp4 or .mov as video_path, uploaded for you). It works on a video you already have: there is no need to regenerate it or run a pipeline to caption or re-caption it. There are two kinds of text, and one request can use both:

  • Timed cards and captions (cues). Each cue is { text, start, end, position?, style?, y?, size?, max_width? }: up to 200 characters shown from start to end seconds, at the top, center or bottom, as a caption line or a bold card. Up to 50 cues. Use these for points timed to spoken moments, for example a grade card for each subject as the presenter names it.

  • Auto captions (auto_captions: true). The server transcribes the speech and captions every word as it is said, in short chunks (captions_position, default bottom). If you know the script, pass it as script: it corrects the transcript's spellings of names, brands and numbers.

Placing the text. Three optional fields fine-tune where a cue sits and how big it is:

  • y, from 0.05 to 0.95: the vertical centre of the text as a fraction of the frame height (0 is the top). It overrides position.

  • size: small, medium or large (default medium for a caption, large for a card).

  • max_width, from 0.4 to 1.0: the width of the text block as a fraction of the frame width.

A cue's text may also hold line breaks (\n), at most 3 lines. For auto captions, captions_y (0.05 to 0.95, overriding captions_position) and captions_size (small, medium or large) do the same.

In a 9:16 talking clip the face is usually in the upper third, so keep cards below it. A face-safe grade card, on two short lines, sitting just below the middle of the frame:

{ "text": "Maths\nA+", "start": 2, "end": 4.5, "style": "card", "y": 0.62, "size": "large", "max_width": 0.7 }

position: "center" is a simpler face-safe choice when you don't need the exact height.

The request is checked on your machine first (one source, at least one cue or auto captions, text lengths and line counts, timings and every placement value), so a bad one fails before anything is sent or charged. Rendering counts as one creative job from the plan allowance, not a generation; transcription for auto captions costs about US$0.006 per minute of video. The tool returns a job id at once; follow it with adsoptimiser_get_job, which reports the cues, whether captions were added, the transcript's word count and the transcription cost. In a pipeline, the add_captions step takes the same cues (placement fields included, checked on your machine first) and a timing of speech for captions timed to the words. On an older Ads Optimiser deployment the tool says overlays aren't supported yet, and one that predates placement says it doesn't support cue placement, caption placement or line breaks yet.

Working with local files

  • Use absolute paths. Claude Desktop starts servers in its own folder, so relative paths may not point where you expect. Paths starting with ~ expand to your home folder.

  • Uploads: images must be PNG, JPEG, WebP or GIF, up to 10 MB (HEIC and TIFF need converting to JPEG or PNG first). Videos must be MP4 or MOV, up to 120 MB (100 MB for a lip-sync video_path). Files are checked on your machine before anything is sent.

  • Downloads go to ./adsoptimiser-output by default (or your home folder's adsoptimiser-output when the server was started in a system folder). Files are named <job id>-<prompt words>.<ext>. An existing file is never replaced unless you ask for overwrite; a numbered name such as -2 is used instead. Folder paths containing .. are refused.

  • Batches stop at the first plan limit, daily quota or rate limit and report which jobs were queued and the offset to resume from once you are ready. The API allows about 8 generation requests a minute per person, so a full batch of 10 may need a second call.

Configuration

Env var

Default

Purpose

ADSOPTIMISER_URL

https://api.adsoptimiser.com.au

The Ads Optimiser API to talk to

ADSOPTIMISER_APP_URL

https://app.adsoptimiser.com.au

The web app used in links (Billing, job pages)

ADSOPTIMISER_OUTPUT_DIR

./adsoptimiser-output

Default folder for adsoptimiser_download_job

Set them in the MCP config entry, for example to target another deployment or choose where downloads land:

"adsoptimiser": {
  "command": "npx",
  "args": ["-y", "@cintelisai/adsoptimiser-mcp@latest"],
  "env": {
    "ADSOPTIMISER_URL": "https://your-deployment.example.com",
    "ADSOPTIMISER_OUTPUT_DIR": "/Users/you/Documents/Ad creatives"
  }
}

Hosted connector or this package?

Ads Optimiser also has a hosted connector at https://mcp.adsoptimiser.com.au/mcp. Add it in claude.ai under Settings > Connectors > Add custom connector, and it works in Claude on the web, mobile and desktop with nothing to install. It has the same generate tools, but it runs in the cloud, so it cannot read or write files on your computer.

Use this package when you want Claude to work with local files: upload product shots from a folder, turn a folder of images into videos, run a list of prompts from a file, or save finished creatives to disk. You can use both; they are separate connections, each with its own token.

Security notes

  • The token is cached in one file per host in your home folder (~/.adsoptimiser-mcp-<host>.json, mode 0600). On Windows the mode is not enforced; the file inherits your user profile's permissions, which by default only you and administrators can read. The token never appears in any config file, log or chat, and tools never return it.

  • The token is generate-only: it can generate and view creatives, pipelines and characters in the one workspace you chose, save characters, preview voices and upload source media. The API refuses it for publishing, scheduling, ads and campaigns, deleting, billing, workspace settings and admin.

  • Tokens are per machine and individually revocable: each appears in the app under Profile > API tokens, where you can revoke it. adsoptimiser_disconnect revokes it on the server and deletes the local copy. If a token is revoked elsewhere, the next tool call deletes the local copy and asks you to reconnect; if you lose access to the workspace, the tools tell you to reconnect to another one.

  • Uploaded files are stored by Ads Optimiser under unguessable URLs so the generation models can read them. Do not upload anything you would not put in an ad.

  • Media downloads fetch the public media URL directly; the token is not sent with them.

  • Previews and adsoptimiser_view_image images are fetched from the Ads Optimiser API (/api/v1/media/thumbnail) with the token, like every other API call. Nothing is fetched from another host, and the token is only ever sent to the API host.

Releasing

Publishing is automated by .github/workflows/publish.yml, which runs the tests and publishes to npm with provenance when a version tag is pushed.

  1. Add the release to CHANGELOG.md, then bump the version: npm version patch (or minor / major), which updates package.json and creates a vX.Y.Z commit and tag. Or edit package.json, commit, and run git tag vX.Y.Z.

  2. Push the commit and the tag: git push && git push origin vX.Y.Z.

The workflow fails if the tag does not match package.json, and skips publishing (with a notice) if that version is already on npm, so re-running a tag is safe. It needs an NPM_TOKEN repository secret: a granular npm automation token with publish rights on the @cintelisai scope.

Development

npm install
npm test

The published bin is dist/server.mjs, a single ES module bundled by esbuild (npm run build, scripts/build.mjs) with the MCP SDK and zod inside it, so the package has no runtime dependencies. npm test builds it first; npm pack and npm publish rebuild it. The licences of the bundled packages ship in dist/THIRD-PARTY-NOTICES.txt.

  • npm start runs the unbundled source (server.mjs); npm run start:dist runs the bundle.

  • npm run smoke starts the bundle over stdio and times initialize and tools/list.

Tests use node --test against a local stub of the API; they need no network access or account. The bundle tests copy dist/server.mjs into an empty folder and drive it over stdio, to prove it runs with no node_modules.

Licence

MIT © Cintelis Pty Limited

Available Tools

16 tools
adsoptimiser_batch_generateBatch generateA

Queue one job per local image in a folder (image_to_video or image_edit) or per line of a prompts file (prompts). At most 10 per call; each job uses plan allowance like a single generation. Stops at a plan limit, quota or rate limit and reports what was queued and the offset to resume from. Returns job ids at once; check them with adsoptimiser_get_job or adsoptimiser_list_jobs.

ParametersJSON Schema
NameRequiredDescriptionDefault
modeYesimage_to_video: one video per image in `folder`. image_edit: one edited image per image in `folder`. prompts: one job per line of `prompts_file`.
modelNo
folderNoFolder of images (png, jpg, webp, gif) for the image modes.
offsetNoSkip this many items first, to resume a batch that stopped.
promptNoImage modes: the instruction applied to every image. Required for them.
qualityNoGrok Image 2.0 only.
durationNoVideos: seconds, 1 to 15.
max_itemsNoHow many to queue in this call (default and maximum 10).
asset_typeNoprompts mode only: generate images (default) or videos.
resolutionNoImages: 1k or 2k. Videos: 480p, 720p or 1080p.
aspect_ratioNoVideos default to 9:16.
prompts_fileNoText file with one prompt per line (blank lines and # comments skipped).

TDQS

A4.4/5.0
Behavior5/5

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

Adds substantial behavior beyond the annotations: credit/quota consumption per job, graceful stop at plan/quota/rate limits, offset-based resume semantics, and asynchronous job-id returns. These are exactly the operational facts an agent needs before firing a 10-item batch.

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 tight sentences, front-loaded with the core batching action, then limits, then failure behavior, then next-step pointers. No filler; every sentence carries load.

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 12-parameter async batch tool with no output schema, the description covers return shape (job ids), limits, and symptom handling. It leans on the 92%-covered schema for parameter details, which is reasonable, though it could say a bit more about mode-specific requirements (e.g. prompt/folder coupling).

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 92%, so the schema already documents mode, offset, folder, prompts_file, etc. The description restates mode semantics and the resume role of offset but adds little syntactic or format detail not present in 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?

States a specific verb (queue jobs) and resource (images in a folder / lines of a prompts file), and enumerates the three operating modes. It is clearly distinguishable from the single-shot siblings adsoptimiser_generate_image and adsoptimiser_generate_video.

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

Usage Guidelines4/5

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

Provides concrete operating context: batch-of-10 cap, per-job plan allowance cost, and where to check results (adsoptimiser_get_job / adsoptimiser_list_jobs). It never explicitly says when to prefer this over single generate_image/generate_video, so it stops short of full when/when-not guidance.

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

adsoptimiser_connectConnect to Ads OptimiserA

Start signing in to Ads Optimiser (OAuth device flow). Returns a URL and a code for the user to approve in their browser, where they also choose the workspace; afterwards call adsoptimiser_finish_connect.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare the safety profile (readOnlyHint=false, openWorldHint=true, destructiveHint=false), and the description adds genuinely useful behavior: this is a two-step device flow where the user approves in a browser and selects the workspace there. It omits details like code expiry or polling requirements, but it goes well beyond the structured fields.

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

Conciseness5/5

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

Two sentences with no filler, and the return value plus the required next step are both front-loaded. Every clause carries actionable information.

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

Completeness5/5

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

There is no output schema, so the description must explain the return value, and it does (URL plus code, approved in browser). Combined with the explicit handoff to adsoptimiser_finish_connect, an agent has everything needed to run the flow 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?

The tool takes zero parameters, so the baseline is 4; there is nothing for the description to disambiguate. The description correctly implies no inputs are required to initiate the flow.

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 ('Start signing in to Ads Optimiser') plus the mechanism (OAuth device flow). It also specifies what the tool returns (a URL and code) and which sibling continues the flow, so it is distinguishable from adsoptimiser_finish_connect without opening either schema.

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

Usage Guidelines4/5

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

Explicitly routes the agent to the follow-up call ('afterwards call adsoptimiser_finish_connect'), which is strong sequential guidance. It does not cover the edge cases of when not to start a flow, e.g. checking adsoptimiser_status first when already connected, so it falls short of full when/when-not coverage.

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

adsoptimiser_disconnectDisconnectA
DestructiveIdempotent

Revoke this machine's Ads Optimiser token and delete it from this machine.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.9/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true, idempotentHint=true and openWorldHint=true, so safety is covered. The description adds genuinely new context by scoping the action to 'this machine's' token and clarifying that credential material is both revoked and removed from the local machine, not just the account.

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 with no filler; the destructive action and its scope appear immediately, which is exactly right for a zero-argument tool.

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?

With no parameters, no output schema, and annotations covering the safety profile, the definition is nearly sufficient. It stops just short of stating whether revocation is server-side as well as local, which matters for an agent deciding whether re-connecting is required.

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 tool takes zero parameters, so per the rubric the baseline is 4. There are no arguments whose semantics could be added or omitted.

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

Purpose4/5

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

The description gives a specific verb+resource pair ('Revoke this machine's Ads Optimiser token and delete it') that an agent can act on directly. It is naturally the inverse of the connect/finish_connect siblings, so the purpose is effectively distinguished, though it never names those siblings explicitly.

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

Usage Guidelines3/5

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

Usage is only implied by the name and the word 'disconnect' — the agent can infer this is the cleanup step after connecting, but there is no explicit when-to-use or when-not-to-use statement, and no mention of what state the machine must be in first.

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

adsoptimiser_download_jobDownload a finished jobA

Save a finished job's image or video to a local folder (default ./adsoptimiser-output). The file is named after the job id and prompt, and an existing file is never replaced unless overwrite is true.

ParametersJSON Schema
NameRequiredDescriptionDefault
folderNoFolder to save into (created if missing). Defaults to ./adsoptimiser-output, or ADSOPTIMISER_OUTPUT_DIR when set.
job_idYes
overwriteNoReplace a file with the same name. Default false: a numbered name is used instead.

TDQS

A3.7/5.0
Behavior4/5

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

Annotations declare readOnlyHint=false but destructiveHint=false, and the description explains why: an existing file is never replaced unless overwrite is true. That non-obvious safety behavior is real added value beyond the annotations, though the description omits error behavior for unfinished jobs or missing folders.

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: the action and destination come first, the naming/overwrite constraint second. No filler or redundancy.

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

Completeness3/5

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

With no output schema, the description should say what the call returns (e.g., the resolved save path) and what happens if the job is not finished or the folder is unwritable. It covers the destination and overwrite semantics well but leaves those operational gaps.

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

Parameters3/5

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

Schema coverage is 67%, and the schema already documents folder defaults and overwrite numbering. The description restates the overwrite rule and adds the filename convention (job id + prompt), which is modest added meaning but not syntax details beyond the schema.

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

Purpose4/5

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

States a specific verb and resource ('Save a finished job's image or video to a local folder'), so an agent knows exactly what the tool produces. However, it never contrasts itself with siblings like adsoptimiser_get_job (metadata) or adsoptimiser_list_jobs, leaving the boundary to inference.

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?

'a finished job's image or video' implies the job must be complete, which is useful pre-condition context. But there is no explicit routing guidance — nothing tells the agent to check adsoptimiser_get_job/adsoptimiser_status first, nor what to do for an unfinished job.

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

adsoptimiser_enhance_promptEnhance a promptA
Read-only

Expand a rough idea into a detailed prompt tuned for TikTok ad creatives. Returns text only; nothing is generated and no allowance is used.

ParametersJSON Schema
NameRequiredDescriptionDefault
promptYesThe rough idea to expand.
languageNoLanguage of the rough prompt. The result is always English.
asset_typeNoWhat the prompt is for.

TDQS

A4/5.0
Behavior4/5

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

Annotations already establish readOnlyHint (safe read) and openWorldHint. The description adds genuinely useful traits beyond that: it returns text only and consumes no allowance, which is a meaningful cost/behavior signal. It omits rate limits or any length/quality guarantees.

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 tightly written sentences with the core action front-loaded and the cost/generation disclaimer second. Every clause carries information; no waste.

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?

With no output schema, the description helpfully states 'Returns text only,' covering the return shape, and the params are fully documented in the schema. It is complete for invocation purposes, lacking only detail like expected output length.

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 every parameter (prompt, language, asset_type) is documented in the schema, including the enum values. The description adds no parameter-level meaning beyond the schema, so the baseline of 3 applies.

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

Purpose4/5

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

Specific verb and resource: 'Expand a rough idea into a detailed prompt,' with a clear domain qualifier ('tuned for TikTok ad creatives'). It implicitly distinguishes itself from generation siblings by clarifying it produces text only, though it never names them.

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 'nothing is generated and no allowance is used' gives clear context that this is a free, non-generative pre-step, which implies when to reach for it versus the generate_* siblings. It stops short of explicitly naming an alternative or stating a when-not condition.

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

adsoptimiser_finish_connectFinish connectingA

Complete a pending Ads Optimiser sign-in after the user has approved it in the browser.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.8/5.0
Behavior3/5

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

Annotations mark this as non-read-only and open-world, so the agent knows it is a state-changing external call. The description adds the meaningful prerequisite that browser approval must already have happened, but says nothing about failure modes (e.g., approval not granted, expired request) or what credential/session state it establishes.

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 with no filler. The condition and the action are both in the first clause, which is exactly what an agent needs.

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

Completeness3/5

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

For a zero-param auth-completion step this covers the essential trigger, but with no output schema and no annotation detail on authentication semantics, it leaves open what the call returns, whether it is idempotent, and how failures surface. A little more on the connect-then-finish sequence would close the gap.

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 tool takes zero parameters, so there is nothing for the description to disambiguate; the baseline for a parameterless tool applies.

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

Purpose4/5

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

States a specific verb ("Complete") and resource ("pending Ads Optimiser sign-in"), and the phrase "pending ... after the user has approved it in the browser" cleanly separates it from the sibling adsoptimiser_connect, which presumably starts the flow. It does not name that sibling explicitly, so the differentiation is inferred rather than stated.

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 a clear usage condition: call it once a sign-in is pending and the user has approved in the browser. The prerequisite dependency on the earlier connect step is implied by "pending" but never spelled out, and there is no guidance on what to do if no sign-in is pending.

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

adsoptimiser_generate_imageGenerate an imageA

Generate an ad image with Grok (or Luma where enabled). Uses one image generation from the workspace's monthly plan allowance. Usually returns the finished image URL; if it takes longer, returns the job id to check with adsoptimiser_get_job. To edit or restyle existing images pass reference_image_paths (local files, uploaded for you), reference_image_urls or reference_job_ids.

ParametersJSON Schema
NameRequiredDescriptionDefault
seedNo
waitNoWait briefly for the finished image (default true). false returns the job id at once.
modelNoModel id from adsoptimiser_list_models. Defaults to grok-imagine-image-2.0.
promptYesWhat to create.
qualityNoGrok Image 2.0 only. low is fastest (about 13s); medium and auto can take 45 to 50s.
resolutionNo
aspect_ratioNoFor example 9:16 (TikTok vertical), 1:1 or 16:9. See adsoptimiser_list_models.
reference_job_idsNoFinished image jobs to use as references instead of URLs.
reference_image_urlsNoImages to edit or use as references (https URLs, for example media_url values).
reference_image_pathsNoLocal image files (absolute paths; png, jpg, webp or gif, max 10 MB each) to upload and edit or use as references.

TDQS

A4.4/5.0
Behavior4/5

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

Beyond the annotations (readOnlyHint=false, openWorldHint=true), the description discloses real cost behavior ('uses one image generation from the workspace's monthly plan allowance'), the dual return shape (image URL or job id), and that local reference files are uploaded on the caller's behalf. These are exactly the operational facts an agent cannot infer from the schema. It stops short of permissions/failure 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?

Three sentences, front-loaded with purpose, then cost/return behavior, then the reference-parameter guidance. Every sentence carries distinct information with no filler.

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

Completeness4/5

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

For a 10-parameter, no-output-schema generation tool, the description covers the essentials: what it produces, what it costs, both possible return shapes, and how references work. The job-id fallback path is adequately signposted; only the async polling details are left implicit.

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 80%, so the baseline is 3, and the description adds genuine meaning on top: it groups the three reference_* parameters by intent (edit or restyle) and notes that local paths are uploaded automatically, clarifying path vs URL vs job-id choice. It adds little for seed/quality/resolution, which the schema already documents.

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 ('Generate an ad image') plus the backing models (Grok, Luma), which cleanly separates it from adsoptimiser_generate_video, adsoptimiser_batch_generate and adsoptimiser_run_pipeline. The scope is unambiguous without opening any schema.

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

Usage Guidelines4/5

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

Explains the edit/restyle case for the three reference_* parameters and routes to adsoptimiser_get_job when generation is slow. It does not contrast against sibling generators (generate_video, batch_generate) or state when to prefer batch over single, so alternatives are only partially covered.

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

adsoptimiser_generate_videoGenerate a videoA

Start an ad video generation (text-to-video, or image-to-video from source_image_path, source_image_url or source_job_id). Uses one video generation from the plan allowance and counts toward the daily video quota. Returns immediately with a job id; videos take one to several minutes, so check progress with adsoptimiser_get_job.

ParametersJSON Schema
NameRequiredDescriptionDefault
modelNogrok-imagine-video (default) or grok-imagine-video-1.5; see adsoptimiser_list_models.
promptYesWhat should happen in the video.
durationNoSeconds, 1 to 15.
voice_idsNoPreset voices (Grok Video 1.5, text-to-video, max 720p). Tag speech in the prompt as <AUDIO_0>..<AUDIO_2>.
resolutionNoDefaults to 720p. 1080p is Grok Video 1.5 only and costs about 3x more.
aspect_ratioNoDefaults to 9:16 (TikTok vertical).
source_job_idNoAnimate the image from this finished image job.
source_image_urlNoAnimate this image (image-to-video).
source_image_pathNoAnimate this local image (absolute path; image-to-video). It is uploaded first.

TDQS

A4.3/5.0
Behavior4/5

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

Annotations cover the safety profile (readOnlyHint=false, destructiveHint=false, openWorldHint=true), and the description adds real behavioral context beyond that: it consumes one video generation from the plan allowance, counts toward a daily video quota, returns immediately with a job id, and takes one to several minutes. Failure modes and quota-exhaustion behavior are not described, keeping it short of a 5.

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, zero filler, and the most decision-relevant information (what is generated and from what inputs) is front-loaded, with the quota/async caveats following.

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?

Complete for an async job-launching tool with no output schema: the description explains that the immediate return is a job id, that completion is non-instant, and which sibling tool reports progress. Nothing needed to invoke it correctly is missing.

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

Parameters3/5

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

Schema description coverage is 100%, so every parameter is already documented in the schema (including the image-to-video semantics of the source_* fields and the 1080p cost caveat). The description's contribution is mostly a restatement of the three source modes rather than new syntax or format guidance, so the 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?

States a specific verb+resource ('Start an ad video generation') and immediately enumerates both modalities (text-to-video, image-to-video from source_image_path/source_image_url/source_job_id). This clearly separates it from the sibling adsoptimiser_generate_image and adsoptimiser_batch_generate without requiring a schema read.

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 clear context for when each mode applies (text-to-video vs. image-to-video conditioned on which source parameter is supplied) and explicitly routes progress checking to adsoptimiser_get_job. It stops short of stating exclusions, e.g. when to prefer adsoptimiser_generate_image or adsoptimiser_batch_generate for multi-video workloads.

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

adsoptimiser_get_jobGet a creative jobB
Read-only

Get the status of an image or video job, with the result URL once it is ready (statuses: queued, generating, ready, failed, expired).

ParametersJSON Schema
NameRequiredDescriptionDefault
job_idYes

TDQS

B3.3/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false. The description adds the full status lifecycle (queued, generating, ready, failed, expired) and notes that the result URL appears once ready, which is useful behavioral context beyond what the 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?

One sentence, front-loaded with the core action and outcome, and the parenthetical status list is efficient. No wasted words.

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

Completeness3/5

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

Covers the return value (result URL) despite no output schema, and enumerates statuses. Missing is any indication of where job_id comes from or what happens when a job fails or expires, which leaves an agent without full context.

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

Parameters2/5

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

Schema coverage is 0% and the description never mentions job_id or how to obtain it. For the single required parameter, the description offers no format, pattern, or sourcing details, so it fails to compensate for the missing schema documentation.

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

Purpose4/5

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

States a specific verb 'Get' and resource 'status of an image or video job', and lists the possible statuses. It does not explicitly distinguish itself from sibling tools like download_job or list_jobs, but the scope is clear enough.

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

Usage Guidelines2/5

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

No guidance on when to use this tool versus list_jobs (to find jobs) or download_job (to fetch the asset). Usage is implied—poll a job by ID—but no prerequisites or alternatives are stated.

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

adsoptimiser_get_pipeline_runGet a pipeline runB
Read-only

Get a pipeline run's status and each step's status, job id and result URL.

ParametersJSON Schema
NameRequiredDescriptionDefault
run_idYes

TDQS

B3.1/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description adds useful context about what the response contains (per-step status, job id, result URL), but says nothing about behavior for an unknown/expired run_id or any polling semantics.

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 with no filler; the resource comes first and the returned fields follow. Nothing is wasted.

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

Completeness3/5

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

With no output schema, the description usefully names the returned fields, which is a genuine contribution. However, it leaves the required run_id parameter entirely undocumented, which is a meaningful gap for a tool whose only input is that identifier.

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

Parameters2/5

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

Schema description coverage is 0% and the single run_id parameter has no description, pattern explanation, or format example anywhere. The description references 'a pipeline run' but never clarifies the identifier, so it fails to compensate for the schema gap.

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

Purpose4/5

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

States a specific verb (Get) and resource (pipeline run), and enumerates what is returned: status, per-step status, job id, result URL. It does not, however, distinguish itself from the sibling adsoptimiser_get_job, which an agent could easily confuse it with.

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

Usage Guidelines2/5

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

There is no statement of when to use this tool versus adsoptimiser_get_job, adsoptimiser_list_pipelines, or adsoptimiser_run_pipeline. Usage can only be inferred from the name and the presence of a run_id parameter.

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

adsoptimiser_list_jobsList recent creative jobsA
Read-only

List recent image and video jobs in the workspace, newest first. Filter by status or asset type.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoDefault 10.
offsetNo
statusNo
asset_typeNo

TDQS

A3.5/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description adds the useful behavioral detail that results are ordered newest-first and are workspace-scoped, but says nothing about pagination behavior despite the presence of limit/offset.

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 core action and ordering come first, filters second. Every sentence earns its place.

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

Completeness3/5

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

For a read-only list tool with no output schema, the description should clarify paging (limit/offset) and roughly what a job record contains. It covers scope, ordering and filters but leaves pagination and result shape unaddressed.

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 only 25% (only 'limit' is documented), so the description must compensate; it partially does by naming status and asset_type as filters. However offset is left entirely without meaning and the enum values for status/asset_type are never explained in the description.

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

Purpose4/5

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

States a specific verb and resource ('List recent image and video jobs') plus scope ('in the workspace') and ordering ('newest first'). It is clear what the tool returns, though it does not explicitly distinguish itself from single-job siblings like adsoptimiser_get_job or adsoptimiser_list_pipelines.

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 second sentence implies usage by naming the two filterable dimensions, but there is no explicit when-to-use guidance nor any reference to the alternative tools (get_job for one job, list_pipelines for pipelines). Usage is inferable but not stated.

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

adsoptimiser_list_modelsList generation modelsA
Read-only

List the image and video models available for generation with their modes, aspect ratios, resolutions, quality options and indicative cost. Call this before choosing a non-default model.

ParametersJSON Schema
NameRequiredDescriptionDefault
asset_typeNoOnly list image or video models.

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description adds genuine behavioral value beyond that: it discloses the fields returned and notes 'indicative cost', which signals approximate rather than binding pricing. It does not mention pagination or authorization, but for a read-only listing tool this is solid.

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 what the tool returns and closed with the usage directive. Every clause earns its place with no redundant restatement of the name or title.

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 compensates by enumerating the returned fields, which is exactly what an agent needs to decide whether to call this discovery tool. For a one-optional-parameter lister with annotations covering safety, nothing material 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 coverage is 100% and the single asset_type parameter has an enum documented in the schema, so the schema fully carries the parameter semantics. The description does not restate or extend the asset_type filtering, which is the expected baseline of 3 when structured data does the work.

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 ('List') and resource ('image and video models') and enumerates exactly what each entry carries (modes, aspect ratios, resolutions, quality options, indicative cost). This clearly distinguishes it from sibling listers like list_jobs and list_pipelines, so an agent can select it 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 Guidelines4/5

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

Gives an explicit trigger to call it ('Call this before choosing a non-default model'), which is actionable context. It stops short of naming an alternative sibling or stating when-not to call it, so it lacks the full when/alternatives framing of a 5.

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

adsoptimiser_list_pipelinesList pipelinesA
Read-only

List pipeline templates and the workspace's saved pipelines that adsoptimiser_run_pipeline can start.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.2/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, so safety and world scope are covered structurally. The description adds the useful fact that results span two distinct categories (templates plus workspace-saved pipelines), but says nothing about pagination, ordering, or result size. Modest added value against an already-informative annotation set.

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 with no filler, front-loaded with the verb and resource. Every clause carries information, including the cross-reference to the consuming tool.

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 zero-argument, read-only listing tool with no output schema, the description supplies what an agent most needs: what the list contains and which downstream tool uses it. It stops short of describing the returned shape (e.g., identifiers needed to invoke adsoptimiser_run_pipeline), which is the only remaining gap.

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 tool takes zero parameters, so there is nothing for the description to disambiguate; the baseline for a parameterless tool is 4. The description correctly implies the call is unfiltered and returns the full listing.

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 ('List') and a precisely scoped resource ('pipeline templates and the workspace's saved pipelines'), and names the sibling tool (adsoptimiser_run_pipeline) that consumes the result. An agent can distinguish this discovery tool from adsoptimiser_run_pipeline, adsoptimiser_get_pipeline_run, and adsoptimiser_list_jobs without opening any schema.

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

Usage Guidelines4/5

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

The description clearly frames the context of use: this is the lookup you perform to find pipelines that adsoptimiser_run_pipeline can start. It does not add explicit exclusions or state when NOT to call it, but the when-to-use signal is unambiguous.

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

adsoptimiser_run_pipelineRun a pipelineA

Start a pipeline run from a template_id or a saved graph_id. Each generation step uses plan allowance like a single job (video steps also count toward the daily video quota). Returns the run id and an estimated provider cost; check progress with adsoptimiser_get_pipeline_run.

ParametersJSON Schema
NameRequiredDescriptionDefault
promptNoThe run prompt. Required unless every step gets its prompt elsewhere.
graph_idNoA saved pipeline id from adsoptimiser_list_pipelines.
template_idNoA template id from adsoptimiser_list_pipelines, for example product-ad.

TDQS

A4/5.0
Behavior4/5

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

Annotations cover the safety profile (readOnlyHint=false, destructiveHint=false, openWorldHint=true), and the description adds genuinely non-obvious behavior: each generation step consumes plan allowance like a single job and video steps draw on the daily video quota. It also states the return payload (run id + estimated provider cost). It stops short of covering failure modes or async semantics.

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 front-loaded sentences: the action first, then the allowance/quota cost model, then the disposal of the returned run id. No filler and every sentence carries distinct information.

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

Completeness4/5

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

With no output schema, the description usefully compensates by naming the returned run id and cost estimate, and it documents the quota side effects of an open-world execution tool. It is nearly complete, missing only failure/retry expectations for a long-running run.

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 three parameters including the prompt's conditional requirement and the graph_id pattern. The description restates the two id sources but adds no syntax or exclusivity detail beyond the schema, matching the baseline of 3.

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 ('Start a pipeline run') and names both accepted input modes (template_id or saved graph_id). It also explicitly points to adsoptimiser_get_pipeline_run for progress, which cleanly separates it from that sibling so an agent can route without opening either schema.

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

Usage Guidelines3/5

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

Usage is implied through the two entry-point parameters (template_id, graph_id) and the progress-check pointer, but it never says when to prefer a template over a saved graph, nor when to use this versus batch_generate. No explicit exclusions are given.

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

adsoptimiser_statusConnection statusA
Read-only

Show whether this machine is connected to Ads Optimiser, as which user, to which workspace and with what role.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.9/5.0
Behavior4/5

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

Annotations mark it readOnlyHint=true and openWorldHint=false, and the description adds what the read actually surfaces (connected?, as which user, to which workspace, with what role). That is genuine value beyond the safety flags, though it does not cover behavior when disconnected or any auth nuances.

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 front-loaded sentence with no filler; the informative dimensions are packed into a single clause and nothing is wasted.

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?

With no output schema, the description carries the burden of explaining return values, and it does so adequately by listing user, workspace, and role. It stops short of describing the disconnected case or return shape, but the essentials for correct invocation are present.

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

Parameters4/5

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

The tool takes zero parameters, so there is nothing for the description to disambiguate; baseline of 4 applies.

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

Purpose4/5

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

States a specific verb ('Show') and resource ('connection status') and enumerates the facets returned: connection state, user, workspace, and role. It is clearly distinguishable from siblings like connect/disconnect/finish_connect, though it does not explicitly name them.

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?

No explicit when-to-use statement or prerequisites are given. The intended use (checking connectivity before invoking other Ads Optimiser tools) is only implied by the sibling set, not stated in the description.

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

adsoptimiser_upload_fileUpload a local fileA

Upload a local image (png, jpg, webp, gif; max 10 MB) or video (mp4, mov; max 120 MB) to Ads Optimiser and return its hosted URL, for use as reference_image_urls or source_image_url. Uses no plan allowance.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYesAbsolute path of a local image (png, jpg, webp, gif; max 10 MB) or video (mp4, mov; max 120 MB).
purposeNoVideos only: extend accepts source videos up to 15s instead of 8.7s.

TDQS

A4.3/5.0
Behavior4/5

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

Annotations declare readOnlyHint=false, destructiveHint=false and openWorldHint=true, so the agent already knows this writes an external resource. The description adds genuinely useful context beyond that: exact size ceilings, allowed MIME types, and the billing note 'Uses no plan allowance', which affects whether the agent should call it freely.

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

Conciseness5/5

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

A single dense sentence front-loads the action, constraints, and return value, with the billing note last. Every clause carries information; nothing is redundant padding.

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 two-parameter upload tool with no output schema, the description covers formats, size limits, return value, and downstream usage. The only omission, the 'purpose' enum semantics, is already handled by the schema.

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 both parameters are fully documented in the schema. The description re-states the format/size rules for 'path' but says nothing about the 'purpose' enum (reference vs extend) or the 15s/8.7s video distinction, so it adds no meaning beyond structured data. 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?

Specific verb (Upload) plus resource (local file), enumerated accepted formats and size caps, and an explicit statement of what is returned (hosted URL). It is the only upload sibling, so differentiation is inherent, and the agent can understand the operation 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 Guidelines4/5

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

The description ties the output to concrete downstream uses (reference_image_urls, source_image_url), which tells the agent when this tool is relevant. It stops short of naming exclusions or competing tools, but no real alternative exists in the sibling list.

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.

  1. 16 tool updatesv0.1.0
    • First observedadsoptimiser_batch_generate
    • First observedadsoptimiser_connect
    • First observedadsoptimiser_disconnect
    • First observedadsoptimiser_download_job
    • First observedadsoptimiser_enhance_prompt
    • First observedadsoptimiser_finish_connect
    • First observedadsoptimiser_generate_image
    • First observedadsoptimiser_generate_video
    • First observedadsoptimiser_get_job
    • First observedadsoptimiser_get_pipeline_run
    • First observedadsoptimiser_list_jobs
    • First observedadsoptimiser_list_models
    • First observedadsoptimiser_list_pipelines
    • First observedadsoptimiser_run_pipeline
    • First observedadsoptimiser_status
    • First observedadsoptimiser_upload_file

TDQS

A3.7/5.0

Scored across 16 tools

Disambiguation4/5

Each tool targets a distinct action or resource, such as generate_image vs generate_video, get_job vs list_jobs, and run_pipeline vs batch_generate. The connect/finish_connect pair is clearly sequential and described well, though run_pipeline and batch_generate both start multiple jobs and could be confused in edge cases.

Naming Consistency4/5

All tools use the adsoptimiser_ prefix and snake_case, with a mostly verb_noun pattern like generate_image, list_jobs, and run_pipeline. Minor deviations exist in batch_generate (modifier_verb) and finish_connect (verb_verb), but the convention remains predictable overall.

Tool Count4/5

16 tools is slightly on the heavy side but reasonable for a creative generation server with auth, image/video generation, job management, pipelines, batch processing, and file handling. Each tool appears to earn its place, though some grouping could reduce surface area.

Completeness4/5

The server covers auth lifecycle, model listing, prompt enhancement, image/video generation, job status/list/download, pipeline runs, uploads, and batch generation. Minor gaps exist around canceling or deleting jobs and pipeline runs, but agents can likely work around these via expiry or status checks.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers