addrbookFor publishers
← The evidence ledger

Evidence row 3405664

Observed , by probe.mcp/1.

Kind
mcp.tools
About
endpoint 4e8b2aaf-2efe-4b1e-9194-3e9f5e951f0d
Recorded
Previous row
#2990488
Body SHA-256
4f471fd4d0241d2328bb34f7f16ee034d9d2bf976e31557aa1d3248a1ae4fe7b
Leaf
0x13be6095b6c2cc54ce46e9b45f502e68a611d6474374727403872880715a75a4

What was observed

{
  "count": 21,
  "tools": [
    {
      "description": "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.",
      "inputSchema": {
        "properties": {
          "content_type": {
            "type": "string"
          },
          "key": {
            "type": "string"
          },
          "photo": {
            "description": "The file the user attached.",
            "properties": {
              "download_url": {
                "type": "string"
              },
              "file_id": {
                "type": "string"
              },
              "file_name": {
                "type": "string"
              },
              "mime_type": {
                "type": "string"
              }
            },
            "required": [
              "download_url",
              "file_id"
            ],
            "type": "object"
          },
          "size": {
            "minimum": 1,
            "type": "integer"
          }
        },
        "type": "object"
      },
      "name": "add_photo"
    },
    {
      "description": "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.",
      "inputSchema": {
        "properties": {
          "content_type": {
            "type": "string"
          },
          "key": {
            "type": "string"
          },
          "photo": {
            "description": "The file the user attached.",
            "properties": {
              "download_url": {
                "type": "string"
              },
              "file_id": {
                "type": "string"
              },
              "file_name": {
                "type": "string"
              },
              "mime_type": {
                "type": "string"
              }
            },
            "required": [
              "download_url",
              "file_id"
            ],
            "type": "object"
          },
          "size": {
            "minimum": 1,
            "type": "integer"
          }
        },
        "type": "object"
      },
      "name": "add_selfie"
    },
    {
      "description": "The user's credit balance, about how many photos it buys, and where to buy more.",
      "inputSchema": {
        "properties": {},
        "type": "object"
      },
      "name": "balance"
    },
    {
      "description": "Hides every face in one of the user's photos, as a new photo, paid from their credits: effect blur or pixelate, strength 0 (light) to 100 (strong). The faces are found by Luala; with none found nothing is started or charged. To keep some faces sharp or hide one it missed, the user opens the photo's link and uses Blur faces in the app. 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.",
      "inputSchema": {
        "properties": {
          "effect": {
            "default": "blur",
            "enum": [
              "blur",
              "pixelate"
            ],
            "type": "string"
          },
          "max_credits": {
            "minimum": 1,
            "type": "integer"
          },
          "photo_id": {
            "type": "integer"
          },
          "strength": {
            "default": 70,
            "maximum": 100,
            "minimum": 0,
            "type": "integer"
          }
        },
        "required": [
          "photo_id",
          "max_credits"
        ],
        "type": "object"
      },
      "name": "blur_faces"
    },
    {
      "description": "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.",
      "inputSchema": {
        "properties": {
          "max_credits": {
            "minimum": 1,
            "type": "integer"
          },
          "photo_id": {
            "type": "integer"
          },
          "with_photo_id": {
            "type": "integer"
          }
        },
        "required": [
          "photo_id",
          "with_photo_id",
          "max_credits"
        ],
        "type": "object"
      },
      "name": "combine"
    },
    {
      "description": "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.",
      "inputSchema": {
        "properties": {
          "beard": {
            "enum": [
              "as_in_photos",
              "clean",
              "stubble",
              "full"
            ],
            "type": "string"
          },
          "expression": {
            "enum": [
              "as_in_photos",
              "smiling",
              "calm",
              "serious",
              "laughing"
            ],
            "type": "string"
          },
          "glasses": {
            "enum": [
              "as_in_photos",
              "none",
              "glasses",
              "sunglasses"
            ],
            "type": "string"
          },
          "hair_colour": {
            "enum": [
              "as_in_photos",
              "blonde",
              "brown",
              "black",
              "red",
              "grey"
            ],
            "type": "string"
          },
          "hair_length": {
            "enum": [
              "as_in_photos",
              "short",
              "shoulder",
              "long"
            ],
            "type": "string"
          },
          "light": {
            "enum": [
              "day",
              "golden_hour",
              "evening",
              "studio"
            ],
            "type": "string"
          },
          "makeup": {
            "enum": [
              "as_in_photos",
              "none",
              "natural",
              "glam"
            ],
            "type": "string"
          },
          "max_credits": {
            "minimum": 1,
            "type": "integer"
          },
          "outfit": {
            "type": "string"
          },
          "photo_id": {
            "type": "integer"
          },
          "place": {
            "type": "string"
          },
          "text": {
            "maxLength": 300,
            "type": "string"
          },
          "type": {
            "enum": [
              "change",
              "zoom_out"
            ],
            "type": "string"
          }
        },
        "required": [
          "photo_id",
          "type",
          "max_credits"
        ],
        "type": "object"
      },
      "name": "edit"
    },
    {
      "description": "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.",
      "inputSchema": {
        "properties": {
          "slug": {
            "description": "The pack's or mix's slug.",
            "type": "string"
          }
        },
        "required": [
          "slug"
        ],
        "type": "object"
      },
      "name": "get_pack"
    },
    {
      "description": "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.",
      "inputSchema": {
        "properties": {
          "shoot_id": {
            "type": "integer"
          }
        },
        "required": [
          "shoot_id"
        ],
        "type": "object"
      },
      "name": "get_shoot"
    },
    {
      "description": "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.",
      "inputSchema": {
        "properties": {
          "angle": {
            "enum": [
              "eye_level",
              "low",
              "high"
            ],
            "type": "string"
          },
          "focus": {
            "enum": [
              "blur",
              "sharp"
            ],
            "type": "string"
          },
          "lens": {
            "enum": [
              "24mm",
              "35mm",
              "50mm",
              "85mm",
              "135mm",
              "anamorphic"
            ],
            "type": "string"
          },
          "light": {
            "enum": [
              "day",
              "golden_hour",
              "evening",
              "studio",
              "side",
              "rembrandt",
              "butterfly",
              "rim",
              "neon",
              "candle",
              "flash"
            ],
            "type": "string"
          },
          "look": {
            "enum": [
              "teal_orange",
              "portra",
              "fuji",
              "bw",
              "high_key",
              "low_key",
              "seventies",
              "grain",
              "kodachrome",
              "chrome",
              "cinestill",
              "tri_x",
              "instant"
            ],
            "type": "string"
          },
          "max_credits": {
            "minimum": 1,
            "type": "integer"
          },
          "photo_id": {
            "type": "integer"
          },
          "text": {
            "maxLength": 300,
            "type": "string"
          }
        },
        "required": [
          "photo_id",
          "max_credits"
        ],
        "type": "object"
      },
      "name": "light_camera"
    },
    {
      "description": "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.",
      "inputSchema": {
        "properties": {
          "use_case": {
            "description": "Only the packs for this use case.",
            "enum": [
              "dating",
              "brand",
              "social",
              "headshot",
              "fun",
              "moments"
            ],
            "type": "string"
          }
        },
        "type": "object"
      },
      "name": "list_packs"
    },
    {
      "description": "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.",
      "inputSchema": {
        "properties": {
          "before": {
            "type": "integer"
          },
          "ids": {
            "items": {
              "type": "integer"
            },
            "maxItems": 10,
            "type": "array"
          },
          "uploads": {
            "type": "boolean"
          }
        },
        "type": "object"
      },
      "name": "list_photos"
    },
    {
      "description": "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.",
      "inputSchema": {
        "properties": {
          "backdrop": {
            "default": "clear",
            "pattern": "^(clear|#[0-9a-fA-F]{6})$",
            "type": "string"
          },
          "max_credits": {
            "minimum": 1,
            "type": "integer"
          },
          "photo_id": {
            "type": "integer"
          }
        },
        "required": [
          "photo_id",
          "max_credits"
        ],
        "type": "object"
      },
      "name": "remove_background"
    },
    {
      "description": "Takes what description names out of one of the user's photos, paid from their credits, and fills where it was from what is around it; nothing else in the photo changes. Describe it as the user did, in any language (the people behind me, the bin on the left, the sign and the cables): Luala finds every match and removes the ones the words mean. 4 credits for one or two kinds of thing, 5 for three or four; when nothing matches, nothing is charged and the answer says so. Not on a cutout. 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.",
      "inputSchema": {
        "properties": {
          "description": {
            "maxLength": 200,
            "minLength": 1,
            "type": "string"
          },
          "max_credits": {
            "minimum": 1,
            "type": "integer"
          },
          "photo_id": {
            "type": "integer"
          }
        },
        "required": [
          "photo_id",
          "description",
          "max_credits"
        ],
        "type": "object"
      },
      "name": "remove_objects"
    },
    {
      "description": "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.",
      "inputSchema": {
        "properties": {
          "max_credits": {
            "minimum": 1,
            "type": "integer"
          },
          "photo_id": {
            "type": "integer"
          },
          "scene": {
            "enum": [
              "studio_white",
              "studio_grey",
              "studio_colour",
              "office",
              "bookshelf",
              "cafe",
              "city_street",
              "park",
              "beach",
              "home"
            ],
            "type": "string"
          },
          "text": {
            "maxLength": 300,
            "type": "string"
          }
        },
        "required": [
          "photo_id",
          "max_credits"
        ],
        "type": "object"
      },
      "name": "replace_background"
    },
    {
      "description": "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.",
      "inputSchema": {
        "properties": {
          "max_credits": {
            "minimum": 1,
            "type": "integer"
          },
          "photo_id": {
            "type": "integer"
          }
        },
        "required": [
          "photo_id",
          "max_credits"
        ],
        "type": "object"
      },
      "name": "reroll"
    },
    {
      "description": "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.",
      "inputSchema": {
        "properties": {
          "colourise": {
            "default": false,
            "type": "boolean"
          },
          "faces": {
            "default": true,
            "type": "boolean"
          },
          "max_credits": {
            "minimum": 1,
            "type": "integer"
          },
          "photo_id": {
            "type": "integer"
          },
          "repair": {
            "default": true,
            "type": "boolean"
          },
          "size": {
            "enum": [
              "1K",
              "2K"
            ],
            "type": "string"
          }
        },
        "required": [
          "photo_id",
          "size",
          "max_credits"
        ],
        "type": "object"
      },
      "name": "restore"
    },
    {
      "description": "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.",
      "inputSchema": {
        "properties": {
          "max_credits": {
            "description": "The most the user agreed to pay.",
            "minimum": 1,
            "type": "integer"
          },
          "options": {
            "description": "Option ids from get_pack: outfit, place, light, ratio, shots (a list of shot ids) and any attribute key. Anything left out keeps its default.",
            "type": "object"
          },
          "pack": {
            "description": "The pack's or mix's slug.",
            "type": "string"
          }
        },
        "required": [
          "pack",
          "max_credits"
        ],
        "type": "object"
      },
      "name": "start_shoot"
    },
    {
      "description": "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.",
      "inputSchema": {
        "properties": {
          "max_credits": {
            "minimum": 1,
            "type": "integer"
          },
          "part": {
            "enum": [
              "top",
              "bottom"
            ],
            "type": "string"
          },
          "photo_id": {
            "type": "integer"
          },
          "with_photo_id": {
            "type": "integer"
          }
        },
        "required": [
          "photo_id",
          "with_photo_id",
          "max_credits"
        ],
        "type": "object"
      },
      "name": "try_on"
    },
    {
      "description": "For Luala's widget: whether the file staged at key was saved by add_photo or add_selfie (tool). Read-only.",
      "inputSchema": {
        "properties": {
          "key": {
            "type": "string"
          },
          "tool": {
            "enum": [
              "add_photo",
              "add_selfie"
            ],
            "type": "string"
          }
        },
        "required": [
          "tool",
          "key"
        ],
        "type": "object"
      },
      "name": "upload_status"
    },
    {
      "description": "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.",
      "inputSchema": {
        "properties": {
          "max_credits": {
            "minimum": 1,
            "type": "integer"
          },
          "photo_id": {
            "type": "integer"
          },
          "size": {
            "enum": [
              "1K",
              "2K",
              "4K"
            ],
            "type": "string"
          }
        },
        "required": [
          "photo_id",
          "size",
          "max_credits"
        ],
        "type": "object"
      },
      "name": "upscale"
    },
    {
      "description": "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.",
      "inputSchema": {
        "properties": {
          "max_credits": {
            "minimum": 1,
            "type": "integer"
          },
          "photo_id": {
            "type": "integer"
          },
          "ratio": {
            "enum": [
              "1:1",
              "9:16",
              "4:5",
              "3:4",
              "2:3",
              "16:9",
              "5:4",
              "4:3",
              "3:2"
            ],
            "type": "string"
          },
          "w": {
            "maximum": 1,
            "minimum": 0,
            "type": "number"
          },
          "x": {
            "maximum": 1,
            "minimum": 0,
            "type": "number"
          },
          "y": {
            "maximum": 1,
            "minimum": 0,
            "type": "number"
          }
        },
        "required": [
          "photo_id",
          "ratio",
          "max_credits"
        ],
        "type": "object"
      },
      "name": "zoom_in"
    }
  ]
}

What the leaf hashes

{"body":"4f471fd4d0241d2328bb34f7f16ee034d9d2bf976e31557aa1d3248a1ae4fe7b","id":3405664,"kind":"mcp.tools","method":"probe.mcp/1","observed_us":1793883960581633,"prev":2990488,"subject":"4e8b2aaf-2efe-4b1e-9194-3e9f5e951f0d","subject_kind":"endpoint"}

Proof

Fold these into the leaf in order, hashing each sorted pair with keccak256, to reach the root of (322504 rows).

  1. 0x13be4c7d67d4359c4d5c3c653eeb3ffcab826a72668ad733bee4de7ea15be953
  2. 0xcedadec02ba525df66df06899aa5501bc27b1b61300ad15508ecd7cb4dacd45f
  3. 0xbf406e41055030acd5210006e7adbb9a1c5877672490236f4af004da665109eb
  4. 0x5010e17aa606a9d0e29d00957ee6af985aac3b630133acd069c8e706cf62c214
  5. 0x3c4b696e8971a5db6715c9c6d9c2335ace7a797eb1324e395cfed878dec8c05d
  6. 0xc59d1e83caa71d7f7f5bccdacc717faa7e9d83e9a9efa812611973bc0a780a87
  7. 0xf241be3e7d3190833b1d8e66a780582b20d3124821a0e9fbc9886b7dbe2c777a
  8. 0x5e40f0cc740130c5c77cf77d34b8c048fdb291179fee24f23370136dd5da70d1
  9. 0xd73a3f7302e40219e67a760f480596697e9d1f798f1ea99c1ed06dc40f24c293
  10. 0x99ec023fc1e2adc04aab7306cc69063bc3fa8ac858d849eef7dd195390cf9fb2
  11. 0xe27b06c126a6614497013a0eb8b71620137ee5015c93a1976fe91c9f8edd0de9
  12. 0xd64a6566f24e5e47ca97c1c45376acd9687d13e0f294565e4e5bb9d68ab8bda4
  13. 0x56fb483f90a438aa799fb13783ca8c16107192f63c2eaf825e0f1afcbb86968a
  14. 0x887993386ba8c77165972bfd61a7626182576fdc51fd76a24fcaca885bf67d2a
  15. 0x752bb7ff1be85646eaf6af7e83e853b7b33e92ad9c57231f0b796b8997fb1076
  16. 0xcde4d0d0f64b40921f36a3f07dfe9c7256f1d0a8925aed414788c614314b871e
  17. 0x0cdf39687556f127f9de2f03ec7df8e10e613bf9487760cbe3eaaaa02d8d48b4
  18. 0xa9caf228b42660818160afb416ff04cb014f57c4d8ee75ea3452fb76c3d8c645
  19. 0xf72fe7c4860b9addb17aac4a00b8afc2f8085836173f10f31697c3d192df119b
Day root
0x9f0215efb0252701dc86d5600ce95f276cccc716759bf112525ae863f698d128
Chained
0xc54ddff800630c6cd9656f99e7d6a61adce99bf1cea37121600598b0a9a720d2
Published
On Arc Testnet, block 70942081: 0x88f612ad94ca63af4e4e9faab9f34b665b41f03828afac1571ad013cc62bba94

How to check it · This row as JSON