no-api-media
Provides image and video generation using Google AI Pro/Ultra accounts, including Nano Banana and Veo 3.1 through Google Flow and Gemini, with sign-in and status checks.
Provides image generation through ChatGPT (GPT Image) using a ChatGPT Plus/Pro account, either via the Codex CLI or chatgpt.com sign-in, with account status and credit checks.
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., "@no-api-mediacreate a 16:9 hero image for our landing page, match the site's style"
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.
no-api-media-mcp is an open source MCP server (Apache-2.0, Node 22+) that lets Claude Code, Cursor, Codex and other MCP clients make images and videos for your projects with the AI subscriptions you already pay for. No API keys. No second bill. Uses your own ChatGPT, Google AI Pro, Higgsfield and Grok accounts.
Intro video • Features • Quick start • Connect accounts • Installation • Tools • CLI commands • Troubleshooting
Watch the 72 second intro
https://github.com/user-attachments/assets/c96b3ad1-4795-4c54-91e7-95d3cd4627d3
A short narrated tour, 1080p: the problem it solves, the server making a real image from a prompt, and how to install it. The video itself was made with our own intro video tool and its synthetic NexaForge narrator. Download the MP4 (9.4 MB).
Related MCP server: img-vid-mcp
Features
Images and videos from your own plans: GPT Image (ChatGPT via Codex), Nano Banana and Veo 3.1 (Google Flow), Gemini, Higgsfield (Seedance, Kling and more), Grok
No API keys at all: you sign in once, by hand, in a private Chrome window. API-key variables are stripped before any tool runs
Understands your project: reads what it does, its colours, fonts, 3D or animation libraries and existing images, then matches the style (luxury, premium, playful, corporate, modest)
Premium by default: writes a real creative brief for every asset, with named looks like
neon-glass(the style of the graphics on this page)Built-in media studio (new in 0.2): background removal, video editing for Reels and Shorts, and every social size from one image, all running locally
Saves straight into your project: full quality, no Download folder, no Save dialog, never outside the project
Shrinks for the web without visible loss: WebP and H.264, checked with an SSIM quality score
Credit-safe: shows the cost first, hard
max_creditscap, one job at a timeAdd any site with a small JSON file, no code
What's new in 1.x
Made the way the server now recommends: the background came from design_brief and image_generate (Codex on a ChatGPT plan), every word and logo was set on top in HTML instead of being drawn by the model, then composition_check and media_optimize checked and shrank it. None of the graphics on this page show another company's logo.
Tool | What it does |
| Sets your real headline and a registered brand's logo over generated art: measured placement, at least 4.5:1 contrast, the brand's fonts, no glow |
| The exact file a platform wants (linkedin-feed, instagram-story, x-post, github-social and more): size, smallest JPEG that still looks identical, under the size limit |
| The brands you publish under, with who publishes (a person or a company) and their real logo files, so the right mark is never guessed |
| Remembers what you said was wrong and applies it to every later brief, per brand if you like |
| Finds empty bands at the edges and crops them while keeping your target shape |
| Closes the browser when the work is finished, never while another session still uses it |
The media studio (since 0.2)
Tool | What it does |
| Cuts out the subject into a transparent PNG with BiRefNet models via rembg. Fully local, nothing uploaded. Quality: |
| Trim, reframe to 9:16 / 1:1 / 16:9 / 4:5, speed, fade, mute, replace audio, poster frame, GIF, text overlay, logo, burned-in subtitles, join clips |
| One image into Open Graph, LinkedIn, X, Instagram square/portrait/story, YouTube thumbnail, Pinterest, GitHub social preview, favicon and app icons. Cover, blurred-fill or solid padding |
| Duration, size, frame rate and codecs of any file |
Try:
Remove the background from public/products/lamp.jpg.
Turn this 16:9 clip into a 9:16 Reel with our logo top-right and these subtitles.
Make every social size from public/og.png.Quick start
git clone https://github.com/farhan6667/no-api-media-mcp
cd no-api-media-mcp
npm ci
node dist/src/index.js setupnpm ci installs the exact dependency versions in package-lock.json and builds the server.
setup checks your machine, opens a Chrome window where you sign in to ChatGPT and Google, and prints the line to add to your AI client. Then just ask your agent for what you need.
No prompt writing needed
You don't write image prompts. When your AI client connects, this server hands it a full workflow, and the agent follows it on its own:
Reads your project: what it does (from the README or site), colours, fonts, 3D or animation libraries, existing images
Writes a real creative brief: what the project is, where the image goes, who sees it, what it must achieve, and a premium quality bar. This is the part that makes results look high-end instead of generic
Generates with the right tool: GPT Image (ChatGPT) for designs with text, Google Flow for photo and 3D scenes
Checks every result against a design checklist (spelling, brand fit, no third-party logos, crop) and retries with a corrected brief
Shrinks and places the winner in your project, with real alt text
Try one of these
Copy any of these into Claude Code, Cursor or Codex, inside your project:
Look at this project and tell me where images or video would make the site better, then make them and put them in.Make a premium 16:9 hero image for the landing page that matches our brand.Create a 1200x630 social preview image for this repo, with the project name spelled exactly.Make a premium infographic that explains what this project does, for the top of the README.Make an 8 second calm background video for the hero, quote the credits first.That's the whole interface. Say "premium", "luxury", "minimal" or "playful" if you want a specific level, otherwise it aims for premium.
Made with this MCP
Both of these came out of the prompts above, through Google Flow on an AI Pro plan, 0 credits, no API key:
At a glance
It designs for who's actually looking
Tell design_brief who sees the asset (context.audience, plain English: "CISOs", "developers", "the open source community", "security analysts", "the general public") and it recognises a few real audiences and changes the art direction for them: tone, a default style tier and a palette when you haven't set your own, plus one honest critique question asked from that reader's seat.
You said | It assumes | Tier | A question it adds |
CISOs, executives, buyers | time-pressed, skeptical of a hard sell | corporate | Would they get the one thing that matters in three seconds? |
developers, engineers | can tell marketing gloss from substance | minimal | Would they believe it, or tune it out? |
the open source community, GitHub | scanning a repo list, not a product page | premium | Does it read as open source, not a corporate ad? |
security analysts, pentesters, SOC teams | seen a hundred vendor decks already | premium | Would a working analyst trust it? |
the general public, gamers, consumers | scrolling for fun | playful | Is it fun without turning childish? |
Don't invent an audience it doesn't recognise, say so plainly and it's simply left unset.
It sets the text and logo itself, then delivers the final file
Generated art is only half a post. Register the brands you publish under once:
brand_profiles(action="set", id="sfa", name="SFA", publisher="person", logo_dark="/path/sfa-logo.webp")Then compose sets the headline and that brand's real logo over the art. It measures the picture to find the calmest corner, keeps the text out of the busy part, picks the text colour and a soft scrim for at least 4.5:1 contrast, and never adds a glow. deliver turns the result into the file a platform wants:
compose(input_path="art.png", headline="Shadow AI", brand_id="sfa", platform="linkedin-feed")
deliver(input_path="art-composed-linkedin-feed.png", platform="linkedin-feed")That gives an exact 1080x1350 JPEG, as small as it can be without a visible change, metadata stripped, under LinkedIn's limit, and checked for an empty band.
It measures its own work, and remembers your corrections
design_audit doesn't only take the model's word for it: given the file, it measures it, and an empty band at an edge or a washed-out thumbnail caps the score so a weak result can't ship. composition_check does the same on demand and gives a crop that keeps your target shape.
When you say a result was wrong (the crop, the colours, the wrong logo), the assistant records it with design_feedback, and every later brief applies it. A correction can be tied to one brand, so "use my personal mark" never leaks onto company posts.
It handles several sessions at once
Each Claude (or Cursor, or Codex) session runs its own copy of this server, but there's only one signed-in browser profile. By default a second session simply opens its own tab in the same browser, so both jobs run side by side.
This works through a loopback-only Chrome devtools port that's open while the browser is open. On your own computer that's fine. On a shared machine, turn it off:
node dist/src/index.js config set share_browser falseWith sharing off, the second session waits in line instead and says so in its progress messages: its place in the queue, how long it has waited, and an estimate once there's enough history (taken from how long recent jobs on your machine really took). It carries on by itself when the browser frees up.
The brief also asks before it guesses now: if it doesn't know where an image will be used or what post it goes with, design_brief returns needs_from_user with those questions, so your assistant asks you once instead of producing the wrong size or the wrong message.
It knows 3D and WebGL sites need different assets
Two more asset types for design_brief: texture (a seamless, tileable surface for a background or a Three.js material) and environment-map (a seamless 2:1 equirectangular panorama for reflections and lighting in a Three.js or WebGL scene). Each gets its own critique checklist instead of the usual photo-realism one, since neither is meant to be looked at directly.
loop_check(input_path=".ai-media/flow/hero-loop.mp4")Compares a looping video's first and last frame the same way media_optimize checks quality loss, and tells you if the loop will actually look seamless before it ships.
palette_extract(input_path="public/images/hero.jpg", count=6)Pulls the real dominant colours out of a generated (or any) image and returns a ready :root CSS block, so the site's design system can match what actually got made instead of a guess.
The server also recognises the kind of project it's in on its own now: a GitHub repo, a single social post, a 3D/WebGL site, or an animated landing page, and reaches for the matching asset types without being told each time.
It remembers what actually shipped
design_audit can carry the style (tier and look) a draft used. Once enough drafts of one asset type have shipped under the same tier, design_brief defaults to it on its own next time, instead of always starting from premium. Ask for a specific tier or look and that always wins; this only fills in the gap when you didn't ask.
It compares drafts side by side
contact_sheet(input_paths=["dir1/a.png", "dir1/b.png", "dir1/c.png"], output_path=".ai-media/compare/hero.jpg")Lays up to 12 images on one grid instead of one at a time. No text is baked into the image; the result lists which grid position holds which file.
It knows what actually keeps platforms from cutting your reach
Meta has said plainly that a plain "AI info" label does not by itself reduce a post's reach. What does get penalised is content that reads as a real photo of an event, person or statement that never happened. design_brief's critique list now asks that question directly for every realistic asset type, and social_sizes covers Facebook, YouTube and X/Twitter cover sizes alongside LinkedIn, Instagram and Pinterest.
It keeps a face or a look consistent
Pass reference_images to image_generate (Codex provider only) and the generated picture is built from your own photos. Use it for a person's portrait, a product, or a style you have already approved. The description says what to keep (for example "the same face, glasses and beard") and what to change (clothes, pose, setting, light).
image_generate(provider="codex", reference_images=["refs/me.png", "approved/portrait-v1.png"], prompt="Keep my face exactly. New navy blazer, glass wall at blue hour, calm expression...")Up to four images, and each one has to be a real image file inside the project. Only use a photo of someone who has agreed to it, which usually means your own. For a fixed expression or a repeated fix, name the exact fault in the prompt ("brow crease, flat mouth") and pass the previous result as a reference. It is the one place a client can ask for a specific person, so the server never fetches a reference from the web.
It falls back when a provider breaks
Browser-driven providers depend on the site's own pages, and a redesign can break a selector overnight. Pass fallback_providers to image_generate and it tries the next one automatically instead of failing the whole run:
image_generate(provider="flow", fallback_providers=["codex", "gemini"], ...)The result always lists every attempt and why each one failed, so nothing is silently swallowed. A second local journal (separate from the design one) tracks these outcomes, and when a provider fails the same way three times in a row, the next error says so plainly instead of staying a mystery.
It checks for a new version
Once a day, the server checks this project's GitHub releases. If a newer one is out, it tells you at startup
and in status/setup: what changed, and the exact command to update. It never patches itself while running,
and it never installs anything unless you turn that on:
Setting | Default | What it does |
| checks on | stop checking entirely |
| off | npm installs only: once a newer version is found, install exactly that version with npm for you; it takes effect the next time the server starts, never mid-run. A git checkout is never changed; the notice tells you to |
| 24 | how often to check |
The check is a plain, unauthenticated read of this repo's own GitHub releases, with a size cap and a short
timeout, and a failed check never breaks a real tool call. Only a plain version number (like 1.4.1) is
ever handed to npm.
The package is not published on npm yet, so the setup command and the client config always point at your
own copy by its full path, never at npx no-api-media-mcp.
It learns from its own mistakes
Every time the model scores an image with design_audit (and tells it the asset type), the server writes the scores to a small local journal in your no-api-media folder. It is never uploaded and never lives inside a project. The next design_brief for that kind of asset reads it back: any criterion that has fallen short at least twice (for example "not template" or "brand presence") is turned into advice and put into every prompt up front. A mistake that happened twice stops happening a third time.
On top of that, design_brief carries a short list of built-in lessons from real use, such as these:
Never ask the model to draw a real logo or to spell words. Leave a calm area, then place the real logo file and the text afterwards.
If the image will be cropped much wider than 16:9, keep every important element in the middle band. Set
context.targetAspect(for example3.2:1for a profile banner) and the brief adds this guidance for you.A single big centred object reads as stock. Ask for an abstract backdrop with open space and let the real brand mark be the focal point.
A black-background logo dropped on busy art washes out. Put it on a dark glass plate or a feathered mask.
The full list, with the reasons and the provider notes, is in docs/lessons.md.
It keeps your project tidy
Generated drafts land in <project>/.ai-media. Left alone, that folder fills up with rejected attempts. The server now tracks what happened to each draft:
Status | How it gets there | When it is removed |
draft | just generated | after 30 days |
shortlisted |
| after 60 days |
rejected |
| after 3 days |
used |
| after 14 days, and only if that final file still exists |
Pass the draft's file to design_audit and media_optimize does the rest on its own. The final image goes to your project's own images folder, so nothing important stays in .ai-media.
Cleanup runs once per session, and you can run it yourself with media_cleanup (a dry run by default, so it first shows what would go and how much space it frees). It is strict on purpose: it only looks inside .ai-media, never touches your final files, skips symbolic links, and ignores anything that is not a media file. If .ai-media itself is a link or junction (a cloned repo could ship one), it refuses to read, write or delete anything there. Turn the automatic part off with node dist/src/index.js config set auto_cleanup false or NOAPI_AUTO_CLEANUP=0.
Connect your accounts
You sign in yourself, once. The server never asks for or sees a password.
Account | You need | How to connect | Ready when |
Google AI Pro / Ultra (Flow, Gemini) | A Google account with the plan | Sign in at the Google tab in the setup window |
|
ChatGPT (images) | ChatGPT Plus or Pro |
|
|
Higgsfield | A Higgsfield plan |
|
|
Grok or any JSON site | That site's plan | Ask your agent to run |
|
Close the whole setup window when you're done. The server can't use the private profile while it is open.
Installation
Requirements: Node 22+, Google Chrome, and ffmpeg for shrinking and editing. Optional: rembg for background removal (uv tool install "rembg[cpu,cli]" or pip install "rembg[cpu,cli]"; the model downloads once on first use).
# all projects
claude mcp add --scope user no-api-media -- node /full/path/to/no-api-media-mcp/dist/src/index.js
# this project only
claude mcp add no-api-media -- node /full/path/to/no-api-media-mcp/dist/src/index.jsAdd to your MCP config:
{
"mcpServers": {
"no-api-media": {
"command": "node",
"args": ["/full/path/to/no-api-media-mcp/dist/src/index.js"]
}
}
}Config file locations:
App | File |
Claude Desktop (Windows) |
|
Claude Desktop (macOS) |
|
Cursor |
|
Windsurf |
|
Restart the app after editing.
.vscode/mcp.json:
{
"servers": {
"no-api-media": { "command": "node", "args": ["/full/path/to/no-api-media-mcp/dist/src/index.js"] }
}
}codex mcp add no-api-media -- node /full/path/to/no-api-media-mcp/dist/src/index.jsTools
Tool | What it does |
| Opens the private Chrome window so you sign in |
| Which accounts are ready, plan tier, low-credit warnings |
| Every provider and JSON site, and what each can make |
| Reads the project: style tier, 3D/animated, colours, fonts, reference images |
| Writes a real creative brief (project, purpose, placement, premium quality bar) with concept directions and a critique checklist. Asset types: logo, app icon, hero, illustration, product shot, social post, banner, infographic, poster, background video, product video |
| The art-director check after you look at an image (pass |
| Makes images with |
| Exact credit cost for a Flow or Higgsfield job, generates nothing |
| Veo 3.1 / Omni in Flow, Seedance / Kling in Higgsfield, or Grok, with a credit cap |
| Image to WebP, video to H.264, smaller with no visible change. Strips embedded metadata by default and reports it (see the behaviour notice); |
| Transparent cutout, local BiRefNet models via rembg |
| Trim, reframe, speed, fade, mute, audio, poster frame, GIF, text, logo, subtitles, join |
| Every social and icon size from one image |
| Duration, size, fps, codecs |
id | Makes | Signs in with | Notes |
| images | Codex CLI, ChatGPT login | Most reliable ChatGPT route |
| images | chatgpt.com in the private profile | Cloudflare may ask for a human check; use |
| images, videos | Google, in the private profile | Nano Banana 2 images were 0 credits on AI Pro when tested; videos cost credits |
| images | Google, in the private profile | |
| images, videos | official CLI (OAuth) | Exact cost shown before every job |
| images, videos | grok.com in the private profile | Limits depend on your plan |
Where files go
No
output_path:<project>/.ai-media/<provider>/<date>-<prompt>.<ext>, ignored by git, with amanifest.jsonlof every promptWith
output_path(e.g.public/images/hero.png): must be inside the project and a media file, checked before anything is generated
CLI commands
Command | What it does |
| Check everything, open the sign-in window, print client config |
| Sign in to one service again ( |
| Show which accounts are ready, without opening a window |
| Print the version |
| Show |
| Keep embedded metadata in optimized files ( |
| Other keys: |
| List these commands |
| Check the Codex CLI is signed in with ChatGPT |
| List Higgsfield workspaces to pick one |
| Run the test suite (unit and security tests) |
Without a command, dist/src/index.js runs as the MCP server. That's what your AI client starts.
Troubleshooting
You see | Do this |
| The sign-in window (or another copy of the server) is still open. Close that Chrome window and try again |
| Run |
| ChatGPT's Cloudflare noticed automation. The server never solves these. Use |
| Run |
| Your plan's Codex quota is spent. Use |
|
|
| Sign in with the account that has your AI plan, or set |
| Google changed the Flow page. Update to the latest version or open an issue |
| Video credits are low. Images on Nano Banana 2 usually still work |
| Install Chrome or set |
|
|
|
|
|
|
| Your network inspects TLS. The server passes your system certificates to rembg automatically; if it still fails, run once on another network, the model is cached afterwards |
| Use a path inside the project, like |
|
|
| A symbolic link or junction in that path leads to a missing place. Pick another path or remove the link |
Nothing happens on a Linux server | Chrome needs a display. Run under Xvfb |
Configuration
All optional.
Variable | Default | Meaning |
|
| Private profile and state. Delete it to sign out of everything |
| the folder the client starts the server in | Folders the server may write to |
| first signed-in account | Which Google account to use |
|
| Seconds between two generations on one provider |
| unset |
|
| auto-detected | Binary locations |
Add another site without code
Put a file in ~/.no-api-media/providers/<id>.json. Start from examples/providers/template.json. Media is only downloaded from the hosts you list in mediaHosts, and specs are never read from a project folder.
Safety and terms
Your password never touches this code and the server can't write outside your project. It listens on no network port of its own; the one port is Chrome's loopback-only devtools port while
share_browseris on (the default), which you can turn off. The full threat model is in SECURITY.md.Web providers drive the consumer sites the way you would by hand. OpenAI's, Google's and xAI's terms restrict automated use of those sites, so using them is your call and your account's risk. The server works at human pace, stops at captchas and sign-in pages, and doesn't hide that it is automation. Official CLIs (Codex, Higgsfield) are the safer routes.
Behaviour notice: metadata is stripped from optimized files
Since 0.3.0, media_optimize removes embedded metadata from the files it writes: EXIF, XMP, text chunks and C2PA content credentials (the signed manifest that ChatGPT, Codex, Google Flow, Gemini and Veo embed, and that platforms such as LinkedIn turn into a "Content credentials" badge). This is what most web image optimizers and CDNs do, and in fact 0.2 already dropped it as a silent side effect of re-encoding. 0.3 makes it explicit: every result lists what was removed, and you can turn it off.
Your originals are never touched. Generated files in
.ai-media/keep their manifests; only the optimized copy is stripped.Turn it off in any of three ways:
keep_metadata: trueon a call, the environment variableNO_API_MEDIA_KEEP_METADATA=1, ornode dist/src/index.js config set strip_ai_metadata false.What it does not do. This removes embedded metadata only. It does not remove invisible watermarks such as Google SynthID, which live in the pixels, so platforms and detectors may still identify the AI origin. It is not a way to pass AI images off as real photographs. You are responsible for the rules of the platforms you post to and for any disclosure requirements that apply to you.
A signed C2PA manifest cannot survive re-encoding anyway (it is bound to the original bytes), so with
keep_metadata: truethe result is honest about what the encoder lost rather than copying an invalid manifest.
Frequently asked questions
How do I generate images and videos in Claude Code without an API key?
Install this MCP server, then sign in once to ChatGPT, Google (Flow and Gemini), Higgsfield or Grok in the browser window it opens. After that you can ask Claude Code, Cursor or Codex for an image or a video and it uses the plan you already pay for.
Does it see my password?
No. You type your password yourself in a normal browser window. The server never asks for it, types it or stores it. With share_browser off it drives the browser over a pipe only; with it on (the default) Chrome also opens a loopback-only devtools port so several sessions can share the window, which any program on your computer could use while it's open. Turn it off on a shared machine.
Can it bill my API account by accident?
It is built to prevent that. API key variables are removed from every child process, and Codex only runs when its login status shows a ChatGPT login.
Which clients and providers does it work with?
Any MCP client, including Claude Code, Cursor, Codex and Windsurf. Providers are ChatGPT through Codex, Google Flow (Veo and Nano Banana), Gemini, Higgsfield and Grok, plus any other site you describe in a JSON file.
Which assistant model should I use?
The images themselves come from your provider's image model (GPT Image through Codex or ChatGPT, Nano Banana through Flow or Gemini), so picking a different assistant model doesn't change the picture directly. It does change the result: your assistant writes the brief, looks at every draft and scores it honestly, and sets the final text and logo. Use a current top-tier model with good image understanding and tool use; small, fast models tend to skip steps or pass weak drafts. For designs with words, codex renders text best; for photo and 3D scenes, Flow.
What do I need to install to use it?
An MCP client to talk to it, plus whatever sign-in the providers you want need.
Claude Code: in the terminal, the desktop app, or the Claude Code extension for VS Code. See claude.com/claude-code. Cursor and Windsurf work too.
Codex as your assistant (optional): the Codex IDE extension for VS Code, Cursor and Windsurf (docs), or the Codex CLI.
For the
codeximage provider you need the Codex CLI itself, installed withnpm i -g @openai/codexand signed in withcodex loginusing your ChatGPT plan (not an API key). The server calls the CLI, so the editor extension alone isn't enough for this provider.For Flow, Gemini and ChatGPT on the web, Google Chrome, and a one-time sign-in in the window
accounts_loginopens.
Does it leave browser windows open?
No. Each job's tab closes when the job ends, and the window itself closes when your assistant calls browser_done at the end of the work. If that never happens, a safety net closes it after 20 idle minutes (node dist/src/index.js config set browser_idle_minutes 10 changes that). While the work is still going, between rounds of edits, it deliberately stays open so the next step doesn't have to start the browser again.
Does it remove AI watermarks?
No. media_optimize strips embedded metadata (EXIF, XMP and C2PA content credentials) from the files it writes, by default and with a report, and you can switch that off. It never touches invisible watermarks such as SynthID.
Can it do more than generate?
Yes. It removes backgrounds locally, edits video with ffmpeg, exports every social media size and shrinks files for the web. The design_brief and design_audit tools help the model art direct and judge its own results.
Are the providers fine with this?
The browser-driven providers work like you would by hand, and their terms restrict automated use of the consumer sites, so using them is your call. Official command line routes such as Codex and Higgsfield are the safer ones. See Safety and terms.
Does it put text and logos on the image for me?
Yes. compose renders your headline and a registered brand's real logo over the generated art, measuring where the calm area is and checking contrast. The image model itself never draws your logo or your words.
How does it get the right size and format for LinkedIn or X?
deliver takes a platform name (linkedin-feed, x-post, instagram-story, github-social and others) and produces that exact size as an optimized JPEG under the platform's file limit. For a LinkedIn feed post it's 1080x1350; 1200x627 is only for link previews.
I run several Claude sessions. Why did one say the browser is busy?
With share_browser on (the default) sessions work side by side as separate tabs, so you'll mostly see this when sharing is off or the other browser couldn't be joined. The waiting session queues, reports its place and an estimate, and continues on its own.
Can it make assets for a three.js or WebGL site?
Yes: design_brief has an environment-map asset type (a seamless 2:1 panorama for reflections and lighting) and a texture asset type (a seamless tileable surface), on top of the usual hero and background-video. Both get checked for seams instead of photo-realism.
Does Facebook or another platform penalise AI-made images?
Not for being AI-made and disclosed as such; Meta has said that label alone doesn't cut reach. What does get penalised hard is content that reads as a real photo of an event or statement that never happened. design_brief now asks that question for every realistic asset type, and the honest fix is the same as always: make it obviously a graphic or a considered shot, not a faked real moment.
What happens if a provider's page changes and a call breaks?
Pass fallback_providers to image_generate (for example ["codex", "gemini"]) and it tries the next one in order. The result reports every attempt and its failure reason. A local, redacted journal also tracks this over time, so a real pattern (the same provider failing the same way repeatedly) gets called out instead of looking like one bad run.
Can it keep my face the same across pictures?
Yes, with Codex. Pass reference_images with one or more photos of yourself, and say in the prompt what must stay (face, glasses, beard) and what may change. It is meant for your own photos or people who agreed, and results still need a look from you before they go public.
Does it know who the image is for?
If you tell design_brief who sees it (context.audience), it recognises a short list of real audiences (CISOs, developers, the open source community, security analysts, the general public) and adjusts tone, default tier, palette and the critique question accordingly. It won't guess an audience you didn't name.
Will it update itself without telling me?
No. It checks once a day and tells you when a newer version exists, with the exact command to run. For an npm install it only installs the update for you if you explicitly set NOAPI_AUTO_UPDATE=1, and even then only for the next run, never while the server is live. A git checkout is never updated automatically.
Where do the palette and font suggestions in design_brief come from?
From a reviewed UI design skill's colour and typography database, picked by the same topic detection the brief already does. They are only used when you don't supply your own brand colours, and you can always override them.
Does it learn from my past results?
Yes, locally. design_audit writes each score sheet to a small journal on your machine, and design_brief turns the criteria that keep falling short into advice at the top of the next prompt for that asset type. It also carries built-in lessons from real use. Nothing is uploaded.
Will it fill my disk with old drafts?
No. Rejected drafts are removed after 3 days, drafts that already became a final file after 14 days, and untouched ones after 30. It only ever looks inside .ai-media, never touches your final files, and you can switch it off or run it by hand with media_cleanup.
Is it free?
The server is free and open source under Apache-2.0. It uses the AI plans you already have, so it adds no API bill.
Contributing
Fixes for broken selectors and new site specs are the most useful help. See CONTRIBUTING.md.
Contact and support
Tried it? Tell me how it went, good or bad, with the feedback form. It takes two minutes.
Bugs, questions, ideas: open a GitHub issue or start a discussion.
Security problems: use a private security advisory, see SECURITY.md.
Work with NexaForge (cyber security, vibe coding, web development and IT infrastructure): nexaforge.services@gmail.com or nexaforge.eu.cc/contact.
If this saved you an API bill, a star on the repo is the easiest way to say thanks.
Sponsor the work. If your company can help with hosting, tools or funding, the sponsor page explains how. GitHub Sponsors is not available in Pakistan, so it works by email.
License
Apache-2.0. See NOTICE for the attribution and trademark note.
Built by Syed Farhan Ahmed (SFA) at NexaForge Cyber security · Vibe coding · Web development and IT infrastructure
Website · LinkedIn · Portfolio · Email
Available Tools
25 toolsaccounts_loginSign in to your AI accountsA
Opens a normal Chrome window on the private no-api-media profile so the USER can sign in by hand. The server never sees or stores a password. Tell the user to sign in, then close that window.
| Name | Required | Description | Default |
|---|---|---|---|
| services | No | Any of: chatgpt, google, grok, higgsfield |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does real work: it discloses that a visible browser window is opened on the 'private no-api-media' profile, that credentials are never seen or stored server-side, and that closure is the user's responsibility. It does not say whether sessions persist after the window closes or what happens if it is left open.
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 short sentences with zero filler, and the security guarantee — the most trust-critical fact — is front-loaded immediately after the action. Each 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 one-optional-parameter tool with no annotations and no output schema, the description covers the essentials: the mechanism, the security posture, and the required user follow-up. It is slightly short on the post-sign-in state (whether logins are stored for later tools to use, or how to confirm success).
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 optional 'services' parameter already carries an inline description with allowed values and a default. The description never mentions 'services', so it adds no meaning beyond the schema; baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Concrete verb and resource: opens a normal Chrome window on a named profile so the user can sign in by hand. An agent knows exactly what action occurs. It does not differentiate itself from the sibling accounts_status, which an agent might reasonably confuse for checking login state.
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 explicit operational instruction: tell the user to sign in, then close the window — so the agent knows the call starts a human-in-the-loop step rather than completing auth itself. It does not mention accounts_status as the way to verify the result afterward, so routing between the two siblings is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
accounts_statusCheck which accounts are readyB
Checks Codex and Higgsfield CLI sign-in, ChatGPT web sign-in, the Google account and plan tier on Flow, and every JSON-defined site.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must carry behavioral disclosure. It does enumerate exactly what gets inspected, implying a read-only probe, but never says whether it makes live network/auth calls, whether it can be slow or rate-limited, or whether it mutates anything — and there is no output schema to fall back on.
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 dense, front-loaded sentence listing all checked surfaces with no filler. Slightly list-heavy phrasing but every clause names a distinct account source.
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 should convey what comes back — per-account status, pass/fail booleans, or remediation hints pointing to accounts_login. It lists the inspected targets but leaves the return shape undefined.
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 and the description correctly presents the check as parameter-free with a fixed enumeration of targets. Baseline 4 applies; nothing extra is needed.
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 ('Checks') plus concrete resources: Codex and Higgsfield CLI sign-in, ChatGPT web sign-in, Google account/plan tier on Flow, and JSON-defined sites. It's clearly a status/readiness probe rather than the login action performed by the sibling accounts_login, though it doesn't name that sibling 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?
No statement of when to call it versus accounts_login, nor any prerequisite or exclusion (e.g. 'run before generation to verify auth'). Readiness gating is only weakly implied by the title 'Check which accounts are ready'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
background_removeRemove the background from an imageA
Cuts out the subject and saves a transparent PNG, fully on this computer with rembg and BiRefNet models (no upload, no API). quality: fast (BiRefNet lite, default), best (BiRefNet general, slower, ~1 GB model on first use), portrait (people), anime. The first run downloads the model once. Needs rembg: uv tool install "rembg[cpu,cli]".
| Name | Required | Description | Default |
|---|---|---|---|
| quality | No | fast | |
| overwrite | No | ||
| input_path | Yes | ||
| output_path | No | Default: <name>-cutout.png next to the input |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden and does substantial work: it discloses local-only processing with no upload or API, the one-time model download on first run, and the exact dependency install command. It omits what happens when the target file already exists and whether the input file is ever modified, which matters for a writing tool.
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?
Front-loaded with the outcome, then the presets, then the environment caveat; nearly every clause earns its place. The install command is useful but sits slightly awkwardly at the tail.
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 say what comes back, and it only implies a file is written rather than stating whether a path is returned. Combined with the silent `overwrite` parameter, an agent knows the intent but not the failure and return contract.
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 25%, so the description must compensate and does so well for `quality`, mapping each enum value to a model, speed cost, and use case. However, `overwrite` is undocumented in both schema and description, leaving the agent to guess whether false means error or skip, which is the riskiest parameter here.
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: cuts out the subject and saves a transparent PNG, entirely on this machine. The operation is distinct from every sibling listed (media_optimize, media_cleanup, image_generate all do something else), so an agent can select it without ambiguity.
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 quality presets are explained with the conditions that select them (fast = default, best = slower with a ~1 GB model on first use, portrait = people, anime), which is real selection guidance. It stops short of stating when to prefer this tool over a sibling like media_optimize, and gives no exclusion for non-photographic inputs.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
brand_profilesRegister the brands you publish underB
Keeps a profile per brand so the right logo is never guessed: who publishes (a person posting as themselves, or a company), the real logo files for dark and light backgrounds, and optionally palette and fonts. design_brief takes brand_id and fills these in; compose places that brand's logo. action list, set or remove. Stored on this machine only.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | Short id, e.g. sfa or nexaforge | |
| name | No | ||
| action | No | list | |
| colors | No | ||
| used_for | No | When to use it, e.g. 'his own LinkedIn posts and portfolio' | |
| body_font | No | ||
| logo_dark | No | Absolute path of the logo made for dark backgrounds | |
| publisher | No | ||
| logo_light | No | Absolute path of the logo made for light backgrounds | |
| heading_font | No | ||
| google_fonts_url | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It usefully discloses that data is 'stored on this machine only', but for a mutating tool it does not say whether set overwrites an existing profile, what remove destroys, or what list returns. The local-persistence note is real added value, but mutation semantics are missing.
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 dense sentences, front-loaded with the purpose and rationale ('so the right logo is never guessed'), followed by workflow links and the action set. Little waste, though the rationale clause could be trimmed without loss.
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 an 11-parameter tool with no annotations and no output schema, the description leaves key behavior unexplained: what a list result contains, whether set is an upsert, and what remove clears. The workflow and persistence notes help, but an agent still has to infer mutation semantics.
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 only 36%, so the description must compensate. It does explain publisher ('a person posting as themselves, or a company'), the dark-vs-light logo distinction, and that palette and fonts are optional, but leaves name, colors format, used_for, body_font/heading_font, and google_fonts_url to the schema. Partial compensation only.
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 states the resource (a per-brand profile holding publisher type, dark/light logo files, optional palette and fonts) and the supported operations (list, set, remove). It also names the siblings it feeds (design_brief, compose), so an agent can place it in the workflow. The verb is soft ('keeps a profile') rather than an explicit 'register/read brand profiles', which keeps it just short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It says design_brief takes brand_id and fills these in, and compose places the logo, which implies this tool should be populated before those run. However, there is no explicit instruction on when to call it (before composing? on first run?) or how to choose between list, set, and remove.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_doneClose the browser when the work is finishedA
Call this only at the very end: the final asset is in the project (optimized or delivered, wired in where it belongs), you've checked it, and the user has nothing left to change. It closes this session's browser instead of leaving the window open until the idle safety net. Tabs other sessions have open in a shared browser are never closed; the browser then closes on its own once they finish. Don't call it between rounds of edits: reopening costs a few seconds, but closing mid-work makes the next step start over.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so well: it discloses the cross-session safety behavior (other sessions' tabs are untouched, the browser closes itself once they finish) and the fallback idle safety net. It does not state whether the call is idempotent or what a repeat call returns, which is the only remaining gap.
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?
The prerequisite is front-loaded in the first sentence and every sentence carries information. The closing clause ('reopening costs a few seconds, but closing mid-work makes the next step start over') restates the earlier don't-call-mid-work point at slightly more length than needed.
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, output-schema-less lifecycle tool, the description covers timing, side effects, cross-session side effects, and the failure mode of misuse. An agent has everything needed to call it correctly and nothing required 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?
The tool takes zero parameters, so the baseline is 4 and there is nothing for the description to disambiguate. It correctly avoids inventing parameter detail.
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 ('closes this session's browser') along with the exact precondition for calling it. The scope caveat (shared-browser tabs from other sessions are never closed) further sharpens what the tool does, and no sibling tool overlaps with this lifecycle role.
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 when ('only at the very end', with three concrete completion conditions), an explicit when-not ('don't call it between rounds of edits'), and the cost rationale for the exclusion. Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
composeSet the real headline and logo over generated artA
Renders a headline (and an optional sub line) and a registered brand's real logo over a generated image, the careful way every time: the calmest corner is measured and gets the text, the logo takes the calmest bottom corner left, text colour and a soft scrim are chosen for at least 4.5:1 contrast, the brand's display font (or the brief's) is used, one colour, no glow, no eyebrow label. A logo on its own dark tile gets a feathered edge so it doesn't look boxed. Saves a PNG; run deliver on it for the platform. Opens a tab in the server's browser to render.
| Name | Required | Description | Default |
|---|---|---|---|
| subline | No | ||
| brand_id | No | A brand from brand_profiles; its logo and fonts are used. Leave out for text only | |
| headline | Yes | ||
| platform | No | Crop the art to this platform's size first, so the text margins are right in the final file | |
| body_font | No | ||
| overwrite | No | ||
| input_path | Yes | The generated art, relative to the project | |
| logo_corner | No | ||
| output_path | No | Default: <input folder>/<name>-composed.png | |
| text_corner | No | Default: the calmest corner, measured | |
| heading_font | No | Default: the brand's, else Space Grotesk |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does real work: it discloses that a PNG is written to disk, that a browser tab is opened on the server, and the deterministic layout/contrast rules (4.5:1 scrim, single colour, no glow, feathered logo tile). It does not disclose what happens when the output already exists without overwrite, or what errors can occur.
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?
Purpose is front-loaded in the first clause, followed by dense behavioural detail, then outputs and side effects. The middle sentence is long and comma-chained but every clause carries real information; nothing is 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 an 11-parameter write tool with no annotations and no output schema, the description explains the output (a saved PNG), the downstream step (deliver), and the browser-tab side effect, which covers most of what an agent needs. Gaps around overwrite behaviour, failure modes, and a few parameters keep it short of complete.
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?
At 55% schema coverage the description meaningfully supplements several params: text_corner defaults to the measured calmest corner, logo_corner defaults to the calmest bottom corner, and heading_font falls back to the brand's display font then Space Grotesk. However overwrite, output_path, body_font and platform cropping are left to the schema alone, so it only partially compensates.
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 chain: renders a headline plus a registered brand's logo over a generated image, and saves a PNG. That is clearly distinct from image_generate (creates art) and deliver (publishes the finished file), both of which are named or implied.
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?
Implies the position in the workflow by telling the agent to 'run deliver on it for the platform' and by taking a generated art path as input, and it notes the browser tab side effect. But it never states when not to use it, nor how it relates to composition_check or design_audit, which are obvious adjacent siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
composition_checkFind empty bands at the edgesA
Measures an image for the empty band generated art often leaves at an edge (a plain sky or flat strip meant for text that never came) and returns how much of the frame it takes, plus a crop that removes it. Pass output_path to save the cropped version. Run it on a draft before compositing and on the final file before shipping.
| Name | Required | Description | Default |
|---|---|---|---|
| overwrite | No | ||
| input_path | Yes | ||
| output_path | No | If set and a band is found, the cropped image is saved here | |
| planned_edges | No | Edges you left calm on purpose for text you'll set there | |
| target_aspect | No | Keep this shape when cropping, e.g. "4:5" for a LinkedIn feed post |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the load and does disclose the key trait: analysis produces a measurement plus a crop, and a file is only written when output_path is passed ('Pass output_path to save the cropped version'). Undisclosed behaviours remain — what overwrite=false does when the target exists, and whether the input file is ever touched — so it is not complete coverage of a tool that can write to disk.
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, no filler: what it detects and returns first, then the optional write, then the workflow triggers. Every clause carries information an agent would otherwise have to infer.
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 steps in to describe the return value (band proportion plus a crop), which is exactly the right compensation. Given a five-parameter tool with no annotations, the missing overwrite failure behaviour is the one substantive hole.
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 60%, and the description only touches output_path, which the schema already documents ('If set and a band is found, the cropped image is saved here'). planned_edges ('Edges you left calm on purpose') and target_aspect shape preservation go unmentioned in prose, and overwrite is undocumented in both places. Adequate, but no added parameter meaning.
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 object: 'Measures an image for the empty band generated art often leaves at an edge' and 'returns how much of the frame it takes, plus a crop that removes it'. That is far more discriminating than sibling names like design_audit or media_probe, which are not named but are also clearly not about edge-band detection. No explicit sibling routing, so it stops short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Run it on a draft before compositing and on the final file before shipping' gives two concrete moments to call it, which is real context rather than implication. No when-not-to guidance and no statement of what to do if the tool is a poor fit (e.g. an image with an intentional border), so no exclusion clause.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
contact_sheetLay out drafts side by side for comparisonA
Puts up to 12 draft images (for example several directions from image_generate, or a few iterations of the same one) on a single grid, so they can be judged against each other instead of one at a time. No text is drawn onto the image; the result instead lists which grid position holds which file, in reading order (left to right, top to bottom).
| Name | Required | Description | Default |
|---|---|---|---|
| columns | No | Default: a roughly square grid | |
| overwrite | No | ||
| input_paths | Yes | Draft files, relative to the project | |
| output_path | Yes | Where the grid image is saved, e.g. .ai-media/compare/hero-drafts.jpg |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden and does disclose two non-obvious traits: no text is drawn onto the image, and the result is a position-to-file mapping rather than baked-in labels. It omits overwrite behavior, error conditions, and how output_path conflicts are handled, so the mutation side is under-disclosed.
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, both earning their place, with the core action front-loaded and the return-format caveat second. No filler or restated 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 and no annotations, the description appropriately covers the return value (position-to-file listing in reading order) and the 12-image ceiling. Remaining gaps are minor: side effects of the required output_path and overwrite 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 75%, so most parameters are already documented ('roughly square grid' default for columns, example output path). The description's 'up to 12' merely restates maxItems:12 and it says nothing about columns or overwrite, adding little beyond the schema. Baseline 3 fits.
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 — putting up to 12 draft images onto a single grid — and names the concrete upstream source (image_generate directions) that produces the inputs. An agent can tell this apart from compose/deliver/media_optimize siblings 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?
Clearly says when this tool applies: judging several drafts against each other rather than one at a time. It does not name an alternative to use instead when comparison isn't the goal, so it stops short of full routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
deliverMake the final file for a platformA
One step from a finished image to the file a platform wants: exact size (cropped to fill), JPEG at the lowest quality that still looks identical (SSIM), metadata stripped, under the platform's file-size limit, then checked for an empty band. Platforms: linkedin-feed (1080x1350, LinkedIn feed post, portrait 4:5 (takes the most room in a phone feed)); linkedin-square (1080x1080, LinkedIn feed post, square); linkedin-link (1200x627, LinkedIn link preview card, not a feed post); instagram-feed (1080x1350, Instagram feed post, portrait 4:5); instagram-story (1080x1920, Story or reel cover, 9:16; keep text out of the top 14% and bottom 20%); x-post (1600x900, X post image, 16:9); facebook-feed (1080x1350, Facebook feed post, portrait 4:5); youtube-thumbnail (1280x720, YouTube thumbnail, 2 MB limit); github-social (1280x640, GitHub repository social preview, 1 MB limit); og (1200x630, Open Graph link preview).
| Name | Required | Description | Default |
|---|---|---|---|
| platform | Yes | ||
| overwrite | No | ||
| input_path | Yes | ||
| output_path | No | Default: <input folder>/<name>-<platform>.jpg |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the load well: it discloses cropping behavior ('cropped to fill'), the quality strategy (lowest JPEG quality that passes SSIM), metadata stripping, enforcement of per-platform size limits, and a post-hoc empty-band validation. Gaps remain around overwrite behavior when the target exists and what the tool actually returns, but the mutation semantics are mostly spelled out.
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?
Purpose and pipeline are front-loaded in the first clause, before the reference-style platform table, which is the right ordering. The platform enumeration makes the single sentence very long and comma-heavy, but each entry carries distinct resolution/intent/size information rather than 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 four-parameter tool with no annotations and no output schema, the description covers the processing contract, per-platform target semantics, and size ceilings — enough for an agent to call it correctly on the first try. Only overwrite semantics and return-value expectations are unaddressed, which are minor against the overall coverage.
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 only 25% (only output_path is documented), so the description must compensate — and it does heavily for the most important parameter, giving every platform enum value a resolution, use case, and in some cases a byte limit (2 MB YouTube, 1 MB GitHub). input_path and overwrite are not explained anywhere, and overwrite's default-false implication is left implicit, so it is not fully compensating.
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 concrete verb and outcome: turn a finished image into the exact file a platform expects, and enumerates the processing steps (crop-to-fill, JPEG/SSIM, metadata strip, size cap, empty-band check). The platform list with dimensions and intent makes the scope unmistakable and lets an agent tell it apart from neighbors like social_sizes or media_optimize even without naming 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?
'One step from a finished image to the file a platform wants' establishes when to reach for it, and several enum entries carry real disambiguation guidance (linkedin-link is a 'link preview card, not a feed post'; instagram-story needs text kept out of the top 14%/bottom 20%). It stops short of naming sibling alternatives (compose, media_optimize, social_sizes) or stating preconditions such as source image requirements.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
design_auditEye-catch audit of a finished imageA
After you have LOOKED at a generated image, score it 0 to 5 on each criterion (focal-point, thumbnail, hierarchy, palette, topic-cues, brand-presence, text-accuracy, not-template) and pass the scores here. Returns ship or revise, the weakest points and the exact fix for each. Call with no scores to get the criteria. Be harsh: a generic, flat or template-looking result scores 2 or 3. Pass asset_type so the server learns what usually goes wrong and warns you up front next time. Pass file (the draft inside .ai-media) so a revise marks it rejected, which lets it be cleaned up later, and a ship marks it shortlisted. Pass style.tier and style.look (whatever you actually passed to design_brief) so the server can remember, once enough drafts have shipped, which tier and look tend to work for this asset type and suggest it by default next time.
| Name | Required | Description | Default |
|---|---|---|---|
| file | No | The draft you scored, relative to the project, e.g. .ai-media/codex/banner.png. It's also measured, and the measurements can cap your scores | |
| style | No | The style you actually used for this draft, so a shipped result can be remembered | |
| scores | No | ||
| asset_type | No | ||
| planned_edges | No | Edges left calm on purpose for text, so they don't count as empty bands |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden well: it discloses side effects (revise marks rejected, ship marks shortlisted), server learning behavior, and that measurements can cap scores. Gaps remain around auth, error cases, and durability of the shortlist/reject state, but the key behaviors are disclosed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and return values, then the side-effect guidance. The back half is dense but each sentence carries distinct information; only the learning-loop explanation drifts toward verbosity.
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?
Given a 5-param nested tool with no output schema and no annotations, the description covers the workflow (look, score, submit), returns, and side effects. Missing only return-shape details for revises beyond 'weakest points and exact fix' and behavior for planned_edges.
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?
At 60% schema coverage, the description adds real meaning: it explains the file lifecycle consequence, why asset_type and style matter, and provides the eight criterion keys expected in scores. It doesn't explain planned_edges or why scores is free-form/additionalProperties, which is a notable omission but not fatal.
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: score a generated image 0-5 on eight named criteria and get a ship/revise verdict. The named criteria and return values distinguish it clearly from siblings like composition_check or design_feedback.
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 says to call after LOOKING at the image, and that calling with no scores returns the criteria. It also states what to pass and why (asset_type for learning, file for lifecycle marking, style so defaults can be suggested), which is strong when/when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
design_briefArt direction before generatingA
Call this BEFORE image_generate or video_generate. Returns designer-grade guidance for the asset type: what good looks like, concept directions with ready prompts written like a real creative brief, a critique checklist to judge every result, and the iteration process. Fill context from project_profile and the conversation: what the project is, where the asset goes and why. That story is what makes results premium instead of generic. Quality defaults to premium. For designs with words (infographic, poster, social post) put every word in context.exactText.
| Name | Required | Description | Default |
|---|---|---|---|
| brand | No | ||
| style | No | ||
| context | No | ||
| subject | Yes | What it should show or express, e.g. 'image and video generation without API keys' | |
| brand_id | No | A brand registered with brand_profiles (e.g. sfa, nexaforge): fills in publisher, logo files, palette and fonts | |
| asset_type | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the transparency burden and does disclose non-obvious behavior: quality defaults to premium, omitting overlayText changes the composition request, and very wide targetAspect values change the composition guidance. It does not state whether the call is read-only/side-effect free or whether guidance depends on a prior brand_profiles lookup, leaving a small gap.
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?
The most decision-critical instruction (call before generation) is front-loaded, and every sentence adds information with no filler. Slightly dense in the second half where context-population rules and the exactText caveat stack up, but nothing is expendable.
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 complex tool with deep nested objects, no annotations, and no output schema, the description covers what is returned and how to prime it well. It leaves unstated how `brand_id` and the inline `brand` object interact and what happens if project_profile is unavailable, which matters for a tool whose output quality hinges on that 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 description coverage is only 33%, so more compensation was needed. The description adds real meaning for `context` (fill from project_profile and the conversation, exactText for every word) but says nothing about `asset_type` — the primary required enum with 13 values — or how `brand_id` relates to the nested `brand` object.
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 action and output: it returns designer-grade guidance (concept directions with ready prompts, critique checklist, iteration process) rather than the asset itself. It explicitly distinguishes itself from image_generate and video_generate by positioning as the pre-step, so an agent can route correctly without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit ordering rule — 'Call this BEFORE image_generate or video_generate' — naming the alternative tools and the condition that triggers this one. It also tells the agent how to populate `context` from project_profile and the conversation, and calls out the exactText requirement for word-bearing asset types.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
design_feedbackRemember a correction the user gaveA
When the user says something about a result was wrong (a colour, a crop, an empty band, how the text looks, the wrong logo), call this right away with what was wrong and what they want instead. It's kept in a local journal on this machine, and every later design_brief applies it: image corrections go into the prompt as what to do, corrections about text and logos come back as compositing_rules. Set brand when the correction is about one brand ("use the SFA mark on his personal posts"), so it never leaks into another brand's work. action list shows what's stored, action forget removes one entry by its time. Pass file to mark that draft rejected.
| Name | Required | Description | Default |
|---|---|---|---|
| file | No | add: the draft it was about, relative to the project | |
| time | No | forget: the time stamp of the entry, from list | |
| brand | No | Only apply this to one brand's work, matched against brand.name in design_brief | |
| action | No | add | |
| instead | No | What they want instead, e.g. 'fill the frame and crop to the content' | |
| problem | No | What was wrong, in the user's terms, e.g. 'an empty navy band across the top' | |
| applies_to | No | Leave out to let the server decide: anything about text, fonts or logos is compositing | |
| asset_type | No | all |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations present the description carries the full burden, and it does: persistence is disclosed ('kept in a local journal on this machine'), the downstream effect is spelled out ('every later design_brief applies it'), and the propagation mechanism is separated by type (image corrections become prompt instructions, text/logo corrections become compositing_rules). The brand-leakage warning ('so it never leaks into another brand's work') is exactly the kind of cross-call side effect an agent cannot infer from the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The trigger is front-loaded in the first sentence, followed by persistence, propagation, scoping, actions and the file flag — a sensible order with no filler. It is dense to the point of being a single run-on block, which costs a little scanability but wastes no sentences.
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 an 8-parameter, annotation-free, no-output-schema tool this covers the essentials: when to call, what is stored, how it is later applied, how to scope it, and how to inspect or delete entries. It falls short only on asset_type and the applies_to override, and on what a 'list' entry actually looks like — the latter matters because 'time' must come from that listing to forget an entry.
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 75%, but the description still adds meaning beyond it: brand scoping is explained with a concrete example and the note that it matches brand.name in design_brief, and 'Pass file to mark that draft rejected' clarifies the add-mode effect of that parameter. However, applies_to and asset_type — two parameters that shape how the correction is applied — are never mentioned in the description, leaving the agent to rely on schema text alone for them.
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?
It states a specific action (record/correct) and resource (user feedback/journal entries) and ties it to a concrete trigger: 'When the user says something about a result was wrong ... call this right away with what was wrong and what they want instead.' The distinction from design_brief is made explicit through the propagation rule, so an agent can tell the two apart 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?
It gives an explicit when-to-use trigger (a correction about colour, crop, empty band, text, wrong logo), a when-to-scope rule ('Set brand when the correction is about one brand'), and per-action guidance (list shows stored entries, forget removes one by time, file marks a rejected draft). Nothing about the mode selection is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
image_generateGenerate an image with your own accountA
Generates one image (Flow and Higgsfield can return several) and saves the full-quality file inside the project. Providers: codex (ChatGPT plan via Codex CLI, most reliable), chatgpt (chatgpt.com), flow (Google Flow, Nano Banana 2, usually 0 credits), gemini (gemini.google.com), higgsfield (official CLI, costs credits: quote first), plus any JSON-defined site (call providers_list). Without output_path the file goes to /.ai-media//. Look at the result yourself before using it. Pass fallback_providers to try others in order if the first one fails.
| Name | Required | Description | Default |
|---|---|---|---|
| count | No | Flow only | |
| model | No | Higgsfield only, e.g. nano_banana_2, gpt_image_2_5 | |
| aspect | No | ||
| prompt | Yes | ||
| quality | No | Flow only | original |
| provider | Yes | ||
| overwrite | No | ||
| max_credits | No | Higgsfield only: quote first, then cap | |
| output_path | No | Relative to the project, e.g. public/images/hero.png | |
| reference_images | No | Codex only: up to 4 images inside the project to use as references, for example a clear photo of the person whose face must stay recognisable. Only use a photo of someone who has said yes (the user's own, or a person who agreed). The description says what to keep and what to change. | |
| fallback_providers | No | Try these in order if the first provider fails (for example a site redesign broke a selector). Each attempt and why it failed is reported in the result. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden and does real work: it discloses the default output location (<project>/.ai-media/<provider>/), the credit-cost implication of higgsfield and the max_credits cap, provider reliability ranking, and that failed fallback attempts are reported. Still missing permission/account prerequisites (the accounts_login / accounts_status siblings hint there are auth steps) and overwrite 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?
Front-loaded with the core action and effect, then operational details. Dense with parentheticals but nearly every clause carries decision-relevant information; the one instructional aside ('Look at the result yourself') is short and useful.
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 an 11-parameter, no-annotation, no-output-schema tool, the description covers the hard parts: provider selection, cost gating, default save location, and retry semantics. Gaps remain on auth prerequisites, overwrite semantics, and the shape of the returned result beyond 'attempts and failures are reported'.
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 64%, and the description compensates where the schema is silent: the provider parameter has no schema description, but the text enumerates codex, chatgpt, flow, gemini, higgsfield and JSON-defined sites with traits and cost notes, and it explains the output_path default location. It does not add meaning for aspect, model, overwrite, or count beyond what the schema already says.
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 one image) plus the side effect (saves the full-quality file inside the project), which cleanly separates it from video_generate and video_edit among the siblings. It even flags that Flow and Higgsfield can return several images despite the singular name.
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 concrete operating guidance: quote before spending credits on higgsfield, call providers_list for JSON-defined sites, use fallback_providers with ordered retries, and inspect the result before using it. It stops short of explicit when-not-to-use routing (e.g. versus video_generate or asking the user for a provider preference), so it is clear context rather than full alternatives coverage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
loop_checkCheck a looping video for a visible seamA
For a background-video or product-video meant to loop: compares its first and last frame with the same structural-similarity check media_optimize uses for quality loss, and reports whether it will look seamless on repeat. A low similarity means a visible jump or jerk when it loops; regenerate with a direction that explicitly brings the motion back to where it started.
| Name | Required | Description | Default |
|---|---|---|---|
| input_path | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral burden and does well: 'compares' and 'reports' imply a read-only check, and it explains what low similarity means in practice. It does not explicitly state side effects, permissions, or expected output shape, leaving minor gaps.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded: it starts with the intended use case, then explains the check, then interprets low similarity and remediation. Every sentence adds relevant information without repetition.
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 simple one-parameter check with no output schema, the description explains purpose, method, result interpretation, and remediation well. It remains slightly incomplete because the lone input parameter and exact return shape are not described.
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% for the single input_path parameter, so the schema provides almost no semantic help. The description only indirectly indicates the input is a looping video and gives no path format, file constraints, or accepted video details.
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 states a specific verb and resource: it compares a video's first and last frame and reports looping seamlessness. It also differentiates the check from media_optimize by explaining that this is the loop-seam use of a similar similarity check.
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?
It clearly scopes use to background-video or product-video assets meant to loop, and it says what to do when similarity is low: regenerate with motion that returns to the starting point. It does not explicitly name exclusions or alternative sibling tools, so it is strong but not complete.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
media_cleanupClean up old draftsA
Removes old drafts from /.ai-media to stop it growing: rejected drafts after a few days, drafts already used for a final file after a couple of weeks, and untouched drafts after a month. Only files inside .ai-media are ever considered, final assets in the project are never touched, and a used draft goes only if its final file still exists. dry_run is true by default: it lists what would be removed and how much space it frees. Pass dry_run: false to delete. The server also does this on its own once per session unless auto_cleanup is off.
| Name | Required | Description | Default |
|---|---|---|---|
| dry_run | No | ||
| used_days | No | Default 14 | |
| draft_days | No | Default 30 | |
| rejected_days | No | Default 3 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden and does well: it discloses deletion scope, safety boundaries (only .ai-media, final assets untouched), conditional deletion of used drafts, dry-run default, and automatic cleanup. It does not explicitly state irreversibility or permissions, leaving some destructive-action context implicit.
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?
The description is front-loaded with purpose and retention rules, then safety boundaries, then dry_run behavior, then automatic cleanup. Every sentence adds useful information without 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?
For a mutation/cleanup tool with no annotations and no output schema, the description covers scope, safety, defaults, deletion mode, and automatic behavior well. It could be more complete by stating irreversibility or what a non-dry-run call returns, but the core operational context is 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?
Schema coverage is 75%, and the description adds meaningful semantics for dry_run and the three age thresholds in prose. It explains what the thresholds represent (rejected, used, untouched drafts) and default behavior. It does not directly map parameter names to each threshold, but the meaning is clear.
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 states a specific verb and resource: removes old drafts from <project>/.ai-media. It also defines the three cleanup categories, making the purpose much clearer than the title alone. It does not explicitly differentiate itself from any sibling tool, so it falls short of the top score under the rubric.
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?
It clearly explains default behavior (dry_run true lists candidates) and how to actually delete (dry_run false). It also notes automatic cleanup once per session unless auto_cleanup is off, which is important usage context. It does not name explicit alternatives or when-not-to-use conditions, so 4 rather than 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
media_optimizeShrink an image or video for the web without visible lossA
Images to WebP by default, or JPEG/PNG with format (or a .jpg/.png output_path), for places like LinkedIn post uploads that don't take WebP. Videos to H.264 with faststart. Raises quality until SSIM (similarity to the original) reaches the target, so the size drops but the picture does not visibly change. The original is kept untouched. Behaviour notice: by default the output has embedded metadata stripped (EXIF, XMP, C2PA content credentials, text chunks), like most web image optimizers; the result lists what was removed. Pass keep_metadata: true to keep what re-encoding can carry. Invisible watermarks such as SynthID are never touched.
| Name | Required | Description | Default |
|---|---|---|---|
| format | No | Image output format. Default: from output_path's extension, else webp | |
| max_width | No | ||
| overwrite | No | ||
| input_path | Yes | ||
| keep_audio | No | ||
| output_path | No | Default: same folder, .webp for images (or the chosen format), -web.mp4 for videos | |
| keep_metadata | No | true: don't strip embedded metadata from the output (EXIF/XMP/C2PA). Default follows config strip_ai_metadata (on). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Without annotations the description carries the full burden and does most of it well: it discloses the default metadata stripping (EXIF, XMP, C2PA, text chunks), notes the result lists what was removed, offers keep_metadata as an escape hatch, and states the invisible-watermark and original-file guarantees. Gaps remain on the overwrite semantics, keep_audio, and error 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?
Front-loaded with the primary outcome and format behavior, then the quality mechanism, then the metadata warning. The 'Behaviour notice' paragraph is long but earns its place given no annotations exist; a slightly tighter phrasing of the metadata sentence would improve it.
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?
Good coverage of the destructive-surprise axis (metadata stripping, original preservation) and a partial return-value hint ('the result lists what was removed') in the absence of an output schema. But for a 7-parameter mutation tool it leaves overwrite, max_width, and keep_audio wholly unexplained, which is a real completeness gap for calling it 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?
Schema coverage is only 43%, so the description must compensate. It does add real meaning for format/output_path fallback logic and keep_metadata (including the config dependency that the schema only hints at), but max_width, overwrite, and keep_audio are documented nowhere — those three are fully silent.
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 (optimize/shrink) applied to a specific resource (image or video), and enumerates the concrete transformations: WebP/JPEG/PNG for images, H.264 with faststart for video, size reduced via SSIM-targeted quality. This clearly separates it from media_cleanup, media_probe, and video_edit in the sibling list.
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 one concrete usage context ('places like LinkedIn post uploads that don't take WebP'), which is genuinely useful for routing. However, there is no explicit when-not guidance and no named sibling alternative (e.g. 'use media_probe first to inspect' or 'use media_cleanup to remove files'), so the agent must infer the rest of the decision boundary.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
media_probeWhat's in a media fileC
Duration, size, frame rate and codecs of an image or video inside the project.
| Name | Required | Description | Default |
|---|---|---|---|
| input_path | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description carries the full burden and does not say whether the call is read-only, what happens on unsupported codecs or corrupt files, whether remote URLs are accepted, or how large files are handled. It does usefully pre-declare the returned fields, which is some behavioral value beyond the name.
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 tight sentence with the most useful information (the returned fields) front-loaded and no filler. It is efficient but omits the action verb, which slightly reduces usability per word.
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 annotations and no output schema, the description does compensate by enumerating the returned metadata fields. However, it leaves the required parameter undocumented and says nothing about error conditions or path conventions, which are the main remaining gaps for a one-parameter inspection tool.
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 single parameter input_path is never mentioned, so the agent gets no statement of whether it must be a project-relative path, absolute path, or asset ID. The phrase 'inside the project' weakly implies path scoping but does not document the parameter.
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 names the resource (an image or video in the project) and the exact outputs (duration, size, frame rate, codecs), so an agent can infer this is a read-only metadata probe. It does not explicitly contrast with siblings such as media_cleanup, media_optimize or background_remove, and it is phrased as a noun list rather than a verb, so it stops short of a top score.
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 call this versus media_optimize, media_cleanup or video_edit, and no prerequisites or exclusions are given. The only implicit cue is 'inside the project', which narrows scope but does not guide selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
palette_extractPull a website colour palette from an imageA
Reads the dominant colours out of a real image (a generated hero, banner or any photo) and returns them as hex codes with their share of the image, plus a ready :root CSS custom-properties block. This is a colour histogram, not a brand decision: it names the colours --palette-1, --palette-2 and so on by how much of the image they cover, most dominant first. Decide yourself which one is the primary, the accent or the background before wiring it into a stylesheet.
| Name | Required | Description | Default |
|---|---|---|---|
| count | No | ||
| input_path | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden, and it does disclose the output shape (hex codes, coverage shares, ordered --palette-1..N names, ready CSS block) and clarifies that ordering is by pixel coverage, not semantics. It says nothing about failure modes — invalid path, unsupported or missing image, very low-diversity images — which matters for a filesystem-reading tool.
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 what it returns, followed by the naming convention and interpretive caveat. The closing 'decide yourself' sentence earns its place by preventing misuse, though it could be tightened.
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 2-param, no-annotation, no-output-schema tool, the description conveys the return structure well enough that an output schema is less necessary. But the undocumented `count` parameter and the absence of any error/format expectations leave real gaps an agent would hit on first call.
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 description never mentions the `count` parameter, which controls how many colours are returned (1-12, default 6) and directly shapes the output. `input_path` is only obliquely implied by 'a real image'; the agent must infer it is a path to a local file rather than a URL or asset id.
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: reads dominant colours from an image and returns hex codes with coverage shares plus a :root CSS block. The 'colour histogram, not a brand decision' framing clearly separates it from generative siblings like image_generate or brand_profiles.
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?
It names the input context ('a generated hero, banner or any photo') and tells the agent to interpret the output itself rather than treat it as a brand decision, which implies usage. However, it never states when to prefer this over alternatives (e.g. brand_profiles for existing brand colours) or what conditions make it inapplicable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
project_profileWork out the project's visual personalityA
Read-only scan of the project: 3D or animation libraries, luxury/premium/playful/corporate/modest wording, brand colours, fonts, dark or light theme, and the existing images to use as references. Call it first, open the reference images yourself, then pass the result to design_brief. If the user states the level they want (e.g. 'premium', 'glowing', 'minimal'), that wins.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden and does declare read-only semantics, that reference images must be opened by the agent rather than embedded in the result, and that it is a prerequisite step. It does not say anything about latency, cost, or the shape of the returned profile, which keeps it below 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, front-loaded with what is scanned, followed by the workflow step and the override rule. The inventory of signals is dense but each item is load-bearing for interpreting the result, and nothing is restated from structured fields.
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-parameter, read-only tool with no output schema, the description covers the important ground: what is scanned, sequencing, and the user-override rule. The one remaining gap is the shape of the returned profile that gets handed to design_brief, which the agent must discover at call time.
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; it correctly spends no words on inputs. Baseline 4 applies for a parameterless tool.
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 ('Read-only scan of the project') and enumerates exactly what it inspects: 3D/animation libraries, tone of wording, brand colours, fonts, theme, and reference images. It is clearly separable from design_brief, which it explicitly feeds, and from design_audit/design_feedback.
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 ordering ('Call it first... then pass the result to design_brief') and names the downstream consumer, so the agent knows its place in the workflow. It also states a precedence rule — a user-stated level like 'premium' or 'minimal' overrides the inferred profile.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
providers_listList the AI sites this server can driveB
Built-in providers plus JSON specs from ~/.no-api-media/providers. Shows what each can make.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It discloses the data sources (built-in plus JSON specs from ~/.no-api-media/providers), which is useful behavioral context, but it does not describe what is returned, whether it is always safe/read-only, or how missing/custom specs are handled.
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 short sentences with no wasted words. The key source information is front-loaded, though the second sentence is somewhat vague about what 'what each can make' entails.
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-parameter list tool with no output schema, the description should probably explain the return shape—for example, provider names and capabilities. It hints at capabilities ('what each can make') but does not fully describe the returned structure, leaving an agent to infer the output.
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 has zero parameters, so the baseline is 4. There are no parameter semantics to explain, and the description correctly does not pretend otherwise.
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 clearly states the resource being listed (built-in providers plus JSON specs from a specific path) and that each entry shows what it can make. The tool is understandable as a provider inventory, but the description does not explicitly differentiate it from siblings such as accounts_status or usage_report.
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 guidance on when to call this tool versus alternatives like accounts_status or accounts_login. The implied use case is discovering available providers, but no conditions, exclusions, or routing hints are provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
usage_reportLocal usage summaryA
Totals up this project's own .ai-media/manifest.jsonl: how many images and videos were generated, by which provider, in what format, and on which days. Nothing is uploaded; this only reads what the server already wrote to disk while saving each result.
| Name | Required | Description | Default |
|---|---|---|---|
| since_days | No | Only count the last N days. Default: everything on record. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description carries the full burden and does well: it discloses that nothing is uploaded, that it only reads files the server wrote on save, and where those files live. It doesn't state cost, latency, or whether the report is cached, but the trust-relevant behavior is covered.
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, zero filler. The data source and the dimensions of the report are front-loaded, and the second sentence immediately answers the security question an agent would have.
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 does the work of explaining what comes back: counts of images and videos broken out by provider, format, and day. A sentence on the return shape (e.g. tabular vs. nested) would make it fully self-contained.
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 the single optional since_days parameter is fully documented there. The description adds no syntax or meaning beyond the schema, which is the baseline case.
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?
Uses a specific verb+resource: totals the project's own .ai-media/manifest.jsonl and reports counts by provider, format, and day. That is far more precise than the title 'Local usage summary', though it doesn't explicitly contrast with neighbors like media_probe or media_cleanup.
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 scope ('this project's own manifest') implies when to reach for it, and 'this only reads' signals it's a reporting call. But there is no explicit when-to-use vs. when-not, nor a pointer to the sibling tools that answer related questions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
video_editEdit a video (or put text/logo on an image)A
One operation per call, all local with ffmpeg: trim (start, end), reframe (aspect 9:16/1:1/16:9/4:5/4:3, fit cover|contain), speed (factor), fade (fade_in, fade_out seconds), mute, replace_audio (audio_path), extract_frame (at seconds, e.g. a poster image), gif (start, duration, width, fps), text (text, position top|center|bottom, size, color, box) on a video or image, logo (logo_path, position, width_percent) on a video or image, subtitles (srt_path, burned in), concat (others: more clips joined after this one). Chain calls for several edits.
| Name | Required | Description | Default |
|---|---|---|---|
| at | No | ||
| box | No | ||
| end | No | ||
| fit | No | cover | |
| fps | No | ||
| size | No | ||
| text | No | ||
| color | No | white | |
| start | No | ||
| width | No | ||
| aspect | No | ||
| factor | No | ||
| others | No | ||
| fade_in | No | ||
| duration | No | ||
| fade_out | No | ||
| position | No | ||
| srt_path | No | ||
| logo_path | No | ||
| operation | Yes | ||
| overwrite | No | ||
| audio_path | No | ||
| input_path | Yes | ||
| output_path | No | ||
| width_percent | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden; it does disclose the local/ffmpeg processing model and the one-op-per-call constraint, which are useful behavioral facts. But it is silent on mutation semantics: overwrite defaults to false, output_path handling, and what happens to the source file are all undisclosed for a tool that writes media files.
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 with the governing rule ('one operation per call') front-loaded, then a scannable parameter→operation mapping, closing with the chaining hint. Every clause carries information, though the run-on comma structure makes it slightly harder to parse than a short bulleted form.
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 25-parameter, no-annotation, no-output-schema tool, this covers enough to invoke correctly: operation selection, per-operation arguments, local execution model, and multi-edit chaining. The remaining hole is output/overwrite behavior, which matters for a file-writing operation but is at least partly discoverable from the schema defaults.
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%, so the description must compensate, and it largely does — nearly every parameter is bound to its operation (trim→start/end, reframe→aspect/fit, gif→start/duration/width/fps, text→text/position/size/color/box, logo→logo_path/position/width_percent, concat→others). Gaps: input_path, output_path, and overwrite are never explained, and 'position top|center|bottom' omits the four corner values available in the enum for logo placement.
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 starts with a specific verb+scope ('One operation per call, all local with ffmpeg') and then enumerates all 12 supported operations with their key parameters, so an agent knows exactly what this tool does. The title also clarifies it works on images for text/logo overlays, distinguishing it from video_generate (creation) and media_optimize (compression).
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?
'One operation per call' plus 'Chain calls for several edits' gives explicit usage structure, and 'all local with ffmpeg' implies no upload step. It does not, however, name when to prefer this over siblings like media_optimize or video_generate, nor state prerequisites such as whether input_path files must already exist locally.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
video_generateGenerate a video with your own accountA
provider=flow (default): Veo or Omni in Google Flow. provider=higgsfield: Seedance, Kling, Veo and more via the official CLI. Both spend credits: call video_quote first, tell the user the cost, and pass max_credits. If the real cost is higher, nothing is generated. JSON-defined sites (e.g. grok) show no price up front, so they need confirm_spend: true, which you may only set after the user agreed in chat.
| Name | Required | Description | Default |
|---|---|---|---|
| model | No | flow: veo-lite, veo-fast, veo-quality, omni-flash. higgsfield: e.g. seedance_2_0, kling3_0 | veo-lite |
| aspect | No | 16:9 | |
| prompt | Yes | ||
| quality | No | original | |
| duration | No | Higgsfield only, seconds | |
| provider | No | flow | |
| overwrite | No | ||
| max_credits | No | flow and higgsfield: hard cap from video_quote | |
| output_path | No | ||
| confirm_spend | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does disclose the key behavior: both providers spend credits, the cap is a hard cap, and if the real cost exceeds it nothing is generated. It omits what happens to partially spent credits, whether existing files are clobbered by overwrite, and any auth requirements.
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 tight sentences, each doing distinct work: provider selection, the credit-cap procedure, and the confirm_spend exception. The most consequential rule (call video_quote first) is front-loaded rather than buried.
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 spend tool with no annotations and no output schema, the description covers the money-safety story well but leaves the file story — output_path and overwrite — unaddressed. An agent could call it correctly but might silently overwrite an existing video.
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 only 30% across 10 parameters, and the description compensates for provider, max_credits, and confirm_spend, while the schema itself documents model and duration. Overwrite, output_path, aspect, and quality are explained in neither place, leaving the destructive overwrite and the output destination ambiguous.
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 states a clear verb and resource — it generates video, and spells out the two provider backends (flow vs. higgsfield) with their model families. It doesn't distinguish itself from the sibling video_edit, but it does route to video_quote as a prerequisite, so an agent can place it in the workflow.
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?
It gives an explicit sequencing rule: call video_quote first, tell the user the cost, then pass max_credits. It also restricts confirm_spend to cases where the user has already agreed in chat, which is a real when/when-not condition. It stops short of saying when to prefer this over video_edit or image_generate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
video_quoteHow many credits a generation will costB
provider=flow: opens the Flow project, sets model and aspect, reads the cost Flow shows. provider=higgsfield: asks the Higgsfield CLI for the exact cost of model + prompt (images or videos). Generates nothing.
| Name | Required | Description | Default |
|---|---|---|---|
| count | No | ||
| model | No | flow: veo-lite, veo-fast, veo-quality, omni-flash. higgsfield: any job type, e.g. seedance_2_0, kling3_0, nano_banana_2 | veo-lite |
| aspect | No | 16:9 | |
| prompt | No | higgsfield: needed for an exact quote | |
| provider | No | flow |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It discloses provider mechanics and the important fact that it generates nothing, but omits auth needs, whether opening/setting the Flow project persists state, rate limits, and return format.
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?
It is two sentences with no filler and front-loads the provider branches. The compact "provider=flow:" shorthand is efficient, though slightly terse, which keeps it from a 5.
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 5-param, no-annotation, no-output-schema tool, it covers the main provider branches and the no-generation guarantee. It still lacks return-value format/units, authentication expectations, and count semantics, leaving meaningful 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 40%, so the description must compensate. It adds useful semantics for provider, model, aspect, and prompt, especially the higgsfield prompt requirement for an exact quote, but does not explain the count parameter or clarify all aspect constraints.
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 states a specific purpose: quote credit cost for a generation, with provider-specific behavior, and explicitly says "Generates nothing," which separates it from generation siblings like video_generate. It does not explicitly contrast with usage_report or providers_list, so it is not a full 5.
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?
It implies when to use it by provider and cost-quote purpose, but gives no explicit when/when-not guidance or alternatives such as video_generate or usage_report. An agent must infer that this is a pre-generation cost check.
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.
25 tool updates
v1.4.1- First observed
accounts_login - First observed
accounts_status - First observed
background_remove - First observed
brand_profiles - First observed
browser_done - First observed
compose - First observed
composition_check - First observed
contact_sheet - First observed
deliver - First observed
design_audit - First observed
design_brief - First observed
design_feedback - First observed
image_generate - First observed
loop_check - First observed
media_cleanup - First observed
media_optimize - First observed
media_probe - First observed
palette_extract - First observed
project_profile - First observed
providers_list - First observed
social_sizes - First observed
usage_report - First observed
video_edit - First observed
video_generate - First observed
video_quote
TDQS
Scored across 25 tools
Most tools have clearly distinct roles across the media pipeline: generation, design guidance, QA, compositing, post-processing, delivery, and cleanup. Some overlap exists between social_sizes, deliver, and media_optimize for resizing/compression, and between composition_check and design_audit for quality checks, but the descriptions make the intended stage and purpose reasonably clear.
All names use snake_case, which is good, but the structural pattern is mixed: some are noun_verb (image_generate, video_quote), some noun_noun (project_profile, design_brief), some verb_noun (background_remove, palette_extract), and some bare verbs (deliver, compose). The set remains readable, but an agent cannot rely on a predictable verb_noun convention.
At 25 tools this is borderline heavy for a single server, though the domain is broad and includes generation, design guidance, compositing, post-processing, delivery, account management, and cleanup. Most tools earn their place, but the count is high enough that the surface feels dense rather than tightly scoped.
The tool surface covers a full media asset lifecycle: provider/account setup, project profiling, design briefing and auditing, image/video generation with cost quotes, probing, background removal, palette extraction, compositing, resizing, optimization, delivery, video editing, cleanup, and usage reporting. There are no obvious dead ends for the stated no-api-media purpose.
Maintenance
Related MCP Connectors
- MolyinOAuthcom.molyin
Generate AI images, videos and music from your AI client.
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.
Image and video AI tools and your own pipelines, run from any AI assistant.
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
AlicenseNot gradedqualityCmaintenanceGenerates images, video, music, and voice from plain-language prompts, shipping them production-ready as optimised WebP with SEO alt text, directly in your terminal or AI agent.46 npm1MIT- AlicenseNot gradedqualityCmaintenanceEnables AI agents to search the web for images and videos, download them into website projects with automatic optimization, and receive paste-ready HTML snippets, all self-hosted and without API keys.1MIT
- AlicenseNot gradedqualityBmaintenanceEnables AI coding agents to create client-editable photo and video galleries, upload and organize media in bulk, generate embed code for popular site builders, and manage client feedback — so non-technical clients can update their own content without a CMS.33 npm1MIT
- AlicenseAqualityBmaintenanceEnables Claude Code, Cursor, Codex and other MCP clients to generate and edit images and videos directly in a project using AI subscriptions the user already pays for, without API keys or extra billing. Also provides local media tools such as background removal, video editing for social formats, and automatic resizing and optimization of results.25Apache 2.0
social_sizesMake every social and web size from one imageA
From one image, makes the sizes people need: Open Graph, LinkedIn, X (post and profile header), Instagram square/portrait/story, YouTube thumbnail and channel banner, Facebook cover and event cover, Pinterest, TikTok profile, GitHub social preview, favicon and app icons. fit: cover (fill and crop, photos), contain (whole image on a blurred copy of itself, logos and posters), pad (whole image on a solid colour). Facebook and YouTube cover/banner sizes get cropped differently on different devices: keep the subject and any text centred in the middle third so it survives every crop. Files go to the output folder named after each preset.
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioural burden. It usefully discloses the output location ('Files go to the output folder named after each preset') and warns that some banner sizes crop differently per device, but it says nothing about what happens when an output file already exists (the schema's overwrite default implies a possible failure or skip), whether the operation is idempotent, or what filesystem access is required.
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?
Front-loaded with the core verb and the output list, then the fit guidance, then the crop caveat. Dense but every clause carries usable information. The preset enumeration is long but directly maps to the enum values, so it earns its space; the device-crop advice is the only sentence bordering on advisory 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 6-parameter, no-output-schema, no-annotation tool, the description covers purpose, fit choice, preset scope, and output destination adequately. The gaps are behavioural rather than definitional: how overwrite=false is handled, whether pad_color only applies in pad mode, and what the tool returns (paths? a manifest?) are not conveyed.
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 50%, and the description compensates well for the two most consequential parameters: the three fit modes are explained in richer, more practical terms than the schema ('contain … whole image on a blurred copy of itself, logos and posters'), and the preset families are grouped by platform. It adds no meaning for pad_color, overwrite, or input_path beyond what the schema shows, which keeps it below a 5.
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: 'From one image, makes the sizes people need', followed by a concrete enumeration of the platforms and formats produced (Open Graph, LinkedIn, X, Instagram, YouTube, favicon/app icons). An agent can immediately tell this is a batch resize/export tool and distinguish it from siblings like image_generate or compose.
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 gives useful guidance on which fit mode to choose (cover for photos, contain for logos and posters, pad for solid colour) and a centring tip for Facebook/YouTube crops, which implicitly tells the agent when each mode applies. However, it never states when to use this tool rather than a sibling such as compose, image_generate, or media_optimize, and no exclusions or prerequisites are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.