MCP server exposing PicLumen AI image, video and audio generation to MCP clients (Claude, Cursor, etc.)
Strong foundation with complete schemas, clear descriptions, and proper error handling guidance. All 7 tools have documented input schemas with types and descriptions. Tool names follow verb_noun convention (generate_image, get_job_status, list_models). Descriptions are detailed (150-400 chars) and explain async behavior, prerequisites, and error cases. However, some parameter descriptions could be more concise, and output schemas are documented in prose rather than formal JSON Schema. Error handling includes recovery guidance (e.g., 'Poll piclumen_get_job_status'). Security is solid: API key injected server-side, no secrets in parameters. Composition is clean: each tool has one responsibility, and tool outputs chain properly (job_id flows from generate → get_job_status). Minor gaps: response_format parameter appears in all tools but could be consolidated; some enum descriptions are verbose.
Start an asynchronous image generation job on PicLumen. This tool does NOT return the finished image directly — image generation is async. It returns a job_id immediately. Poll piclumen_get_job_status with that job_id until status is "succeeded", then read the asset URLs. Args: - prompt (string): What to generate. Required, 1-2000 chars. - model (string): Image model id (default "piclumen-v1"). Discover ids via piclumen_list_models. - aspect_ratio ('1:1'|'3:4'|'4:3'|'9:16'|'16:9'): Default '1:1'. - count (number): How many images, 1-4 (default 1). - negative_prompt (string): Optional, what to avoid. - seed (number): Optional, for reproducible output. - response_format ('markdown'|'json'): Default 'markdown'. Returns: a Job object { job_id, status, kind:"image", model, created_at, ... }. This consumes the authenticated account's credits when the job completes. Example: "Make a 16:9 watercolour fox" -> prompt="watercolour fox", aspect_ratio="16:9".
Start an asynchronous video generation job on PicLumen. Async, like image generation: returns a job_id immediately. Poll piclumen_get_job_status until status is "succeeded". Video jobs typically take longer than image jobs. Args: - prompt (string): What to generate. Required, 1-2000 chars. - model (string): Video model id (default "piclumen-video-v1"). - duration_seconds (number): 2-10 (default 5). - aspect_ratio ('1:1'|'9:16'|'16:9'): Default '16:9'. - image_url (string): Optional source image for image-to-video. - response_format ('markdown'|'json'): Default 'markdown'. Returns: a Job object { job_id, status, kind:"video", ... }. Consumes account credits.
Check the status of an async PicLumen generation job and retrieve its results. Call this after piclumen_generate_image / piclumen_generate_video with the returned job_id. Repeat until status is "succeeded" (then read assets) or "failed" (read error). Args: - job_id (string): The id returned by a generate tool. Required. - response_format ('markdown'|'json'): Default 'markdown'. Returns: a Job object. When succeeded, job.assets contains the result URLs.
Output schemas documented in prose only; no formal JSON Schema for return types. LLMs cannot parse expected response structure programmatically.
response_format parameter duplicated across all 7 tools. Should be consolidated into a single server-level configuration or removed if not essential to the agent workflow.
piclumen_post_to_community description mentions 'prompt_visibility' behavior but does not explicitly state this is a WRITE operation with side effects. Agents need to know posting is irreversible.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 60 | 2026-07-28+ | v2 |
Read the account's community-related settings. Most relevant: hide_prompt_in_community — the default applied when posting with prompt_visibility='inherit'. Use this to tell the user what will happen to their prompt before posting. Args: - response_format ('markdown'|'json'): default 'markdown'. Returns: { hide_prompt_in_community: boolean }.
List the authenticated account's past generations (history), newest first. Args: - kind ('image'|'video'|'audio'): Optional filter. - limit (number): Max results, 1-100 (default 20). - offset (number): Skip count for pagination (default 0). - response_format ('markdown'|'json'): Default 'markdown'. Returns: { total, count, offset, items: [{ job_id, kind, model, prompt, status, created_at, asset_count }], has_more, next_offset }.
List the generation models available to the authenticated account. Use this to discover valid model ids before calling a generate tool. Args: - kind ('image'|'video'|'audio'): Optional filter. If omitted, returns all. - response_format ('markdown'|'json'): Default 'markdown'. Returns: { total, models: [{ id, name, kind, description, default_aspect_ratio }] }.
Publish a finished generation (image or video) to the PicLumen community feed. The job must be one of the account's own generations and already 'succeeded' (use piclumen_get_job_status to confirm). Returns the public community post. Prompt visibility: - prompt_visibility='inherit' (default) → uses the account's hide_prompt_in_community setting (read it with piclumen_get_settings). - prompt_visibility='visible' → force the prompt shown, even if the account hides by default. - prompt_visibility='hidden' → force the prompt hidden for this post. The value actually applied is returned as 'prompt_visible'. Args: - job_id (string): a succeeded generation to publish. Required. - title (string): optional, up to 140 chars. - caption (string): optional, up to 2000 chars. - prompt_visibility ('inherit'|'visible'|'hidden'): default 'inherit'. - response_format ('markdown'|'json'): default 'markdown'. Returns: { post_id, job_id, kind, url, prompt_visible, created_at }. Errors: - "Error: Not found..." (404) if the job_id doesn't exist or isn't yours. - "Error: Conflict..." (409) if the job isn't finished yet, or is already posted. - "Error: Prompt rejected by content moderation" (422).
Error responses documented in prose (e.g., '404 if job_id doesn't exist') but not formalized in schema. LLMs cannot programmatically distinguish error types for recovery logic.
piclumen_list_generations and piclumen_list_models lack explicit guidance on when to call them. Discovery tools should state 'Call this first to discover available options before invoking generate tools.'