{
  "generated_from": "internal/mcp/server.go defaultTools(), customer-visible tools only",
  "endpoint": "https://mcp.nolgia.ai/mcp",
  "count": 72,
  "groups": [
    {
      "id": "generate",
      "title": "Generate",
      "tools": [
        "nolgia_text_to_image",
        "nolgia_image_to_image",
        "nolgia_text_to_video",
        "nolgia_image_to_video",
        "nolgia_text_to_audio",
        "nolgia_run_preset",
        "nolgia_render_blocks",
        "nolgia_multicam_plan",
        "nolgia_multicam_start",
        "nolgia_multicam_run",
        "nolgia_multicam_download",
        "nolgia_multicam_cancel",
        "nolgia_generate_3d",
        "nolgia_generate_set",
        "nolgia_miroge_options",
        "nolgia_miroge"
      ]
    },
    {
      "id": "library",
      "title": "Your library",
      "tools": [
        "nolgia_list_assets",
        "nolgia_get_asset",
        "nolgia_delete_asset",
        "nolgia_update_asset_tags",
        "nolgia_upload_asset",
        "nolgia_list_characters",
        "nolgia_get_character",
        "nolgia_create_character",
        "nolgia_update_character",
        "nolgia_delete_character",
        "nolgia_list_styles",
        "nolgia_create_style",
        "nolgia_delete_style",
        "nolgia_transcribe_asset",
        "nolgia_get_transcript",
        "nolgia_suggest_clips",
        "nolgia_create_clips",
        "nolgia_get_set",
        "nolgia_get_miroge"
      ]
    },
    {
      "id": "projects",
      "title": "Projects",
      "tools": [
        "nolgia_list_projects",
        "nolgia_get_project",
        "nolgia_create_project",
        "nolgia_update_project",
        "nolgia_delete_project",
        "nolgia_add_project_assets",
        "nolgia_remove_project_asset",
        "nolgia_list_canvases",
        "nolgia_get_canvas",
        "nolgia_create_canvas",
        "nolgia_update_canvas"
      ]
    },
    {
      "id": "edits",
      "title": "Edit sessions and tweaks",
      "tools": [
        "nolgia_list_tweak_scopes",
        "nolgia_create_edit_session",
        "nolgia_get_edit_session",
        "nolgia_edit_session_step",
        "nolgia_revert_edit_session",
        "nolgia_estimate_edit_session"
      ]
    },
    {
      "id": "presets",
      "title": "Presets",
      "tools": [
        "nolgia_list_presets",
        "nolgia_get_preset"
      ]
    },
    {
      "id": "timeline",
      "title": "Timelines",
      "tools": [
        "nolgia_validate_mask",
        "nolgia_validate_motion",
        "nolgia_list_color_presets",
        "nolgia_get_render"
      ]
    },
    {
      "id": "apps",
      "title": "Desktop apps",
      "tools": [
        "nolgia_app_status",
        "nolgia_app_info",
        "nolgia_app_run",
        "nolgia_app_command",
        "nolgia_app_preview",
        "nolgia_app_import",
        "nolgia_app_export",
        "nolgia_app_save",
        "nolgia_app_open"
      ]
    },
    {
      "id": "account",
      "title": "Models, account and jobs",
      "tools": [
        "nolgia_list_models",
        "nolgia_get_account",
        "nolgia_get_usage",
        "nolgia_cancel_job",
        "nolgia_list_jobs"
      ]
    }
  ],
  "tools": [
    {
      "name": "nolgia_list_models",
      "title": "List models",
      "group": "account",
      "description": "List every model this account can generate with. Use this BEFORE choosing a model or passing any reference, quality, duration or aspect-ratio parameter: the catalog is the source of truth for both capabilities and pricing, and the generate tools reject anything outside the selected model's capabilities with a 400. Returns each model's catalog `id` (what a generate tool sends), modality, plan floor (`min_tier`), credit cost and its billing unit, per-quality-tier costs, aspect ratios, durations, and a `references` block naming the reference inputs it accepts (start_frame, end_frame, video_refs_max, element_refs_max, audio_refs_max, bitrate_modes). Read-only and free.",
      "read_only": true,
      "destructive": false,
      "open_world": false,
      "renders_ui": false
    },
    {
      "name": "nolgia_text_to_image",
      "title": "Generate image from text",
      "group": "generate",
      "description": "Generate a new image from a text prompt and save it to the account's library. Use this when the user wants a picture made from words alone; use nolgia_image_to_image instead whenever they supply a picture to work from, and nolgia_run_preset when they name a preset. Spends credits. Returns the finished image asset with a signed URL, plus the request id, the seed used and credits_charged (what this generation cost, from the account's ledger; absent when it could not be read).",
      "read_only": false,
      "destructive": false,
      "open_world": true,
      "renders_ui": true
    },
    {
      "name": "nolgia_image_to_image",
      "title": "Generate image from an image",
      "group": "generate",
      "description": "Generate an image from a text prompt PLUS one or more reference images: restyle a photo, edit part of it with a mask, or keep a subject consistent. Use this whenever the user supplies a picture to work from; for a saved NOLGIA character, fetch its reference URLs with nolgia_get_character and pass them here. Reference inputs are model-gated: gpt-image models and seedream-v5-pro take image_url plus image_urls, the other reference-capable models take a single image_url (see image.reference_images_max on nolgia_list_models). Spends credits. Returns the finished image asset with a signed URL and credits_charged (what this generation cost, from the account's ledger; absent when it could not be read).",
      "read_only": false,
      "destructive": false,
      "open_world": true,
      "renders_ui": true
    },
    {
      "name": "nolgia_text_to_video",
      "title": "Generate video from text",
      "group": "generate",
      "description": "Submit a video generation job from a text prompt, or from reference videos when video_asset_ids / video_urls are set. Use this when nothing pins the opening frame; use nolgia_image_to_video when the user supplies the first image. Every reference, quality and duration parameter is gated by the model's `references` block from nolgia_list_models and rejected with a 400 elsewhere. Spends credits and runs asynchronously: returns the QUEUED job with credits_charged (the credits taken at submit, from the account's ledger; a failed or canceled render is refunded), so poll nolgia_list_jobs until it reads succeeded, failed or canceled (canceled: its owner stopped it, and status_message says what was refunded).",
      "read_only": false,
      "destructive": false,
      "open_world": true,
      "renders_ui": true
    },
    {
      "name": "nolgia_image_to_video",
      "title": "Animate an image into video",
      "group": "generate",
      "description": "Submit a video generation job that starts from a supplied image: image_url is the first frame, and end_image_url / end_image_asset_id pin the last one on models publishing references.end_frame. Use this to animate a photo or an image you just generated. Parameters are gated per model, so check its references block with nolgia_list_models; unsupported ones are rejected with a 400. Spends credits and runs asynchronously: returns the QUEUED job with credits_charged (the credits taken at submit, from the account's ledger; a failed or canceled render is refunded), so poll nolgia_list_jobs until it reads succeeded, failed or canceled (canceled: its owner stopped it, and status_message says what was refunded).",
      "read_only": false,
      "destructive": false,
      "open_world": true,
      "renders_ui": true
    },
    {
      "name": "nolgia_text_to_audio",
      "title": "Generate audio from text",
      "group": "generate",
      "description": "Generate speech, music or a sound effect from a text prompt and save it to the account's library. Use this for voiceover, a soundtrack bed or an SFX cue; which one you get is decided by the model you pick, so check nolgia_list_models first. Spends credits. Returns the finished audio asset with a signed URL and credits_charged (what this generation cost, from the account's ledger; absent when it could not be read).",
      "read_only": false,
      "destructive": false,
      "open_world": true,
      "renders_ui": true
    },
    {
      "name": "nolgia_list_assets",
      "title": "List generated assets",
      "group": "library",
      "description": "List the images, videos and audio this account has generated or uploaded, newest first. Use this to find work the user made earlier, narrowing by search, modality, tag or project_id rather than regenerating something they already have. `search` matches the name, the prompt or the model, `tag` is exact, and both filter the WHOLE library rather than the page in hand. Returns a page of assets with freshly signed URLs and a next_cursor to continue. Read-only.\n\nTHIS TOOL ALONE ANSWERS a question about the person's library. Do not follow it with nolgia_list_projects or nolgia_list_characters to check whether there is more. On a host that draws cards, call it once and STOP. In a text-only client, follow next_cursor with subsequent calls to this tool when more matching assets are needed to answer the request; stop when next_cursor is absent or the request is satisfied. A library question is about their FILES; those other tools answer different questions, how work is grouped and which faces are saved, that nobody asked.\n\nWHEN YOUR HOST DISPLAYS THIS SERVER'S CARDS (ChatGPT does; a plain text client does not), the result renders as a GRID of the person's own media: the thumbnail, the name they gave it and its tags, filterable by images, video and audio, and tapping one asks to use that asset. They recognise their own work by looking at it, so do not read the list back as names and ids. Say what is there in a sentence and let them point. In a text-only client, where nothing is drawn, describe the assets in text, because an id alone is not something a person can act on.",
      "read_only": true,
      "destructive": false,
      "open_world": false,
      "renders_ui": true
    },
    {
      "name": "nolgia_get_asset",
      "title": "Open an asset",
      "group": "library",
      "description": "Open one saved asset by id in its media card with inline video/audio playback or an image preview and a download action. Use this to show a completed generation or an existing library item; find the id with nolgia_list_assets first if needed. Returns metadata and a fresh signed media URL. Omit disposition for playback; use disposition=attachment only for a file download. In widget-capable hosts, prefer the card's playback and download controls. Do not alter or add query parameters to signed URLs: that invalidates the signature. Read-only.",
      "read_only": true,
      "destructive": false,
      "open_world": false,
      "renders_ui": true
    },
    {
      "name": "nolgia_delete_asset",
      "title": "Trash an asset",
      "group": "library",
      "description": "Move one asset to the trash. Use this only when the user asks to delete a specific piece of work, never to tidy up on your own. Trashed assets leave every listing and can be restored from the web Library's Trash view for 30 days, after which they are purged permanently. Returns {deleted: true}.",
      "read_only": false,
      "destructive": true,
      "open_world": false,
      "renders_ui": false
    },
    {
      "name": "nolgia_update_asset_tags",
      "title": "Set an asset's tags",
      "group": "library",
      "description": "Replace an asset's whole tag set. Use this to label work ('hero', 'draft', 'client-a') so nolgia_list_assets can filter to it later. Pass the tags the asset should END with, not the ones to add: this overwrites, so read the current tags first if you mean to keep them, and pass [] to clear them all. Returns the updated asset.",
      "read_only": false,
      "destructive": false,
      "open_world": false,
      "renders_ui": false
    },
    {
      "name": "nolgia_upload_asset",
      "title": "Upload an image",
      "group": "library",
      "description": "Store an image the user supplied as an asset in their NOLGIA library, so it can be used as a reference by the other tools. Use this when the user attaches or pastes a picture (a logo, a product photo, a screenshot) that does not exist in NOLGIA yet; use nolgia_list_assets instead when the picture is already theirs. PNG, JPEG and WebP up to about 3 MB; larger media goes through the web app or the nolgia CLI. Returns the stored asset, whose id feeds an intake answer or nolgia_run_preset and whose signed_url feeds image_url.",
      "read_only": false,
      "destructive": false,
      "open_world": false,
      "renders_ui": false
    },
    {
      "name": "nolgia_list_characters",
      "title": "List saved characters",
      "group": "library",
      "description": "List the account's saved characters: reusable named subjects (a person, a mascot, a creature) carrying up to 8 reference images each. Use this first whenever the user names a recurring subject, so the next generation matches the last one instead of inventing a new face. Returns each character with its reference assets. Read-only.",
      "read_only": true,
      "destructive": false,
      "open_world": false,
      "renders_ui": true
    },
    {
      "name": "nolgia_get_character",
      "title": "Get one character",
      "group": "library",
      "description": "Fetch one character with freshly signed URLs for its reference images. Use this right before generating: pass those URLs as image_url / image_urls to nolgia_image_to_image, or as the start frame for nolgia_image_to_video, to keep the subject consistent. Returns the character, its ordered reference assets and identity verdicts; readiness is ready when the main reference shows one face front-on. Read-only. The face identity check (identity_score on renders) runs only once the user has confirmed consent for the character's photos in the NOLGIA app or CLI; you cannot give that consent, so when face_check.needs_consent is true tell the user to confirm it on the Characters page. Without it the photos are still used as references.",
      "read_only": true,
      "destructive": false,
      "open_world": false,
      "renders_ui": false
    },
    {
      "name": "nolgia_create_character",
      "title": "Save a character",
      "group": "library",
      "description": "Save a reusable character so later generations depict the same subject. Use this when the user wants a recurring person, mascot or creature rather than a one-off picture. The reference images must already exist as image assets, so generate or list them first and pass up to 8 of their ids in display order. Returns the created character; readiness is ready when the main reference shows one face front-on. The face identity check (identity_score on renders) runs only once the user has confirmed consent for the character's photos in the NOLGIA app or CLI; you cannot give that consent, so when face_check.needs_consent is true tell the user to confirm it on the Characters page. Without it the photos are still used as references.",
      "read_only": false,
      "destructive": false,
      "open_world": false,
      "renders_ui": false
    },
    {
      "name": "nolgia_update_character",
      "title": "Update a character",
      "group": "library",
      "description": "Update a saved character's name, description or reference images (up to 8), primary reference and preferred models. Partial: only the fields you pass change. reference_asset_ids, when passed, REPLACES the whole reference set rather than appending to it, so include the ids you want to keep. Returns the updated character. The face identity check (identity_score on renders) runs only once the user has confirmed consent for the character's photos in the NOLGIA app or CLI; you cannot give that consent, so when face_check.needs_consent is true tell the user to confirm it on the Characters page. Without it the photos are still used as references.",
      "read_only": false,
      "destructive": false,
      "open_world": false,
      "renders_ui": false
    },
    {
      "name": "nolgia_delete_character",
      "title": "Delete a character",
      "group": "library",
      "description": "Delete a saved character. Use this only on an explicit request. The character's reference image assets are kept and are not deleted with it. Returns {deleted: true}.",
      "read_only": false,
      "destructive": true,
      "open_world": false,
      "renders_ui": false
    },
    {
      "name": "nolgia_list_projects",
      "title": "List projects",
      "group": "projects",
      "description": "List the account's projects: named groups of assets, where one asset may sit in several. Use this to see how the user already organizes work by client, campaign or scene before filing anything new. Returns each project with its current asset count. Read-only.",
      "read_only": true,
      "destructive": false,
      "open_world": false,
      "renders_ui": false
    },
    {
      "name": "nolgia_get_project",
      "title": "Get one project",
      "group": "projects",
      "description": "Fetch one project by id, including its current asset count. Use this to confirm a project exists before passing its id as project_id on a generation. Read-only.",
      "read_only": true,
      "destructive": false,
      "open_world": false,
      "renders_ui": false
    },
    {
      "name": "nolgia_create_project",
      "title": "Create a project",
      "group": "projects",
      "description": "Create a project to group related assets, typically one per campaign, client or scene. Use this before a batch of generations, so each one can be filed with project_id as it is made instead of being sorted out afterwards. Returns the created project.",
      "read_only": false,
      "destructive": false,
      "open_world": false,
      "renders_ui": false
    },
    {
      "name": "nolgia_update_project",
      "title": "Update a project",
      "group": "projects",
      "description": "Rename a project or change its description. Partial: only the fields you pass change. Returns the updated project.",
      "read_only": false,
      "destructive": false,
      "open_world": false,
      "renders_ui": false
    },
    {
      "name": "nolgia_delete_project",
      "title": "Delete a project",
      "group": "projects",
      "description": "Delete a project. Use this only on an explicit request. The grouping goes; the member assets are never deleted with it. Returns {deleted: true}.",
      "read_only": false,
      "destructive": true,
      "open_world": false,
      "renders_ui": false
    },
    {
      "name": "nolgia_add_project_assets",
      "title": "Add assets to a project",
      "group": "projects",
      "description": "File existing assets into a project, up to 100 per call. Use this for work generated before the project existed. The assets must belong to the caller, and ones already in the project are skipped, so repeating the call is safe. Returns {added: true}.",
      "read_only": false,
      "destructive": false,
      "open_world": false,
      "renders_ui": false
    },
    {
      "name": "nolgia_remove_project_asset",
      "title": "Remove an asset from a project",
      "group": "projects",
      "description": "Take one asset out of a project without deleting the asset itself. Use this to re-file work; removing an asset that is not a member is a no-op. Returns {removed: true}.",
      "read_only": false,
      "destructive": false,
      "open_world": false,
      "renders_ui": false
    },
    {
      "name": "nolgia_get_account",
      "title": "Get the signed-in account",
      "group": "account",
      "description": "Get the signed-in account's id and email, and its credit balance. Use this to confirm which NOLGIA account this credential belongs to before acting on the user's behalf, and to answer \"how many credits do I have\" or estimate whether a generation is affordable: `credits.available` is what this credential can spend and `credits.channel` names its pool rule (`app`: subscription credits first, then top-up credits, which is how the app, the NOLGIA Agent, organization keys and connected assistants such as ChatGPT or Claude spend; `api`: top-up credits only, a personal access token the user created). `credits.available_for_app` and `credits.available_for_api` are the two channel figures. `credits.total` is the billing-page balance. When `credits.scope` is `organization`, these are shared organization balances, further limited by `member_budget` minus `member_spent_this_month` when a budget is present (zero means no remaining budget). A balance is not a guarantee that generation will be authorized. `credits` is absent, rather than zero, when the balance could not be read. Read-only and free.",
      "read_only": true,
      "destructive": false,
      "open_world": false,
      "renders_ui": false
    },
    {
      "name": "nolgia_get_usage",
      "title": "Get generation counts",
      "group": "account",
      "description": "Get this account's generation counts, split into images, videos and audio. Use this when the user asks how much they have made. It reports counts, not a credit balance or an invoice. Read-only.",
      "read_only": true,
      "destructive": false,
      "open_world": false,
      "renders_ui": false
    },
    {
      "name": "nolgia_cancel_job",
      "title": "Cancel a generation job",
      "group": "account",
      "description": "Cancel a queued or running generation job so it stops at the model provider where the provider allows it and is never added to the library. Use this only when the user asks to stop or cancel a generation. A job that had not reached the provider yet is refunded in full. For a started render the result says what the provider did: `cancellation.provider_cancel` is cancelled (stopped before it started, refunded), stopped_partway (the rendered share charged, the rest refunded), or requested/refused/unsupported/failed, in which case `cancellation.settlement` stays pending until the provider's final answer: refunded if it stops or fails without billing, charged if it finishes. Tell the user `cancellation.message` as written; never promise a refund the result does not show. A finished job cannot be canceled (the tool reports it). Canceling twice returns the same result. Returns {job_id, status, cancellation}.",
      "read_only": false,
      "destructive": true,
      "open_world": false,
      "renders_ui": false
    },
    {
      "name": "nolgia_list_jobs",
      "title": "List generation jobs",
      "group": "account",
      "description": "List asynchronous generation jobs newest first, optionally filtered by status or modality. Use this to poll a video job submitted by nolgia_text_to_video, nolgia_image_to_video or nolgia_run_preset until it reads succeeded, failed or canceled, then fetch a succeeded job's result with nolgia_list_assets. Canceled means its owner stopped it: nothing is delivered, and status_message says what was refunded. Returns a page of jobs with status and a next_cursor. Read-only.",
      "read_only": true,
      "destructive": false,
      "open_world": false,
      "renders_ui": false
    },
    {
      "name": "nolgia_list_presets",
      "title": "List presets",
      "group": "presets",
      "description": "List the NOLGIA preset catalog: outcome-named recipes (\"Logo design\", \"Product photo\", \"Explainer video\") that already know the prompt, the model and the questions to ask. Use this to offer the user a proven starting point instead of assembling a prompt from scratch, then read one with nolgia_get_preset and run it with nolgia_run_preset. Returns each preset's slug, name, description, what it is best for, output type, thumbnail, rough time and credit estimate, whether it asks guided questions, and its family shape: a parent lists its directions, a direction names its parent. A preset with `runs_in` is a Film assistant workflow for a desktop app on the person's own computer (Blender and others): running it is free and returns written instructions to carry out in that app. Read-only and free.\n\nCALL THIS ONCE. It takes no arguments and returns the ENTIRE catalog in one response: there is no pagination, no filter and no second page, so calling it again returns byte-identical data and, on hosts that display it, renders a second, duplicate gallery to the person.\n\nWHEN YOUR HOST DISPLAYS THIS SERVER'S CARDS (ChatGPT does, and any MCP Apps host; a plain text client does not), the person can already see a scrollable gallery of cards with artwork, each preset's own description, its credit range and its direction count, and they can filter it and open any card themselves. In that case, do NOT transcribe the catalog into your reply: listing the names in prose duplicates what is on their screen and buries it. Say what the catalog covers in a sentence, name at most three that fit what they asked for, and ask which one they want. In a text-only client, where nothing is drawn, use the returned catalog to answer in text, including the full list when requested; the three-suggestion limit does not apply. Reuse the same result rather than calling again.",
      "read_only": true,
      "destructive": false,
      "open_world": false,
      "renders_ui": true
    },
    {
      "name": "nolgia_get_preset",
      "title": "Get one preset",
      "group": "presets",
      "description": "Fetch one preset in full: what it makes and who it is for, the long description and use cases, worked EXAMPLES with playable image and video URLs you can show the user, its directions (children) or the family it belongs to, and the guided questions it asks, with the credit cost of one run. A SLUG IS ALL THIS NEEDS: when you already have the exact slug from a prior catalog result, a card the person tapped, or a slug they supplied, call this DIRECTLY without calling nolgia_list_presets again. If you only know the display name, resolve its slug from a prior catalog result or call nolgia_list_presets if none is available. Never guess a slug from a display name. Use the catalog also when the person has not chosen a preset. Returns the preset, its examples and its intake steps with each step's allowed answers. A Film assistant preset (one with `runs_in`) asks no questions: its detail carries the workflow as `instructions` and the `starter_prompt`. Read-only and free.\n\nWHEN YOUR HOST DISPLAYS THIS SERVER'S CARDS (ChatGPT does; a plain text client does not), the person can already see the result, and for a guided preset the card ASKS THE QUESTIONS ITSELF: it renders the examples, the directions and a form with a field, chips or a picker over their own library for every step, and a button that sends the answers. In that case, do not ask those same questions in prose. Point at the card, say what it needs in a sentence, and let them fill it in. Ask in the conversation only when the card says to, which is when a step needs something it cannot draw. In a text-only client, explain the preset in text and collect the required intake answers in conversation, using each step's allowed answers, before calling nolgia_run_preset.",
      "read_only": true,
      "destructive": false,
      "open_world": false,
      "renders_ui": true
    },
    {
      "name": "nolgia_run_preset",
      "title": "Run a preset",
      "group": "generate",
      "description": "Run a catalog preset end to end: validates one answer per intake step against the preset's schema, then calls the preset's own generation endpoint with the answers bound exactly as the NOLGIA web app binds them (the baked prompt with its labelled slots filled, the chosen option chips, and each asset id on the field its step names). Use this whenever the user picks a preset by name rather than describing raw generation parameters; read the questions first with nolgia_get_preset, and pass dry_run to preview the request without generating (assemble may still charge 1 credit). Presets whose submit kind is `agent` are productions of several shots on a timeline: this pass never opens an agent session, so it always returns the fenced intake brief to hand to NOLGIA Agent, and where the preset declares one it ALSO renders the single representative scene of that production so the user has something to watch now. Say plainly that the scene is one shot and not the finished piece, which `note` gives you wording for; pass brief_only to skip rendering it. A Film assistant preset (one with `runs_in`) generates nothing and charges nothing: it returns the workflow to carry out in that desktop app on the person's computer through the NOLGIA app tools, starting with the step it names (check the app is connected). Spends credits on a generate preset and on an agent preset's scene. Returns the finished asset (image and audio) or the queued job (video), alongside the request that was sent.",
      "read_only": false,
      "destructive": false,
      "open_world": true,
      "renders_ui": true
    },
    {
      "name": "nolgia_validate_mask",
      "title": "Validate a timeline mask",
      "group": "timeline",
      "description": "Check a Studio timeline MASK (an Adobe Premiere-style per-clip Opacity mask) and report exactly what the platform would clamp or drop. Use it on every data-mask / overlay `mask` you author BEFORE pushing it, so a silently dropped field does not surface as a wrong render. A mask is a sparse JSON object: shape ('rectangle' default | 'ellipse' | 'polygon'), x/y (shape CENTER, % of the clip box, -100..200, default 50), width/height (% of the clip box, 0..200, default 100), rotation (degrees clockwise, -180..180), cornerRadius (px, rectangle only, 0..500), points ([[x,y],...] 3..64 vertices, polygon only), feather (edge softness px 0..500), expansion (grow/shrink px -500..500), opacity (0..100, how strongly the OUTSIDE is hidden), inverted (bool: hide the inside instead). Masks attach as data-mask='\u003cjson\u003e' on a timed \u003cvideo\u003e/\u003cimg\u003e element or as elements.\u003ckey\u003e.mask / additions[].mask in nolgia-edits.json ({} clears an authored mask). Stateless, free and read-only. Returns {mask: canonical sparse mask | null, identity: bool, problems: [{path, message}]}.",
      "read_only": true,
      "destructive": false,
      "open_world": false,
      "renders_ui": false
    },
    {
      "name": "nolgia_validate_motion",
      "title": "Validate timeline motion",
      "group": "timeline",
      "description": "Check a Studio timeline MOTION (Adobe Premiere-style per-clip Motion: position, scale, rotation, opacity, anchor, with keyframes) and report exactly what the platform would clamp or drop. Use it on every overlay `motion` you author BEFORE pushing it. A motion is a sparse JSON object: x/y (where the clip's ANCHOR lands, % of the canvas, -100..200, default 50/50), scale (uniform, 1 = fit-to-frame, 0..10), scaleX/scaleY (per-axis multipliers on top of scale, 0..10, default 1), rotation (degrees clockwise about the anchor, -360..360), opacity (0..100, default 100), anchor {x, y} (the transform origin, % of the CLIP BOX, default 50/50 = center; a constant only). Every property except anchor is a CONSTANT number or a KEYFRAME LIST [{t, v, ease}, ...]: t = seconds from the CLIP START on the timeline (srcOffset does not move it; any finite number, full precision, a frame-snapped keyframe is exactly frame/fps), v = the value in that property's units and range (clamped and rounded like a constant), ease = the curve of the segment STARTING at that keyframe, one of linear | ease-in | ease-out | ease-in-out | hold (the CSS cubic-bezier eases; hold keeps the value and steps at the next keyframe; missing or unknown reads as linear; the last keyframe's ease is carried but unused). Before the first keyframe the first v holds, after the last the last v holds; lists sort by t and a duplicate t keeps the later entry; a one-keyframe list is kept (the stopwatch-on state) and acts as the constant v. Example: {\"x\": [{\"t\": 0, \"v\": 20, \"ease\": \"ease-in-out\"}, {\"t\": 1.5, \"v\": 80, \"ease\": \"linear\"}], \"opacity\": [{\"t\": 0, \"v\": 0, \"ease\": \"ease-out\"}, {\"t\": 0.5, \"v\": 100, \"ease\": \"linear\"}]}. The Studio preview samples per frame and the export samples at the export frame rate with the same curves, so the MP4 matches the editor. Transform order: fit to frame, scale about the anchor, rotate about the anchor, place the anchor at x/y, then opacity; the clip's mask moves with it. Motion lives ONLY in nolgia-edits.json (elements.\u003ckey\u003e.motion / additions[].motion, object-level replacement; {} resets to the default placement); there is no data-motion attribute, so never --clear-edits a composition whose motion you have not re-authored. Video and image clips only: text clips are placed by textStyle (x/y/rotation/opacity), a motion on text is ignored with a warning. Stateless, free and read-only. Returns {motion: canonical sparse motion | null (keyframe lists sorted and clamped, every keyframe with an explicit ease), identity: bool, problems: [{path, message}]} where a keyframe problem path reads like scale[2].v.",
      "read_only": true,
      "destructive": false,
      "open_world": false,
      "renders_ui": false
    },
    {
      "name": "nolgia_list_color_presets",
      "title": "List color-grade presets",
      "group": "timeline",
      "description": "List the built-in color-grade presets (LUT looks) a Studio composition can apply. Use this before writing a colorGrade on a composition element or canvas, so the `preset` slug you set is one that actually exists. Returns the catalog version and each preset's slug, name and description. Read-only.",
      "read_only": true,
      "destructive": false,
      "open_world": false,
      "renders_ui": false
    },
    {
      "name": "nolgia_render_blocks",
      "title": "Assemble clips and narration into one video",
      "group": "generate",
      "description": "Assemble one finished MP4 from ordered clip and narration pairs, one fixed-length block per pair (block_seconds, default 10). Use this to cut a narrated explainer or story together after every narration take and clip exists, instead of hand-placing clips on a timeline. Centers a shorter take, speeds up a longer one with pitch-preserving atempo up to 1.25x, and refuses a longer one with a 400 naming the pair. Trims or holds each clip to its block and mutes clip audio unless keep_video_audio is true. aspect_ratio supports 16:9, 9:16 and 1:1. Up to 60 blocks and 600 seconds. Creates a composition that carries the render, costs no credits, and returns the QUEUED render: poll nolgia_get_render until succeeded (asset_id is the MP4, fetch it with nolgia_get_asset) or failed (error names the reason).",
      "read_only": false,
      "destructive": false,
      "open_world": false,
      "renders_ui": false
    },
    {
      "name": "nolgia_get_render",
      "title": "Check a render",
      "group": "timeline",
      "description": "Read a render and its status. Poll until succeeded, then asset_id names the output MP4, or failed, when error explains the reason. Read-only and free.",
      "read_only": true,
      "destructive": false,
      "open_world": false,
      "renders_ui": false
    },
    {
      "name": "nolgia_list_tweak_scopes",
      "title": "List image tweak scopes",
      "group": "edits",
      "description": "List measured, narrow image tweaks with their allowed models and route. Includes known-unavailable scopes and their measured reasons; do not offer unavailable scopes. Use scope and detail on nolgia_edit_session_step when the customer wants one local change. Read-only and free.",
      "read_only": true,
      "destructive": false,
      "open_world": false,
      "renders_ui": false
    },
    {
      "name": "nolgia_list_styles",
      "title": "List saved styles",
      "group": "library",
      "description": "List the account's saved styles: reusable looks, each a name, a prompt fragment and up to four reference images, with an optional model hint. Use this before generating when the user mentions their usual look, house style or a style they saved, then pass the style's id as style_id on nolgia_text_to_image, nolgia_image_to_image or nolgia_edit_session_step. Read-only and free.",
      "read_only": true,
      "destructive": false,
      "open_world": false,
      "renders_ui": false
    },
    {
      "name": "nolgia_create_style",
      "title": "Save a style",
      "group": "library",
      "description": "Save a look the user wants to reuse: a short name, a prompt fragment describing the style (lighting, palette, medium, mood, never the subject), up to four reference image asset ids in display order, and an optional model_hint naming the image model it renders best on. Use this when the user says they want to keep or reuse a look; the assets must already exist (generate or upload them first). Returns the saved style. Costs no credits.",
      "read_only": false,
      "destructive": false,
      "open_world": false,
      "renders_ui": false
    },
    {
      "name": "nolgia_delete_style",
      "title": "Delete a saved style",
      "group": "library",
      "description": "Delete a saved style. Use this only on an explicit request. Its reference image assets are kept. Costs no credits and returns deleted: true.",
      "read_only": false,
      "destructive": true,
      "open_world": false,
      "renders_ui": false
    },
    {
      "name": "nolgia_create_edit_session",
      "title": "Start an edit session",
      "group": "edits",
      "description": "Start a chained edit session on one image asset in the user's library, so later edits build on each other instead of starting over. Use this when the user wants to keep editing one picture step by step. Returns the session with the source as its head; then call nolgia_edit_session_step for each change. Costs no credits.",
      "read_only": false,
      "destructive": false,
      "open_world": false,
      "renders_ui": false
    },
    {
      "name": "nolgia_get_edit_session",
      "title": "Read an edit session",
      "group": "edits",
      "description": "Read an edit session: its source image, every step with its prompt, status and output asset, which step is the head, and chain_credits, the credits spent on the chain so far. Read-only and free.",
      "read_only": true,
      "destructive": false,
      "open_world": false,
      "renders_ui": false
    },
    {
      "name": "nolgia_edit_session_step",
      "title": "Apply the next image edit",
      "group": "edits",
      "description": "Prefer a scoped tweak over a regenerate when the customer's complaint is local. List nolgia_list_tweak_scopes, then pass an available scope and detail without prompt: the server composes the prompt, applies the measured route and defaults to the scope's first allowed model. Inpaint scopes require mask_asset_id; edit scopes use no mask. Otherwise, apply one edit to the session's current head image: the head rides as the single reference of an image edit on model (default: the style's model hint, else the previous step's model, else gpt-image-2) with your prompt, and the result becomes the new head. Spends credits exactly like nolgia_image_to_image. Optional style_id applies a saved style only to unscoped generation and cannot be combined with scope: its prompt fragment and reference images would break the scoped prompt and picked-render-only image input guarantee. Waits for the render and returns the updated session (steps, head, chain_credits); if the render is still running after the wait, the returned step reads queued or running, so read the session again with nolgia_get_edit_session. Refuses with a conflict while the previous step is still generating or after it failed: revert to an earlier step first.",
      "read_only": false,
      "destructive": false,
      "open_world": true,
      "renders_ui": false
    },
    {
      "name": "nolgia_revert_edit_session",
      "title": "Revert an edit session",
      "group": "edits",
      "description": "Move the session's head back to an earlier step, or to the source image when step_id is omitted. Nothing is deleted: every step and its output stay in the library and the history. The next nolgia_edit_session_step edits from the new head. Costs no credits and returns the updated session.",
      "read_only": false,
      "destructive": false,
      "open_world": false,
      "renders_ui": false
    },
    {
      "name": "nolgia_estimate_edit_session",
      "title": "Estimate the next edit",
      "group": "edits",
      "description": "Estimate the cost of the next edit step (next_step_credits, priced by the API for the given or default model, quality and render_quality) and the credits the chain has spent so far (chain_credits). Read-only and free; nothing is generated.",
      "read_only": true,
      "destructive": false,
      "open_world": false,
      "renders_ui": false
    },
    {
      "name": "nolgia_transcribe_asset",
      "title": "Transcribe an asset",
      "group": "library",
      "description": "Transcribe a video or audio asset into text with pause-aligned timestamps. Spends 1 credit per started minute of measured audio when speech is sent to the model, up to 60 minutes. This call can take a minute or two. Returns an existing ready transcript unless force is true.",
      "read_only": false,
      "destructive": false,
      "open_world": true,
      "renders_ui": false
    },
    {
      "name": "nolgia_get_transcript",
      "title": "Get an asset transcript",
      "group": "library",
      "description": "Read a saved asset transcript as JSON, SRT or WebVTT. Free and read-only. Subtitle formats return an object with format and content fields.",
      "read_only": true,
      "destructive": false,
      "open_world": false,
      "renders_ui": false
    },
    {
      "name": "nolgia_suggest_clips",
      "title": "Find short video clips",
      "group": "library",
      "description": "Find strong standalone moments to post as vertical shorts. Transcribe the video with nolgia_transcribe_asset first. Spends about 1 credit. Returns ranked start and end times, titles and hook reasons, ready for nolgia_create_clips.",
      "read_only": false,
      "destructive": false,
      "open_world": true,
      "renders_ui": false
    },
    {
      "name": "nolgia_create_clips",
      "title": "Create short video clips",
      "group": "library",
      "description": "Cut chosen video ranges into new clips, with a centered 9:16 crop or the original aspect ratio. Renders in the background without spending credits. Each clip returns a render id; its finished video asset appears in the library. Use nolgia_list_assets to find finished clips.",
      "read_only": false,
      "destructive": false,
      "open_world": false,
      "renders_ui": false
    },
    {
      "name": "nolgia_list_canvases",
      "title": "List canvases",
      "group": "projects",
      "description": "List canvas summaries, including version and node_count, optionally filtered by project_id. A canvas is a node graph production plan for one project, built by the web editor and the NOLGIA Agent. Building a canvas does NOT run anything or spend credits. The customer runs it from the canvas in the web app, where each run shows its credit quote first and calls the ordinary generate endpoints. Use the generate tools directly when the person just wants one result now.",
      "read_only": true,
      "destructive": false,
      "open_world": false,
      "renders_ui": false
    },
    {
      "name": "nolgia_get_canvas",
      "title": "Get a canvas",
      "group": "projects",
      "description": "Get the full canvas including graph and version. Read before editing; pass the version you last read to nolgia_update_canvas. A canvas is a node graph production plan for one project, built by the web editor and the NOLGIA Agent. Building a canvas does NOT run anything or spend credits. The customer runs it from the canvas in the web app, where each run shows its credit quote first and calls the ordinary generate endpoints. Use the generate tools directly when the person just wants one result now.",
      "read_only": true,
      "destructive": false,
      "open_world": false,
      "renders_ui": false
    },
    {
      "name": "nolgia_create_canvas",
      "title": "Create a canvas",
      "group": "projects",
      "description": "Create a canvas in a project. Omit graph for an empty canvas. Returns the created canvas. A canvas is a node graph production plan for one project, built by the web editor and the NOLGIA Agent. Building a canvas does NOT run anything or spend credits. The customer runs it from the canvas in the web app, where each run shows its credit quote first and calls the ordinary generate endpoints. Use the generate tools directly when the person just wants one result now. Graph {schema_version:1,nodes:[],edges:[],viewport?:{x,y,zoom}}. Maximum 150 nodes and 300 edges, acyclic. Nodes are {id,type,position:{x,y},data:{...}}; ids use 1 to 64 letters, digits, underscores or hyphens. Positions are canvas pixels; lay nodes left to right in run order about 320 px apart. All nodes accept data.label (80 characters). Data by type: prompt takes text (4000 characters); character takes optional character_id UUID; asset takes optional asset_id UUID and required media_type image|video|audio; image_generate, video_generate, audio_generate take optional model, inline prompt (4000 characters), params; output takes only label. Generate model must be a catalog id from nolgia_list_models for that modality. Params holds scalar request fields such as aspect_ratio, duration_seconds, quality, resolution, generate_audio (at most 24 keys, string/finite number/bool only); never put model, prompt or project_id in params. Do not set run, the editor writes it. Ports: prompt has no inputs, output text:text; character has no inputs, output image:image; asset has no inputs, its ONE output port is named by media_type and carries that type. image_generate inputs prompt:text max 1, references:image max 8; output image:image. video_generate inputs prompt:text max 1, start_frame:image max 1, end_frame:image max 1, references:image max 9, video_references:video max 10, audio_references:audio max 10; output video:video. audio_generate input prompt:text max 1; output audio:audio. output input media:image|video|audio max 50, no outputs. Edges are {id,source,source_handle,target,target_handle,type}; type equals the source port's type and must be accepted by the target port. No duplicate edges or self loops.",
      "read_only": false,
      "destructive": false,
      "open_world": false,
      "renders_ui": false
    },
    {
      "name": "nolgia_update_canvas",
      "title": "Update a canvas",
      "group": "projects",
      "description": "Update a canvas name or replace its whole graph when given. Optimistic concurrency: pass the version you last read; a stale version is refused, so re-read with nolgia_get_canvas and reapply your edit. Returns the updated canvas. A canvas is a node graph production plan for one project, built by the web editor and the NOLGIA Agent. Building a canvas does NOT run anything or spend credits. The customer runs it from the canvas in the web app, where each run shows its credit quote first and calls the ordinary generate endpoints. Use the generate tools directly when the person just wants one result now. Graph {schema_version:1,nodes:[],edges:[],viewport?:{x,y,zoom}}. Maximum 150 nodes and 300 edges, acyclic. Nodes are {id,type,position:{x,y},data:{...}}; ids use 1 to 64 letters, digits, underscores or hyphens. Positions are canvas pixels; lay nodes left to right in run order about 320 px apart. All nodes accept data.label (80 characters). Data by type: prompt takes text (4000 characters); character takes optional character_id UUID; asset takes optional asset_id UUID and required media_type image|video|audio; image_generate, video_generate, audio_generate take optional model, inline prompt (4000 characters), params; output takes only label. Generate model must be a catalog id from nolgia_list_models for that modality. Params holds scalar request fields such as aspect_ratio, duration_seconds, quality, resolution, generate_audio (at most 24 keys, string/finite number/bool only); never put model, prompt or project_id in params. Do not set run, the editor writes it. Ports: prompt has no inputs, output text:text; character has no inputs, output image:image; asset has no inputs, its ONE output port is named by media_type and carries that type. image_generate inputs prompt:text max 1, references:image max 8; output image:image. video_generate inputs prompt:text max 1, start_frame:image max 1, end_frame:image max 1, references:image max 9, video_references:video max 10, audio_references:audio max 10; output video:video. audio_generate input prompt:text max 1; output audio:audio. output input media:image|video|audio max 50, no outputs. Edges are {id,source,source_handle,target,target_handle,type}; type equals the source port's type and must be accepted by the target port. No duplicate edges or self loops.",
      "read_only": false,
      "destructive": false,
      "open_world": false,
      "renders_ui": false
    },
    {
      "name": "nolgia_multicam_plan",
      "title": "Plan a Multicam job",
      "group": "generate",
      "description": "Multicam turns one locked-off take (a video in the person's library, up to 2 minutes, shot from one fixed camera) into every chosen camera angle, each a full-length clip in sync over the take's own sound, plus a free highlight edit cut between the angles, a Studio timeline with every angle stacked, and a ZIP of every clip. This plans one: it reads the take, lists the angles it can have (grouped by how close, where the camera is and how it moves; on a take with no clear person the angles that need one are hidden and some are marked experimental), the ready-made packs, the highlight edit's cut list and the exact credit price with the person's balance. Free and read-only: nothing is rendered or charged. Pass pack, angles or custom_angles to price a choice; with none, the Auto pack is priced as a suggestion. Where the host shows this server's cards, the plan is a picker the person chooses from, so do not read the angle list back. Start the job with nolgia_multicam_start with the same choice, only once the person agrees to the price.",
      "read_only": true,
      "destructive": false,
      "open_world": false,
      "renders_ui": true
    },
    {
      "name": "nolgia_multicam_start",
      "title": "Start a Multicam job",
      "group": "generate",
      "description": "Multicam turns one locked-off take (a video in the person's library, up to 2 minutes, shot from one fixed camera) into every chosen camera angle, each a full-length clip in sync over the take's own sound, plus a free highlight edit cut between the angles, a Studio timeline with every angle stacked, and a ZIP of every clip. This starts one and spends credits: the job is priced first (the price nolgia_multicam_plan shows) and started at exactly that price, and when the balance does not cover it nothing starts. Call it only after the person has chosen the angles and accepted the price, with the same take_asset_id, pack, angles, custom_angles, quality, generate_audio and notes as the plan. Up to 16 angles. Each angle renders over the whole take, usually in a few minutes, and the job keeps going after the chat moves on. Returns the job's card; nolgia_multicam_run checks its progress.",
      "read_only": false,
      "destructive": false,
      "open_world": true,
      "renders_ui": true
    },
    {
      "name": "nolgia_multicam_run",
      "title": "Check a Multicam job",
      "group": "generate",
      "description": "Read a Multicam job: its status (running, finished or canceled), each angle's state with its clip and poster once ready, the highlight edit, the Studio timeline and the credits agreed. Free and read-only. While status is running, check again every half minute or so rather than in a tight loop. Clip links are signed and expire; read the job again for fresh ones.",
      "read_only": true,
      "destructive": false,
      "open_world": false,
      "renders_ui": true
    },
    {
      "name": "nolgia_multicam_download",
      "title": "Download every Multicam angle",
      "group": "generate",
      "description": "Get one ZIP of a Multicam job: the original take and every finished angle's clip, named by angle (00-original-take.mp4, 01-wide.mp4 and so on). Returns a short-lived download link with the file list and size. Free, and it changes nothing in the job or the library: the ZIP is packed once and the same file is handed out again until an angle changes. Needs at least one finished angle. Give the link to the person as it is; changing its query string breaks it.",
      "read_only": true,
      "destructive": false,
      "open_world": false,
      "renders_ui": true
    },
    {
      "name": "nolgia_multicam_cancel",
      "title": "Stop a Multicam job",
      "group": "generate",
      "description": "Stop a running Multicam job. Use it only when the person asks to stop or cancel the job. Angles not sent to the model yet are never charged; a render already running is canceled where the model allows it: refunded in full when it had not started, charged for the share it rendered when it stops partway, charged when it finishes anyway. Angles that finished keep their clips, and the highlight edit is cut from what finished. A stopped job cannot be resumed; start a new one instead. Stopping twice returns the same result.",
      "read_only": false,
      "destructive": true,
      "open_world": false,
      "renders_ui": true
    },
    {
      "name": "nolgia_generate_3d",
      "title": "Generate a 3D model",
      "group": "generate",
      "description": "Turn one to four photos of an OBJECT into a textured 3D model (a GLB file) saved to the account's library. Use this for a product, prop, toy or figure the user wants as a 3D asset, to spin in a viewer or to import into Blender; it is not for people or scenes. Pass image_asset_ids (the user's image assets in front, back, left, right order; trellis takes exactly one) or one https image_url, never both. model hunyuan3d-v3 is the quality default (about 21 credits, more with pbr or extra views); trellis is the 2-credit draft. texture defaults to true; pbr adds physically based materials on hunyuan3d-v3 only. A clean front photo of the object on a plain background works best. Spends credits and runs asynchronously (about one to three minutes): returns the QUEUED job, so poll nolgia_list_jobs until it reads succeeded, failed or canceled (canceled: its owner stopped it, nothing is delivered), then find the 3d asset with nolgia_list_assets (modality 3d); its signed_url is the .glb and thumbnail_url a preview image.",
      "read_only": false,
      "destructive": false,
      "open_world": true,
      "renders_ui": true
    },
    {
      "name": "nolgia_generate_set",
      "title": "Generate a set of images",
      "group": "generate",
      "description": "One run creates 2 to 8 labelled Outputs sharing references and one visual system. Use kind pack for carousel slides or ad variants, or variants with axis for an emotion or concept ladder. Each member is its own image job with its own credit hold and refund. Poll with nolgia_get_set until Ready or Failed. For a catalog preset whose target kind is set, read its members from nolgia_get_preset, fill each labelled slot in every member prompt yourself, then call this tool.",
      "read_only": false,
      "destructive": false,
      "open_world": true,
      "renders_ui": false
    },
    {
      "name": "nolgia_get_set",
      "title": "Get a set of images",
      "group": "library",
      "description": "Read a set and its ordered Outputs, image jobs, and available assets. Poll this tool while the set is Generating.",
      "read_only": true,
      "destructive": false,
      "open_world": false,
      "renders_ui": false
    },
    {
      "name": "nolgia_miroge_options",
      "title": "Price a Miroge remake",
      "group": "generate",
      "description": "List the models that can run a Miroge mode on the customer's clip, each with the exact credits it would charge for this clip, which one is the default, and what it takes (how many photos, which clip lengths, whether the remake keeps the clip's length). Use it when the customer wants to compare prices or models before remaking. Free: nothing is generated or charged. Pass the same photos, characters and product you will remake with so the prices match; a model marked available: false says why in reason. Miroge remakes a video the customer already has, in one of three modes: motion (Motion transfer: the clip's moves, timing and camera performed by the customer's photos, characters or product), swap (Swap: replace one person, animal, product or outfit and keep the rest of the shot as filmed) or world (New world: keep the subject and its moves, redraw the place and the light around it).",
      "read_only": true,
      "destructive": false,
      "open_world": false,
      "renders_ui": false
    },
    {
      "name": "nolgia_miroge",
      "title": "Remake a clip with Miroge",
      "group": "generate",
      "description": "Remake a video from the customer's library with Miroge. Miroge remakes a video the customer already has, in one of three modes: motion (Motion transfer: the clip's moves, timing and camera performed by the customer's photos, characters or product), swap (Swap: replace one person, animal, product or outfit and keep the rest of the shot as filmed) or world (New world: keep the subject and its moves, redraw the place and the light around it). The clip is source_asset_id; the cast is element_asset_ids (photos, @Image1 onwards), character_ids and product_id. Miroge writes the instruction for the mode itself, so prompt holds only the customer's own words. The render is priced first and held to exactly that price. Spends credits and runs asynchronously: returns the queued job with credits_charged (a failed or canceled render is refunded); check it with nolgia_get_miroge and stop it with nolgia_cancel_job. Sending the identical remake again within five minutes returns the render already running instead of charging twice. When the default model cannot edit uploaded footage where the customer is, the next model runs it and the result says so.",
      "read_only": false,
      "destructive": false,
      "open_world": true,
      "renders_ui": true
    },
    {
      "name": "nolgia_get_miroge",
      "title": "Check a Miroge remake",
      "group": "library",
      "description": "Read a Miroge render by job_id: its status (queued, running, succeeded, failed or canceled), the finished video with a fresh link once it succeeded, what it was charged, and for a failure the reason and what to do about it. Pass the source_asset_id and mode given to nolgia_miroge so the card shows the clip beside its remake. Read-only; costs nothing.",
      "read_only": true,
      "destructive": false,
      "open_world": false,
      "renders_ui": true
    },
    {
      "name": "nolgia_app_status",
      "title": "List connected desktop apps",
      "group": "apps",
      "description": "List the desktop apps connected to NOLGIA on the person's own computer through the NOLGIA plugin (Blender first; After Effects, Premiere Pro, Illustrator, Photoshop, DaVinci Resolve Studio and TouchDesigner as their plugins ship): the app and its version, the open document, the computer's name, the commands each plugin supports, whether it allows the NOLGIA Agent, and when it last checked in. Call this first. With none connected, tell the person to install the NOLGIA plugin for their app from https://nolgia.ai/plugins, sign in, and switch it on. Read-only and free.",
      "read_only": true,
      "destructive": false,
      "open_world": false,
      "renders_ui": false
    },
    {
      "name": "nolgia_app_info",
      "title": "Read a desktop app's state",
      "group": "apps",
      "description": "Read the state of a desktop app connected to NOLGIA: the open document's name and path, whether it has unsaved changes, and app facts (Blender: scene, frame range, fps, render engine and resolution, collections with object counts, selected objects, cameras). Always call this before editing so your changes fit what is actually open. The app runs on the person's own computer. Free. Waits up to about 50 seconds; a slow app returns a command_id to follow with nolgia_app_command.",
      "read_only": true,
      "destructive": false,
      "open_world": false,
      "renders_ui": false
    },
    {
      "name": "nolgia_app_run",
      "title": "Run code in a desktop app",
      "group": "apps",
      "description": "Run code inside a desktop app on the person's own computer through the NOLGIA plugin: Python for Blender, DaVinci Resolve and TouchDesigner, ExtendScript for After Effects, Premiere Pro and Illustrator, UXP JavaScript for Photoshop. In Blender, set a variable named result to a JSON-serialisable value to get it back as value, next to stdout and stderr. A code error comes back as status failed with the traceback in error: read it and fix the code. The code edits the person's real document and can reach their files, so call nolgia_app_info first, save before destructive steps (in Blender, bpy.ops.wm.save_mainfile()), make one focused change per call, and never delete or overwrite files the person did not ask about. The person may be asked to approve each run in the app. Free. Waits up to about 50 seconds; a longer job returns a command_id to follow with nolgia_app_command.",
      "read_only": false,
      "destructive": true,
      "open_world": true,
      "renders_ui": false
    },
    {
      "name": "nolgia_app_command",
      "title": "Check a desktop app command",
      "group": "apps",
      "description": "Follow a desktop app command that another tool handed back as command_id because it took longer: its status (queued, running, succeeded, failed, expired, cancelled) and, once finished, its result or error. Waits up to about 50 seconds while it is still running; call again if it still is. Read-only and free.",
      "read_only": true,
      "destructive": false,
      "open_world": false,
      "renders_ui": false
    },
    {
      "name": "nolgia_app_preview",
      "title": "Preview a desktop app's document",
      "group": "apps",
      "description": "Render or capture a still of the document open in a desktop app (Blender: through the scene camera or a named camera, at a frame) and return the image so you can see it, plus its asset_id: the still is saved to the person's NOLGIA library. Use it to check your changes before you report them. Free: the app renders on the person's computer. Waits up to about 50 seconds; a slow render returns a command_id to follow with nolgia_app_command.",
      "read_only": false,
      "destructive": false,
      "open_world": false,
      "renders_ui": false
    },
    {
      "name": "nolgia_app_import",
      "title": "Import an asset into a desktop app",
      "group": "apps",
      "description": "Bring an asset from the person's NOLGIA library into the document open in a desktop app (Blender: GLB models as objects, images as planes or textures, video as a movie clip), for example a 3D model from nolgia_generate_3d. Pass exactly one of asset_id, asset_ids, project_id or color_preset. DaVinci Resolve also takes several assets at once (asset_ids, in order), a whole NOLGIA project (project_id: its ready video, image and audio assets, oldest first), the bin to import into and append to lay the clips on the end of the current timeline; and color_preset installs one of NOLGIA's film stocks (nolgia_list_color_presets) as a .cube LUT in the person's LUT folder, with apply_to to set it on clips of the current timeline. Returns the names of what was imported (for a LUT, the path Resolve lists it under). Free. Waits up to about 50 seconds; a slow import returns a command_id to follow with nolgia_app_command.",
      "read_only": false,
      "destructive": false,
      "open_world": false,
      "renders_ui": false
    },
    {
      "name": "nolgia_app_export",
      "title": "Export from a desktop app",
      "group": "apps",
      "description": "Render or export the document open in a desktop app into the person's NOLGIA library as a new asset (Blender formats: png, mp4, glb), optionally for a frame range and under a file name. Returns its asset_id. Blender also takes blend, which saves a copy on the person's computer and returns its path instead: project files stay local. Renders run on the person's computer and can take minutes: this waits up to about 50 seconds, then returns a command_id to follow with nolgia_app_command. Free.",
      "read_only": false,
      "destructive": false,
      "open_world": false,
      "renders_ui": false
    },
    {
      "name": "nolgia_app_save",
      "title": "Save the document in a desktop app",
      "group": "apps",
      "description": "Save the document open in a desktop app on the person's own computer. Blender, After Effects, Premiere Pro, Illustrator and Photoshop save the open file in place, or to path when given (a file that was never saved needs path). DaVinci Resolve keeps projects in its project library, so it saves the open project under its own name and takes no path. Returns the saved file's path, or the project's name. Free. Waits up to about 50 seconds; a slow save returns a command_id to follow with nolgia_app_command.",
      "read_only": false,
      "destructive": false,
      "open_world": false,
      "renders_ui": false
    },
    {
      "name": "nolgia_app_open",
      "title": "Open a document in a desktop app",
      "group": "apps",
      "description": "Open another document in a desktop app on the person's own computer: a file by path (a .blend, .aep, .prproj or .ai, or a file Photoshop opens; Blender and After Effects ask the person first when the open file has unsaved changes, Premiere Pro, Illustrator and Photoshop open it beside the open document), or for DaVinci Resolve a project by name (project, with folder for a project folder such as Clients/ACME; Resolve asks the person first, since its scripting cannot tell whether the open project has unsaved changes). Pass exactly one of path or project. Returns what is now open. Free. Waits up to about 50 seconds; a slow open returns a command_id to follow with nolgia_app_command.",
      "read_only": false,
      "destructive": false,
      "open_world": false,
      "renders_ui": false
    }
  ]
}
