Ads Optimiser MCP server
OfficialConnects Claude to Ads Optimiser to generate and manage TikTok ad images/videos, run pipelines, and work with local files.
Sign in/out via SSO device flow; check connection status.
List available image/video models and enhance prompts.
Generate images with text prompts and references (local, URL, job IDs), with options for model, quality, resolution, aspect ratio, seed.
Generate videos (text-to-video, image-to-video) with options for model, duration, voices, resolution, aspect ratio.
Check job status and list recent jobs.
Run and monitor pipelines from templates or saved graphs.
Upload local images/videos to get hosted URLs.
Download finished jobs to local folders.
Batch-generate images/videos from folders or prompt files.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Ads Optimiser MCP serverGenerate a TikTok ad image for a 50% off summer sale"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
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:
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 afterinitializemeans the server started too slowly.Version 0.2.0 and later start in well under a second once downloaded. If you are on an older version,
@latestin the config picks up the fix on the next restart.To take
npxout of the picture entirely, install the package once and point Claude Desktop at it withnode:npm install -g @cintelisai/adsoptimiser-mcp npm root -gnpm root -gprints the global folder, for exampleC:\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-mcpagain to upgrade.
Claude Code
claude mcp add adsoptimiser -- npx -y @cintelisai/adsoptimiser-mcp@latestThe @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.
Open the URL and sign in to Ads Optimiser if asked.
Check the code on the page matches the one Claude showed you. If it does not, do not approve.
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.
Tell Claude you've approved; it calls
adsoptimiser_finish_connectand you're connected.
Tools
Tool | What it does |
| Start the SSO device flow |
| Collect the token after you approve |
| Show the connected user, workspace and role |
| Revoke the token on the server and delete it from this machine |
| List image and video models, their options and indicative cost |
| Expand a rough idea into a detailed ad prompt (uses no allowance) |
| Generate an image, with a preview of the result; accepts local reference images ( |
| Start a video; text-to-video, or image-to-video from a local image ( |
| Make the person in a finished clip (a job, a URL or a local |
| Burn timed text cards or captions into any finished video (a job, a URL or a local |
| Status and result URL of one job, with a preview once it is finished |
| Recent jobs, filterable by status and type; previews with |
| Pipeline templates and saved pipelines |
| The pipeline node catalogue: node types, inputs, outputs, params, graph rules and an example |
| A saved pipeline's graph, node count and estimated cost per run |
| Check a pipeline graph: errors by node, node count, estimated cost, whether it needs a prompt (uses no allowance) |
| Save a pipeline graph to the workspace, or update a saved one by |
| Start a pipeline run from a template, a saved pipeline or an inline graph, optionally with a |
| Status and results of each pipeline step |
| Saved characters with their images, description, style and voice |
| 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 |
| Everything made with a character, filterable by type and paged; previews with |
| 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 a character from 1 to 5 images: local files ( |
| Change a character's name, description, style, voice or images (uses no allowance) |
| xAI preset voices and OpenAI voices, and whether OpenAI voices are available |
| A short sample in any voice as a playable URL, optionally filed in a character's preview history, and with |
| Upload a local image or video and get its hosted URL (uses no allowance) |
| Save a finished job's image or video to a local folder |
| 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) |
| General ad images |
|
Grok Image |
| The fastest Grok images | No |
GPT Image 2.5 Sunburst (precise, fast) |
| Detailed specs followed exactly, in about 12 seconds |
|
GPT Image 2.5 Flare (fast) |
| Quick drafts in about 9 seconds, less precise on detail |
|
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 |
| the finished image, when it is ready in time | on |
| the finished image, or a video's poster frame | on |
| up to 5 reference images | on |
| up to 6 finished jobs | off |
| 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:
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.
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.Preview the voice.
adsoptimiser_list_voiceslists the xAI presets and the OpenAI voices;adsoptimiser_preview_voiceplays a short sample, and withsave_tosaves the mp3 so you can listen locally. OpenAI voices take instructions such as accent, pacing and tone.Make content. Pass
character_idtoadsoptimiser_generate_imagefor new scenes (porch, kitchen, garden), toadsoptimiser_generate_videowith ascriptfor a 9:16 talking-to-camera clip, or to a pipeline. For captioned b-roll, animate a scene image and add text withadsoptimiser_add_overlaysor anadd_captionsstep 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) withadsoptimiser_run_pipeline, acharacter_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 calladsoptimiser_lip_syncwith its job id (or a URL, or a local .mp4 or .mov up to 100 MB asvideo_path) and thescript. The line must fit the clip: speech runs about 15 characters a second, so about 20 words for an 8 second clip. The voice isvoice, 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 fromstarttoendseconds, at thetop,centerorbottom, as acaptionline or a boldcard. 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, defaultbottom). If you know the script, pass it asscript: 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 overridesposition.size:small,mediumorlarge(defaultmediumfor a caption,largefor 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-outputby default (or your home folder'sadsoptimiser-outputwhen 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 foroverwrite; a numbered name such as-2is 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
offsetto 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 |
|
| The Ads Optimiser API to talk to |
|
| The web app used in links (Billing, job pages) |
|
| Default folder for |
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_disconnectrevokes 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_imageimages 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.
Add the release to
CHANGELOG.md, then bump the version:npm version patch(orminor/major), which updatespackage.jsonand creates avX.Y.Zcommit and tag. Or editpackage.json, commit, and rungit tag vX.Y.Z.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 testThe 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 startruns the unbundled source (server.mjs);npm run start:distruns the bundle.npm run smokestarts the bundle over stdio and timesinitializeandtools/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 toolsadsoptimiser_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.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | Yes | image_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`. | |
| model | No | ||
| folder | No | Folder of images (png, jpg, webp, gif) for the image modes. | |
| offset | No | Skip this many items first, to resume a batch that stopped. | |
| prompt | No | Image modes: the instruction applied to every image. Required for them. | |
| quality | No | Grok Image 2.0 only. | |
| duration | No | Videos: seconds, 1 to 15. | |
| max_items | No | How many to queue in this call (default and maximum 10). | |
| asset_type | No | prompts mode only: generate images (default) or videos. | |
| resolution | No | Images: 1k or 2k. Videos: 480p, 720p or 1080p. | |
| aspect_ratio | No | Videos default to 9:16. | |
| prompts_file | No | Text file with one prompt per line (blank lines and # comments skipped). |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
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.
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.
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.
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.
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.
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_disconnectDisconnectADestructiveIdempotent
Revoke this machine's Ads Optimiser token and delete it from this machine.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| folder | No | Folder to save into (created if missing). Defaults to ./adsoptimiser-output, or ADSOPTIMISER_OUTPUT_DIR when set. | |
| job_id | Yes | ||
| overwrite | No | Replace a file with the same name. Default false: a numbered name is used instead. |
TDQS
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.
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.
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.
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.
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.
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 promptARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| prompt | Yes | The rough idea to expand. | |
| language | No | Language of the rough prompt. The result is always English. | |
| asset_type | No | What the prompt is for. |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| seed | No | ||
| wait | No | Wait briefly for the finished image (default true). false returns the job id at once. | |
| model | No | Model id from adsoptimiser_list_models. Defaults to grok-imagine-image-2.0. | |
| prompt | Yes | What to create. | |
| quality | No | Grok Image 2.0 only. low is fastest (about 13s); medium and auto can take 45 to 50s. | |
| resolution | No | ||
| aspect_ratio | No | For example 9:16 (TikTok vertical), 1:1 or 16:9. See adsoptimiser_list_models. | |
| reference_job_ids | No | Finished image jobs to use as references instead of URLs. | |
| reference_image_urls | No | Images to edit or use as references (https URLs, for example media_url values). | |
| reference_image_paths | No | Local image files (absolute paths; png, jpg, webp or gif, max 10 MB each) to upload and edit or use as references. |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| model | No | grok-imagine-video (default) or grok-imagine-video-1.5; see adsoptimiser_list_models. | |
| prompt | Yes | What should happen in the video. | |
| duration | No | Seconds, 1 to 15. | |
| voice_ids | No | Preset voices (Grok Video 1.5, text-to-video, max 720p). Tag speech in the prompt as <AUDIO_0>..<AUDIO_2>. | |
| resolution | No | Defaults to 720p. 1080p is Grok Video 1.5 only and costs about 3x more. | |
| aspect_ratio | No | Defaults to 9:16 (TikTok vertical). | |
| source_job_id | No | Animate the image from this finished image job. | |
| source_image_url | No | Animate this image (image-to-video). | |
| source_image_path | No | Animate this local image (absolute path; image-to-video). It is uploaded first. |
TDQS
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.
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.
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.
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.
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.
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 jobBRead-only
Get the status of an image or video job, with the result URL once it is ready (statuses: queued, generating, ready, failed, expired).
| Name | Required | Description | Default |
|---|---|---|---|
| job_id | Yes |
TDQS
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.
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.
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.
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.
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.
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 runBRead-only
Get a pipeline run's status and each step's status, job id and result URL.
| Name | Required | Description | Default |
|---|---|---|---|
| run_id | Yes |
TDQS
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.
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.
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.
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.
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.
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 jobsARead-only
List recent image and video jobs in the workspace, newest first. Filter by status or asset type.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Default 10. | |
| offset | No | ||
| status | No | ||
| asset_type | No |
TDQS
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.
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.
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.
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.
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.
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 modelsARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| asset_type | No | Only list image or video models. |
TDQS
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.
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.
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.
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.
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.
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 pipelinesARead-only
List pipeline templates and the workspace's saved pipelines that adsoptimiser_run_pipeline can start.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| prompt | No | The run prompt. Required unless every step gets its prompt elsewhere. | |
| graph_id | No | A saved pipeline id from adsoptimiser_list_pipelines. | |
| template_id | No | A template id from adsoptimiser_list_pipelines, for example product-ad. |
TDQS
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.
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.
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.
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.
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.
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 statusARead-only
Show whether this machine is connected to Ads Optimiser, as which user, to which workspace and with what role.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Absolute path of a local image (png, jpg, webp, gif; max 10 MB) or video (mp4, mov; max 120 MB). | |
| purpose | No | Videos only: extend accepts source videos up to 15s instead of 8.7s. |
TDQS
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.
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.
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.
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.
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.
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.
16 tool updates
v0.1.0- First observed
adsoptimiser_batch_generate - First observed
adsoptimiser_connect - First observed
adsoptimiser_disconnect - First observed
adsoptimiser_download_job - First observed
adsoptimiser_enhance_prompt - First observed
adsoptimiser_finish_connect - First observed
adsoptimiser_generate_image - First observed
adsoptimiser_generate_video - First observed
adsoptimiser_get_job - First observed
adsoptimiser_get_pipeline_run - First observed
adsoptimiser_list_jobs - First observed
adsoptimiser_list_models - First observed
adsoptimiser_list_pipelines - First observed
adsoptimiser_run_pipeline - First observed
adsoptimiser_status - First observed
adsoptimiser_upload_file
TDQS
Scored across 16 tools
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.
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.
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.
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
Related MCP Connectors
Publish and schedule videos to TikTok, YouTube Shorts, Instagram, Facebook, LinkedIn, Pinterest, Bluesky, Threads and X from Claude, Cursor or any MCP client. Upload once, post everywhere, track views in unified analytics, and retry failed posts. Official platform APIs only, free plan available. Docs: https://docs.multi-upload-tool.com/mcp
Generate images from Claude, ChatGPT, Cursor and Codex with 12 top AI image models. Up to 4 images per call, SVG vectorization, background removal, upscaling and image-to-video. Remote MCP with OAuth, no API keys.
Use AI models for chat, image, and video generation from Claude Code and other MCP hosts.
Generate images from Claude, ChatGPT, Cursor and Codex with 12 top AI image models and 10 tools: up to 4 images per call, SVG vectorization, editing and more. Remote MCP with OAuth, no API keys. Pay per image, no subscription.
Related MCP Servers
- AlicenseAqualityCmaintenanceMCP server for AI-powered image, audio, and video generation, enabling media creation directly from Claude, Cursor, and other MCP clients.1119 npmMIT
- AlicenseAqualityBmaintenanceMulti-provider image generation MCP server that enables image generation from Claude Desktop, Claude Code, or any MCP client using OpenAI, Google Gemini, Stable Diffusion, or a placeholder provider.1072 PyPI1MIT
- AlicenseAqualityCmaintenanceEnables AI photo generation, editing, and video creation from MCP-compatible clients like Claude Desktop, Cursor, and Windsurf.811 npmMIT
- AlicenseBqualityBmaintenanceLocal MCP server that uses Playwright browser automation to enable Claude Code to generate images, create variations, expand, and remove backgrounds via Adobe Firefly, requiring manual sign-in once.1116 npm1MIT