no-api-media
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| NOAPI_HOME | No | Private profile and state. Delete it to sign out of everything | ~/.no-api-media |
| NOAPI_CHROME | No | Binary location for Chrome | auto-detected |
| NOAPI_FFMPEG | No | Binary location for ffmpeg | auto-detected |
| NOAPI_MIN_GAP | No | Seconds between two generations on one provider | 20 |
| NOAPI_CODEX_JS | No | Binary location for Codex JS | auto-detected |
| NOAPI_HIGGSFIELD | No | Binary location for Higgsfield | auto-detected |
| NOAPI_GOOGLE_EMAIL | No | Which Google account to use | first signed-in account |
| NOAPI_OUTPUT_ROOTS | No | Folders the server may write to | the folder the client starts the server in |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
| prompts | {
"listChanged": true
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| accounts_loginA | 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. |
| providers_listB | Built-in providers plus JSON specs from ~/.no-api-media/providers. Shows what each can make. |
| design_briefA | 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 |
| design_auditA | 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. |
| brand_profilesB | 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. |
| design_feedbackA | 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. |
| composition_checkA | 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. |
| media_cleanupA | 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. |
| project_profileA | 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. |
| accounts_statusB | Checks Codex and Higgsfield CLI sign-in, ChatGPT web sign-in, the Google account and plan tier on Flow, and every JSON-defined site. |
| image_generateA | 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. |
| video_quoteB | 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. |
| video_generateA | 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. |
| media_probeC | Duration, size, frame rate and codecs of an image or video inside the project. |
| background_removeA | 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]". |
| social_sizesA | 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. |
| contact_sheetA | 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). |
| loop_checkA | 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. |
| palette_extractA | 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. |
| deliverA | 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). |
| composeA | 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. |
| browser_doneA | 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. |
| usage_reportA | 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. |
| video_editA | 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. |
| media_optimizeA | 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. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
| design-asset | Brief, explore three directions, critique hard, iterate, then place the winner. Works for logos, heroes, icons, banners and videos. |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
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.