{
  "automatic_evidence_credit": false,
  "captures": [],
  "change_log": [
    {
      "after_hash": "f3318c259877704df277c88da9969dff3ddba377a68c08ae01e83a8314122d88",
      "before_hash": "f3318c259877704df277c88da9969dff3ddba377a68c08ae01e83a8314122d88",
      "diff": {
        "changes": [
          {
            "compatibility_class": "INFO",
            "fact": "Declared provider, version, model, operator or AI self-disclosure changed",
            "kind": "DECLARED_INGREDIENTS_CHANGED",
            "path": "$.declared_ingredients_changed",
            "security_relevant_field": false
          }
        ],
        "classified": true,
        "counts_by_class": {
          "BREAKING": 0,
          "INFO": 1,
          "NON_BREAKING": 0
        },
        "taxonomy_version": null,
        "total": 1,
        "truncated": false
      },
      "entry_sha256": "29da0b5696abe91efd79ebb38ad96721403d919d06d655e78504a69ff02e2729",
      "evidence_class": "FACT_CHANGE",
      "labels": [
        "DECLARED_INGREDIENTS_CHANGED"
      ],
      "observed_at_utc": "2026-10-16T03:15:23Z",
      "previous_entry_sha256": "c98f24fd31bc17c78b1df99d8cfbde6d57907cce5d71829e6164a5525be1c5c7",
      "receipt_id": null,
      "receipt_url": null,
      "sequence": 31922,
      "target_id": "obs_eb433c5ecc94b594bf232049",
      "target_kind": "MCP_REMOTE",
      "target_locator": "https://mcp.ludo.ai/mcp"
    },
    {
      "after_hash": "f3318c259877704df277c88da9969dff3ddba377a68c08ae01e83a8314122d88",
      "before_hash": "f3318c259877704df277c88da9969dff3ddba377a68c08ae01e83a8314122d88",
      "diff": {
        "changes": [],
        "classified": true,
        "counts_by_class": {
          "BREAKING": 0,
          "INFO": 0,
          "NON_BREAKING": 0
        },
        "taxonomy_version": "1.0.0",
        "total": 0,
        "truncated": false
      },
      "entry_sha256": "8af0e3bd263f022e78c01abc7e890ce06ca06d1a92f02e97026e459776b379b0",
      "evidence_class": "MANIFEST_CHANGE",
      "labels": [
        "MANIFEST_CHANGED"
      ],
      "observed_at_utc": "2026-10-15T01:46:02Z",
      "previous_entry_sha256": "b7012f005b6ec843567972d98ffae0a754f43b4c92eac3131e753eaa0fcae43a",
      "receipt_id": "b6214606-eac9-5b77-927a-05cda15eaed8",
      "receipt_url": "https://www.gaipagents.com/v1/free/receipts/b6214606-eac9-5b77-927a-05cda15eaed8",
      "sequence": 30381,
      "target_id": "obs_eb433c5ecc94b594bf232049",
      "target_kind": "MCP_REMOTE",
      "target_locator": "https://mcp.ludo.ai/mcp"
    },
    {
      "after_hash": "f3318c259877704df277c88da9969dff3ddba377a68c08ae01e83a8314122d88",
      "before_hash": "f67d7b40a523c58b7a138b25362cc132a13e331f14b5809ccf87fdf5561855d0",
      "diff": {
        "changes": [
          {
            "compatibility_class": "INFO",
            "fact": "tool description changed",
            "kind": "TOOL_DESCRIPTION_CHANGED",
            "path": "tools[animateSpriteKeyframes].description",
            "security_relevant_field": false
          },
          {
            "compatibility_class": "INFO",
            "fact": "tool description changed",
            "kind": "TOOL_DESCRIPTION_CHANGED",
            "path": "tools[editSpritesheet].description",
            "security_relevant_field": false
          },
          {
            "compatibility_class": "NON_BREAKING",
            "fact": "input enum value added",
            "kind": "INPUT_ENUM_VALUE_ADDED",
            "path": "tools[editSpritesheet].inputSchema.properties[requestBody].properties[edit_mode].enum",
            "security_relevant_field": false
          },
          {
            "compatibility_class": "NON_BREAKING",
            "fact": "input enum value added",
            "kind": "INPUT_ENUM_VALUE_ADDED",
            "path": "tools[rotateSpritesheet].inputSchema.properties[requestBody].properties[model].enum",
            "security_relevant_field": false
          }
        ],
        "classified": true,
        "counts_by_class": {
          "BREAKING": 0,
          "INFO": 2,
          "NON_BREAKING": 2
        },
        "taxonomy_version": "1.0.0",
        "total": 4,
        "truncated": false
      },
      "entry_sha256": "943e01ac2d82c446969a9f141ac9b3c0f72bcebac98086be8871872b48cdec5c",
      "evidence_class": "MANIFEST_CHANGE",
      "labels": [
        "MANIFEST_CHANGED",
        "TOOL_LIST_OR_TOOL_TEXT_CHANGED"
      ],
      "observed_at_utc": "2026-10-13T23:36:53Z",
      "previous_entry_sha256": "8b8861e388942de66864a1e1e400b167e46378c327bc839f745c34593503e6e3",
      "receipt_id": "211f3afb-1bc7-56ab-8a2d-1d36d0b8626c",
      "receipt_url": "https://www.gaipagents.com/v1/free/receipts/211f3afb-1bc7-56ab-8a2d-1d36d0b8626c",
      "sequence": 29378,
      "target_id": "obs_eb433c5ecc94b594bf232049",
      "target_kind": "MCP_REMOTE",
      "target_locator": "https://mcp.ludo.ai/mcp"
    },
    {
      "after_hash": "f67d7b40a523c58b7a138b25362cc132a13e331f14b5809ccf87fdf5561855d0",
      "before_hash": "8c6b8673721bd99e01a96ba0da1752fb7c4ca1c2ef545e0a3a448ed85c73a6d0",
      "diff": {
        "changes": [
          {
            "compatibility_class": "INFO",
            "fact": "tool description changed",
            "kind": "TOOL_DESCRIPTION_CHANGED",
            "path": "tools[create3DModel].description",
            "security_relevant_field": false
          },
          {
            "compatibility_class": "NON_BREAKING",
            "fact": "input field added",
            "kind": "INPUT_FIELD_ADDED",
            "path": "tools[create3DModel].inputSchema.properties[requestBody].properties[model]",
            "security_relevant_field": false
          },
          {
            "compatibility_class": "INFO",
            "fact": "tool description changed",
            "kind": "TOOL_DESCRIPTION_CHANGED",
            "path": "tools[rigModel].description",
            "security_relevant_field": false
          }
        ],
        "classified": true,
        "counts_by_class": {
          "BREAKING": 0,
          "INFO": 2,
          "NON_BREAKING": 1
        },
        "taxonomy_version": "1.0.0",
        "total": 3,
        "truncated": false
      },
      "entry_sha256": "8027e9774d1de538478427b66747be1cad2c209cfb31e80e4fcc496637301875",
      "evidence_class": "MANIFEST_CHANGE",
      "labels": [
        "MANIFEST_CHANGED",
        "TOOL_LIST_OR_TOOL_TEXT_CHANGED"
      ],
      "observed_at_utc": "2026-10-10T19:19:38Z",
      "previous_entry_sha256": "36b3b810c995358eb33df1f7a857ae58ac024c9a79f8f74a31817e7185c615a8",
      "receipt_id": "e2fc870c-f959-5c83-ac13-a3b06116a563",
      "receipt_url": "https://www.gaipagents.com/v1/free/receipts/e2fc870c-f959-5c83-ac13-a3b06116a563",
      "sequence": 23147,
      "target_id": "obs_eb433c5ecc94b594bf232049",
      "target_kind": "MCP_REMOTE",
      "target_locator": "https://mcp.ludo.ai/mcp"
    },
    {
      "after_hash": "8c6b8673721bd99e01a96ba0da1752fb7c4ca1c2ef545e0a3a448ed85c73a6d0",
      "before_hash": "2e47fa9d512cfd03ef05d36d8c42a29b38a2b5432dd5bc8a259cab2dc2152397",
      "diff": {
        "changes": [
          {
            "compatibility_class": "INFO",
            "fact": "tool description changed",
            "kind": "TOOL_DESCRIPTION_CHANGED",
            "path": "tools[submitApiFeedback].description",
            "security_relevant_field": false
          },
          {
            "compatibility_class": "NON_BREAKING",
            "fact": "input field added",
            "kind": "INPUT_FIELD_ADDED",
            "path": "tools[submitApiFeedback].inputSchema.properties[requestBody].properties[job_ids]",
            "security_relevant_field": false
          }
        ],
        "classified": true,
        "counts_by_class": {
          "BREAKING": 0,
          "INFO": 1,
          "NON_BREAKING": 1
        },
        "taxonomy_version": "1.0.0",
        "total": 2,
        "truncated": false
      },
      "entry_sha256": "13d341f08ea3f91db8c1a8076eeecb21ecfc5a2ae85baf83f3efc2d8d85d8c2c",
      "evidence_class": "MANIFEST_CHANGE",
      "labels": [
        "MANIFEST_CHANGED",
        "TOOL_LIST_OR_TOOL_TEXT_CHANGED"
      ],
      "observed_at_utc": "2026-10-09T17:47:32Z",
      "previous_entry_sha256": "68a73c2a7f7455dd99e4fa35d13a80f74a5acf1bb0337af13453caeeab6e3a25",
      "receipt_id": "a8381362-e35e-5a95-a188-f71fb626bdf1",
      "receipt_url": "https://www.gaipagents.com/v1/free/receipts/a8381362-e35e-5a95-a188-f71fb626bdf1",
      "sequence": 21069,
      "target_id": "obs_eb433c5ecc94b594bf232049",
      "target_kind": "MCP_REMOTE",
      "target_locator": "https://mcp.ludo.ai/mcp"
    },
    {
      "after_hash": "2e47fa9d512cfd03ef05d36d8c42a29b38a2b5432dd5bc8a259cab2dc2152397",
      "before_hash": "ca3c1be2f39ee849b6c52446e6b569af35d6072746245d68a08288fa0e68c0c8",
      "diff": {
        "changes": [
          {
            "compatibility_class": "INFO",
            "fact": "tool description changed",
            "kind": "TOOL_DESCRIPTION_CHANGED",
            "path": "tools[animate3DModelPreset].description",
            "security_relevant_field": false
          },
          {
            "compatibility_class": "INFO",
            "fact": "tool description changed",
            "kind": "TOOL_DESCRIPTION_CHANGED",
            "path": "tools[create3DModel].description",
            "security_relevant_field": false
          },
          {
            "compatibility_class": "INFO",
            "fact": "tool description changed",
            "kind": "TOOL_DESCRIPTION_CHANGED",
            "path": "tools[listAnimationPresets].description",
            "security_relevant_field": false
          }
        ],
        "classified": true,
        "counts_by_class": {
          "BREAKING": 0,
          "INFO": 3,
          "NON_BREAKING": 0
        },
        "taxonomy_version": "1.0.0",
        "total": 3,
        "truncated": false
      },
      "entry_sha256": "be4974f96a07b7086fa822ae26275fd6b0110c40b48a87f10b6221a8b7914bfe",
      "evidence_class": "MANIFEST_CHANGE",
      "labels": [
        "MANIFEST_CHANGED",
        "TOOL_LIST_OR_TOOL_TEXT_CHANGED"
      ],
      "observed_at_utc": "2026-10-08T16:13:30Z",
      "previous_entry_sha256": "b3ddc6d38c2f0bff89df23a8773d9aa4018ddab142b070aba01eb7a78ae13dc7",
      "receipt_id": "fdba056a-33ee-56a2-85b2-5d32fb83d96e",
      "receipt_url": "https://www.gaipagents.com/v1/free/receipts/fdba056a-33ee-56a2-85b2-5d32fb83d96e",
      "sequence": 20304,
      "target_id": "obs_eb433c5ecc94b594bf232049",
      "target_kind": "MCP_REMOTE",
      "target_locator": "https://mcp.ludo.ai/mcp"
    },
    {
      "after_hash": "ca3c1be2f39ee849b6c52446e6b569af35d6072746245d68a08288fa0e68c0c8",
      "before_hash": "029e1d1c2dfd8099534737478e840a1f5411897f63b63041120c8c18b941056f",
      "diff": {
        "changes": [
          {
            "compatibility_class": "INFO",
            "fact": "tool description changed",
            "kind": "TOOL_DESCRIPTION_CHANGED",
            "path": "tools[adjustSpritesheet].description",
            "security_relevant_field": false
          },
          {
            "compatibility_class": "INFO",
            "fact": "tool description changed",
            "kind": "TOOL_DESCRIPTION_CHANGED",
            "path": "tools[animateSpriteKeyframes].description",
            "security_relevant_field": false
          },
          {
            "compatibility_class": "INFO",
            "fact": "tool description changed",
            "kind": "TOOL_DESCRIPTION_CHANGED",
            "path": "tools[createVideo].description",
            "security_relevant_field": false
          },
          {
            "compatibility_class": "INFO",
            "fact": "tool description changed",
            "kind": "TOOL_DESCRIPTION_CHANGED",
            "path": "tools[createVideoFromReferences].description",
            "security_relevant_field": false
          },
          {
            "compatibility_class": "INFO",
            "fact": "tool description changed",
            "kind": "TOOL_DESCRIPTION_CHANGED",
            "path": "tools[editSpritesheet].description",
            "security_relevant_field": false
          },
          {
            "compatibility_class": "INFO",
            "fact": "tool description changed",
            "kind": "TOOL_DESCRIPTION_CHANGED",
            "path": "tools[editVideo].description",
            "security_relevant_field": false
          },
          {
            "compatibility_class": "INFO",
            "fact": "tool description changed",
            "kind": "TOOL_DESCRIPTION_CHANGED",
            "path": "tools[submitApiFeedback].description",
            "security_relevant_field": false
          }
        ],
        "classified": true,
        "counts_by_class": {
          "BREAKING": 0,
          "INFO": 7,
          "NON_BREAKING": 0
        },
        "taxonomy_version": "1.0.0",
        "total": 7,
        "truncated": false
      },
      "entry_sha256": "52e3e609496c3d91eaf4097b1efd13eb953ee77cf69c204aab4743da4f43d5f4",
      "evidence_class": "MANIFEST_CHANGE",
      "labels": [
        "MANIFEST_CHANGED",
        "TOOL_LIST_OR_TOOL_TEXT_CHANGED"
      ],
      "observed_at_utc": "2026-10-07T14:52:06Z",
      "previous_entry_sha256": "1484e6ae0b864b7073bac3b3dae94197d0d7db67e4d6e3684746e2e7db06f016",
      "receipt_id": "d97f517d-7ce1-54b2-8f6e-f62a71a86010",
      "receipt_url": "https://www.gaipagents.com/v1/free/receipts/d97f517d-7ce1-54b2-8f6e-f62a71a86010",
      "sequence": 19029,
      "target_id": "obs_eb433c5ecc94b594bf232049",
      "target_kind": "MCP_REMOTE",
      "target_locator": "https://mcp.ludo.ai/mcp"
    },
    {
      "after_hash": "029e1d1c2dfd8099534737478e840a1f5411897f63b63041120c8c18b941056f",
      "before_hash": "6fb25ffa1255ef3ce23126d8b0580c92a32c9541dcebca82f8fa163f1f7b732b",
      "diff": {
        "changes": [
          {
            "compatibility_class": "BREAKING",
            "fact": "input field removed",
            "kind": "INPUT_FIELD_REMOVED",
            "path": "tools[transferMotion].inputSchema.properties[requestBody].properties[margin_ratio]",
            "security_relevant_field": false
          }
        ],
        "classified": true,
        "counts_by_class": {
          "BREAKING": 1,
          "INFO": 0,
          "NON_BREAKING": 0
        },
        "taxonomy_version": "1.0.0",
        "total": 1,
        "truncated": false
      },
      "entry_sha256": "313da312e3c27e85705b8ec709a6afbdaa9524e55c749436881dcdb148720147",
      "evidence_class": "MANIFEST_CHANGE",
      "labels": [
        "MANIFEST_CHANGED"
      ],
      "observed_at_utc": "2026-10-06T13:30:32Z",
      "previous_entry_sha256": "24b546639e68764e4b8d916e34fa0a8b6b241e0020305c584830c1c86b533166",
      "receipt_id": "b6629a43-9459-52c1-87e6-abe36ed3f942",
      "receipt_url": "https://www.gaipagents.com/v1/free/receipts/b6629a43-9459-52c1-87e6-abe36ed3f942",
      "sequence": 18470,
      "target_id": "obs_eb433c5ecc94b594bf232049",
      "target_kind": "MCP_REMOTE",
      "target_locator": "https://mcp.ludo.ai/mcp"
    },
    {
      "after_hash": "6fb25ffa1255ef3ce23126d8b0580c92a32c9541dcebca82f8fa163f1f7b732b",
      "before_hash": "5a5609cfe655b74a234bdc0bbd9f170133b730421a495eb5ff25fadf8e3f63f0",
      "diff": {
        "changes": [
          {
            "compatibility_class": "NON_BREAKING",
            "fact": "tool added",
            "kind": "TOOL_ADDED",
            "path": "tools[adjustSpritesheet]",
            "security_relevant_field": false
          }
        ],
        "classified": true,
        "counts_by_class": {
          "BREAKING": 0,
          "INFO": 0,
          "NON_BREAKING": 1
        },
        "taxonomy_version": "1.0.0",
        "total": 1,
        "truncated": false
      },
      "entry_sha256": "390d78d80ac2211a29b2e40b2abca263c22b2631d24b28fbead1cb23d09eaa88",
      "evidence_class": "MANIFEST_CHANGE",
      "labels": [
        "MANIFEST_CHANGED",
        "TOOL_LIST_OR_TOOL_TEXT_CHANGED"
      ],
      "observed_at_utc": "2026-10-05T12:00:41Z",
      "previous_entry_sha256": "6ac0cfc4167cdc4f5922f36da8d359cd376670ca6363788028411aeb2541c7e1",
      "receipt_id": "0e435718-adb0-5aab-abc4-c8d55782de98",
      "receipt_url": "https://www.gaipagents.com/v1/free/receipts/0e435718-adb0-5aab-abc4-c8d55782de98",
      "sequence": 16375,
      "target_id": "obs_eb433c5ecc94b594bf232049",
      "target_kind": "MCP_REMOTE",
      "target_locator": "https://mcp.ludo.ai/mcp"
    },
    {
      "after_hash": "5a5609cfe655b74a234bdc0bbd9f170133b730421a495eb5ff25fadf8e3f63f0",
      "before_hash": "cdf9088c7c950c419740378703384f7c0ba36bc57994125f3d751bae88b4a85c",
      "diff": {
        "changes": [
          {
            "compatibility_class": "NON_BREAKING",
            "fact": "tool added",
            "kind": "TOOL_ADDED",
            "path": "tools[rotateSpritesheet]",
            "security_relevant_field": false
          }
        ],
        "classified": true,
        "counts_by_class": {
          "BREAKING": 0,
          "INFO": 0,
          "NON_BREAKING": 1
        },
        "taxonomy_version": "1.0.0",
        "total": 1,
        "truncated": false
      },
      "entry_sha256": "5457a8db5b596a8ff3f9370a7a7d371a76687695e97ba3ffa689859a6cbaee03",
      "evidence_class": "MANIFEST_CHANGE",
      "labels": [
        "MANIFEST_CHANGED",
        "TOOL_LIST_OR_TOOL_TEXT_CHANGED"
      ],
      "observed_at_utc": "2026-10-03T09:04:41Z",
      "previous_entry_sha256": "e8a9ce46ce1e42d4935d0a830498e101c92b3a9d4a1ea6b3c487cfb262181000",
      "receipt_id": "5445cbb3-5bdc-548c-95fa-306d6fc9ff7d",
      "receipt_url": "https://www.gaipagents.com/v1/free/receipts/5445cbb3-5bdc-548c-95fa-306d6fc9ff7d",
      "sequence": 8068,
      "target_id": "obs_eb433c5ecc94b594bf232049",
      "target_kind": "MCP_REMOTE",
      "target_locator": "https://mcp.ludo.ai/mcp"
    },
    {
      "after_hash": "cdf9088c7c950c419740378703384f7c0ba36bc57994125f3d751bae88b4a85c",
      "before_hash": "cb8028431c74269396d2cb49e2ff6761e1d9a2d3e5160539dd8cfd011de6aaec",
      "diff": {
        "changes": [
          {
            "compatibility_class": "NON_BREAKING",
            "fact": "input type widened",
            "kind": "INPUT_TYPE_WIDENED",
            "path": "tools[animateSprite].inputSchema.type",
            "security_relevant_field": false
          },
          {
            "compatibility_class": "BREAKING",
            "fact": "input field removed",
            "kind": "INPUT_FIELD_REMOVED",
            "path": "tools[animateSprite].inputSchema.properties[requestBody]",
            "security_relevant_field": false
          },
          {
            "compatibility_class": "NON_BREAKING",
            "fact": "input type widened",
            "kind": "INPUT_TYPE_WIDENED",
            "path": "tools[animateSpriteKeyframes].inputSchema.type",
            "security_relevant_field": false
          },
          {
            "compatibility_class": "BREAKING",
            "fact": "input field removed",
            "kind": "INPUT_FIELD_REMOVED",
            "path": "tools[animateSpriteKeyframes].inputSchema.properties[requestBody]",
            "security_relevant_field": false
          },
          {
            "compatibility_class": "NON_BREAKING",
            "fact": "input field added",
            "kind": "INPUT_FIELD_ADDED",
            "path": "tools[editImage].inputSchema.properties[requestBody].properties[image_type]",
            "security_relevant_field": false
          },
          {
            "compatibility_class": "INFO",
            "fact": "tool description changed",
            "kind": "TOOL_DESCRIPTION_CHANGED",
            "path": "tools[submitApiFeedback].description",
            "security_relevant_field": false
          },
          {
            "compatibility_class": "NON_BREAKING",
            "fact": "protocol version changed",
            "kind": "PROTOCOL_VERSION_CHANGED",
            "path": "protocolVersion",
            "security_relevant_field": false
          }
        ],
        "classified": true,
        "counts_by_class": {
          "BREAKING": 2,
          "INFO": 1,
          "NON_BREAKING": 4
        },
        "taxonomy_version": "1.0.0",
        "total": 7,
        "truncated": false
      },
      "entry_sha256": "ef1dc942bf99da4484394c01265b4e422d95aa95521b9b935f076ed98c2f0014",
      "evidence_class": "MANIFEST_CHANGE",
      "labels": [
        "MANIFEST_CHANGED",
        "TOOL_LIST_OR_TOOL_TEXT_CHANGED"
      ],
      "observed_at_utc": "2026-10-01T21:49:27Z",
      "previous_entry_sha256": "8d0f6c8475ae530465cbf3db4e35fcbd919b258920442f76be0d80c80895e669",
      "receipt_id": "9be3cf35-c990-5ddf-b144-c27000c61a60",
      "receipt_url": "https://www.gaipagents.com/v1/free/receipts/9be3cf35-c990-5ddf-b144-c27000c61a60",
      "sequence": 453,
      "target_id": "obs_eb433c5ecc94b594bf232049",
      "target_kind": "MCP_REMOTE",
      "target_locator": "https://mcp.ludo.ai/mcp"
    },
    {
      "after_hash": "cb8028431c74269396d2cb49e2ff6761e1d9a2d3e5160539dd8cfd011de6aaec",
      "before_hash": "cb677d4ca8647e8c9559ebb6e9deccd657d8b476ec080ad40a1b12122565f491",
      "diff": {
        "changes": [
          {
            "compatibility_class": "INFO",
            "fact": "tool description changed",
            "kind": "TOOL_DESCRIPTION_CHANGED",
            "path": "tools[animateSpriteKeyframes].description",
            "security_relevant_field": false
          },
          {
            "compatibility_class": "INFO",
            "fact": "tool description changed",
            "kind": "TOOL_DESCRIPTION_CHANGED",
            "path": "tools[createAmbiance].description",
            "security_relevant_field": false
          },
          {
            "compatibility_class": "INFO",
            "fact": "tool description changed",
            "kind": "TOOL_DESCRIPTION_CHANGED",
            "path": "tools[createAudioTransform].description",
            "security_relevant_field": false
          },
          {
            "compatibility_class": "INFO",
            "fact": "tool description changed",
            "kind": "TOOL_DESCRIPTION_CHANGED",
            "path": "tools[createMusic].description",
            "security_relevant_field": false
          },
          {
            "compatibility_class": "INFO",
            "fact": "tool description changed",
            "kind": "TOOL_DESCRIPTION_CHANGED",
            "path": "tools[createSoundEffect].description",
            "security_relevant_field": false
          },
          {
            "compatibility_class": "INFO",
            "fact": "tool description changed",
            "kind": "TOOL_DESCRIPTION_CHANGED",
            "path": "tools[createSpeech].description",
            "security_relevant_field": false
          },
          {
            "compatibility_class": "INFO",
            "fact": "tool description changed",
            "kind": "TOOL_DESCRIPTION_CHANGED",
            "path": "tools[createSpeechPreset].description",
            "security_relevant_field": false
          },
          {
            "compatibility_class": "INFO",
            "fact": "tool description changed",
            "kind": "TOOL_DESCRIPTION_CHANGED",
            "path": "tools[createSpriteAudio].description",
            "security_relevant_field": false
          },
          {
            "compatibility_class": "INFO",
            "fact": "tool description changed",
            "kind": "TOOL_DESCRIPTION_CHANGED",
            "path": "tools[createVoice].description",
            "security_relevant_field": false
          },
          {
            "compatibility_class": "INFO",
            "fact": "tool description changed",
            "kind": "TOOL_DESCRIPTION_CHANGED",
            "path": "tools[editSpritesheet].description",
            "security_relevant_field": false
          }
        ],
        "classified": true,
        "counts_by_class": {
          "BREAKING": 0,
          "INFO": 10,
          "NON_BREAKING": 0
        },
        "taxonomy_version": "1.0.0",
        "total": 10,
        "truncated": false
      },
      "entry_sha256": "ec62d9491003c18acf9e5f755990bf52cd5e9e412aeeed0436d6baf621d47395",
      "evidence_class": "MANIFEST_CHANGE",
      "labels": [
        "MANIFEST_CHANGED",
        "TOOL_LIST_OR_TOOL_TEXT_CHANGED"
      ],
      "observed_at_utc": "2026-09-30T06:15:33Z",
      "previous_entry_sha256": "ce34cdfc4a191edb4c76667b65120392d298ef93e1250e38b06ed31d86bbb006",
      "receipt_id": "39d18a5e-8800-5262-8677-70286399adac",
      "receipt_url": "https://www.gaipagents.com/v1/free/receipts/39d18a5e-8800-5262-8677-70286399adac",
      "sequence": 53,
      "target_id": "obs_eb433c5ecc94b594bf232049",
      "target_kind": "MCP_REMOTE",
      "target_locator": "https://mcp.ludo.ai/mcp"
    }
  ],
  "check_outcomes": {
    "ask": {
      "changed_since": "https://www.gaipagents.com/v1/free/observatory/changed-since?url=<endpoint>",
      "changes_and_reachability": "https://www.gaipagents.com/v1/free/changes/subscribe?url=<endpoint>",
      "conformance": "https://www.gaipagents.com/v1/free/conformance/check?url=<endpoint>"
    },
    "published": false,
    "why": "Outcomes of GAIP's own checks (whether the endpoint answered, HTTP status, response time, conformance findings) are given only to a caller who asks about the URL, never on a public page, list or feed. The same applies to every target."
  },
  "conformance": {
    "findings": "GIVEN_TO_CALLER_ONLY",
    "meaning": "The rule catalogue this manifest was read against at the observed time. The finding codes go only to a caller who checks the URL (check_outcomes.ask.conformance).",
    "observed_at_utc": "2026-10-17T04:39:44Z",
    "protocol": "MCP",
    "rule_catalogue_route": "/v1/free/knowledge/conformance-rules",
    "rule_catalogue_version": "1.0.0"
  },
  "corrections": {
    "contact": "https://www.gaipagents.com/contact",
    "exclusion": "https://www.gaipagents.com/v1/free/observatory/corrections/exclusion",
    "opt_out": "POST kind OPT_OUT to the route; the target is withdrawn from public view at once (a pause). The site's owner makes it permanent at https://www.gaipagents.com/v1/free/observatory/corrections/exclusion.",
    "queued_for_review": 0,
    "route": "https://www.gaipagents.com/v1/free/observatory/corrections"
  },
  "declared_derivations": {
    "data_appetite": {
      "categories": {
        "free_text_large": {
          "fields": 15,
          "tools": 15
        }
      },
      "fields_read": 263,
      "observed_at_utc": "2026-10-15T01:46:02Z",
      "tools_read": 38
    },
    "dependency_domains": [
      {
        "domain": "github.com",
        "roles": [
          "repository"
        ]
      }
    ],
    "last_observed_at_utc": "2026-10-17T04:39:44Z",
    "meaning": "Derived by GAIP from what this agent declared, at the stated time: the categories of data its tools' input fields ask for (counts, by keyword rules gaip.data-appetite-rules.v1), the outside domains its declarations point to, and the operator as the agent itself publishes it. Facts about declarations, not an assessment of the agent or its operator.",
    "operator": {
      "as_published": "ai.ludo",
      "source_kind": "registry_namespace_domain"
    },
    "rules_version": "gaip.data-appetite-rules.v1",
    "schema_version": "gaip.declared-derivations.v1"
  },
  "latest": {
    "baseline_at_utc": "2026-09-29T04:14:33Z",
    "manifest_sha256": "f3318c259877704df277c88da9969dff3ddba377a68c08ae01e83a8314122d88",
    "observed_at_utc": "2026-10-17T04:39:44Z"
  },
  "metadata_signals": {
    "meaning": "Pattern rules are published only as aggregate rates across all observed targets (see the summary), never per party. GAIP issues no overall verdict and does not rank parties.",
    "overall_verdict": null,
    "per_target_results": null,
    "published": "AGGREGATE_ONLY_IN_SUMMARY",
    "rules": [
      {
        "rationale": "Zero-width, bidirectional-control and Unicode tag characters are not visible to a human reader but are read by language models. GAIP reports whether any occur; many have ordinary uses.",
        "rule_id": "OBS-SIG-001",
        "title": "Invisible or bidirectional-control Unicode characters in names or descriptions"
      },
      {
        "rationale": "Tool and skill descriptions are read by models. GAIP reports whether a description contains phrases shaped like instructions to a model (the patterns in GAIP's public conformance rule catalogue, plus the phrases listed in the Observatory method). Such phrases can be benign.",
        "rule_id": "OBS-SIG-002",
        "title": "Instruction-like text in descriptions"
      },
      {
        "rationale": "When a description refers to a tool name that only a different observed server publishes, a model using both servers may connect the two. GAIP reports whether such a reference occurs; shared names are common and often coincidental.",
        "rule_id": "OBS-SIG-003",
        "title": "Description names a tool published by a different observed server"
      },
      {
        "rationale": "Declared OAuth scopes whose names contain wildcard or whole-account wording (*, all, admin, root, full) request wide access by name. GAIP reports whether such a scope name is declared; it does not know what the scope grants.",
        "rule_id": "OBS-SIG-004",
        "title": "Declared authorization scopes with broad-access wording"
      }
    ],
    "third_party_scanners": [
      {
        "name": "Snyk agent-scan (formerly Invariant Labs mcp-scan)",
        "status": "NOT_RUN",
        "url": "https://github.com/snyk/agent-scan"
      },
      {
        "name": "Cisco AI Defense MCP Scanner",
        "status": "NOT_RUN",
        "url": "https://github.com/cisco-ai-defense/mcp-scanner"
      }
    ]
  },
  "method": "https://www.gaipagents.com/observatory",
  "notice": "Facts observed by GAIP at the stated time (UTC); they may be out of date. This is not an assessment of safety, quality, security, legality or trustworthiness of any party, and not a recommendation. To request a correction, add a right of reply or opt out, POST to https://www.gaipagents.com/v1/free/observatory/corrections or use https://www.gaipagents.com/contact.",
  "price_gbp": 0,
  "schema_version": "gaip.observatory.v1.target",
  "silent_changes_last_30_days": {
    "days": 30,
    "entries_read_at_most": 200,
    "kinds": [
      "input_or_output_format_changed",
      "tool_descriptions_reworded",
      "tools_added"
    ],
    "line": "In the last 30 days its declared tools or interface changed with no declared version change in 2 weeks: 2026-W41 (2026-10-05, 2026-10-06, 2026-10-07, 2026-10-08, 2026-10-09, 2026-10-10); 2026-W42 (2026-10-13, 2026-10-15); kinds: input or output schema changed, tool descriptions re-worded, tools added.",
    "meaning": "Weeks (ISO) in which GAIP recorded a change to the agent's declared tools or interface (tools added or removed, descriptions re-worded, input or output schema, behaviour labels, sign-in, terms or prices, endpoint host) and no declared version (registry or card version, serverInfo.version) moved that week. A week whose version movement is not recorded is not counted. Dated facts from the public change log; not an assessment of the agent.",
    "weeks": [
      {
        "dates": [
          "2026-10-05",
          "2026-10-06",
          "2026-10-07",
          "2026-10-08",
          "2026-10-09",
          "2026-10-10"
        ],
        "kinds": [
          "input_or_output_format_changed",
          "tool_descriptions_reworded",
          "tools_added"
        ],
        "week": "2026-W41"
      },
      {
        "dates": [
          "2026-10-13",
          "2026-10-15"
        ],
        "kinds": [
          "input_or_output_format_changed",
          "tool_descriptions_reworded"
        ],
        "week": "2026-W42"
      }
    ],
    "weeks_with_silent_changes": 2
  },
  "snapshot": {
    "capabilities": [
      "tools"
    ],
    "description": "Generate game assets with AI: sprites, animations, 3D models with rigging, video, music, SFX, voices",
    "name": "ai.ludo/game-assets",
    "parts": [
      "registry_server_json",
      "mcp_initialize_tools_list"
    ],
    "protocol": "MCP",
    "protocolVersion": "2025-11-25",
    "public_copy": "Text excerpts of at most 300 characters; input schemas and security schemes as SHA-256 and size only.",
    "remotes": [
      {
        "type": "streamable-http",
        "url": "https://mcp.ludo.ai/mcp"
      }
    ],
    "scopes": [],
    "serverInfo": {
      "name": "ludoai",
      "version": "0.9.10"
    },
    "title": "Ludo AI Game Assets",
    "tools": [
      {
        "annotations": {},
        "description": "Adjust Sprite Sheet: re-export a previously generated sprite animation with different sheet settings - frame count, frame size, loop trimming or whitespace cropping - without generating the animation again. Free (no credits). Pass the `spritesheet_url` you received from `animateSprite`, `animateSpri",
        "inputSchema": {
          "bytes": 2715,
          "published": "HASH_ONLY",
          "sha256": "066f82cc6b2ee6c6ccc837c7aac24c00833fd13c685b7f429ef9b15ef3116846"
        },
        "name": "adjustSpritesheet",
        "title": null
      },
      {
        "annotations": {},
        "description": "Generate text-driven skeletal animations for an already-rigged 3D model. Pass the rigged GLB in `model` (URL or base64; the 3D asset file, not an AI model name) and a motion `prompt` (e.g. \"walking\", \"swinging its axe\"). The model must already have a skeleton - rig it first with rigModel if not. The",
        "inputSchema": {
          "bytes": 1835,
          "published": "HASH_ONLY",
          "sha256": "eed7e072360d12deb2f35c8afab86704dbb7b7a470b1d9926a5dbc3949e09fc6"
        },
        "name": "animate3DModel",
        "title": null
      },
      {
        "annotations": {},
        "description": "Apply a curated animation preset to an already-rigged 3D model (retargeting). Pass the rigged GLB in `model` (URL or base64; the 3D asset file, not an AI model name) and a `preset_id` from the animation presets list (from listAnimationPresets; any preset id works). The model must have a humanoid-tem",
        "inputSchema": {
          "bytes": 1154,
          "published": "HASH_ONLY",
          "sha256": "a697a96ea9a4dd4d27392c72a19737a4bb365df04d52c294154ca2de185abeb9"
        },
        "name": "animate3DModelPreset",
        "title": null
      },
      {
        "annotations": {},
        "description": "Animate a static sprite into a spritesheet driven by a motion text prompt (image-to-spritesheet): supply an initial_image (URL or base64) plus a motion_prompt like \"walking\" or \"attack slash\", and optionally a final_image to interpolate between a start and end frame. Describe the motion exactly and ",
        "inputSchema": {
          "bytes": null,
          "published": "HASH_ONLY",
          "sha256": "7e3910371f2c25ba3f979186a8e589b7ef103c42d1cb327146fc62961ae880d3"
        },
        "name": "animateSprite",
        "title": null
      },
      {
        "annotations": {},
        "description": "Animate a sprite through up to three fixed keyframes - initial_image, middle_image and final_image (each a URL or base64) - producing a spritesheet that interpolates through the provided frames in order. At least one of initial_image or middle_image is required (a final_image alone has nothing to an",
        "inputSchema": {
          "bytes": null,
          "published": "HASH_ONLY",
          "sha256": "2b244d32dea1f345b8aa50990a1cb0c4daff2d3ce38f8ed186cb09b332f4bd25"
        },
        "name": "animateSpriteKeyframes",
        "title": null
      },
      {
        "annotations": {},
        "description": "Cancel a queued job you started through the API or MCP; the credits held for it are refunded. Jobs that are already running cannot be canceled (409). Returns the canceled job. This is free (no credits).",
        "inputSchema": {
          "bytes": 73,
          "published": "HASH_ONLY",
          "sha256": "3797626bd17e346de1adbbe242cd2c4e41a5956ccf7424c65cf45e2bbef10c81"
        },
        "name": "cancelApiJob",
        "title": null
      },
      {
        "annotations": {},
        "description": "Convert a source image into a textured 3D model (image-to-3D). The job result is a downloadable GLB model_url plus an array of snapshot image URLs rendered from different angles (handy for previews). model picks the generator: prop (default) is low-cost and suits everyday props and environment piece",
        "inputSchema": {
          "bytes": 1867,
          "published": "HASH_ONLY",
          "sha256": "fed7dfebeabaa140651a9c2de5d6d659e3da7897a56b38d53faf122c005afa4f"
        },
        "name": "create3DModel",
        "title": null
      },
      {
        "annotations": {},
        "description": "Produce a looping background ambiance soundscape from a text description, such as \"windy forest at dusk\" or \"busy tavern interior\". The job result is a single audio result containing the URL of an MP3 or WAV file (the URL's extension, .mp3 or .wav, says which). The description field is required and ",
        "inputSchema": {
          "bytes": 1308,
          "published": "HASH_ONLY",
          "sha256": "3a1d067795c8971553150693bf022806d65099d60e6cffca7e2b41abe9ddfa1f"
        },
        "name": "createAmbiance",
        "title": null
      },
      {
        "annotations": {},
        "description": "Remix an existing audio sample (a sound effect, ambiance, or music clip) into a variation guided by a text prompt, for example turning a track into an 80s synthwave or metal version. Both the sample and the prompt are required; the sample is uploaded as a URL or base64 audio and must be at most 15MB",
        "inputSchema": {
          "bytes": 1690,
          "published": "HASH_ONLY",
          "sha256": "ce6028f01564c53049f007d64b458180dcf418a2b76b21f08d551b60af4f55a9"
        },
        "name": "createAudioTransform",
        "title": null
      },
      {
        "annotations": {},
        "description": "Generate game-art images from a text prompt alone, selecting an image_type (e.g. sprite) and optionally art_style, perspective, and aspect_ratio. The job result is an array of image results, each with a url; request n (1-8) to control how many variations come back. Because it generates purely from t",
        "inputSchema": {
          "bytes": 2602,
          "published": "HASH_ONLY",
          "sha256": "4d4d25efc1de3232f61c3f7796f078f7ed8118d8486012573b98d7cbc3a14385"
        },
        "name": "createImage",
        "title": null
      },
      {
        "annotations": {},
        "description": "Produce a piece of music from a text description, such as \"epic orchestral battle theme\" or \"calm piano melody\", with optional lyrics. The job result is a single audio result containing the URL of an MP3 or WAV file (the URL's extension, .mp3 or .wav, says which). The description field is required; ",
        "inputSchema": {
          "bytes": 1315,
          "published": "HASH_ONLY",
          "sha256": "ff4012164ff00f705ff807a7626cde82d3c01524008da95b6107c0621e45243a"
        },
        "name": "createMusic",
        "title": null
      },
      {
        "annotations": {},
        "description": "Produce a short sound effect (SFX) from a text description, such as \"laser gun firing\" or \"footsteps on gravel\". The job result is a single audio result containing the URL of an MP3 or WAV file (the URL's extension, .mp3 or .wav, says which). The description field is required, duration is capped at ",
        "inputSchema": {
          "bytes": 1288,
          "published": "HASH_ONLY",
          "sha256": "42438c00ad68850ac67e0ac856356d32733382462c055e2c8d2d975af509be21"
        },
        "name": "createSoundEffect",
        "title": null
      },
      {
        "annotations": {},
        "description": "Convert text to speech by cloning the voice from an audio sample you provide (voice-cloning text-to-speech). Both text and sample are required; the text is limited to 1000 characters and the sample is supplied as a URL or base64 audio that must be at most 15MB, with violations returning HTTP 400. Th",
        "inputSchema": {
          "bytes": 720,
          "published": "HASH_ONLY",
          "sha256": "7f04a1675e872bc6dad71b2bb1f4de451c1e5c83555bbb8011fffbe633fe0397"
        },
        "name": "createSpeech",
        "title": null
      },
      {
        "annotations": {},
        "description": "Convert text to speech using a named built-in preset voice, with optional emotion and language settings. Both text and voice_preset_id are required and the text is limited to 1000 characters; invalid input returns HTTP 400. The job result is a single audio result containing the URL of an MP3 or WAV ",
        "inputSchema": {
          "bytes": 1597,
          "published": "HASH_ONLY",
          "sha256": "a4ea694ff60b2dec9e1a2d707e4814f5f9061635f4c30c220cc995d61de0ea23"
        },
        "name": "createSpeechPreset",
        "title": null
      },
      {
        "annotations": {},
        "description": "Generate a sound effect for a previously generated spritesheet animation. Pass, as `spritesheet_video_url`, the `video_url` you received from `animateSprite`, `animateSpriteKeyframes`, `transferMotion`, or `editSpritesheet` - it must belong to a spritesheet you generated within the last 7 days; arbi",
        "inputSchema": {
          "bytes": 864,
          "published": "HASH_ONLY",
          "sha256": "1dcbfa1cdd5614928b1eca3482a0a2f81078343a8ea33256126eda904071c6ad"
        },
        "name": "createSpriteAudio",
        "title": null
      },
      {
        "annotations": {},
        "description": "Generate a short video clip from a source image and a motion text prompt (image-to-video); a source `image` is required - to make a video from text alone, first createImage and animate that, or use createVideoFromReferences with reference images. Griffin (default, 480p) and Griffin HD (720p) both ge",
        "inputSchema": {
          "bytes": 2749,
          "published": "HASH_ONLY",
          "sha256": "c6711f60c13f0501cdc93ce2d50523ff3fa87a5d8b9ab7da145c93b13934e923"
        },
        "name": "createVideo",
        "title": null
      },
      {
        "annotations": {},
        "description": "Generate a video from 1-5 reference images and a text prompt (references-to-video). Unlike createVideo, which animates a single source image, this composes a new scene that borrows characters, objects, and style from the reference images. Each image can be a URL or base64. Griffin (default, 480p) an",
        "inputSchema": {
          "bytes": 2129,
          "published": "HASH_ONLY",
          "sha256": "36a268523670799b00ad2f79b3d522b1db34a6073ae01e9201c3513b574c189e"
        },
        "name": "createVideoFromReferences",
        "title": null
      },
      {
        "annotations": {},
        "description": "Design a new voice from a character description (such as \"deep-voiced warrior\" or \"cheerful young girl\") and have it speak a short line of text, returning a sample of that newly created voice. Both voice_description and text are required, the spoken text is limited to 200 characters or the call retu",
        "inputSchema": {
          "bytes": 1254,
          "published": "HASH_ONLY",
          "sha256": "b48044e8696a4c2e8bb60e08a76506abfeeb9826ec28dde4c2f247bd17da31ba"
        },
        "name": "createVoice",
        "title": null
      },
      {
        "annotations": {},
        "description": "Modify an existing image according to text instructions: supply a source image (URL or base64) and a prompt describing the changes (e.g. \"add clouds\", \"warmer color scheme\"), with an optional reference_image for extra style or content guidance. The job result is an array of image results, each with ",
        "inputSchema": {
          "bytes": 2179,
          "published": "HASH_ONLY",
          "sha256": "80c666ad22624548067378085a53f42dd6e767a3a5e02800e11d31d891d5f968"
        },
        "name": "editImage",
        "title": null
      },
      {
        "annotations": {},
        "description": "Edit a previously generated spritesheet: re-prompt its underlying animation (edit_mode \"prompt\"), extend the frame beyond its borders (\"outpaint\"), repair a bad loop (\"fix_loop\"), or re-render it with finer detail (\"improve\": the extra pass hydra-plus runs when it generates, on a spritesheet generat",
        "inputSchema": {
          "bytes": 4456,
          "published": "HASH_ONLY",
          "sha256": "5ece49d250aaf93516a1ea31e5ab56802fe6064ff0931e54e8e560648c00a1d0"
        },
        "name": "editSpritesheet",
        "title": null
      },
      {
        "annotations": {},
        "description": "Edit a previously generated video with a text prompt and optional reference images (video-to-video); runs on griffin-hd (720p, with soundtrack) and the output keeps the source video's duration unless you pass one. Pass the video `url` you received from `createVideo`, `createVideoFromReferences`, or ",
        "inputSchema": {
          "bytes": 1617,
          "published": "HASH_ONLY",
          "sha256": "dfb47c0abb05859ceff57d297c8b779dafc731d02d222a31dddc7ff46e51a147"
        },
        "name": "editVideo",
        "title": null
      },
      {
        "annotations": {},
        "description": "Re-pose an existing sprite into a new target pose while preserving the character, taking a source image (URL or base64), a pose name (or \"Other\" with a free-text description), and an optional n (1-4) for how many variations to produce. Only works with sprite image types (not icons, screenshots, etc.",
        "inputSchema": {
          "bytes": 1850,
          "published": "HASH_ONLY",
          "sha256": "832889893a08fcfee7d2839c38f9477d097244f46f01777049e32d4fa6496339"
        },
        "name": "generatePose",
        "title": null
      },
      {
        "annotations": {},
        "description": "Generate new images that match the visual style of a reference image: supply a style_image (URL or base64) plus a text prompt describing what to create and an optional image_type (defaults to sprite). The job result is an array of image results, each with a url; request n (1-4) to control the number",
        "inputSchema": {
          "bytes": 1767,
          "published": "HASH_ONLY",
          "sha256": "8cd1bbd7ffc23dc4ef7eca08a1fc6896bd3e72d42c749d0907d8c4bafd9495e2"
        },
        "name": "generateWithStyle",
        "title": null
      },
      {
        "annotations": {},
        "description": "Show your account's credit balance, plan and auto top-up settings. `credits.available` is what generations can spend right now (plan_credits + extra - used); `resets_at` is when the plan's monthly credits refill (unix seconds). When `team_pool` is true the balance is your team's shared pool, and `au",
        "inputSchema": {
          "bytes": 47,
          "published": "HASH_ONLY",
          "sha256": "c8a1ac469a826ea3547ac220c7bbfdcd6b58080d4ec596ff2a0149c5ccb9b699"
        },
        "name": "getAccount",
        "title": null
      },
      {
        "annotations": {},
        "description": "Poll the status of a generation job started by any tool. Every generation tool returns `{id, status}`; call getApiJob with that id until status is `succeeded` (then read `result`, shaped exactly like the tool's documented output) or `failed` (read `error`). Poll every few seconds, or pass `wait: 30`",
        "inputSchema": {
          "bytes": 307,
          "published": "HASH_ONLY",
          "sha256": "02bd5f46fdf089e7c8124f3ba9d1364ec053be740fbc7c79ae22fbbdfc8872f4"
        },
        "name": "getApiJob",
        "title": null
      },
      {
        "annotations": {},
        "description": "Browse or read Ludo's own documentation in full - how to choose a sprite animation mode, when to use Generate Before / Generate After, how margins behave, which model suits a job, and each generator's known limitations. To answer a specific question, call searchDocs first: it returns just the sectio",
        "inputSchema": {
          "bytes": 900,
          "published": "HASH_ONLY",
          "sha256": "fae0da2b287eadc770fdb077eed1f237864f2c989820f95d0bdc8dec5c7e1faa"
        },
        "name": "getDocs",
        "title": null
      },
      {
        "annotations": {},
        "description": "List the available animation presets along with their perspectives and the eight supported compass directions (N, NE, E, SE, S, SW, W, NW). Synchronous GET with no request body: it returns an animations array (each with id, name, category, description, duration, and preview_url), a deduplicated pers",
        "inputSchema": {
          "bytes": 47,
          "published": "HASH_ONLY",
          "sha256": "c8a1ac469a826ea3547ac220c7bbfdcd6b58080d4ec596ff2a0149c5ccb9b699"
        },
        "name": "listAnimationPresets",
        "title": null
      },
      {
        "annotations": {},
        "description": "List the generation jobs you started through the API or MCP, most recent first. Web-app jobs are not included. This is a free read-only lookup (no credits, no generation). Filter with a comma-separated status list; limit defaults to 50 and is capped at 100.",
        "inputSchema": {
          "bytes": 315,
          "published": "HASH_ONLY",
          "sha256": "ca376bf2e4d4d8b78d8e9a984387af999e0793913dd5b3b8da392997e9931dcd"
        },
        "name": "listApiJobs",
        "title": null
      },
      {
        "annotations": {},
        "description": "List your generation history across the API and the web app - filter by type, source (api|web|all), text search, and date range. Returns {items, page, page_size, has_more}; keep paging while has_more is true. API-originated results expire after 7 days - download anything you want to retain. For an i",
        "inputSchema": {
          "bytes": 1203,
          "published": "HASH_ONLY",
          "sha256": "098e472fae488861a51a67d0eb20ec41b0156a300977d4d4787886a8b002f8d1"
        },
        "name": "listGenerations",
        "title": null
      },
      {
        "annotations": {},
        "description": "Remove the background from a single image, returning the subject isolated on a transparent background. Supply the source image (URL or base64); optionally set crop to trim the result to the content, and creative_edit (default true) for higher-quality output that may not match the input pixel-for-pix",
        "inputSchema": {
          "bytes": 872,
          "published": "HASH_ONLY",
          "sha256": "23cbf5c0d28b3413885e35148a7d34ab785258992cbd4cfe922f62e9f287b72e"
        },
        "name": "removeBackground",
        "title": null
      },
      {
        "annotations": {},
        "description": "Rig a 3D model: generate a skeleton and skin weights for an existing GLB so it can be animated. Accepts a URL or base64-encoded GLB in `model` (here `model` is the 3D asset file, not an AI model name - rigging has no model choice). The job result is a downloadable `model_url` for the rigged GLB. rig",
        "inputSchema": {
          "bytes": 1671,
          "published": "HASH_ONLY",
          "sha256": "5af330e054536a26d6016a29f49602b24432a54d6eb6bff070b96781617e85f9"
        },
        "name": "rigModel",
        "title": null
      },
      {
        "annotations": {},
        "description": "Re-render an existing sprite from a different camera viewpoint while keeping the same character and pose, taking a source image (URL or base64), a required camera_rotation azimuth (one of 0, 45, 90, 135, 180, -135, -90, -45 degrees), an optional camera_elevation (0, 30, or 60 degrees; omit to keep t",
        "inputSchema": {
          "bytes": 1634,
          "published": "HASH_ONLY",
          "sha256": "2159987a8905bf734dc42c3f2eb64f41d1d1bdeea47638be614e5fce33d85b9e"
        },
        "name": "rotateSprite",
        "title": null
      },
      {
        "annotations": {},
        "description": "Re-render a previously generated sprite animation from a new view: the same motion and timing, seen from a different angle (e.g. a front-facing walk cycle turned into the same walk seen from the back). Pass the `spritesheet_url` you received from `animateSprite`, `animateSpriteKeyframes`, `transferM",
        "inputSchema": {
          "bytes": 3723,
          "published": "HASH_ONLY",
          "sha256": "1cf8d7116090d51d6b8fd2bc6d60c908c03fee66f7f5841853f9fe8dd79bf8e6"
        },
        "name": "rotateSpritesheet",
        "title": null
      },
      {
        "annotations": {},
        "description": "Search Ludo's own documentation with a plain-language question and get back only the few sections that answer it - the fastest way to learn how a feature is meant to be used before you generate with it (how to pick a sprite animation mode or model, how margins behave, what something costs, known lim",
        "inputSchema": {
          "bytes": 397,
          "published": "HASH_ONLY",
          "sha256": "76e48ad5a937674dc1c200398cf4771fb6ede75f2863ab47c481b7acdfb12151"
        },
        "name": "searchDocs",
        "title": null
      },
      {
        "annotations": {},
        "description": "Report a problem with the Ludo API itself to the Ludo team. Use it ONLY for API bugs (an error, a failed or stuck job, a crash, a response that does not match this documentation) and API limitations (a parameter, operation or format you needed that the API does not support, and that you could not wo",
        "inputSchema": {
          "bytes": 1606,
          "published": "HASH_ONLY",
          "sha256": "f45d8ae342088283c3d8654fa3787a276fd0a6739e5682f1082302bc9c30672a"
        },
        "name": "submitApiFeedback",
        "title": null
      },
      {
        "annotations": {},
        "description": "Transfer motion from a reference video or a named animation preset onto a static sprite image, producing an animated spritesheet that mimics the reference movement. Provide the sprite as image (URL or base64) plus either a video URL or a preset_id together with perspective and direction (all three f",
        "inputSchema": {
          "bytes": 7205,
          "published": "HASH_ONLY",
          "sha256": "cc48a05d76ac579592c0a8d540bd3dc2608061a1e72578b6a620d393565f91c8"
        },
        "name": "transferMotion",
        "title": null
      },
      {
        "annotations": {},
        "description": "Upscale a previously generated video to twice its resolution (2x). Pass the video `url` you received from `createVideo`, `createVideoFromReferences`, or `editVideo` - it must be a video you generated within the last 7 days; arbitrary external videos are not accepted. Both dimensions of the source mu",
        "inputSchema": {
          "bytes": 777,
          "published": "HASH_ONLY",
          "sha256": "0927dec58900a73c414a5ab1a70aa7185ca6dce48c6aab5c51a930bcc3c18883"
        },
        "name": "upscaleVideo",
        "title": null
      },
      {
        "annotations": {},
        "description": "Validates an API key. Returns 200 if valid, 403 if invalid.",
        "inputSchema": {
          "bytes": 47,
          "published": "HASH_ONLY",
          "sha256": "c8a1ac469a826ea3547ac220c7bbfdcd6b58080d4ec596ff2a0149c5ccb9b699"
        },
        "name": "validateApiKeyEndpoint",
        "title": null
      }
    ],
    "version": "0.15.0"
  },
  "status_history": [
    {
      "manifest_partial": true,
      "manifest_parts": [
        "registry_server_json"
      ],
      "manifest_sha256": "8438239764531da0245cc603c21ad1832cee7035b610d4c95a3be79d322d13ae",
      "observed_at_utc": "2026-10-17T04:39:44Z",
      "protocol_version": "2025-11-25"
    },
    {
      "manifest_partial": true,
      "manifest_parts": [
        "registry_server_json"
      ],
      "manifest_sha256": "8438239764531da0245cc603c21ad1832cee7035b610d4c95a3be79d322d13ae",
      "observed_at_utc": "2026-10-16T03:15:23Z",
      "protocol_version": "2025-11-25"
    },
    {
      "manifest_partial": null,
      "manifest_parts": [
        "registry_server_json",
        "mcp_initialize_tools_list"
      ],
      "manifest_sha256": "f3318c259877704df277c88da9969dff3ddba377a68c08ae01e83a8314122d88",
      "observed_at_utc": "2026-10-15T01:46:02Z",
      "protocol_version": "2025-11-25"
    },
    {
      "manifest_partial": null,
      "manifest_parts": [
        "registry_server_json",
        "mcp_initialize_tools_list"
      ],
      "manifest_sha256": "f3318c259877704df277c88da9969dff3ddba377a68c08ae01e83a8314122d88",
      "observed_at_utc": "2026-10-13T23:36:53Z",
      "protocol_version": "2025-11-25"
    },
    {
      "manifest_partial": false,
      "manifest_parts": [
        "registry_server_json",
        "mcp_initialize_tools_list"
      ],
      "manifest_sha256": "f67d7b40a523c58b7a138b25362cc132a13e331f14b5809ccf87fdf5561855d0",
      "observed_at_utc": "2026-10-12T22:15:44Z",
      "protocol_version": "2025-11-25"
    },
    {
      "manifest_partial": false,
      "manifest_parts": [
        "registry_server_json",
        "mcp_initialize_tools_list"
      ],
      "manifest_sha256": "f67d7b40a523c58b7a138b25362cc132a13e331f14b5809ccf87fdf5561855d0",
      "observed_at_utc": "2026-10-11T20:48:22Z",
      "protocol_version": "2025-11-25"
    },
    {
      "manifest_partial": null,
      "manifest_parts": [
        "registry_server_json",
        "mcp_initialize_tools_list"
      ],
      "manifest_sha256": "f67d7b40a523c58b7a138b25362cc132a13e331f14b5809ccf87fdf5561855d0",
      "observed_at_utc": "2026-10-10T19:19:38Z",
      "protocol_version": "2025-11-25"
    },
    {
      "manifest_partial": null,
      "manifest_parts": [
        "registry_server_json",
        "mcp_initialize_tools_list"
      ],
      "manifest_sha256": "8c6b8673721bd99e01a96ba0da1752fb7c4ca1c2ef545e0a3a448ed85c73a6d0",
      "observed_at_utc": "2026-10-09T17:47:32Z",
      "protocol_version": "2025-11-25"
    },
    {
      "manifest_partial": null,
      "manifest_parts": [
        "registry_server_json",
        "mcp_initialize_tools_list"
      ],
      "manifest_sha256": "2e47fa9d512cfd03ef05d36d8c42a29b38a2b5432dd5bc8a259cab2dc2152397",
      "observed_at_utc": "2026-10-08T16:13:30Z",
      "protocol_version": "2025-11-25"
    },
    {
      "manifest_partial": null,
      "manifest_parts": [
        "registry_server_json",
        "mcp_initialize_tools_list"
      ],
      "manifest_sha256": "ca3c1be2f39ee849b6c52446e6b569af35d6072746245d68a08288fa0e68c0c8",
      "observed_at_utc": "2026-10-07T14:52:06Z",
      "protocol_version": "2025-11-25"
    },
    {
      "manifest_partial": null,
      "manifest_parts": [
        "registry_server_json",
        "mcp_initialize_tools_list"
      ],
      "manifest_sha256": "029e1d1c2dfd8099534737478e840a1f5411897f63b63041120c8c18b941056f",
      "observed_at_utc": "2026-10-06T13:30:32Z",
      "protocol_version": "2025-11-25"
    },
    {
      "manifest_partial": null,
      "manifest_parts": [
        "registry_server_json",
        "mcp_initialize_tools_list"
      ],
      "manifest_sha256": "6fb25ffa1255ef3ce23126d8b0580c92a32c9541dcebca82f8fa163f1f7b732b",
      "observed_at_utc": "2026-10-05T12:00:41Z",
      "protocol_version": "2025-11-25"
    },
    {
      "manifest_partial": false,
      "manifest_parts": [
        "registry_server_json",
        "mcp_initialize_tools_list"
      ],
      "manifest_sha256": "5a5609cfe655b74a234bdc0bbd9f170133b730421a495eb5ff25fadf8e3f63f0",
      "observed_at_utc": "2026-10-04T10:33:20Z",
      "protocol_version": "2025-11-25"
    },
    {
      "manifest_partial": null,
      "manifest_parts": [
        "registry_server_json",
        "mcp_initialize_tools_list"
      ],
      "manifest_sha256": "5a5609cfe655b74a234bdc0bbd9f170133b730421a495eb5ff25fadf8e3f63f0",
      "observed_at_utc": "2026-10-03T09:04:41Z",
      "protocol_version": "2025-11-25"
    },
    {
      "manifest_partial": null,
      "manifest_parts": [
        "registry_server_json",
        "mcp_initialize_tools_list"
      ],
      "manifest_sha256": "cdf9088c7c950c419740378703384f7c0ba36bc57994125f3d751bae88b4a85c",
      "observed_at_utc": "2026-10-01T21:49:27Z",
      "protocol_version": "2025-11-25"
    },
    {
      "manifest_partial": null,
      "manifest_parts": [
        "registry_server_json",
        "mcp_initialize_tools_list"
      ],
      "manifest_sha256": "cb8028431c74269396d2cb49e2ff6761e1d9a2d3e5160539dd8cfd011de6aaec",
      "observed_at_utc": "2026-09-30T06:15:33Z",
      "protocol_version": "2025-06-18"
    },
    {
      "manifest_partial": null,
      "manifest_parts": [
        "registry_server_json",
        "mcp_initialize_tools_list"
      ],
      "manifest_sha256": "cb677d4ca8647e8c9559ebb6e9deccd657d8b476ec080ad40a1b12122565f491",
      "observed_at_utc": "2026-09-29T04:14:33Z",
      "protocol_version": "2025-06-18"
    }
  ],
  "target": {
    "corrections_route": "https://www.gaipagents.com/v1/free/observatory/corrections",
    "first_seen_at_utc": "2026-09-29T00:40:32Z",
    "kind": "MCP_REMOTE",
    "last_observed_at_utc": "2026-10-17T04:39:44Z",
    "locator": "https://mcp.ludo.ai/mcp",
    "name": "ai.ludo/game-assets",
    "source": "official-mcp-registry",
    "target_id": "obs_eb433c5ecc94b594bf232049"
  }
}