Skip to content

Luala

app.luala/lualaluala.appstreamable-httpv1.19.0Scanned

Photo shoots of you from your saved selfies: pick a pack, shoot, edit.

19 tools: 1 can delete or cancel things, 14 change things and 4 only read.

Tools: 1 delete, 0 irreversible, 14 write, 4 read.
  • Reads private data · 0
  • Reads text others write · 2
  • Can send data out · 0
  • 2 findings

Anlyon alternative

15 of these tools change something. Run those as governed actions.

Declare what an action changes, and Anlyon puts it under a shared limit, binds every approval to the exact request, and grades the outcome. It works on any HTTPS API you can describe as an action.

Anlyon does not run, proxy or govern this MCP server. A tool your own code calls directly is not routed through Anlyon and is not governed by it.

Import an OpenAPI spec →

Tools

Grouped by what each tool does, most consequential first. Open one for its reasons and full description; descriptions are the publisher's own words.

19 tools

Deletes or cancels 1Claude Code: deny
  • remove_backgroundCuts the person out of one of the user's photos, paid from their credits: on a clear (transparent) backdrop unless backdrop names a colour, #rrggbb (the app offers #ffffff, #e9e7e3…1 finding

    Why it is in this group

    • The name "remove_background" says "remove": a word for removing or ending something.
    • The server marks it not destructive (destructiveHint: false), but an annotation never lowers a class.

    Findings

    • Warn

      The server marks "remove_background" not destructive (destructiveHint: false), and its own name, description or input give the class "destructive".

      Matched text

      annotations: {"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false}; The name "remove_background" says "remove": a word for removing or ending something.

      What this check looks for
    Description, as the server wrote it
    Cuts the person out of one of the user's photos, paid from their credits: on a clear (transparent) backdrop unless backdrop names a colour, #rrggbb (the app offers #ffffff, #e9e7e3, #3a3a3c, #000000, #1f2f4d, #bcd7ee, #f2e8d5, #b9c8b0). On a photo that is already a cutout it lays it on another backdrop. Pass the price the user agreed to as max_credits: the photo's prices from get_shoot or list_photos name it. If a call to this tool got no answer, it may already have started: check list_photos before calling it again.

    Annotations the server declares

    • openWorldHint: false
    • readOnlyHint: false
    • destructiveHint: false
    • idempotentHint: false
Changes things 14Claude Code: ask
  • add_photoAdds one photo to the user's My photos in Luala, free, so it can be edited: an old print to restore, clothes to try on, a photo to change.Reads text others writeNo findings

    Why it is in this group

    • The name "add_photo" says "add": a word for a change.

    What it can reach

    • untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
    Description, as the server wrote it
    Adds one photo to the user's My photos in Luala, free, so it can be edited: an old print to restore, clothes to try on, a photo to change. The answer is the saved photo with its photo_id and edit prices: when the user asked for an edit of it, tell them that edit's price, and once they agree make it with Luala's tool for it on this photo_id, never with another image tool. Pass the file the user attached as photo. If you can't, but the file is in your sandbox, call with its content_type (image/jpeg, image/png or image/webp: convert a HEIC to JPEG first) and size in bytes, PUT the file to the answer's upload url with its headers, then call again with the answer's key. Called with none of these, it answers with the luala.app page where the user adds it. The user accepted the upload rules when connecting Luala.

    Annotations the server declares

    • openWorldHint: true
    • readOnlyHint: false
    • destructiveHint: false
    • idempotentHint: false
  • add_selfieAdds one selfie to the user's selfie set in Luala, which shoots are made from, free: one face, clearly visible, up to 15 selfies in the set.Reads text others writeNo findings

    Why it is in this group

    • The name "add_selfie" says "add": a word for a change.

    What it can reach

    • untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
    Description, as the server wrote it
    Adds one selfie to the user's selfie set in Luala, which shoots are made from, free: one face, clearly visible, up to 15 selfies in the set. Pass the file the user attached as photo. If you can't, but the file is in your sandbox, call with its content_type (image/jpeg, image/png or image/webp: convert a HEIC to JPEG first) and size in bytes, PUT the file to the answer's upload url with its headers, then call again with the answer's key. Called with none of these, it answers with the luala.app page where the user adds it. The user accepted the upload rules when connecting Luala.

    Annotations the server declares

    • openWorldHint: true
    • readOnlyHint: false
    • destructiveHint: false
    • idempotentHint: false
  • balanceThe user's credit balance, about how many photos it buys, and where to buy more.No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
    Description, as the server wrote it
    The user's credit balance, about how many photos it buys, and where to buy more.

    Annotations the server declares

    • openWorldHint: false
    • readOnlyHint: true
  • combineAdds the main subject of another of the user's photos (with_photo_id: an object or a person, a cutout works well) into one of their photos, keeping its scene, framing and light, pa…No findings

    Why it is in this group

    • The description's first verb is "add": a word for a change.
    Description, as the server wrote it
    Adds the main subject of another of the user's photos (with_photo_id: an object or a person, a cutout works well) into one of their photos, keeping its scene, framing and light, paid from their credits. with_photo_id may not be a selfie, nor photo_id itself. Pass the price the user agreed to as max_credits: the photo's prices from get_shoot or list_photos name it. If a call to this tool got no answer, it may already have started: check list_photos before calling it again.

    Annotations the server declares

    • openWorldHint: false
    • readOnlyHint: false
    • destructiveHint: false
    • idempotentHint: false
  • editMakes an edited copy of one of the user's photos, paid from their credits.No findings

    Why it is in this group

    • The name "edit" says "edit": a word for a change.
    Description, as the server wrote it
    Makes an edited copy of one of the user's photos, paid from their credits. type change keeps the pose and framing and changes any of: outfit and place (ids from get_pack of the photo's pack), light, the attributes, and text, up to 300 characters of what to change. type zoom_out steps back one step. Pass the price the user agreed to as max_credits: the photo's prices from get_shoot or list_photos name it. Fetch the result with list_photos. If a call to this tool got no answer, it may already have started: check list_photos before calling it again.

    Annotations the server declares

    • openWorldHint: false
    • readOnlyHint: false
    • destructiveHint: false
    • idempotentHint: false
  • light_cameraChanges the light, the camera or the look of one of the user's photos, paid from their credits: at most one pick per group (light, lens, angle, focus, look), and/or text, up to 300…No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    Description, as the server wrote it
    Changes the light, the camera or the look of one of the user's photos, paid from their credits: at most one pick per group (light, lens, angle, focus, look), and/or text, up to 300 characters of what to change. What is not picked stays as it is. light and look keep the pose, framing and scene; a lens, angle or focus pick re-imagines the same moment through that camera, so the framing changes. Pass the price the user agreed to as max_credits: the photo's prices from get_shoot or list_photos name it. If a call to this tool got no answer, it may already have started: check list_photos before calling it again.

    Annotations the server declares

    • openWorldHint: false
    • readOnlyHint: false
    • destructiveHint: false
    • idempotentHint: false
  • replace_backgroundPuts the person in one of the user's photos somewhere else, keeping their pose and framing, paid from their credits: scene is one of the app's scenes, or text says the place in up …No findings

    Why it is in this group

    • The name "replace_background" says "replace": a word for a change.
    Description, as the server wrote it
    Puts the person in one of the user's photos somewhere else, keeping their pose and framing, paid from their credits: scene is one of the app's scenes, or text says the place in up to 300 characters; a scene wins when both come. Pass the price the user agreed to as max_credits: the photo's prices from get_shoot or list_photos name it. If a call to this tool got no answer, it may already have started: check list_photos before calling it again.

    Annotations the server declares

    • openWorldHint: false
    • readOnlyHint: false
    • destructiveHint: false
    • idempotentHint: false
  • rerollMakes the same photo again, a new take of the same look, paid from the user's credits.No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    Description, as the server wrote it
    Makes the same photo again, a new take of the same look, paid from the user's credits. Pass the price the user agreed to as max_credits: the photo's prices from get_shoot or list_photos name it. If a call to this tool got no answer, it may already have started: check list_photos before calling it again.

    Annotations the server declares

    • openWorldHint: false
    • readOnlyHint: false
    • destructiveHint: false
    • idempotentHint: false
  • restoreRepairs an old or damaged photo of the user's (a photographed print, most often one from list_photos with uploads), paid from their credits: repair fixes scratches, tears and stain…No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    Description, as the server wrote it
    Repairs an old or damaged photo of the user's (a photographed print, most often one from list_photos with uploads), paid from their credits: repair fixes scratches, tears and stains, faces enhances them, colourise adds colour to a black and white one. size 1K is Standard, 2K High quality; the price is by size. Pass the price the user agreed to as max_credits: the photo's prices from get_shoot or list_photos name it. If a call to this tool got no answer, it may already have started: check list_photos before calling it again.

    Annotations the server declares

    • openWorldHint: false
    • readOnlyHint: false
    • destructiveHint: false
    • idempotentHint: false
  • start_shootStarts a shoot of a pack from the user's saved selfies, paid from their credits: one photo per picked shot, at the price get_pack gives.No findings

    Why it is in this group

    • The name "start_shoot" says "start": a word for a change.
    Description, as the server wrote it
    Starts a shoot of a pack from the user's saved selfies, paid from their credits: one photo per picked shot, at the price get_pack gives. Unless the user has said, offer them the whole pack or only the shots they want, even one. Tell the user the price first and pass it as max_credits; the shoot is refused if it costs more. A photo takes about 20 seconds: follow them with get_shoot. If a call to this tool got no answer, it may already have started: check list_photos before calling it again.

    Annotations the server declares

    • openWorldHint: false
    • readOnlyHint: false
    • destructiveHint: false
    • idempotentHint: false
  • try_onPuts the clothes another of the user's photos shows (with_photo_id) on the person in one of their photos, paid from their credits; part top or bottom takes only that part of the ou…No findings

    Why it is in this group

    • The description's first verb is "put": a word for a change.
    Description, as the server wrote it
    Puts the clothes another of the user's photos shows (with_photo_id) on the person in one of their photos, paid from their credits; part top or bottom takes only that part of the outfit. with_photo_id may not be a selfie, nor photo_id itself. Pass the price the user agreed to as max_credits: the photo's prices from get_shoot or list_photos name it. If a call to this tool got no answer, it may already have started: check list_photos before calling it again.

    Annotations the server declares

    • openWorldHint: false
    • readOnlyHint: false
    • destructiveHint: false
    • idempotentHint: false
  • upload_statusFor Luala's widget: whether the file staged at key was saved by add_photo or add_selfie (tool).1 finding

    Why it is in this group

    • The name "upload_status" says "upload": a word for a change.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.

    Findings

    • Warn

      The server marks "upload_status" read-only (readOnlyHint: true), and its own name, description or input give the class "write".

      Matched text

      annotations: {"readOnlyHint":true,"openWorldHint":false}; The name "upload_status" says "upload": a word for a change.

      What this check looks for
    Description, as the server wrote it
    For Luala's widget: whether the file staged at key was saved by add_photo or add_selfie (tool). Read-only.

    Annotations the server declares

    • openWorldHint: false
    • readOnlyHint: true
  • upscaleUpscales one of the user's photos to 1K, 2K or 4K, paid from their credits.No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    Description, as the server wrote it
    Upscales one of the user's photos to 1K, 2K or 4K, paid from their credits. A photo is offered only the sizes larger than it and at most 4× its size; its prices from get_shoot or list_photos name them. Pass the price the user agreed to as max_credits. If a call to this tool got no answer, it may already have started: check list_photos before calling it again.

    Annotations the server declares

    • openWorldHint: false
    • readOnlyHint: false
    • destructiveHint: false
    • idempotentHint: false
  • zoom_inCuts a frame of the given shape out of one of the user's photos and upscales it to a full photo, paid from their credits.No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    Description, as the server wrote it
    Cuts a frame of the given shape out of one of the user's photos and upscales it to a full photo, paid from their credits. x, y and w are the frame's left edge, top edge and width as fractions of the photo (0 to 1); left out, the largest frame is centred. Pass the price the user agreed to as max_credits: the photo's prices from get_shoot or list_photos name it. If a call to this tool got no answer, it may already have started: check list_photos before calling it again.

    Annotations the server declares

    • openWorldHint: false
    • readOnlyHint: false
    • destructiveHint: false
    • idempotentHint: false
Only reads 4Show 4 read-only tools
  • get_packA pack's or mix's options (outfit, place, light, shots, shape and the attribute pickers), with ids, labels and defaults, and its price per photo.No findings

    Why it is in this group

    • The name "get_pack" says "get": a word for reading.
    Description, as the server wrote it
    A pack's or mix's options (outfit, place, light, shots, shape and the attribute pickers), with ids, labels and defaults, and its price per photo. Each shot is one photo, and the user may pick any of them, from one to all (the default). start_shoot takes these ids.

    Annotations the server declares

    • openWorldHint: false
    • readOnlyHint: true
  • get_shootA shoot's photos: each one's id, whether it is ready, still working or failed (failed photos are refunded), each one's link in the Luala app (the link to give the user), and the sh…No findings

    Why it is in this group

    • The name "get_shoot" says "get": a word for reading.
    Description, as the server wrote it
    A shoot's photos: each one's id, whether it is ready, still working or failed (failed photos are refunded), each one's link in the Luala app (the link to give the user), and the shoot's page there; previews of the ready ones once none is working. While photos are working it waits up to 25 seconds for them before answering; call it again until none is working, telling the user how many are ready each time.

    Annotations the server declares

    • openWorldHint: false
    • readOnlyHint: true
  • list_packsLists Luala's photo packs (a themed shoot of several photos of the user, made from their selfies) and mixes (one photo from each of several packs), with what all of a pack's photos…No findings

    Why it is in this group

    • The name "list_packs" says "list": a word for reading.
    Description, as the server wrote it
    Lists Luala's photo packs (a themed shoot of several photos of the user, made from their selfies) and mixes (one photo from each of several packs), with what all of a pack's photos cost and the price of one: a shoot can be any of a pack's shots, down to a single photo. Optionally only the packs for one use case.

    Annotations the server declares

    • openWorldHint: false
    • readOnlyHint: true
  • list_photosWith ids, those photos (up to 10), with a preview of each ready one once none is working: how to fetch an edit's result.No findings

    Why it is in this group

    • The name "list_photos" says "list": a word for reading.
    Description, as the server wrote it
    With ids, those photos (up to 10), with a preview of each ready one once none is working: how to fetch an edit's result. While one is working it waits up to 25 seconds for it. Without, the user's latest shoots, newest first, five at a time; pass the answer's next as before for the five after. With uploads true, the photos the user added in the app (My photos) and those made from them, newest first, ten at a time, paged the same way: an old print to restore, clothes to try on, something to add.

    Annotations the server declares

    • openWorldHint: false
    • readOnlyHint: true

This is not a safety rating, and no finding is not a safety guarantee. The groups and findings come from fixed checks of the tool definitions the server returned on the date shown, not from its code or what it does when called. How the checks work.

Exfil surface

Which tools read private data, which read text someone else can write, and which can send data out. One of each is a path a prompt injection can use.

No private-data, untrusted-input, outbound path in this server alone: no tool is tagged private-data or outbound.

Reads private data0
Reads files, mail, messages, databases, secrets, calendars or repositories.
Reads text others write2
Brings in text someone else can write: web pages, inbound email, messages, issues and comments.
Can send data out0
Can carry data to people or systems: it sends, posts or publishes, or takes a recipient, channel or URL.

Other servers in the same agent add their own tools to these paths. Audit your whole setup to see them together.

Findings

Matches of fixed checks, with the text they matched.

2 warn
  • The server marks "remove_background" not destructive (destructiveHint: false), and its own name, description or input give the class "destructive".

    Matched text

    annotations: {"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false}; The name "remove_background" says "remove": a word for removing or ending something.

    What this check looks for
  • The server marks "upload_status" read-only (readOnlyHint: true), and its own name, description or input give the class "write".

    Matched text

    annotations: {"readOnlyHint":true,"openWorldHint":false}; The name "upload_status" says "upload": a word for a change.

    What this check looks for

History

Changes to its tool definitions and to its remote endpoint, newest first.

No change seen yet. Its tools are rescanned every day, and a remote endpoint is looked at once a week.

Install

Pinned to version 1.19.0. Values in angle brackets are yours to fill in.

claude mcp add --transport http luala https://luala.app/mcp
claude mcp add --transport http luala https://luala.app/mcp

Run in a terminal.

Claude Code permissions

Allow the reads, ask before a change or a way out, deny the deletes. Paste into .claude/settings.json.

.claude/settings.json
{
  "permissions": {
    "allow": [
      "mcp__luala__list_packs",
      "mcp__luala__get_pack",
      "mcp__luala__get_shoot",
      "mcp__luala__list_photos"
    ],
    "ask": [
      "mcp__luala__start_shoot",
      "mcp__luala__edit",
      "mcp__luala__zoom_in",
      "mcp__luala__upscale",
      "mcp__luala__reroll",
      "mcp__luala__replace_background",
      "mcp__luala__light_camera",
      "mcp__luala__restore",
      "mcp__luala__combine",
      "mcp__luala__try_on",
      "mcp__luala__add_photo",
      "mcp__luala__add_selfie",
      "mcp__luala__upload_status",
      "mcp__luala__balance"
    ],
    "deny": [
      "mcp__luala__remove_background"
    ]
  }
}

Tools that only read are allowed, tools that change things ask first, tools that delete or cancel are denied. A read that can send data out (it takes a URL, say) asks first too. It assumes the server is installed as luala. Review it before you use it.

Capability tags behind 2 rules
  • mcp__luala__add_photo untrusted-input
  • mcp__luala__add_selfie untrusted-input

Pin

Keep the decision: fail CI when the tools change, follow every change, or show a badge.

Pin in CI

Fail a build when the tools you reviewed are not the tools the server serves today.

curl -s "https://anlyon.dev/api/v1/servers/app.luala/luala/verify?hash=63aec9307cf0e53204b9d04f7a47001ab9ec81cfe402d1582c957fecebcb7cb4" | jq -e '.changed == false'

Pinned hash 63aec9307cf0, from Nov 3, 2026, 12:17 UTC.

Watch

Get told when its tools change: a new tool, a new description, a new class.

https://anlyon.dev/servers/app.luala/luala/changes.xml

An Atom feed. Works in any feed reader or Slack's RSS app.

Badge

anlyon.dev badge for app.luala/luala
[![anlyon.dev](https://anlyon.dev/badge/app.luala/luala.svg)](https://anlyon.dev/servers/app.luala/luala)

Source: MCP Registry. Synced Nov 3, 2026, 12:17 UTC.