{"serverInfo":{"name":"emero","title":"Emero","version":"1.5.15","description":"Emero teaches ChatGPT, Claude and other AI assistants to make pro images, video, music and speech with every top model. A second brain built from 6,000+ tested generations and your brand; generations billed at model cost.","websiteUrl":"https://www.emero.studio","icons":[{"src":"https://www.emero.studio/emero-logo.png","mimeType":"image/png"}]},"authentication":{"required":true,"schemes":["oauth2"]},"tools":[{"name":"generate","title":"Generate","description":"Make an image, video clip, instrumental track, voiceover or upscale on emero, billed at cost to the user's emero balance.\n\nFollow 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 \"\".\n\nRules 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: text, reference (reference_image_ids / reference_video_ids) or frames (start_frame_id / end_frame_id); references and frames never mix. Joining clips is combine_videos, not this tool.","inputSchema":{"type":"object","properties":{"kind":{"type":"string","enum":["image","video","music","speech","upscale"],"description":"What to make. upscale = a sharper / bigger version of an existing clip."},"skill":{"type":"string","description":"The tag from the loaded generate skill, e.g. \"generate@140\"."},"confirm":{"type":"boolean","description":"false: return the plan and cost, spend nothing (generate Step 5). true: run it."},"prompt":{"type":"string","maxLength":6000,"description":"image, video, music. Built from the kind's craft skill (Step 7)."},"prompt_source":{"type":"string","enum":["authored","user_verbatim","template"],"description":"Who wrote the prompt. \"authored\" (default): you wrote it — it must follow the skill's Mandatory Prompt Shape. \"user_verbatim\": the user gave you this exact text — sent as-is. \"template\": you filled a skill's prompt template (e.g. product-sheet-prompts)."},"text":{"type":"string","maxLength":10000,"description":"speech: the exact words to speak."},"video_mode":{"type":"string","enum":["text","reference","frames"],"description":"video only, required. Decided in Step 4 MODE."},"reference_image_ids":{"type":"array","items":{"type":"string"},"maxItems":30,"description":"image (up to 8) or video reference mode. Ids, never URLs."},"reference_video_ids":{"type":"array","items":{"type":"string"},"maxItems":10,"description":"video reference mode: clips to borrow motion or camera from."},"start_frame_id":{"type":"string","description":"video frames mode: the first frame."},"end_frame_id":{"type":"string","description":"video frames mode: the last frame."},"source_id":{"type":"string","description":"upscale: the clip to upscale."},"upscale_resolution":{"type":"string","enum":["720p","1080p","4k"],"description":"upscale: target resolution."},"fps":{"type":"number","enum":[30,60],"description":"upscale: 30 (default) or 60 (2x the price; only when asked)."},"model":{"type":"string","description":"Optional: the user's chosen model (exact id from get_settings). Saved to the project."},"aspect_ratio":{"type":"string","description":"image, video. Saved to the project."},"duration":{"type":"number","description":"video, seconds. Saved to the project."},"resolution":{"type":"string","description":"video. Saved to the project."},"sound":{"type":"boolean","description":"video, on models that generate audio. Saved to the project."},"quality":{"type":"string","description":"image. Saved to the project."},"voice":{"type":"string","description":"speech voice name. Saved to the project."},"brain_note":{"type":"string","maxLength":200,"description":"Step 11: what the user decided since the last generation, as one short preference (e.g. \"Avoid dark, moody lighting\"), or \"\" if nothing. Saved to this project's Second Brain on confirm:true."},"brain_quote":{"type":"string","maxLength":200,"description":"With a brain_note: the user's exact words it comes from."},"project_id":{"type":"string","pattern":"^[A-Za-z0-9_-]{1,64}$","description":"Opaque per-chat project id: \"p-\" plus 6 random letters and digits. Every chat is a new project. Mint one on your first emero call and pass that SAME id on every call in this chat. Never mint a second one in the same chat, even for a new topic, campaign or subject. Only when the user asks to continue an earlier project, reuse its id from get_emero_brain's project list."},"project_name":{"type":"string","maxLength":80,"description":"Short human title for the project (2-5 words from the user request, e.g. \"Perfume ad campaign\"). Pass it on your first generate/ingest_url so the project is not left \"Untitled\". You may also rename at will later — pass an updated project_name (on a generate/ingest_url, or on set_settings with no other change) whenever the user asks, e.g. \"call this project cats\"."}},"required":["kind","skill","confirm","brain_note"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":true}},{"name":"combine_videos","title":"Combine videos","description":"Join existing video clips into ONE continuous video, in the order given — assemble a multi-shot sequence from clips already in the library (NOT to generate new footage). Pass 1–10 artifact ids (job:<uuid>#0 handles, in play order). Clips are normalized (resolution/fps) and concatenated, removing the jump between mismatched clips. TRIM: to cut a clip before joining, pass an object { id, start, end } (or { id, start, duration }) in SECONDS instead of a bare id; or set max_clip_seconds to keep the first N seconds of EVERY clip (models often return a longer clip than asked — e.g. ~4s for a 3s request). One clip + a trim is a valid single-clip trim. Ranges auto-clamp to the real clip length. AUDIO: pass audio_id (a voiceover from generate kind \"speech\") and/or music_id (a bed from generate kind \"music\") to lay over the result. audio_mode:\"replace\" (default) makes the overlay(s) the ONLY soundtrack (clips' own audio muted); audio_mode:\"mix\" lays them OVER the clips' audio — set clip_volume (0–2, e.g. 0.2) to quiet the clips' own sound effects under a voiceover. Each overlay has its own gain (audio_volume / music_volume, 0–2; e.g. VO 1.0, music 0.15) and optional fades (audio_fade_in/out, music_fade_in/out, seconds). ducking:true auto-lowers the clips' audio + music WHILE the voiceover speaks and lets them recover in the gaps (sidechaincompress) — the cleanest way to keep a VO on top. Per clip: a video_ids object can carry its own volume (e.g. {id, volume:0.3}) to set that one clip's audio level. Single clip + audio_id = swap one video's audio. Output is free (no model runs). Unsure which ids or their order? call search_creations or read the Recent list in get_settings first. If you have not loaded it this session, call load_skill(\"combining-videos\").","inputSchema":{"type":"object","properties":{"video_ids":{"type":"array","items":{"anyOf":[{"type":"string","minLength":1},{"type":"object","properties":{"id":{"type":"string","minLength":1},"start":{"type":"number","minimum":0},"end":{"type":"number","minimum":0},"duration":{"type":"number","exclusiveMinimum":0},"volume":{"type":"number","minimum":0,"maximum":2}},"required":["id"],"additionalProperties":false}]},"minItems":1,"maxItems":10},"max_clip_seconds":{"type":"number","exclusiveMinimum":0},"audio_id":{"type":"string","minLength":1},"audio_mode":{"type":"string","enum":["replace","mix"]},"audio_volume":{"type":"number","minimum":0,"maximum":2},"clip_volume":{"type":"number","minimum":0,"maximum":2},"ducking":{"type":"boolean"},"music_id":{"type":"string","minLength":1},"music_volume":{"type":"number","minimum":0,"maximum":2},"audio_fade_in":{"type":"number","minimum":0,"maximum":30},"audio_fade_out":{"type":"number","minimum":0,"maximum":30},"music_fade_in":{"type":"number","minimum":0,"maximum":30},"music_fade_out":{"type":"number","minimum":0,"maximum":30},"project_id":{"type":"string","pattern":"^[A-Za-z0-9_-]{1,64}$","description":"Opaque per-chat project id: \"p-\" plus 6 random letters and digits. Every chat is a new project. Mint one on your first emero call and pass that SAME id on every call in this chat. Never mint a second one in the same chat, even for a new topic, campaign or subject. Only when the user asks to continue an earlier project, reuse its id from get_emero_brain's project list."},"project_name":{"type":"string","maxLength":80,"description":"Short human title for the project (2-5 words from the user request, e.g. \"Perfume ad campaign\"). Pass it on your first generate/ingest_url so the project is not left \"Untitled\". You may also rename at will later — pass an updated project_name (on a generate/ingest_url, or on set_settings with no other change) whenever the user asks, e.g. \"call this project cats\"."}},"required":["video_ids"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false}},{"name":"check_generation","title":"Check generation","description":"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).","inputSchema":{"type":"object","properties":{"job_id":{"type":"string","minLength":1},"project_id":{"type":"string","pattern":"^[A-Za-z0-9_-]{1,64}$","description":"Opaque per-chat project id: \"p-\" plus 6 random letters and digits. Every chat is a new project. Mint one on your first emero call and pass that SAME id on every call in this chat. Never mint a second one in the same chat, even for a new topic, campaign or subject. Only when the user asks to continue an earlier project, reuse its id from get_emero_brain's project list."}},"required":["job_id"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}},{"name":"search_creations","title":"Search creations","description":"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.","inputSchema":{"type":"object","properties":{"query":{"type":"string","minLength":1,"maxLength":2000},"modality":{"type":"string","enum":["image","video","audio"]},"limit":{"type":"integer","minimum":3,"maximum":8}},"required":["query"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}},{"name":"view","title":"Show assets to the user","description":"Show the user assets inline — pass `artifact_ids` (one or many): emero ids (\"job:<uuid>#<index>\" / \"upload:<id>\") 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`.\nNEVER 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.","inputSchema":{"type":"object","properties":{"artifact_ids":{"type":"array","items":{"type":"string","minLength":1},"minItems":1,"maxItems":20},"project_id":{"type":"string","pattern":"^[A-Za-z0-9_-]{1,64}$","description":"Opaque per-chat project id: \"p-\" plus 6 random letters and digits. Every chat is a new project. Mint one on your first emero call and pass that SAME id on every call in this chat. Never mint a second one in the same chat, even for a new topic, campaign or subject. Only when the user asks to continue an earlier project, reuse its id from get_emero_brain's project list."},"show_user":{"type":"boolean"},"return_image":{"type":"boolean"},"include_details":{"type":"boolean"},"force":{"type":"boolean"}},"required":["artifact_ids","project_id"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":true}},{"name":"inspect","title":"Inspect assets (for you only)","description":"Look at assets yourself — never shown to the user. Pass `artifact_ids`: emero ids or external https image URLs.\n- 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.\n- 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.\nCall it in its own step — after check_generation's result has arrived, not alongside it.","inputSchema":{"type":"object","properties":{"artifact_ids":{"type":"array","items":{"type":"string","minLength":1},"minItems":1,"maxItems":20},"project_id":{"type":"string","pattern":"^[A-Za-z0-9_-]{1,64}$","description":"Opaque per-chat project id: \"p-\" plus 6 random letters and digits. Every chat is a new project. Mint one on your first emero call and pass that SAME id on every call in this chat. Never mint a second one in the same chat, even for a new topic, campaign or subject. Only when the user asks to continue an earlier project, reuse its id from get_emero_brain's project list."},"images":{"type":"boolean"},"include_details":{"type":"boolean"},"force":{"type":"boolean"}},"required":["artifact_ids","project_id"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":true}},{"name":"ingest_url","title":"Store a reference image","description":"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.\n- `url`: a public https image URL.\n- `file`: only works when your client provides a publicly reachable `download_url` with the attachment. A local or sandbox path will fail — use request_upload instead.\nTo just LOOK at an image (web research, a candidate reference) without storing it, use `inspect`, not this. Only ingest_url the images you've decided to keep and reuse.","inputSchema":{"type":"object","properties":{"file":{"type":"object","properties":{"download_url":{"type":"string"},"file_id":{"type":"string"},"mime_type":{"type":"string"},"file_name":{"type":"string"}},"required":["download_url","file_id"],"additionalProperties":false},"url":{"type":"string","format":"uri"},"project_id":{"type":"string","pattern":"^[A-Za-z0-9_-]{1,64}$","description":"Opaque per-chat project id: \"p-\" plus 6 random letters and digits. Every chat is a new project. Mint one on your first emero call and pass that SAME id on every call in this chat. Never mint a second one in the same chat, even for a new topic, campaign or subject. Only when the user asks to continue an earlier project, reuse its id from get_emero_brain's project list."},"project_name":{"type":"string","maxLength":80,"description":"Short human title for the project (2-5 words from the user request, e.g. \"Perfume ad campaign\"). Pass it on your first generate/ingest_url so the project is not left \"Untitled\". You may also rename at will later — pass an updated project_name (on a generate/ingest_url, or on set_settings with no other change) whenever the user asks, e.g. \"call this project cats\"."}},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":true}},{"name":"request_upload","title":"Ask the user to upload a file","description":"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>`. Ask them to upload and click Done, then WAIT for their reply — don't poll. When they're done, pass upload:<id> 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).","inputSchema":{"type":"object","properties":{"project_id":{"type":"string","pattern":"^[A-Za-z0-9_-]{1,64}$","description":"Opaque per-chat project id: \"p-\" plus 6 random letters and digits. Every chat is a new project. Mint one on your first emero call and pass that SAME id on every call in this chat. Never mint a second one in the same chat, even for a new topic, campaign or subject. Only when the user asks to continue an earlier project, reuse its id from get_emero_brain's project list."},"project_name":{"type":"string","maxLength":80,"description":"Short human title for the project (2-5 words from the user request, e.g. \"Perfume ad campaign\"). Pass it on your first generate/ingest_url so the project is not left \"Untitled\". You may also rename at will later — pass an updated project_name (on a generate/ingest_url, or on set_settings with no other change) whenever the user asks, e.g. \"call this project cats\"."}},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false}},{"name":"get_settings","title":"Get generation settings","description":"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).","inputSchema":{"type":"object","properties":{"compact":{"type":"boolean"},"project_id":{"type":"string","pattern":"^[A-Za-z0-9_-]{1,64}$","description":"Opaque per-chat project id: \"p-\" plus 6 random letters and digits. Every chat is a new project. Mint one on your first emero call and pass that SAME id on every call in this chat. Never mint a second one in the same chat, even for a new topic, campaign or subject. Only when the user asks to continue an earlier project, reuse its id from get_emero_brain's project list."}},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}},{"name":"set_settings","title":"Change generation settings or rename the project","description":"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.","inputSchema":{"type":"object","properties":{"image_model":{"type":"string"},"image_aspect_ratio":{"type":"string"},"image_quality":{"type":"string"},"video_model":{"type":"string"},"video_aspect_ratio":{"type":"string"},"video_duration":{"type":"number"},"video_resolution":{"type":"string"},"video_sound":{"type":"string","enum":["on","off"]},"music_model":{"type":"string"},"voice_model":{"type":"string"},"voice_name":{"type":"string"},"speech_speed":{"type":"number"},"project_id":{"type":"string","pattern":"^[A-Za-z0-9_-]{1,64}$","description":"Opaque per-chat project id: \"p-\" plus 6 random letters and digits. Every chat is a new project. Mint one on your first emero call and pass that SAME id on every call in this chat. Never mint a second one in the same chat, even for a new topic, campaign or subject. Only when the user asks to continue an earlier project, reuse its id from get_emero_brain's project list."},"project_name":{"type":"string","maxLength":80,"description":"Short human title for the project (2-5 words from the user request, e.g. \"Perfume ad campaign\"). Pass it on your first generate/ingest_url so the project is not left \"Untitled\". You may also rename at will later — pass an updated project_name (on a generate/ingest_url, or on set_settings with no other change) whenever the user asks, e.g. \"call this project cats\"."}},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":true,"openWorldHint":false}},{"name":"get_emero_brain","title":"Get emero brain","description":"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.","inputSchema":{"type":"object","properties":{"project_id":{"type":"string","pattern":"^[A-Za-z0-9_-]{1,64}$","description":"Opaque per-chat project id: \"p-\" plus 6 random letters and digits. Every chat is a new project. Mint one on your first emero call and pass that SAME id on every call in this chat. Never mint a second one in the same chat, even for a new topic, campaign or subject. Only when the user asks to continue an earlier project, reuse its id from get_emero_brain's project list."},"project_name":{"type":"string","maxLength":80,"description":"Short human title for the project (2-5 words from the user request, e.g. \"Perfume ad campaign\"). Pass it on your first generate/ingest_url so the project is not left \"Untitled\". You may also rename at will later — pass an updated project_name (on a generate/ingest_url, or on set_settings with no other change) whenever the user asks, e.g. \"call this project cats\"."}},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}},{"name":"save_to_emero_brain","title":"Save to emero brain","description":"Save ONE real decision the user made into this brand's emero brain. Call it when the user makes a brand decision — a rule, a look, a subject to reuse, a definition, or \"remember this\" about their brand or work: it shows in their emero brain tab, where they can review or edit it, and later generations in any chat reuse it. kind=\"rule\" for a must/never/prefer standard (e.g. \"always leave headroom at the top\"), \"preference\" for a leaning (a look, a go-to model), \"subject\" for a Character or Product to reuse across shots (set asset_kind + image_job_ids = the generation/upload ids of its reference image(s)), \"decision\" for a creative call (a definition, a direction), \"look\" for the whole look-lock sheet the user approved (summary = one line, detail = the full sheet: palette roles, light recipe, lens family, casting, wardrobe, materials, grain). scope: \"project\" when the user ties it to this project/campaign (\"in this project\", \"for this campaign\"), \"brand\" when it's how the brand always works (\"always\", \"for the brand\") — required for rule/preference/decision; subjects and looks default to brand. emero grades it but NEVER replaces an earlier entry on its own: if the save reports possible conflicts, the old entries are still active — supersede only if the user's message replaces them, else ask. Save ONLY what the user actually said or did; never invent rules. load_skill(\"emero-brain\") for when to use each kind.","inputSchema":{"type":"object","properties":{"kind":{"type":"string","enum":["rule","preference","subject","decision","look"]},"title":{"type":"string","minLength":1,"maxLength":160},"summary":{"type":"string","minLength":1,"maxLength":1000},"detail":{"type":"string","maxLength":4000},"scope":{"type":"string","enum":["brand","project"]},"asset_kind":{"type":"string","enum":["character","product"]},"image_job_ids":{"type":"array","items":{"type":"string"},"maxItems":12},"project_id":{"type":"string","pattern":"^[A-Za-z0-9_-]{1,64}$","description":"Opaque per-chat project id: \"p-\" plus 6 random letters and digits. Every chat is a new project. Mint one on your first emero call and pass that SAME id on every call in this chat. Never mint a second one in the same chat, even for a new topic, campaign or subject. Only when the user asks to continue an earlier project, reuse its id from get_emero_brain's project list."},"project_name":{"type":"string","maxLength":80,"description":"Short human title for the project (2-5 words from the user request, e.g. \"Perfume ad campaign\"). Pass it on your first generate/ingest_url so the project is not left \"Untitled\". You may also rename at will later — pass an updated project_name (on a generate/ingest_url, or on set_settings with no other change) whenever the user asks, e.g. \"call this project cats\"."}},"required":["kind","title","summary"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false}},{"name":"manage_emero_brain","title":"Manage emero brain","description":"Change existing emero brain entries — ONLY when the user's latest message asked for it or reversed a decision, never on your own judgment. Pass the user's own words as user_request_quote. Actions: \"supersede\" (old_id → new_id: retire an entry in favour of one you just saved; the old one moves to History, linked to its replacement), \"delete\" (id, reason: soft-delete, the user can restore it), \"update\" (id, fields: edit title/summary/detail in place), \"rescope\" (id, scope: move between brand-wide and this project), \"find_conflicts\" (candidate: list active entries a planned entry may clash with; no quote needed). Ids come from get_emero_brain or a save result. A [locked] entry changes only when the user's words name it. Every change is logged and the user can undo it in the emero brain tab. load_skill(\"emero-brain\") first if you haven't.","inputSchema":{"type":"object","properties":{"action":{"type":"string","enum":["supersede","delete","update","find_conflicts","rescope"]},"user_request_quote":{"type":"string","maxLength":2000,"description":"REQUIRED for every action except find_conflicts: the user's OWN words from their latest message asking for this change, verbatim. For a [locked] entry, their words must name it."},"old_id":{"type":"string","format":"uuid","description":"supersede: the entry being replaced"},"new_id":{"type":"string","format":"uuid","description":"supersede: the already-saved replacement"},"id":{"type":"string","format":"uuid","description":"delete / update / rescope: the entry"},"fields":{"type":"object","properties":{"title":{"type":"string","minLength":1,"maxLength":160},"summary":{"type":"string","minLength":1,"maxLength":1000},"detail":{"type":"string","maxLength":4000}},"additionalProperties":false,"description":"update: only the fields to change"},"scope":{"type":"string","enum":["brand","project"],"description":"rescope: where it should apply"},"reason":{"type":"string","maxLength":500},"candidate":{"type":"object","properties":{"kind":{"type":"string","enum":["rule","preference","subject","decision","look"]},"title":{"type":"string","minLength":1,"maxLength":160},"summary":{"type":"string","minLength":1,"maxLength":1000},"detail":{"type":"string","maxLength":4000},"asset_kind":{"type":"string","enum":["character","product"]},"scope":{"$ref":"#/properties/scope"}},"required":["kind","title","summary"],"additionalProperties":false,"description":"find_conflicts: the entry you plan to save"},"project_id":{"type":"string","pattern":"^[A-Za-z0-9_-]{1,64}$","description":"Opaque per-chat project id: \"p-\" plus 6 random letters and digits. Every chat is a new project. Mint one on your first emero call and pass that SAME id on every call in this chat. Never mint a second one in the same chat, even for a new topic, campaign or subject. Only when the user asks to continue an earlier project, reuse its id from get_emero_brain's project list."}},"required":["action"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":false,"openWorldHint":false}},{"name":"get_pricelist","title":"Model price list","description":"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.","inputSchema":{"type":"object","properties":{"kind":{"type":"string","enum":["image","video","music","speech","edit"]},"model":{"type":"string"}},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}},{"name":"load_skill","title":"Load skill","description":"Load emero's guidance for a task before your first use of it (skill v140). 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.)","inputSchema":{"type":"object","properties":{"name":{"type":"string","minLength":1}},"required":["name"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}}],"resources":[],"prompts":[]}