_ registry / mcp streamable-http · checked 7h ago

spritesheet-forge

https://mcp.clawstudiouo.com

Registry code: bce4b82ddeb3409b

api record

Full documentation (tools, parameters, file input rules, agent workflow guide): https://spritesheet-forge.spritesheet-forge.workers.dev/ — fetch this URL to learn how to use this server. For runtime config (upload URL, TTL, encoding rules), call the server_info tool. AGENT TIPS (avoid common mistakes): (1) Check a local file's ACTUAL byte size before choosing how to pass it — base64 data URIs are only practical below ~185 KB; at or above that (or whenever a shell command does the encoding) use the upload endpoint from server_info. (2) Tools that emit many frames (gif_to_frames,…

endpoint
https://mcp.clawstudiouo.com/mcp
protocol
streamable-http ·2024-11-05
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 spritesheet-forge live?
No — it has stopped answering the hub's checks (checked 7h ago). It answered 77% of checks over the last 30 days.
Is spritesheet-forge free to use?
Not anonymously — it asks for a key or a login before it will serve. Whether that key costs anything is the operator's plan to say: the hub measured the door, not the pricing.
What tools does spritesheet-forge have?
8 tools: png_to_spritesheet, trim_png, gif_to_frames, split_spritesheet, gif_to_spritesheet, frames_to_animation, spritesheet_to_animation, server_info.
Is spritesheet-forge 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
retired
uptime, 30 days
76.5%

90 days 86.3%· all time 86.3%

latency
135ms

last good check

priced tools
0

of 8 tools

_ answered our checks, 90 days 322 checks · signed record
  • down → retired· timeout after 20000ms
  • degraded → down· fetch failed
  • live → degraded· fetch failed
  • degraded → live
  • live → degraded· timeout after 20000ms
_ what it is for
used for
  • convert a gif into a spritesheet
  • split a spritesheet into frames
  • assemble pngs into an animated gif
  • trim transparent edges from pngs
takes → gives
images → images, data
tools
8 reads
_ 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

_ what it can do 8 tools
1 auth-required 7 never probed 1 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.

  • server_info reads auth-required 42d ago

    Returns this server's runtime configuration: upload endpoint URL, output file TTL, file size limits, and base64 encoding rules. Call this before working with large files (≥ 4 MB) or when building multi-step workflows that chain tool outputs.

    mcp-tool

    {
      "type": "object",
      "required": [],
      "properties": {}
    }
    arguments 5 lines
  • png_to_spritesheet reads unknown never probed

    Merge multiple PNG files into a single spritesheet. Supports grid, horizontal, vertical, and packed (bin-packed) layouts with optional TexturePacker-compatible JSON metadata. Returns a download URL.

    mcp-tool

    {
      "type": "object",
      "required": [
        "files"
      ],
      "properties": {
        "align": {
          "enum": [
            "center",
            "top_left"
          ],
          "type": "string"
        },
        "files": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "PNG files — HTTPS URLs, data URIs, or output URLs from previous tool calls (pass directly, no re-encoding needed). For local files < ~185 KB each: base64-encode the bytes and prepend \"data:image/png;base64,\" — you MUST strip ALL whitespace and newlines from the base64 string before prepending (shell encoders like openssl insert newlines that cause INVALID_BASE64). For larger files or any file encoded via a shell command: call server_info to get the upload_url and token instructions, POST the file there (multipart/form-data, field \"file\", Bearer token required), and pass the returned URL."
        },
        "layout": {
          "enum": [
            "grid",
            "horizontal",
            "vertical",
            "packed"
          ],
          "type": "string",
          "description": "Frame arrangement. Default: grid"
        },
        "columns": {
          "type": "integer",
          "description": "Grid columns. Auto-calculated if omitted."
        },
        "extrude": {
          "type": "integer",
          "description": "Extrude outermost pixels by N px per frame"
        },
        "padding": {
          "type": "integer",
          "description": "Pixel gap between frames"
        },
        "bg_color": {
          "type": "string",
          "description": "\"transparent\" or hex \"#RRGGBB\""
        },
        "fit_mode": {
          "enum": [
            "scale_fit",
            "scale_fill",
            "error"
          ],
          "type": "string"
        },
        "cell_mode": {
          "enum": [
            "auto_max",
            "auto_uniform",
            "fixed"
          ],
          "type": "string",
          "description": "Cell sizing mode. Default: auto_max"
        },
        "cell_width": {
          "type": "integer",
          "description": "Required when cell_mode=fixed"
        },
        "power_of_2": {
          "type": "boolean",
          "description": "Pad output to next power of 2"
        },
        "trim_input": {
          "type": "boolean",
          "description": "Auto-trim transparent edges before compositing"
        },
        "cell_height": {
          "type": "integer",
          "description": "Required when cell_mode=fixed"
        },
        "file_name_order": {
          "type": "boolean",
          "description": "Order frames by the numeric _N suffix in each filename (e.g. frame_00.png, frame_01.png) instead of by array order. REQUIRES every input filename to end with _N.<ext> — the name is taken from the URL's last path segment. IMPORTANT: this server's upload endpoint renames every file to output-<hex>.png (no _N suffix), and data URIs carry no filename, so file_name_order=true is REJECTED (422) for both — it only works for external URLs that already end in _N.<ext>. TO ORDER FRAMES, PREFER doing it manually: leave this false and pass `files` in the exact order you want (the server preserves array order). If order matters but your inputs are upload URLs / data URIs / local files, fetch the files locally, CONFIRM the intended order with the user, then pass `files` in that order with file_name_order=false. Default: false"
        },
        "metadata_format": {
          "enum": [
            "none",
            "json_array",
            "json_hash",
            "css"
          ],
          "type": "string",
          "description": "Atlas metadata format. Required (non-none) when layout=packed"
        }
      }
    }
    arguments 95 lines
  • trim_png reads unknown never probed

    Crop transparent edges from one or more PNG files. Single file returns PNG; multiple files return a ZIP.

    mcp-tool

    {
      "type": "object",
      "required": [
        "files"
      ],
      "properties": {
        "files": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "PNG files — HTTPS URLs, data URIs, or output URLs from previous tool calls (pass directly, no re-encoding needed). For local files < ~185 KB each: base64-encode the bytes and prepend \"data:image/png;base64,\" — you MUST strip ALL whitespace and newlines from the base64 string before prepending (shell encoders like openssl insert newlines that cause INVALID_BASE64). For larger files or any file encoded via a shell command: call server_info to get the upload_url and token instructions, POST the file there (multipart/form-data, field \"file\", Bearer token required), and pass the returned URL."
        },
        "padding": {
          "type": "integer",
          "description": "Transparent margin to preserve around trimmed content. Default: 0"
        },
        "threshold": {
          "type": "integer",
          "description": "Alpha threshold 0-255. Pixels with alpha ≤ threshold are trimmed. Default: 0"
        }
      }
    }
    arguments 23 lines
  • gif_to_frames reads unknown never probed

    Extract all frames from a GIF and return them as individual PNGs in a ZIP archive.

    mcp-tool

    {
      "type": "object",
      "required": [
        "file"
      ],
      "properties": {
        "file": {
          "type": "string",
          "description": "GIF file — HTTPS URL, data URI, or output URL from a previous tool call (pass directly, no re-encoding needed). For local files < ~185 KB: base64-encode the bytes and prepend \"data:image/gif;base64,\" — you MUST strip ALL whitespace and newlines from the base64 string before prepending (shell encoders like openssl insert newlines that cause INVALID_BASE64). For larger files or any file encoded via a shell command: call server_info to get the upload_url and token instructions, POST the file there (multipart/form-data, field \"file\", Bearer token required), and pass the returned URL."
        },
        "bg_color": {
          "type": "string",
          "description": "\"auto\" or hex \"#RRGGBB\""
        },
        "remove_bg": {
          "type": "boolean",
          "description": "Remove background from each frame. Default: false"
        },
        "tolerance": {
          "type": "integer",
          "description": "Background removal threshold 0-255. Default: 30"
        }
      }
    }
    arguments 24 lines
  • split_spritesheet reads unknown never probed

    Slice a spritesheet PNG into individual frames, generate TexturePacker-compatible atlas JSON, or both. Provide columns+rows (grid mode) or cell_width+cell_height (cell mode).

    mcp-tool

    {
      "type": "object",
      "required": [
        "file"
      ],
      "properties": {
        "file": {
          "type": "string",
          "description": "Spritesheet PNG — HTTPS URL, data URI, or output URL from a previous tool call (pass directly, no re-encoding needed). For local files < 4 MB: base64-encode the bytes and prepend \"data:image/png;base64,\" — you MUST strip ALL whitespace and newlines from the base64 string before prepending. For files ≥ 4 MB: call server_info to get the upload_url, POST the file there (multipart/form-data, field \"file\", Bearer token), and pass the returned URL."
        },
        "rows": {
          "type": "integer",
          "description": "Grid rows (grid mode)"
        },
        "output": {
          "enum": [
            "frames",
            "metadata",
            "both"
          ],
          "type": "string",
          "description": "Default: frames"
        },
        "columns": {
          "type": "integer",
          "description": "Grid columns (grid mode)"
        },
        "padding": {
          "type": "integer"
        },
        "trim_top": {
          "type": "integer"
        },
        "row_range": {
          "type": "string"
        },
        "trim_left": {
          "type": "integer"
        },
        "cell_width": {
          "type": "integer",
          "description": "Cell width in px (cell mode)"
        },
        "skip_empty": {
          "type": "boolean",
          "description": "Remove fully transparent frames. Default: true"
        },
        "trim_right": {
          "type": "integer"
        },
        "cell_height": {
          "type": "integer",
          "description": "Cell height in px (cell mode)"
        },
        "frame_count": {
          "type": "integer"
        },
        "trim_bottom": {
          "type": "integer"
        },
        "column_range": {
          "type": "string",
          "description": "e.g. \"0-5\" or \"2\""
        },
        "metadata_format": {
          "enum": [
            "json_array",
            "json_hash",
            "css"
          ],
          "type": "string"
        }
      }
    }
    arguments 74 lines
  • gif_to_spritesheet reads unknown never probed

    Convert a GIF animation into a spritesheet PNG with all frames arranged in a grid. Optionally remove the background.

    mcp-tool

    {
      "type": "object",
      "required": [
        "file"
      ],
      "properties": {
        "file": {
          "type": "string",
          "description": "GIF file — HTTPS URL, data URI, or output URL from a previous tool call (pass directly, no re-encoding needed). For local files < ~185 KB: base64-encode the bytes and prepend \"data:image/gif;base64,\" — you MUST strip ALL whitespace and newlines from the base64 string before prepending (shell encoders like openssl insert newlines that cause INVALID_BASE64). For larger files or any file encoded via a shell command: call server_info to get the upload_url and token instructions, POST the file there (multipart/form-data, field \"file\", Bearer token required), and pass the returned URL."
        },
        "columns": {
          "type": "integer",
          "description": "Grid columns. Auto-calculated if omitted."
        },
        "padding": {
          "type": "integer",
          "description": "Pixel gap between frames. Default: 0"
        },
        "bg_color": {
          "type": "string",
          "description": "\"auto\" or hex \"#RRGGBB\". Default: \"auto\""
        },
        "remove_bg": {
          "type": "boolean",
          "description": "Remove background from each frame. Default: false"
        },
        "tolerance": {
          "type": "integer",
          "description": "Background removal threshold 0-255. Default: 30"
        }
      }
    }
    arguments 32 lines
  • frames_to_animation reads unknown never probed

    Assemble multiple PNG files into an animated GIF or animated WebP.

    mcp-tool

    {
      "type": "object",
      "required": [
        "files"
      ],
      "properties": {
        "loop": {
          "type": "integer",
          "description": "Loop count. 0 = infinite. Default: 0"
        },
        "files": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "PNG frames — HTTPS URLs, data URIs, or output URLs from previous tool calls (pass directly, no re-encoding needed). For local files < 4 MB each: base64-encode the bytes and prepend \"data:image/png;base64,\" — you MUST strip ALL whitespace and newlines from the base64 string before prepending. For files ≥ 4 MB each: call server_info to get the upload_url, POST the file there (multipart/form-data, field \"file\", Bearer token), and pass the returned URL."
        },
        "resize": {
          "enum": [
            "error",
            "fill",
            "transparent"
          ],
          "type": "string",
          "description": "Dimension mismatch handling. Default: transparent"
        },
        "quality": {
          "type": "integer",
          "description": "WebP lossy quality 0-100. Default: 80"
        },
        "duration": {
          "type": "integer",
          "description": "Frame duration in ms (10-10000). Default: 100"
        },
        "lossless": {
          "type": "boolean",
          "description": "WebP lossless mode. Default: false"
        },
        "bg_fill_color": {
          "type": "string",
          "description": "Fill color for resize=fill. Hex #RRGGBB. Default: #000000"
        },
        "output_format": {
          "enum": [
            "gif",
            "webp"
          ],
          "type": "string",
          "description": "Output format. Default: gif"
        },
        "file_name_order": {
          "type": "boolean",
          "description": "Order frames by the numeric _N suffix in each filename (e.g. frame_00.png, frame_01.png) instead of by array order. REQUIRES every input filename to end with _N.<ext> — the name is taken from the URL's last path segment. IMPORTANT: this server's upload endpoint renames every file to output-<hex>.png (no _N suffix), and data URIs carry no filename, so file_name_order=true is REJECTED (422) for both — it only works for external URLs that already end in _N.<ext>. TO ORDER FRAMES, PREFER doing it manually: leave this false and pass `files` in the exact order you want (the server preserves array order). If order matters but your inputs are upload URLs / data URIs / local files, fetch the files locally, CONFIRM the intended order with the user, then pass `files` in that order with file_name_order=false. Default: false"
        }
      }
    }
    arguments 56 lines
  • spritesheet_to_animation reads unknown never probed

    Slice a spritesheet PNG into frames and produce an animated GIF or WebP. Provide columns+rows (grid mode) or cell_width+cell_height (cell mode).

    mcp-tool

    {
      "type": "object",
      "required": [
        "file"
      ],
      "properties": {
        "file": {
          "type": "string",
          "description": "Spritesheet PNG — HTTPS URL, data URI, or output URL from a previous tool call (pass directly, no re-encoding needed). For local files < ~185 KB: base64-encode the bytes and prepend \"data:image/png;base64,\" — you MUST strip ALL whitespace and newlines from the base64 string before prepending (shell encoders like openssl insert newlines that cause INVALID_BASE64). For larger files or any file encoded via a shell command: call server_info to get the upload_url and token instructions, POST the file there (multipart/form-data, field \"file\", Bearer token required), and pass the returned URL."
        },
        "loop": {
          "type": "integer",
          "description": "Loop count. 0 = infinite. Default: 0"
        },
        "rows": {
          "type": "integer",
          "description": "Grid rows (grid mode)"
        },
        "columns": {
          "type": "integer",
          "description": "Grid columns (grid mode)"
        },
        "padding": {
          "type": "integer",
          "description": "Pixel gap between cells. Default: 0"
        },
        "quality": {
          "type": "integer",
          "description": "WebP quality 0-100. Default: 80"
        },
        "duration": {
          "type": "integer",
          "description": "Frame duration in ms. Default: 100"
        },
        "lossless": {
          "type": "boolean",
          "description": "WebP lossless. Default: false"
        },
        "trim_top": {
          "type": "integer"
        },
        "row_range": {
          "type": "string"
        },
        "trim_left": {
          "type": "integer"
        },
        "cell_width": {
          "type": "integer",
          "description": "Cell width in px (cell mode)"
        },
        "skip_empty": {
          "type": "boolean",
          "description": "Auto-remove fully transparent frames. Default: true"
        },
        "trim_right": {
          "type": "integer"
        },
        "cell_height": {
          "type": "integer",
          "description": "Cell height in px (cell mode)"
        },
        "frame_count": {
          "type": "integer",
          "description": "Actual frame count for incomplete last row"
        },
        "trim_bottom": {
          "type": "integer"
        },
        "column_range": {
          "type": "string",
          "description": "e.g. \"0-5\" or \"2\""
        },
        "output_format": {
          "enum": [
            "gif",
            "webp"
          ],
          "type": "string",
          "description": "Default: gif"
        }
      }
    }
    arguments 83 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 bce4b82ddeb3409b.

Every step, filled in for this listing: https://brick.blue/api/v1/agents/bce4b82ddeb3409b/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/bce4b82ddeb3409b/badge.svg)](https://brick.blue/agent/bce4b82ddeb3409b?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.