Emero
Server Details
Your AI assistant's creative studio. Make images, video, music and speech with Kling 4.0, Seedance 2.5, Nano Banana Pro, GPT Image 2.5 and more, billed at real model cost. A second brain learns from every generation and 100+ tested workflows, so results get better the more you make
- Status
- Healthy
- Uptime
- 100.0% over the last 24 hours
- OAuth
- Works in Glama
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
- Repository
- EmeroAI/emero-mcp
- GitHub Stars
- 0
- ChatGPT
- –
- Claude
- –
TDQS
Scored across 19 tools
Most tools have a distinct resource+action (generate, check_generation, combine_videos, extract_frame), and the descriptions explicitly draw the tricky lines: inspect vs view, ingest_url vs request_upload, get_emero_brain vs get_settings. The only soft overlaps are the three read tools (get_settings, get_emero_brain, get_pricelist) and save/manage_emero_brain, which are clarified in text rather than by name.
Nearly everything follows snake_case verb_noun (list_project_creations, save_to_emero_brain, publish_workflow, check_generation). A handful of bare verbs (generate, inspect, view) break the pattern, but they are the core primitives and remain unambiguous.
19 tools is on the heavy side of the 3-15 sweet spot, but the platform genuinely spans generation, asset I/O, settings, pricing, brain memory, and workflow publishing, so each tool maps to a real capability. Nothing looks like filler, though a couple of read tools could be folded together.
The lifecycle is well covered: plan/cost discovery, generate, poll results, compose/join, extract frames, ingest and view assets, plus brain CRUD and workflow publish/unpublish. Gaps are minor, mainly no delete/cleanup for creations or uploads and no dedicated project-list tool outside the brain view.
Publisher details
- Operator
- Emero
- Operator website
- https://www.emero.studio
- Vendor relationship
- First-party · Publisher source
- Documentation
- https://github.com/EmeroAI/emero-mcp
- Trust center
- Not applicable
- Restrictions
- Needs an Emero account. Flat $10/month plus generations at model cost; new accounts get $2 of generations free · Publisher source
Available Tools
19 toolscheck_generationCheck generationARead-onlyIdempotentInspect
Fetch the result of a generate / combine_videos job — pass the id it returned. Long-polls ~30s and, the moment it's ready, SHOWS the result to the user AND returns a copy you can see (one image, or a video poster frame) — so you never need a second call to view it. While rendering it reports elapsed vs typical time and whether to keep polling (short jobs) or STOP and hand off for a long render — for a long render, tell the user the wait and call this once when they return, don't poll in a loop. The progress % is coarse (not an ETA).
Inputs: job_id (required), project_id.
combine_videosCombine videosAInspect
Join existing clips (job:#0 and upload:, mixed, 1–10 in play order) into ONE video, free (no model runs). Also trims a single clip, retimes it (speed), lays a voiceover or music over it (audio_id / music_id, mix, ducking, fades), or plays 2 clips in one frame as a before/after (layout "side_by_side" / "stacked"). Not for new footage or montages: use it only when shots need different models or locations, or the piece runs past the model's max duration; if one generation can cut it, generate it once. Load load_skill("combining-videos") before the first call: it has every option and value.
Inputs: video_ids (required), sync, speed, layout, +19 more.
extract_frameExtract a frameAIdempotentInspect
Take one frame of a video already in emero (an upload or a generation) and store it as a new lossless PNG. Returns a job:<uuid>#0 id for generate (reference_image_ids, start_frame_id, end_frame_id). The frame comes from emero's own stored file, which for an iPhone HDR upload is emero's SDR conversion, so a still made from it matches the clip's color. Always use this to make a still from a video for emero: never extract or tone-map frames in your own sandbox. Pass time_seconds or frame_number (0-based). Free.
Inputs: video_id (required), project_id, frame_number, project_name, +1 more.
generateGenerateAInspect
Make an image, video clip, instrumental track, voiceover or upscale on emero, billed at cost to the user's emero balance.
Follow the generate skill, step by step: load_skill("generate") first and pass its tag as skill. In short: read the brain (get_emero_brain) → decide kind and scope → art direction for projects → video mode → call with confirm:false to get the plan and cost → show it → bind inputs → compose the prompt from the kind's craft skill → call again with confirm:true → check_generation → deliver. Every call carries brain_note: what the user decided since the last generation, or "".
Rules that always hold: the model is the user's choice, never switched for price or balance. One generation per request. Ids only for inputs, never URLs. Video needs video_mode: edit (base_video_id, Kling 4.0: keeps a clip's motion and usually its camera), text, reference (reference_image_ids / reference_video_ids) or frames (start_frame_id / end_frame_id, plus middle_frame_ids on Kling 4.0); references and frames never mix, except on Kling 4.0 where frames mode also takes references. Joining clips is combine_videos, not this tool.
Inputs: kind (required), skill (required), confirm (required), brain_note (required), +26 more.
get_emero_brainGet emero brainARead-onlyIdempotentInspect
Read this brand's emero brain in full: the look-lock sheet, style and model leanings, defaults, graded rules (require/forbid/prefer), locked subjects (Characters/Products, each with an anchor id to pass as reference_image_ids) and decisions — brand-wide plus this project's, each with its id, and the brand's other projects. Call it before the first generation for a brand: generations reuse its anchors and look-lock to stay consistent, and it is the same brain across every chat, device and teammate. get_settings shows a short version. Empty = no brain yet; it grows with save_to_emero_brain. load_skill("emero-brain") for the shape.
Inputs: project_id, project_name.
get_pricelistModel price listARead-onlyIdempotentInspect
Read-only. Every emero model and its per-generation cost in USD, from the live at-cost rate card (zero markup). Optional filters: kind (image/video/music/speech/edit) and model (exact id). Each model lists its price tiers (quality / resolution / duration / sound) with the unit basis — per image, per second of output, per generation, or per 1,000 characters. Use it when the user asks what something costs or wants the full price list. Changes nothing.
Inputs: kind, model.
get_settingsGet generation settingsARead-onlyIdempotentInspect
Read the current generation settings (model, aspect ratio, quality, duration, resolution, sound, voice, speed), the estimated per-generation cost for image + video, the user's balance, this project's spend, and a short data view of the brand's emero brain (look-lock, rules, subject anchors). Call it before each image or video: show the user the model and cost first — the model is the user's choice. Pass compact:true for a cheap balance / spend / current-model check (skips the catalog and the brain).
Inputs: compact, project_id.
ingest_urlStore a reference imageAInspect
Store an image INTO emero's library so it can anchor a generation — the user's own subject / product / character / scene, or an external reference you've already chosen. Returns a job:<uuid>#0 id; pass it into generate as reference_image_ids (images: up to 8) or as a video's start_frame_id / end_frame_id. No UI. NEVER base64 a file into your reply.
url: a public https image URL.file: only works when your client provides a publicly reachabledownload_urlwith the attachment. A local or sandbox path will fail — use request_upload instead. To just LOOK at an image (web research, a candidate reference) without storing it, useinspect, not this. Only ingest_url the images you've decided to keep and reuse.
Inputs: url, file, project_id, project_name.
inspectInspect assets (for you only)ARead-onlyIdempotentInspect
Look at assets yourself — never shown to the user. Pass artifact_ids: emero ids or external https image URLs.
images (default true): returns a copy YOU can see (downscaled ~1024px, up to 8). For a video, its labeled contact sheet — use it to review MOTION. Each asset comes to you AT MOST ONCE per project; pass force:true ONLY after your context was compacted.
include_details (default false): per emero generation, the EXACT prompt it ran with, model, settings (duration, resolution, aspect…), its inputs as artifact ids with their role (start/end frame, reference), and its project — on every call, for any project of the brand. Use it to rebuild a past prompt, or to debug repeated fixes. images:false + include_details:true just reads them. For an upload, it lists the files in the order added: each one's own id (upload:#n), original filename, type, size, width x height, and a video's length + fps.
One file of an upload: upload:#n (0-based, in the order the user added them); bare upload: means all its files. The per-file id works anywhere an asset id does. Call it in its own step — after check_generation's result has arrived, not alongside it.
Inputs: project_id (required), artifact_ids (required), force, images, +1 more.
list_project_creationsList project creationsARead-onlyIdempotentInspect
Widget-only (the inline creation widget calls it; the assistant never does). Returns the 12 newest creations in this chat's project with their status, embedded thumbnails and links, so the widget can render and live-refresh its tiles. Read-only. To find past work by description across every project, use search_creations instead.
Inputs: have, project_id.
load_skillLoad skillARead-onlyIdempotentInspect
Load emero's guidance for a task before your first use of it (skill v162). Skills are cached per version: if the steps of a skill you loaded earlier are no longer visible in this chat (e.g. only a summary of it remains), load it again. Start every generation with load_skill("generate") (the step-by-step procedure and the tag generate requires); craft skills for its Step 7: make-image, make-video, make-music, make-speech, upscale-video. Also: art-direction, combining-videos, organizing-generations. Call load_skill("index") to list every available skill + workflow. (Name is a free string so new skills/workflows can appear without reconnecting.)
Inputs: name (required).
manage_emero_brainManage emero brainADestructiveInspect
Change existing emero brain entries, ONLY when the user's latest message asked for it or reversed a decision, never on your own judgment; their words go in user_request_quote. Actions: supersede (old_id → new_id just saved) · delete (id, reason; restorable) · update (id, fields) · rescope (id, scope) · find_conflicts (candidate; no quote). Ids come from get_emero_brain or a save result. A [locked] entry changes only when the user's words name it. The user can undo any change in the emero brain tab. load_skill("emero-brain") first if you haven't.
Inputs: action (required), id, scope, fields, +6 more.
publish_workflowPublish workflowADestructiveIdempotentInspect
Publish a tested workflow from this chat to the public library at emero.studio/workflows and add it to today's email digest draft. Live immediately. Calling again with the same slug replaces that post.
You write the words; the server fills every fact. Never write a model name, a cost, or a prompt in the body: each {{gen:...}} token becomes the media plus its model, real cost and exact prompt.
Media tokens (each sits alone on its own line in the body; images render inline, videos as an inline looping player):
A generation: {{gen:job:#}}, with the id generate / check_generation returned (#n = which output, #0 for a single one). Shows the media plus its model, real cost and exact prompt.
An upload (the user's own file, e.g. original source footage, or a file rendered outside emero and added with request_upload): {{upload:}}, with the id request_upload returned (upload:). If the upload holds several files, name one: {{upload:#}} (0-based, in the order they were added; inspect(upload:, include_details:true) lists them). Shows the media and its alt text only, no model, cost or prompt. Use it for before/after: the upload, then the generation made from it.
alts: one entry per token, keyed by the token's id without the braces: "job:#" for a generation, "upload:" (or "upload:#") for an upload.
cover: any token's id in the same form, generation or upload; for a video, a still is taken from it. A bad id, or one from another account, is refused and nothing is published. Example body lines and alts: {{upload:9b1c0f2e-1a2b-4c3d-8e9f-0a1b2c3d4e5f}} {{gen:job:3e6bb619-7a5d-47e8-bec4-6d841e941634#0}} alts: { "upload:9b1c0f2e-1a2b-4c3d-8e9f-0a1b2c3d4e5f": "The original phone clip of the man sitting on the floor", "job:3e6bb619-7a5d-47e8-bec4-6d841e941634#0": "The same shot as a trapped miner in a sinking concrete room" }
slug: [use-case]-[model], lowercase-hyphens, e.g. "jewelry-video-ad-seedance". Never change it after publishing.
title: models first, then the use case. Comparing models: "Seedance 2.5 vs MiniMax H3 - jewelry ad from two photos". One model: "GPT Image 2.5 - photo to ink illustration in five styles". Use the model names the generations show.
seo_title: max 60 chars. Lead with the model people search for, then the outcome, e.g. "Seedance 2.5 Jewelry Video Ad from 2 Photos: Prompts + Cost", "Kling 3.0 Fashion Ad: Ostrich Hands Over a Bag".
summary: max 100 chars, one plain sentence on what the workflow does. No terminal period.
Brands: never put a real brand or its trademarks in the slug, title, seo_title, summary or teaser: no house names (Gucci, Prada, Louis Vuitton) and no product marks (Damier, Intrecciato, GG, Kelly). Describe the look instead: "orange monogram bucket hat", "woven leather bag". In the body, name a brand only where the workflow needs it, never as if the post were their ad. Every post shows a no-affiliation disclaimer.
teaser: a short noun phrase with its article for the email, e.g. "a 10 second jewelry ad from two photos".
body: markdown only (## headings, paragraphs, lists, bold, links), no HTML. Open with why the approach works, then "## 1. " per step, each step a short paragraph followed by its token (see Media tokens). End with "## Why it works".
alts: alt text per token (keys above): what the media shows, e.g. "Emerald ring and necklace on black velvet". On a generation the model name is appended automatically.
cover (optional): the id of the token that represents the post in share previews, the library card and the top of the post. Pick the strongest single frame, e.g. the delivery shot of a fashion spot, not the empty background plate. Must be one of the body's tokens. A video works, a still is taken from it. Omitted = the first generation in the body. To change the cover later, publish again with the same slug and the new cover.
replaces (optional): when you publish a post under a NEW slug to rename an existing one, pass the old slug here. The old post is taken down and its URL redirects to the new one, keeping its date. Never publish a renamed post without it, or the library shows the post twice.
Voice: concise, first person, plain words, no em dashes. Show the user the full post and get their go before calling.
Inputs: alts (required), body (required), slug (required), title (required), +5 more.
request_uploadAsk the user to upload a fileAInspect
Show the user an upload card so they can add their OWN image or video (use this only for a genuine human upload — e.g. their client couldn't hand a file to ingest_url). Returns an upload:<id> (all the files they add); upload:<id>#n is one file, 0-based in the order they added them, and works anywhere an asset id does (generate, view, inspect, publish_workflow). inspect(upload:, include_details:true) lists each file's id, filename, type and size. Ask them to upload and click Done, then WAIT for their reply — don't poll. When they're done, pass upload: STRAIGHT into generate (reference_image_ids / start_frame_id / end_frame_id) or into view to see it — emero resolves it to the full-resolution file(s). Do NOT call request_upload again for the same file (a second call re-shows the card).
Inputs: project_id, project_name.
save_to_emero_brainSave to emero brainAInspect
Save ONE real decision the user made (a rule, a look, a subject to reuse, a decision, or "remember this") into this brand's emero brain; later generations in any chat reuse it. kind: rule (must/never/prefer) · preference (a leaning) · subject (asset_kind + image_job_ids) · decision · look (detail = the full look-lock sheet). scope "project" or "brand", required for rule/preference/decision. Reported conflicts stay active: supersede only if the user's message replaces them, else ask. Save ONLY what the user said or did; never invent rules. load_skill("emero-brain") for when to use each kind and scope.
Inputs: kind (required), title (required), summary (required), scope, +5 more.
search_creationsSearch creationsARead-onlyIdempotentInspect
Find the user's past emero generations (across every project of the brand) by natural-language description. Returns artifact ids with a short description of the output, its age, model, project and a prompt_preview (first ~200 chars, no URLs). For the FULL prompt + settings a generation used (e.g. "make it like that earlier one"), call inspect with include_details:true. Load the organizing-generations skill first if you haven't.
Inputs: query (required), limit, modality.
set_settingsChange generation settings or rename the projectADestructiveIdempotentInspect
Change generation settings AFTER the user confirms — never pick a model or format for them unprompted. Pass only the keys to change; the rest stay. Values are validated + clamped to what the chosen model supports (an unknown model is rejected). The change persists as the base for future generations. Aspect: 9:16 = social/portrait, 16:9 = youtube/landscape, 1:1 = square. Also renames the project: pass project_name with this chat's project_id whenever the user says e.g. 'call this project cats'. Rename only the project this chat is working in; for another project, tell the user to ask in that project's chat. The app sends users here to rename projects, so the Second Brain stays in sync. Returns the updated settings + cost.
Inputs: project_id, voice_name, image_model, music_model, +10 more.
unpublish_workflowUnpublish workflowADestructiveIdempotentInspect
Take a published workflow off the public library by its slug. The post is kept and can be republished with publish_workflow.
Inputs: slug (required).
viewShow assets to the userARead-onlyIdempotentInspect
Show the user assets inline — pass artifact_ids (one or many): emero ids ("job:#" / "upload:") or external https image URLs. This NEVER sends them to you: to look at an asset yourself, or read its exact prompt + settings, use inspect.
NEVER stores — to KEEP an external image for reuse, use ingest_url after you've chosen it. Do NOT call view on a generation you just made: check_generation already showed it to the user.
Inputs: project_id (required), artifact_ids (required), force, show_user, +2 more.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
Related MCP Connectors
AI video, images, music & SFX: Seedance 2.5, Veo 3.1, Kling 3.0, Nano Banana Pro, 20+ models.
Generate images, videos, music & lip sync with 200+ AI models (Flux, Veo 3, Kling, Suno)
Make AI images and videos with Nano Banana, GPT Image, Veo, Kling and more, using your credits.
Make AI images, videos and UGC ads from Claude: Seedance, Kling, Veo, Nano Banana. Pay per use.
Related MCP Servers
- AlicenseAqualityCmaintenanceEnables AI assistants to generate video, images, music, speech and sound effects, transcribe audio, edit and extend clips, and upscale media across 100+ models using a single API key. Also provides task tracking, model discovery, cost estimation and balance checks.14MIT
- AlicenseNot gradedqualityBmaintenanceGenerates images, videos, and speech via Google Nano Banana, Veo, Omni, and Gemini TTS models with pay-as-you-go crypto payments, no subscription required.2Apache 2.0
- AlicenseNot gradedqualityDmaintenanceGenerate and refine AI images/audio/video through natural conversation.412Apache 2.0
- AlicenseNot gradedqualityCmaintenanceAccess 400+ generative AI models directly from your AI assistant — generate images (FLUX, Midjourney, GPT-4o), create videos (Veo3, Kling), make music (Suno), and enhance photos, all via a single MCP server.12MIT
Glama MCP Gateway
Add one secure layer between your agents and this server.