_ registry / mcp http-sse · checked 55m ago

anni

https://anni.run

Registry code: 9e57957231c6fefd

api record

anni.run – a CSS animation editor for coding agents (Claude Code, Codex, Cursor): your agent opens the animations from your project, you tune keyframes, timing and easing on a timeline over your real page, the agent writes them back. This package is the M

from a public catalogue that lists it, not from the operator

endpoint
https://anni.run/mcp
protocol
http-sse ·2025-06-18
authentication
none observed
public key
none — nobody has proven they own this listing · is it yours? claim it
karma
0 · newcomer
_ is it live, free and safe measured by this hub
Is anni live?
Yes — it answered the hub's last check (checked 55m ago). It answered 100% of checks over the last 30 days.
Is anni free to use?
Yes — the hub reached it with no key and no payment.
What tools does anni have?
8 tools: update_files, get_animation_state, get_proposals, list_animations, open_animation, wait_for_save, present, wait_for_changes.
Is anni safe to connect?
The hub found no text in its card or tool descriptions aimed at the agent reading them. It measures what the server answers, not its code — grant it only the access its tools need.
reachable
live
uptime, 30 days
100%

90 days 100%· all time 100%

latency
383ms

last good check

priced tools
0

of 8 tools

_ answered our checks, 90 days 1 checks · signed record
  • unknown → live
_ usage and payments 30 days

Calls placed through this hub's router, from its own receipts. Every caller and every payer counts the same; the chain total is counted from three payers.

accounts
0

through this hub

calls served
0

successful

paid through this hub
0 USDC

what callers paid

inferred, not observed

Access was read off the card rather than seen on the wire: inferred: the handshake, the tool list and a call without arguments went through with no key and no payment asked; no tool was run

_ what it can do 8 tools
8 never probed 0 of 8 classified

Price is per tool, not per server. An agent whose handshake is open can hold tools that demand a key or a payment, and one figure for the whole agent sends callers into a wall.

  • update_files unknown never probed

    Sends files you changed (the animation file, the preview page, its CSS – full content each, paths as in open_animation) to an open anni session. The editor tab reloads with them at once, so the user sees your change live, and edits they have not saved yet stay on top of yours. New files the page now links can be included too.

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "required": [
        "session",
        "files"
      ],
      "properties": {
        "files": {
          "type": "array",
          "items": {
            "type": "object",
            "required": [
              "path",
              "content"
            ],
            "properties": {
              "path": {
                "type": "string",
                "description": "Path relative to the project, e.g. \"css/styles.css\""
              },
              "content": {
                "type": "string",
                "description": "Full text content of the file (or base64 with encoding \"base64\" for fonts/images)"
              },
              "encoding": {
                "enum": [
                  "utf8",
                  "base64"
                ],
                "type": "string"
              }
            }
          },
          "minItems": 1,
          "description": "The changed files, full content"
        },
        "token": {
          "type": "string",
          "description": "Owner token from open_animation"
        },
        "session": {
          "type": "string",
          "description": "Session id from open_animation"
        }
      }
    }
    arguments 47 lines
  • get_animation_state unknown 55m ago

    Returns the animations of an anni session as CSS, including edits the user has not saved yet, and whether there are unsaved changes.

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "required": [
        "session"
      ],
      "properties": {
        "token": {
          "type": "string",
          "description": "Owner token from open_animation"
        },
        "session": {
          "type": "string",
          "description": "Session id from open_animation"
        }
      }
    }
    arguments 17 lines
  • get_proposals unknown 55m ago

    People who watched an anni session can edit a copy of it and export their changes back to it. Returns those exported change sets (newest first), each a markdown brief with before → after values and a diff against the revision the copy started from. Apply them to the code as the brief says: change only what is listed, keep everything else (including later changes), and ask the user about conflicts.

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "required": [
        "session"
      ],
      "properties": {
        "token": {
          "type": "string",
          "description": "Owner token of that session"
        },
        "session": {
          "type": "string",
          "description": "Session id of the original session"
        }
      }
    }
    arguments 17 lines
  • list_animations unknown 55m ago

    Lists all @keyframes in the given css/html content with their keyframes and timing, without opening the editor.

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "required": [
        "content"
      ],
      "properties": {
        "content": {
          "type": "string",
          "description": "The css or html text"
        },
        "filename": {
          "type": "string",
          "description": "Name, used to tell .css from .html"
        }
      }
    }
    arguments 17 lines
  • open_animation unknown never probed

    Opens a CSS animation (@keyframes) in anni, a web timeline editor where the user scrubs, drags keyframes and edits values and timing. anni is hosted, so pass FILE CONTENTS: read the .css (or .html with <style>) file yourself and include it, plus the HTML page that uses it and small assets it links (other css) so the preview works. Returns a link the user opens in their browser. Afterwards call wait_for_save with the returned session id and token: it returns the edited file when the user saves, and you write it back to disk. When the user asks you to change the animation (add an element, a new @keyframes, other values), change your files and send them with update_files: the open editor shows them right away and keeps the user’s unsaved edits. Pass `session` and `token` here only to open other files.

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "required": [
        "files",
        "file"
      ],
      "properties": {
        "file": {
          "type": "string",
          "description": "Path (as given in files) of the file that contains the @keyframes to edit"
        },
        "files": {
          "type": "array",
          "items": {
            "type": "object",
            "required": [
              "path",
              "content"
            ],
            "properties": {
              "path": {
                "type": "string",
                "description": "Path relative to the project, e.g. \"css/styles.css\""
              },
              "content": {
                "type": "string",
                "description": "Full text content of the file (or base64 with encoding \"base64\" for fonts/images)"
              },
              "encoding": {
                "enum": [
                  "utf8",
                  "base64"
                ],
                "type": "string"
              }
            }
          },
          "minItems": 1,
          "description": "The file with the @keyframes and, ideally, the HTML page that uses it plus linked CSS"
        },
        "token": {
          "type": "string",
          "description": "Owner token of that session (from the first open_animation result)"
        },
        "preview": {
          "type": "string",
          "description": "Path (as given in files) of the HTML page to preview on. Defaults to an uploaded .html that references the file."
        },
        "session": {
          "type": "string",
          "description": "Existing session id to reuse"
        },
        "animation": {
          "type": "string",
          "description": "Name of the @keyframes to select. Defaults to the first one."
        },
        "owner_name": {
          "type": "string",
          "description": "The user's name, shown to people who ask for access (e.g. from git config user.name)"
        }
      }
    }
    arguments 63 lines
  • wait_for_save unknown never probed

    Blocks until the user saves in the anni session (or the timeout passes) and returns the full edited file content. Write that content to the file on disk, tell the user, and call again if they keep editing. Returns saved=false on timeout – call again while the user is still working.

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "required": [
        "session"
      ],
      "properties": {
        "token": {
          "type": "string",
          "description": "Owner token from open_animation"
        },
        "session": {
          "type": "string",
          "description": "Session id from open_animation"
        },
        "since_rev": {
          "type": "integer",
          "maximum": 9007199254740991,
          "minimum": -9007199254740991,
          "description": "Only return a save newer than this revision (from a previous result). Defaults to the latest."
        },
        "timeout_seconds": {
          "type": "integer",
          "maximum": 9007199254740991,
          "minimum": 1,
          "description": "How long to wait in seconds (default 45, at most 50 – MCP clients drop requests after 60 s; call again to keep waiting)"
        }
      }
    }
    arguments 29 lines
  • present unknown never probed

    Turns values from code into a touchable panel: describe controls (number, length, color, enum, boolean, text), each with an optional preview wire (how it shows on the uploaded page: a CSS declaration, a custom property or an element's text) and a source wire (where the value lives in code). anni renders the controls next to the page; the user tunes them live. Then call wait_for_changes: it returns {id, from, to, source} for every control the user changed when they save, and you apply them to the code. Upload the HTML page and the CSS/assets it links as files so the preview looks like the real thing (a rendered route of a running app works well); without a preview page the controls still work and apply on save.

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "required": [
        "schema"
      ],
      "properties": {
        "files": {
          "type": "array",
          "items": {
            "type": "object",
            "required": [
              "path",
              "content"
            ],
            "properties": {
              "path": {
                "type": "string",
                "description": "Path relative to the project, e.g. \"css/styles.css\""
              },
              "content": {
                "type": "string",
                "description": "Full text content of the file (or base64 with encoding \"base64\" for fonts/images)"
              },
              "encoding": {
                "enum": [
                  "utf8",
                  "base64"
                ],
                "type": "string"
              }
            }
          },
          "description": "Preview page and the files it links"
        },
        "token": {
          "type": "string",
          "description": "Owner token of that session (from the first present result)"
        },
        "schema": {
          "type": "object",
          "required": [
            "title",
            "groups"
          ],
          "properties": {
            "title": {
              "type": "string",
              "description": "Shown in the editor header, e.g. \"Card\""
            },
            "groups": {
              "type": "array",
              "items": {
                "type": "object",
                "required": [
                  "controls"
                ],
                "properties": {
                  "label": {
                    "type": "string"
                  },
                  "controls": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "required": [
                        "id",
                        "type",
                        "value"
                      ],
                      "properties": {
                        "id": {
                          "type": "string",
                          "description": "Unique id, reported back in changes"
                        },
                        "max": {
                          "type": "number"
                        },
                        "min": {
                          "type": "number"
                        },
                        "step": {
                          "type": "number"
                        },
                        "type": {
                          "enum": [
                            "number",
                            "length",
                            "color",
                            "enum",
                            "boolean",
                            "text"
                          ],
                          "type": "string"
                        },
                        "unit": {
                          "type": "string",
                          "description": "number: fixed unit shown after the field"
                        },
                        "label": {
                          "type": "string"
                        },
                        "units": {
                          "type": "array",
                          "items": {
                            "type": "string"
                          },
                          "description": "length: selectable units (default px, %, em, rem, vw, vh)"
                        },
                        "value": {
                          "type": [
                            "string",
                            "number",
                            "boolean"
                          ],
                          "description": "Current value, as it appears in code (e.g. \"8px\", \"#3b82f6\", 0.5, \"md\")"
                        },
                        "source": {
                          "type": "object",
                          "required": [
                            "file"
                          ],
                          "properties": {
                            "file": {
                              "type": "string",
                              "description": "Path of the source file, relative to the project"
                            },
                            "find": {
                              "type": "string",
                              "description": "A snippet that occurs exactly once in the file and contains the current value"
                            },
                            "range": {
                              "type": "array",
                              "items": {
                                "type": "integer",
                                "maximum": 9007199254740991,
                                "minimum": -9007199254740991
                              },
                              "maxItems": 2,
                              "minItems": 2,
                              "description": "Alternative to find: [start, end] character offsets of the literal to replace"
                            },
                            "replace": {
                              "type": "string",
                              "description": "Replacement for `find` with {{value}} where the new value goes; defaults to swapping the old value inside `find`"
                            },
                            "template": {
                              "type": "string",
                              "description": "With range: text written in place of the literal, {{value}} = the new value (default {{value}})"
                            }
                          },
                          "description": "Where the value lives in code. Omit it and the change is only reported."
                        },
                        "options": {
                          "type": "array",
                          "items": {
                            "anyOf": [
                              {
                                "type": "string"
                              },
                              {
                                "type": "object",
                                "required": [
                                  "value"
                                ],
                                "properties": {
                                  "label": {
                                    "type": "string"
                                  },
                                  "value": {
                                    "type": "string"
                                  }
                                }
                              }
                            ]
                          },
                          "description": "enum: the choices"
                        },
                        "preview": {
                          "type": "object",
                          "properties": {
                            "css": {
                              "type": "object",
                              "required": [
                                "selector",
                                "prop"
                              ],
                              "properties": {
                                "prop": {
                                  "type": "string"
                                },
                                "selector": {
                                  "type": "string"
                                },
                                "important": {
                                  "type": "boolean"
                                }
                              },
                              "description": "Apply as `selector { prop: value }` in the preview"
                            },
                            "var": {
                              "type": "object",
                              "required": [
                                "name"
                              ],
                              "properties": {
                                "name": {
                                  "type": "string"
                                },
                                "scope": {
                                  "type": "string"
                                }
                              },
                              "description": "Set a CSS custom property (default scope :root)"
                            },
                            "text": {
                              "type": "object",
                              "required": [
                                "selector"
                              ],
                              "properties": {
                                "selector": {
                                  "type": "string"
                                }
                              },
                              "description": "Set the text content of matching elements"
                            }
                          },
                          "description": "How the value shows in the preview page. Omit it and the control applies on save only."
                        }
                      }
                    },
                    "minItems": 1
                  }
                }
              },
              "minItems": 1
            }
          }
        },
        "preview": {
          "type": "string",
          "description": "Path (as given in files) of the HTML page to show"
        },
        "session": {
          "type": "string",
          "description": "Existing session id to update in place"
        },
        "owner_name": {
          "type": "string",
          "description": "The user's name, shown to people who ask for access"
        }
      }
    }
    arguments 254 lines
  • wait_for_changes unknown never probed

    Blocks until the user saves in a present() session (or the timeout passes) and returns the changed controls as {id, label, from, to, source}. Apply each one to the code at its source wire (find/replace or range). Returns saved=false on timeout – call again while the user is still working.

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "required": [
        "session"
      ],
      "properties": {
        "token": {
          "type": "string",
          "description": "Owner token from present"
        },
        "session": {
          "type": "string",
          "description": "Session id from present"
        },
        "since_rev": {
          "type": "integer",
          "maximum": 9007199254740991,
          "minimum": -9007199254740991
        },
        "timeout_seconds": {
          "type": "integer",
          "maximum": 9007199254740991,
          "minimum": 1,
          "description": "How long to wait in seconds (default 45, at most 50 – MCP clients drop requests after 60 s; call again to keep waiting)"
        }
      }
    }
    arguments 28 lines
_ try it through the hub, ceiling 0

This deployment has no calling key, so nothing can be run from here. The console signs through the hub with the site's own account; without one it would have to send an unsigned call, which only works against a hub with signatures switched off.

_ is this your agent? claim it: badge, payouts, history

Nobody has claimed this listing. Claimed, its README badge says «verified owner» with figures this hub measured, routed paid calls to it pay your account (today there is nobody to pay), and its history counts towards your passport.

  1. Sign any request with an ed25519 key — that binds it: GET /api/v1/me, then POST /api/v1/passport.
  2. Prove it is yours. Easiest: put brick-blue-key=<your key> in your MCP server's instructions — or a DNS TXT record / a file on the domain.
  3. Ask the hub to check: POST /api/v1/passport/claim-endpoint with this listing's id 9e57957231c6fefd.

Every step, filled in for this listing: https://brick.blue/api/v1/agents/9e57957231c6fefd/claim. Over MCP: the claim_endpoint tool.

_ for your README measured, not declared

measured by brick.blue

[![measured by brick.blue](https://brick.blue/api/v1/agents/9e57957231c6fefd/badge.svg)](https://brick.blue/agent/9e57957231c6fefd?ref=badge)

The picture says what this hub measured — the access class, how many tools it called and whether they answered — and refreshes hourly. Unclaimed, it says so; claim the listing and the same badge says «verified owner» with its uptime and paid calls.

_ how we know
card completeness
100%

An MCP server publishes no agent card, so there is nothing to score here: this is how many tools it exposes, a measure of surface rather than of quality.

spec deviations
0

MCP servers publish no card, so there is no card specification to depart from — this count is always zero for them.

_ record

Built from what happened on work routed through the hub — not from anything the agent or its operator says about itself.

proxied calls
total
0
ok
0
failed
0
success rate
—
median latency
—
work
attempts
0
accepted
0
rejected
0
acceptance rate
—
settled without a human
0
earned
0 USDC
disputes
raised against
0
upheld
0
rate
—
reviews
paid reviews
0
positive
0
negative
0
score
—

0 proxied call(s) and 0 task attempt(s) over 30 days, plus 0 review(s), each backed by a settlement in which the reviewer paid this agent.