Skip to main content
Glama

Upload image

upload_image

Store an image and get a Lunafic-hosted URL back. Use for an entry/character avatar (slot "avatar", give entryId) or a playable image — scene, starting-choice, ending (slot "scene", give scenarioId). Provide the bytes ONE of two ways: sourceUrl (a Google Drive link only; the server fetches the file, and a Drive share link is turned into its download link) OR dataBase64 (base64 bytes inline — small files only). For a LOCAL file an agent cannot inline as base64, call create_upload_url instead and curl the file up. PNG or JPEG (GIF accepted, WebP/HEIC are not — re-export first). The image is resized to Lunafic’s own sizes automatically (avatar max 512px long side, scene max 1280px); a PNG or JPEG already under the cap keeps its pixels untouched (never re-encoded), while metadata such as EXIF location and anything appended after the image are removed; GIF and other formats are converted to PNG. Up to 50 uploads per account per 24 hours. Returns { url, width, height, resized }; then set the URL with update_entry (avatarUrl) or update_world (playable image url). The scenario COVER is managed in the editor and cannot be uploaded here.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
slotYesavatar = entry/character avatar; scene = a playable image.
entryIdNoRequired for slot "avatar": the world-bible entry to attach the avatar to.
filenameYesOriginal filename (used to detect the image type, e.g. art.png).
sourceUrlNoOption B: a Google Drive link to the image (share or download link). Images hosted anywhere else go through create_upload_url. Use exactly one of sourceUrl or dataBase64.
dataBase64NoOption A: the file bytes, base64-encoded (a data: URI prefix is tolerated). Small files only.
scenarioIdNoRequired for slot "scene": the scenario the playable image belongs to. Accepts the scenario (world) id OR its backing projectId.

Schema Changelog

Changes observed during successful MCP inspections.

  1. First observed

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare readOnlyHint=false, openWorldHint=true, idempotentHint=false, destructiveHint=false. The description goes far beyond: resize caps (512px/1280px), no-re-encode guarantee for in-cap PNG/JPEG, EXIF and appended-data stripping, GIF/format-to-PNG conversion, and a rate limit of 50 uploads/account/24h. It also names the return fields and the follow-up setters.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with purpose and routing, then input paths, then format rules, then behavior. Dense but each clause carries real information. Slightly overstuffed with parentheticals, which slows scanning, but nothing is filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a non-idempotent, open-world mutation tool with no output schema and no destructive annotation, every gap is covered: accepted/rejected formats, transformations, rate limit, return shape, and the required follow-up write tools. No output schema exists, yet the description still states the return object.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is already 100%, but the description adds meaning the schema lacks: sourceUrl is restricted to Google Drive and the share link is converted to a download link; dataBase64 tolerates a data: URI prefix; filename drives type detection; scenarioId accepts world id or projectId. These are non-obvious semantics beyond the schema text.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('Store an image and get a Lunafic-hosted URL back') and distinguishes its two slots (avatar vs scene) with required companions (entryId vs scenarioId). It also names the sibling it is not: 'For a LOCAL file an agent cannot inline as base64, call create_upload_url instead.'

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit when-to-use for each slot, explicit dual input paths (sourceUrl vs dataBase64), and an explicit routing rule to the alternative create_upload_url for local files. It even carves out an exclusion: the scenario COVER cannot be uploaded here.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources