RYLA

Generate AI influencer photos, face swaps, and character sheets with a consistent face.

Should I use this

Quality & Safety

A
Description quality
98%
Schema completeness
86%
Naming quality
79%
Poisoning risk
100%
Permission match
100%
Protocol compliance
100%

Findings (2)

  • LOWTool 'ryla_generate_face_swap' description lacks action verbin ryla_generate_face_swap
  • LOWTool 'ryla_character_reference_images' name length outside 3-30 rangein ryla_character_reference_images

Based on automated analysis of tool definitions and protocol compliance.

Context Cost

~3,860Tokens (tool definitions)
~2.1 KBTypical response size
Significant attention impact (3.02% of 128k context)

This is the approximate number of tokens consumed each time the server's tools are loaded into a model's context. Higher counts reduce the attention available for other tasks.

Install

One-Click Install

Add this to your `claude_desktop_config.json` file:

{
  "mcpServers": {
    "ryla": {
      "url": "https://mcp.ryla.ai/mcp"
    }
  }
}

Remote endpoints

https://mcp.ryla.ai/mcpstreamable-http

What it can do

Tool inventory

Tools (17)

🟢 Read-only🟡 Write🔴 Delete⚪ Unknown
⚪ryla_generate_base_image(niche, vibe, nsfwEnabled, promptInput)

Generate base character images from a niche/vibe/prompt. Returns a jobId; poll with ryla_generation_status.

Input Schema

{
  "type": "object",
  "properties": {
    "niche": {
      "type": "string",
      "description": "Content niche, e.g. \"fitness\""
    },
    "vibe": {
      "type": "string",
      "description": "Overall vibe/style descriptor"
    },
    "nsfwEnabled": {
      "type": "boolean",
      "default": false,
      "description": "Enable unrestricted fan content generation"
    },
    "promptInput": {
      "type": "string",
      "description": "Free-form prompt text"
    }
  },
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
⚪ryla_generate_face_swap(characterId, baseImageUrl, prompt, nsfw, seed)

Swap a character face onto a reference base image. Returns the generation result.

Input Schema

{
  "type": "object",
  "properties": {
    "characterId": {
      "type": "string",
      "format": "uuid",
      "description": "Character UUID"
    },
    "baseImageUrl": {
      "type": "string",
      "format": "uri",
      "description": "Reference/base image URL to swap the face from"
    },
    "prompt": {
      "type": "string",
      "description": "Prompt for the target image"
    },
    "nsfw": {
      "type": "boolean",
      "default": false,
      "description": "Enable unrestricted fan content generation"
    },
    "seed": {
      "type": "integer",
      "description": "Random seed for reproducibility"
    }
  },
  "required": [
    "baseImageUrl",
    "prompt"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟢ryla_generate_character_sheet(characterId, nsfw)

Build the 18-shot identity reference sheet for an existing character (the live replacement of the retired character sheet; flat, no extra credits). Use ryla_list_characters to find a characterId. Returns a sheetJobId; poll with ryla_generation_status.

Input Schema

{
  "type": "object",
  "properties": {
    "characterId": {
      "type": "string",
      "format": "uuid",
      "description": "Character UUID"
    },
    "nsfw": {
      "type": "boolean",
      "description": "Character unrestricted intent (the sheet itself stays SFW)"
    }
  },
  "required": [
    "characterId"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟢ryla_generation_status(jobId, detail)

Check the status of a generation job by its jobId.

Input Schema

{
  "type": "object",
  "properties": {
    "jobId": {
      "type": "string",
      "description": "The jobId returned by a ryla_generate_* tool call"
    },
    "detail": {
      "type": "string",
      "enum": [
        "slim",
        "full"
      ],
      "default": "slim",
      "description": "slim (default): status, output URLs and the inputs you set. full: the raw job row incl. internal dispatch fields (large; for debugging)."
    }
  },
  "required": [
    "jobId"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟢ryla_account_credits_balance

Check the authenticated user's current RYLA credit balance.

Input Schema

{
  "type": "object",
  "properties": {},
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟢ryla_account_gallery_list(limit, detail)

List the authenticated user's most recent generated images/jobs.

Input Schema

{
  "type": "object",
  "properties": {
    "limit": {
      "type": "integer",
      "minimum": 1,
      "maximum": 50,
      "description": "Max number of items to return (default 20, max 50)"
    },
    "detail": {
      "type": "string",
      "enum": [
        "slim",
        "full"
      ],
      "default": "slim",
      "description": "slim (default): status, output URLs and the inputs you set. full: raw job rows incl. internal dispatch fields (very large)."
    }
  },
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟡ryla_list_characters

List the authenticated user's existing characters (AI influencers) so you can pick a characterId for the other generation tools. `loraReady` tells you whether `useLora: true` has a trained LoRA to use. There is no tool to CREATE a character -- that happens in the RYLA app at app.ryla.ai.

Input Schema

{
  "type": "object",
  "properties": {},
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟢ryla_generate_image(requestId, characterId, templateId, templateMode, scene, ...)

Generate Studio-quality images for an existing character with full creative control (scene, outfit, pose, lighting, expression, style). This is the primary, full-featured image tool -- prefer it over ryla_generate_base_image. Character must already exist; use ryla_list_characters to find a characterId. Returns a jobId; poll with ryla_generation_status.

Input Schema

{
  "type": "object",
  "properties": {
    "requestId": {
      "type": "string",
      "format": "uuid",
      "description": "Optional UUID for this generation intent. Omit it and one is created for you (returned in the result). Pass the SAME id when retrying after an error or a lost response, so the retry is not charged twice."
    },
    "characterId": {
      "type": "string",
      "format": "uuid",
      "description": "Character UUID to generate images for"
    },
    "templateId": {
      "type": "string",
      "format": "uuid",
      "description": "Template id from ryla_list_templates. Fills scene, outfit, pose, style, lighting and aspect ratio from the template; anything you set yourself wins."
    },
    "templateMode": {
      "type": "string",
      "enum": [
        "exact",
        "inspired"
      ],
      "description": "With templateId: \"exact\" (default) keeps the template pose, outfit and background; \"inspired\" makes a similar but different image."
    },
    "scene": {
      "type": "string",
      "description": "Scene preset or description. Required unless templateId is given."
    },
    "environment": {
      "type": "string",
      "description": "Environment preset or description"
    },
    "outfit": {
      "type": "string",
      "description": "Outfit description"
    },
    "poseId": {
      "type": "string",
      "description": "Pose preset id, e.g. \"standing-casual\""
    },
    "lighting": {
      "type": "string",
      "description": "Lighting preset, e.g. \"natural.goldenHour\""
    },
    "expression": {
      "type": "string",
      "description": "Facial expression preset, e.g. \"positive.smile\""
    },
    "shotType": {
      "type": "string",
      "description": "Camera framing, e.g. \"close-up-portrait\", \"full-body\""
    },
    "aspectRatio": {
      "type": "string",
      "enum": [
        "1:1",
        "9:16",
        "2:3",
        "4:5",
        "3:4",
        "4:3",
        "16:9",
        "3:2"
      ],
      "description": "Image aspect ratio. Required unless templateId is given (then the template ratio is used)."
    },
    "quality": {
      "type": "string",
      "enum": [
        "standard",
        "ultra",
        "2k",
        "4k"
      ],
      "description": "Quality tier: \"standard\" or \"2k\" (HD, default), \"ultra\" or \"4k\" (4K, costs more credits)"
    },
    "count": {
      "type": "integer",
      "minimum": 1,
      "maximum": 10,
      "default": 1,
      "description": "Number of images to generate"
    },
    "nsfw": {
      "type": "boolean",
      "default": false,
      "description": "Enable unrestricted fan content generation"
    },
    "promptEnhance": {
      "type": "boolean",
      "description": "Enable AI prompt enhancement (default true)"
    },
    "seed": {
      "type": "integer",
      "description": "Base seed; each image increments it"
    },
    "useLora": {
      "type": "boolean",
      "description": "Use the character LoRA for face consistency, if trained"
    },
    "loraId": {
      "type": "string",
      "description": "LoRA id to use, if not the default for this character"
    },
    "loraStrength": {
      "type": "number",
      "minimum": 0.1,
      "maximum": 2,
      "description": "LoRA strength, 0.1-2.0"
    },
    "referenceImageUrl": {
      "type": "string",
      "description": "Reference image URL for face consistency (InstantID/PuLID), as an alternative to LoRA"
    },
    "enableFaceSwap": {
      "type": "boolean",
      "description": "Route through face-swap for the reference image"
    },
    "referenceStrength": {
      "type": "number",
      "minimum": 0.1,
      "maximum": 1,
      "description": "Reference image strength, 0.1-1.0"
    },
    "referenceMethod": {
      "type": "string",
      "enum": [
        "instantid",
        "pulid",
        "ipadapter"
      ],
      "description": "Reference image method (default instantid)"
    },
    "socialMediaReady": {
      "type": "boolean",
      "description": "Apply anti-AI-detection post-processing"
    },
    "realismStyle": {
      "type": "boolean",
      "description": "Apply realism post-processing style"
    },
    "stylePreset": {
      "type": "string",
      "enum": [
        "ultraRealistic",
        "instagramReady",
        "editorialFashion",
        "casualSelfie",
        "professionalPortrait"
      ],
      "description": "Visual style preset (default ultraRealistic)"
    },
    "antiDetectPreset": {
      "type": "string",
      "enum": [
        "subtle",
        "moderate",
        "aggressive",
        "advanced",
        "maximum"
      ],
      "description": "Anti-detection intensity (default moderate); advanced/maximum require Pro"
    }
  },
  "required": [
    "characterId"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
⚪ryla_upscale_image(imageId, scale, requestId)

Upscale one of your own generated images (2x or 4x, faithful, no new content). Costs credits. imageId comes from ryla_generation_status (output.imageIds) or ryla_account_gallery_list. Returns a job; poll with ryla_generation_status.

Input Schema

{
  "type": "object",
  "properties": {
    "imageId": {
      "type": "string",
      "format": "uuid",
      "description": "Image id (output.imageIds of a finished job)"
    },
    "scale": {
      "type": "number",
      "enum": [
        2,
        4
      ],
      "description": "Upscale factor, 2 or 4 (default chosen by the server)"
    },
    "requestId": {
      "type": "string",
      "format": "uuid",
      "description": "Optional UUID; pass the same one when retrying so you are not charged twice"
    }
  },
  "required": [
    "imageId"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟢ryla_character_reference_images(characterId)

Get fresh URLs of a character's reference material: its base image and the 16-shot reference sheet. Pass any of these as referenceImageUrl to ryla_generate_image to keep the face consistent. URLs expire after about an hour. Read only: never regenerates anything.

Input Schema

{
  "type": "object",
  "properties": {
    "characterId": {
      "type": "string",
      "format": "uuid",
      "description": "Character UUID"
    }
  },
  "required": [
    "characterId"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟢ryla_generate_video(characterId, sourceImageId, prompt, duration, resolution, ...)

Generate a video from an existing character image (image-to-video, Wan 3.0). Character must already exist; use ryla_list_characters to find a characterId. By default the newest completed image of the character is animated; pass sourceImageId (imageIds from ryla_account_gallery_list) to pick one. Priced per second and resolution (720p = 240 credits/s, 480p 120, 1080p 470; unrestricted x2). Returns a jobId; poll with ryla_generation_status.

Input Schema

{
  "type": "object",
  "properties": {
    "characterId": {
      "type": "string",
      "format": "uuid",
      "description": "Character UUID to generate video for"
    },
    "sourceImageId": {
      "type": "string",
      "format": "uuid",
      "description": "Image UUID to animate (default: newest completed image)"
    },
    "prompt": {
      "type": "string",
      "description": "Optional prompt/description for the motion"
    },
    "duration": {
      "type": "integer",
      "minimum": 2,
      "maximum": 30,
      "default": 5,
      "description": "Video duration in whole seconds, 2 to 30"
    },
    "resolution": {
      "type": "string",
      "enum": [
        "480p",
        "720p",
        "1080p"
      ],
      "default": "720p",
      "description": "Output resolution (drives the price)"
    },
    "aspectRatio": {
      "type": "string",
      "enum": [
        "1:1",
        "9:16",
        "16:9"
      ],
      "description": "Video aspect ratio"
    },
    "nsfw": {
      "type": "boolean",
      "default": false,
      "description": "Enable unrestricted fan content generation"
    },
    "wantAudio": {
      "type": "boolean",
      "description": "Generate sound with the video"
    },
    "requestId": {
      "type": "string",
      "format": "uuid",
      "description": "Idempotency key: the same id returns the same job and never charges twice. Generated when omitted."
    }
  },
  "required": [
    "characterId"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟢ryla_generate_voice(characterId, text, emotion, speed, voiceIdentityId, ...)

Generate speech audio (TTS) in an existing character's voice. Character must already exist; use ryla_list_characters to find a characterId.

Input Schema

{
  "type": "object",
  "properties": {
    "characterId": {
      "type": "string",
      "format": "uuid",
      "description": "Character UUID"
    },
    "text": {
      "type": "string",
      "maxLength": 1000,
      "description": "Text to convert to speech (max 1000 chars)"
    },
    "emotion": {
      "type": "string",
      "enum": [
        "neutral",
        "happy",
        "sad",
        "whisper",
        "laugh",
        "seductive",
        "angry"
      ],
      "description": "Emotion style for the voice"
    },
    "speed": {
      "type": "number",
      "minimum": 0.5,
      "maximum": 2,
      "description": "Speech speed multiplier, 0.5-2.0"
    },
    "voiceIdentityId": {
      "type": "string",
      "description": "Specific voice identity id, if known (otherwise the character default is used)"
    },
    "gender": {
      "type": "string",
      "enum": [
        "female",
        "male"
      ],
      "description": "Character gender, to pick a default voice when voiceIdentityId is absent"
    }
  },
  "required": [
    "characterId",
    "text"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟢ryla_generate_avatar_video(characterId, audioUrl, voiceNoteId, prompt, duration, ...)

Generate a talking avatar video from a character face + an audio track (kie.ai InfiniTalk). Pro plan required. Character must already exist; use ryla_list_characters to find a characterId. Returns a jobId; poll with ryla_generation_status.

Input Schema

{
  "type": "object",
  "properties": {
    "characterId": {
      "type": "string",
      "format": "uuid",
      "description": "Character UUID to use as the avatar face"
    },
    "audioUrl": {
      "type": "string",
      "format": "uri",
      "description": "URL of the audio file (MP3/WAV/M4A, max 5MB, 2-60s). Required unless voiceNoteId is set."
    },
    "voiceNoteId": {
      "type": "string",
      "format": "uuid",
      "description": "UUID of a saved voice note to use as the audio track instead of audioUrl"
    },
    "prompt": {
      "type": "string",
      "description": "Optional prompt/description for the avatar video"
    },
    "duration": {
      "type": "number",
      "enum": [
        5,
        10
      ],
      "default": 5,
      "description": "Video duration in seconds"
    },
    "aspectRatio": {
      "type": "string",
      "enum": [
        "1:1",
        "9:16",
        "16:9"
      ],
      "description": "Video aspect ratio (default 16:9)"
    },
    "modelTier": {
      "type": "string",
      "enum": [
        "standard",
        "pro"
      ],
      "description": "Model quality tier (default pro)"
    },
    "sourceImageId": {
      "type": "string",
      "format": "uuid",
      "description": "UUID of a specific image to use as the face source. If omitted, the character base image is used."
    }
  },
  "required": [
    "characterId"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟢ryla_generate_video_swap(characterId, videoUrl, sourceType, outfitEnabled, outfitPrompt, ...)

Swap a character face into an existing video (face swap onto uploaded footage). Pro plan required. videoUrl must be a video you already uploaded to your RYLA account. Character must already exist; use ryla_list_characters to find a characterId. Returns a jobId; poll with ryla_generation_status.

Input Schema

{
  "type": "object",
  "properties": {
    "characterId": {
      "type": "string",
      "format": "uuid",
      "description": "Character UUID whose face is swapped into the video"
    },
    "videoUrl": {
      "type": "string",
      "format": "uri",
      "description": "URL of the source video to swap (must be a RYLA-hosted storage URL you own)"
    },
    "sourceType": {
      "type": "string",
      "enum": [
        "instagram",
        "tiktok",
        "youtube",
        "upload"
      ],
      "description": "Source type (default upload)"
    },
    "outfitEnabled": {
      "type": "boolean",
      "description": "Enable an outfit-change prompt"
    },
    "outfitPrompt": {
      "type": "string",
      "description": "Outfit description, used only when outfitEnabled is true"
    },
    "backgroundEnabled": {
      "type": "boolean",
      "description": "Enable a background-change prompt"
    },
    "backgroundPrompt": {
      "type": "string",
      "description": "Background description, used only when backgroundEnabled is true"
    }
  },
  "required": [
    "characterId",
    "videoUrl"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
⚪ryla_generate_lip_sync(portraitImageUrl, audioUrl, prompt)

Generate a talking video by lip-syncing a portrait image to an audio track (kie.ai InfiniTalk). Both portraitImageUrl and audioUrl must be RYLA-hosted URLs you own. Pro plan required. This capability may not be available on your account yet (internal rollout, pricing not finalized) -- an unavailable-feature error means it is not yet live for you.

Input Schema

{
  "type": "object",
  "properties": {
    "portraitImageUrl": {
      "type": "string",
      "format": "uri",
      "description": "Portrait/face image URL (RYLA-hosted storage URL you own)"
    },
    "audioUrl": {
      "type": "string",
      "format": "uri",
      "description": "Audio track URL (RYLA-hosted storage URL you own)"
    },
    "prompt": {
      "type": "string",
      "minLength": 1,
      "description": "Prompt describing the desired output (required)"
    }
  },
  "required": [
    "portraitImageUrl",
    "audioUrl",
    "prompt"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟢ryla_list_templates(search, unrestricted, limit, page)

Find RYLA templates (ready-made looks: scene, outfit, pose) by name or tag. Returns template ids. Pass an id as `templateId` to ryla_generate_image to generate your character in that template. Unrestricted (NSFW) templates are only listed when `unrestricted` is true.

Input Schema

{
  "type": "object",
  "properties": {
    "search": {
      "type": "string",
      "description": "Search text, e.g. \"cafe\", \"boots\", \"selfie bed\""
    },
    "unrestricted": {
      "type": "boolean",
      "default": false,
      "description": "Include unrestricted fan content templates"
    },
    "limit": {
      "type": "integer",
      "minimum": 1,
      "maximum": 30,
      "default": 10,
      "description": "Number of templates to return (default 10, max 30)"
    },
    "page": {
      "type": "integer",
      "minimum": 1,
      "default": 1,
      "description": "Page, starting at 1"
    }
  },
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟢ryla_server_info

Get RYLA external MCP server configuration and connection info

Input Schema

{
  "type": "object",
  "properties": {},
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}

Recommended Prompts

list_items
List all [items] available in RYLA
Expected tools: ryla_account_gallery_list
browse_collection
Show me the [collection] from RYLA
Expected tools: ryla_account_gallery_list

Community

Rate this Server

Evidence

Recent observations

verifiedversion not recorded17 tools
verifiedversion not recorded17 tools
verifiedversion not recorded14 tools
verifiedversion not recorded14 tools
verifiedversion not recorded14 tools
verifiedversion not recorded14 tools