Koskamo

Renderball MCP

This MCP server enables AI agents to programmatically create, write, and manage animated, editable presentations (decks) on the Renderball platform. It supports defining brand guidelines, generating design outlines, uploading complete design files, and checking rendering status to provide users with an editable editor URL.

Endpoint and access

No sign-in to connect and list tools. Individual tools may still need a vendor account, credentials, or permissions; check the documented prerequisites.

Renderball MCP logo, by RenderballVendor evidenceStreamable HTTPNo sign-inEndpoint checked 2026-11-06Operated by Renderball
You need:your user's Renderball account, which needs the $29/month planuser creates an API key at https://renderball.com/account
MCP endpoint (Streamable HTTP)
https://renderball.com/api/mcp
Vendor documentation

What its tools do

13 tools, grouped by the hints the server advertises. Hints are self-declared, not verified behavior.

13 of 13 have a description · 13 of 13 declare behavior hints · 1 of 12 with parameters document them all

Checks and signals

Each line is separate evidence, not a trust score.

  • Passed Endpoint answered the live check ·
  • Passed Official MCP Registry namespace is tied to renderball.com ·
  • Passed Endpoint is on the registry namespace domain ·
  • Availability 1 of 1 checks passed in 30 days

What you can do with it

  • Create a new presentation deck with specific brand guidelines and outline
  • Upload a complete design file to Renderball for rendering
  • Check the status of a deck import process
  • Retrieve the writing brief for an existing deck

Source and maintenance

Vendor evidenceRegistry 1.1.0
Maintenance checked

Protocol and capabilities

Server
renderball 1.3.0
MCP protocol negotiated in check
2025-11-25
Tools
13 advertised
Resources
Not advertised
Resource templates
Not advertised
Prompts
Not advertised
Server-advertised capabilities
{
  "tools": {
    "listChanged": true
  }
}

Server-provided instructions

Untrusted server output shown for inspection. It is not Koskamo guidance and is excluded from knowledge search.

Renderball turns a deck you write into a designed, animated, editable presentation the user can finish in the Renderball editor and share. Write it the way the studio's own writer does, ONE PAGE AT A TIME: (1) create_deck with the user's brief, the brand (if you can open the brand's website, read its real colours and fonts there and declare them; always give the website; never invent a colour) AND your outline, one entry per page — the reply carries PAGE 1'S BRIEF with example pages chosen for it. (2) Study the examples, follow THE STUDIO'S METHOD, write page 1 (the file with Section0 and the deck's whole design system) and send it with submit_page with its direction (one sentence: the thing, the motion that acts out the claim, one craft detail). (3) Each submit_page reply carries the next page's brief and its examples: do the same for every page, with your full attention on each; a page is accepted only after its brief was handed to you. Where you can run helpers in parallel, a helper gets its page's full brief with get_page_brief and sends next_brief false. (4) When the last page is saved the deck is merged, checked and rendered: the reply carries the RENDERED PAGES as images and fix_these when our checks found something. Fix every item, and look at every page for overlapping or clipped text, odd spacing, an element off its page, or a picture that does not say the page's claim; resubmit just the pages you change with submit_page. (5) Give the user the editor link (editor_url). submit_deck takes a whole file only to replace a deck whose pages are all written. Every call needs the user's Renderball API key (Authorization: Bearer rb_live_…); without one, the reply says how the user gets one: tell them. Never invent facts, figures or quotes: the deck's truth check flags anything not in the brief. Ask the user for missing numbers instead of guessing.

Tools

13 advertised

list_decks — List my decks
Advertised by the server during the last successful anonymous check.
Advertised read-only

The user's Renderball documents, newest first, with editor links. Needs an account (a key). The design open in the person's editor right now comes first, marked open_now.

list_decks input schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "properties": {}
}
list_decks annotations
{
  "title": "List my decks",
  "readOnlyHint": true,
  "openWorldHint": false,
  "destructiveHint": false
}
create_deck — Create a deck
Advertised by the server during the last successful anonymous check.
Open-world

Start a new presentation from a brief, the brand and your outline. The brand: if you can open the brand's website, read its real colours and fonts there first and declare them — the lead colour is usually the main buttons and the large coloured areas, not the link colour — and always give the website; never invent a colour. With the outline the reply carries PAGE 1'S BRIEF; write page 1 and send it with submit_page — each reply carries the next page's brief.

create_deck input schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "required": [
    "brief"
  ],
  "properties": {
    "size": {
      "type": "string",
      "maxLength": 24,
      "description": "The page size, any you need: \"wide\" 1920×1080 (slides, the default), \"square\" 1080×1080 (a post), \"vertical\" 1080×1920 (a story, a poster, a menu), or any width × height in px written \"1200x628\" (each side 100 to 4096): a link card 1200x628, a portrait post 1080x1350, an A4-shaped page 1240x1754, a banner 1500x500. Pick the size the person asked for: never draw a page turned sideways to fake another size."
    },
    "brand": {
      "type": "object",
      "required": [
        "name"
      ],
      "properties": {
        "name": {
          "type": "string",
          "maxLength": 60,
          "minLength": 1,
          "description": "The brand's name as it should appear."
        },
        "text": {
          "type": "string",
          "pattern": "^#[0-9a-fA-F]{6}$",
          "description": "The main text colour, only if known."
        },
        "fonts": {
          "type": "object",
          "properties": {
            "body": {
              "type": "string",
              "maxLength": 60,
              "description": "Body font family name, only if known."
            },
            "headline": {
              "type": "string",
              "maxLength": 60,
              "description": "Headline font family name, only if known."
            }
          }
        },
        "voice": {
          "type": "string",
          "maxLength": 300,
          "description": "How the brand speaks, in a sentence or two."
        },
        "accent": {
          "type": "string",
          "pattern": "^#[0-9a-fA-F]{6}$",
          "description": "The lead brand colour (usually the main buttons and the large coloured areas, not the links), only if you know it from the user, their material or their site. Never invent one."
        },
        "website": {
          "type": "string",
          "maxLength": 200,
          "description": "Their website, e.g. yourcompany.com. With an account, when you declare no colours, Renderball reads the site for its colours, fonts and logo — so give the website and leave colours you do not know out."
        },
        "logo_url": {
          "type": "string",
          "format": "uri",
          "maxLength": 500,
          "description": "A public https image of the logo (SVG or PNG), only if you have a real one."
        },
        "background": {
          "type": "string",
          "pattern": "^#[0-9a-fA-F]{6}$",
          "description": "The page background colour, only if known."
        }
      },
      "description": "The brand as YOU know it: name, and only the colours, fonts and logo you actually have. Never guess a colour; leave it out."
    },
    "brief": {
      "type": "string",
      "maxLength": 6000,
      "minLength": 20,
      "description": "What the deck is for, who it is for, what it should argue and ask. Real facts only; the truth check refuses invented figures."
    },
    "pages": {
      "type": "integer",
      "maximum": 16,
      "minimum": 1,
      "description": "How many pages you intend to write (default 5). Ignored when `outline` is given."
    },
    "outline": {
      "type": "object",
      "required": [
        "pages"
      ],
      "properties": {
        "tone": {
          "type": "string",
          "maxLength": 300,
          "description": "The register, e.g. 'confident, technical, CTO-to-CTO'."
        },
        "pages": {
          "type": "array",
          "items": {
            "type": "object",
            "required": [
              "label",
              "description",
              "visual_concept",
              "content"
            ],
            "properties": {
              "label": {
                "type": "string",
                "maxLength": 80,
                "minLength": 1,
                "description": "Short page title, 2-6 words (e.g. 'The Tracker Tax')."
              },
              "content": {
                "type": "object",
                "required": [
                  "headline"
                ],
                "properties": {
                  "cta": {
                    "type": "object",
                    "required": [
                      "primary"
                    ],
                    "properties": {
                      "primary": {
                        "type": "string",
                        "maxLength": 60
                      },
                      "secondary": {
                        "type": "string",
                        "maxLength": 80
                      }
                    }
                  },
                  "lede": {
                    "type": "string",
                    "maxLength": 400,
                    "description": "Supporting sentence or two."
                  },
                  "meta": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "required": [
                        "label",
                        "value"
                      ],
                      "properties": {
                        "label": {
                          "type": "string",
                          "maxLength": 60
                        },
                        "value": {
                          "type": "string",
                          "maxLength": 60
                        }
                      }
                    },
                    "maxItems": 6,
                    "description": "Stat tiles as label/value pairs — ONLY figures the user gave you."
                  },
                  "bullets": {
                    "type": "array",
                    "items": {
                      "type": "string",
                      "maxLength": 160
                    },
                    "maxItems": 6,
                    "description": "Up to 6 short points; no walls."
                  },
                  "caption": {
                    "type": "string",
                    "maxLength": 200,
                    "description": "Small mono caption, e.g. a source line."
                  },
                  "eyebrow": {
                    "type": "string",
                    "maxLength": 60,
                    "description": "Tiny label above the headline, e.g. 'THE PROBLEM'."
                  },
                  "headline": {
                    "type": "string",
                    "maxLength": 120,
                    "minLength": 1,
                    "description": "The one strong display line."
                  }
                },
                "description": "The approved copy. Every numeral here must come from the user's material — the deck's truth check enforces it."
              },
              "description": {
                "type": "string",
                "maxLength": 600,
                "minLength": 1,
                "description": "What this page must accomplish in the argument, one or two sentences. Not shown on the page."
              },
              "visual_concept": {
                "type": "string",
                "maxLength": 1200,
                "minLength": 1,
                "description": "The composition and the one graphic device that expresses the page's argument: layout, the diagram/chart/mock, where the headline sits, colours by role. Concrete enough to draw from."
              }
            }
          },
          "maxItems": 16,
          "minItems": 1
        }
      },
      "description": "Your page-by-page outline (one entry per page: label, description, visual_concept, content with a headline). Send it here and the reply carries the brief to write from (page 1's brief when the deck is written page by page) — one call instead of create_deck + write_outline."
    },
    "brand_url": {
      "type": "string",
      "maxLength": 300,
      "description": "Key holders only: a website Renderball reads for colours, fonts and logo when no brand is declared."
    }
  }
}
create_deck annotations
{
  "title": "Create a deck",
  "readOnlyHint": false,
  "openWorldHint": true,
  "destructiveHint": false
}
write_outline — Write the outline
Advertised by the server during the last successful anonymous check.
Advertised destructive

Save a new page-by-page outline for a deck (pages written for the old one are dropped). The reply carries PAGE 1'S BRIEF; each submit_page reply carries the next page's.

write_outline input schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "required": [
    "deck_id",
    "pages"
  ],
  "properties": {
    "tone": {
      "type": "string",
      "maxLength": 300,
      "description": "The register, e.g. 'confident, technical, CTO-to-CTO'."
    },
    "pages": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "label",
          "description",
          "visual_concept",
          "content"
        ],
        "properties": {
          "label": {
            "type": "string",
            "maxLength": 80,
            "minLength": 1,
            "description": "Short page title, 2-6 words (e.g. 'The Tracker Tax')."
          },
          "content": {
            "type": "object",
            "required": [
              "headline"
            ],
            "properties": {
              "cta": {
                "type": "object",
                "required": [
                  "primary"
                ],
                "properties": {
                  "primary": {
                    "type": "string",
                    "maxLength": 60
                  },
                  "secondary": {
                    "type": "string",
                    "maxLength": 80
                  }
                }
              },
              "lede": {
                "type": "string",
                "maxLength": 400,
                "description": "Supporting sentence or two."
              },
              "meta": {
                "type": "array",
                "items": {
                  "type": "object",
                  "required": [
                    "label",
                    "value"
                  ],
                  "properties": {
                    "label": {
                      "type": "string",
                      "maxLength": 60
                    },
                    "value": {
                      "type": "string",
                      "maxLength": 60
                    }
                  }
                },
                "maxItems": 6,
                "description": "Stat tiles as label/value pairs — ONLY figures the user gave you."
              },
              "bullets": {
                "type": "array",
                "items": {
                  "type": "string",
                  "maxLength": 160
                },
                "maxItems": 6,
                "description": "Up to 6 short points; no walls."
              },
              "caption": {
                "type": "string",
                "maxLength": 200,
                "description": "Small mono caption, e.g. a source line."
              },
              "eyebrow": {
                "type": "string",
                "maxLength": 60,
                "description": "Tiny label above the headline, e.g. 'THE PROBLEM'."
              },
              "headline": {
                "type": "string",
                "maxLength": 120,
                "minLength": 1,
                "description": "The one strong display line."
              }
            },
            "description": "The approved copy. Every numeral here must come from the user's material — the deck's truth check enforces it."
          },
          "description": {
            "type": "string",
            "maxLength": 600,
            "minLength": 1,
            "description": "What this page must accomplish in the argument, one or two sentences. Not shown on the page."
          },
          "visual_concept": {
            "type": "string",
            "maxLength": 1200,
            "minLength": 1,
            "description": "The composition and the one graphic device that expresses the page's argument: layout, the diagram/chart/mock, where the headline sits, colours by role. Concrete enough to draw from."
          }
        }
      },
      "maxItems": 16,
      "minItems": 1
    },
    "deck_id": {
      "type": "string",
      "maxLength": 40,
      "minLength": 10
    }
  }
}
write_outline annotations
{
  "title": "Write the outline",
  "readOnlyHint": false,
  "openWorldHint": false,
  "destructiveHint": true
}
get_brief — Get the writing brief
Advertised by the server during the last successful anonymous check.
Advertised read-only

The writing brief for a deck whose outline is already saved.

get_brief input schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "required": [
    "deck_id"
  ],
  "properties": {
    "deck_id": {
      "type": "string",
      "maxLength": 40,
      "minLength": 10
    }
  }
}
get_brief annotations
{
  "title": "Get the writing brief",
  "readOnlyHint": true,
  "openWorldHint": false,
  "destructiveHint": false
}
see_deck — See the rendered pages
Advertised by the server during the last successful anonymous check.
Advertised read-only

The deck's rendered pages as images, page 1 first — look at them for overlapping or clipped text, odd spacing, an element off its page or a picture that does not say its page's claim, then fix that page and submit_page it again. Available once the deck has been rendered.

see_deck input schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "required": [
    "deck_id"
  ],
  "properties": {
    "deck_id": {
      "type": "string",
      "maxLength": 40,
      "minLength": 10
    }
  }
}
see_deck annotations
{
  "title": "See the rendered pages",
  "readOnlyHint": true,
  "openWorldHint": false,
  "destructiveHint": false
}
submit_deck — Submit the deck file
Advertised by the server during the last successful anonymous check.
Advertised destructive

Replace the whole file of a deck whose pages are all written (while pages are still being written, submit_page each one — a whole file is refused then). Renderball checks it against the brief, renders every page and opens it in the editor. Returns 'ready' with the editor_url, or 'importing' — then poll deck_status.

submit_deck input schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "required": [
    "deck_id",
    "source"
  ],
  "properties": {
    "label": {
      "type": "string",
      "maxLength": 40,
      "description": "Who wrote it, e.g. 'claude-code'. Shown in the deck's trace."
    },
    "source": {
      "type": "string",
      "maxLength": 600000,
      "minLength": 1500,
      "description": "The complete deck file, exactly as the writing brief specifies. Raw file or a ```tsx fenced block."
    },
    "deck_id": {
      "type": "string",
      "maxLength": 40,
      "minLength": 10
    },
    "wait_seconds": {
      "type": "integer",
      "maximum": 60,
      "minimum": 0,
      "description": "How long to wait for the import before returning (default 25). Use deck_status to keep checking."
    }
  }
}
submit_deck annotations
{
  "title": "Submit the deck file",
  "readOnlyHint": false,
  "openWorldHint": false,
  "destructiveHint": true
}
deck_status — Check an import
Advertised by the server during the last successful anonymous check.
Advertised read-only

Whether a submitted deck is still importing, ready (with the editor link and the rendered pages, to check them), or failed (with the reason).

deck_status input schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "required": [
    "deck_id"
  ],
  "properties": {
    "deck_id": {
      "type": "string",
      "maxLength": 40,
      "minLength": 10
    }
  }
}
deck_status annotations
{
  "title": "Check an import",
  "readOnlyHint": true,
  "openWorldHint": false,
  "destructiveHint": false
}
share_deck — Share a deck
Advertised by the server during the last successful anonymous check.
Advertised destructiveOpen-world

Turn on the public link for a deck and return it: anyone with the link can view the deck.

share_deck input schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "required": [
    "deck_id"
  ],
  "properties": {
    "deck_id": {
      "type": "string",
      "maxLength": 40,
      "minLength": 10
    }
  }
}
share_deck annotations
{
  "title": "Share a deck",
  "readOnlyHint": false,
  "openWorldHint": true,
  "destructiveHint": true
}
get_page_brief — Get one page's brief
Advertised by the server during the last successful anonymous check.

The full writing brief for ONE page: the studio's method, the rules, the examples chosen for that page, and (after page 1) page 1's file to continue. You rarely need it: page 1's brief comes with create_deck and each submit_page reply carries the next page's. Use it for a helper that writes one page with nothing in front of it.

get_page_brief input schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "required": [
    "deck_id",
    "page"
  ],
  "properties": {
    "page": {
      "type": "integer",
      "maximum": 16,
      "minimum": 1,
      "description": "Which page, 1 first. Page 1 must be saved before any other page's brief."
    },
    "deck_id": {
      "type": "string",
      "maxLength": 40,
      "minLength": 10
    }
  }
}
get_page_brief annotations
{
  "title": "Get one page's brief",
  "readOnlyHint": false,
  "openWorldHint": false,
  "destructiveHint": false
}
get_examples — Read example pages
Advertised by the server during the last successful anonymous check.
Advertised read-only

Up to 4 of the studio's example pages, by the ids listed in a page brief — read the ones that fit the page you are about to write.

get_examples input schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "required": [
    "deck_id",
    "ids"
  ],
  "properties": {
    "ids": {
      "type": "array",
      "items": {
        "type": "string",
        "maxLength": 4
      },
      "maxItems": 4,
      "minItems": 1,
      "description": "Up to 4 example ids from the page brief's list, e.g. [\"L3\", \"R12\"]."
    },
    "deck_id": {
      "type": "string",
      "maxLength": 40,
      "minLength": 10
    }
  }
}
get_examples annotations
{
  "title": "Read example pages",
  "readOnlyHint": true,
  "openWorldHint": false,
  "destructiveHint": false
}
submit_page — Submit one page
Advertised by the server during the last successful anonymous check.
Advertised destructive

Save one page you wrote (page 1: the file with Section0 and the shared design; page N: only its Section), with its direction (one sentence: the thing, the motion that acts out the claim, one craft detail). A page is accepted only after its brief was handed to you. The reply carries the next page's brief; when every page is saved the deck is merged, checked and rendered and the reply carries the rendered pages. To rewrite one page of a finished design, submit just that page: it replaces that page only, and everything else stays as it is, the person's own edits included. To change part of a page, read_page and edit_page are lighter.

submit_page input schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "required": [
    "deck_id",
    "page",
    "source",
    "direction"
  ],
  "properties": {
    "page": {
      "type": "integer",
      "maximum": 16,
      "minimum": 1
    },
    "label": {
      "type": "string",
      "maxLength": 40,
      "description": "Who wrote it, e.g. 'claude-code'. Shown in the deck's trace."
    },
    "source": {
      "type": "string",
      "maxLength": 200000,
      "minLength": 200,
      "description": "Page 1: the file with Section0 and every shared constant, helper and chrome. Page N: ONLY `export const Section{N-1}`. Raw code or a ```tsx fenced block."
    },
    "deck_id": {
      "type": "string",
      "maxLength": 40,
      "minLength": 10
    },
    "page_id": {
      "type": "string",
      "maxLength": 80,
      "description": "Rewriting a page of a finished design: the page_id read_page gave. If the person moved pages since, it is refused instead of replacing another page."
    },
    "direction": {
      "type": "string",
      "maxLength": 400,
      "minLength": 15,
      "description": "This page's direction in one sentence — the thing, the motion that acts out the claim, one craft detail. It goes into the page as its // Direction: line."
    },
    "next_brief": {
      "type": "boolean",
      "description": "Default true: the reply carries the next page's brief. A helper writing just one page sends false."
    },
    "wait_seconds": {
      "type": "integer",
      "maximum": 60,
      "minimum": 0,
      "description": "When this page completes the deck: how long to wait for the import (default 25)."
    }
  }
}
submit_page annotations
{
  "title": "Submit one page",
  "readOnlyHint": false,
  "openWorldHint": false,
  "destructiveHint": true
}
read_page — Read one page
Advertised by the server during the last successful anonymous check.
Advertised read-only

Read one page of a design as it is NOW — the code the person's editor shows, including their own edits — before changing it. Use it whenever the person asks to change something in a design that already exists: their editor may hold edits you have not seen. The reply carries the page's code, the code every page shares (palette, fonts, helpers), the page's element ids and, when the person has the design open, the element they selected ("this").

read_page input schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "required": [
    "deck_id",
    "page"
  ],
  "properties": {
    "page": {
      "type": "integer",
      "maximum": 16,
      "minimum": 1,
      "description": "Which page, 1 first."
    },
    "deck_id": {
      "type": "string",
      "maxLength": 40,
      "minLength": 10
    },
    "with_shared": {
      "type": "boolean",
      "description": "Default true: also return the code every page shares (palette, fonts, helpers). Send false when you already have it in this conversation."
    }
  }
}
read_page annotations
{
  "title": "Read one page",
  "readOnlyHint": true,
  "openWorldHint": false,
  "destructiveHint": false
}
edit_page — Change part of a page
Advertised by the server during the last successful anonymous check.
Advertised destructive

Change part of a design that already exists, the way you edit a file: each edit replaces exact text from read_page (it must appear exactly once) with new text. Use it for any change the person asks for in an existing design — a headline, a colour, a picture, moving or removing something — instead of sending the whole page again: everything you do not touch stays as it is, the person's own edits included, and they see the change in their editor at once and can undo it. One page per call, or shared: true for the code every page shares. A refused edit changes nothing and says why. The reply shows the page as it looks now.

edit_page input schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "required": [
    "deck_id",
    "edits"
  ],
  "properties": {
    "page": {
      "type": "integer",
      "maximum": 16,
      "minimum": 1,
      "description": "Which page to change, 1 first. Leave out only with shared: true."
    },
    "edits": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "find",
          "replace"
        ],
        "properties": {
          "find": {
            "type": "string",
            "maxLength": 20000,
            "minLength": 1,
            "description": "Exact text copied from read_page, character for character; it must appear exactly once."
          },
          "replace": {
            "type": "string",
            "maxLength": 40000,
            "description": "What to put in its place; empty deletes it."
          }
        }
      },
      "maxItems": 30,
      "minItems": 1,
      "description": "Applied in order, all or nothing."
    },
    "shared": {
      "type": "boolean",
      "description": "true: the edits are to the code every page shares (palette, fonts, helpers), as read_page shows it. Only when the person asks to change the whole design."
    },
    "deck_id": {
      "type": "string",
      "maxLength": 40,
      "minLength": 10
    },
    "page_id": {
      "type": "string",
      "maxLength": 80,
      "description": "The page_id read_page gave for this page. If the person moved pages since, the edit is refused instead of landing on another page."
    },
    "summary": {
      "type": "string",
      "maxLength": 120,
      "description": "What you changed, in a few plain words the person sees in their editor, e.g. 'Shortened the headline'."
    }
  }
}
edit_page annotations
{
  "title": "Change part of a page",
  "readOnlyHint": false,
  "openWorldHint": false,
  "destructiveHint": true
}

Prompts

Not advertised

No prompt definitions available.

Resources

Not advertised

No resource definitions available.

90-day uptime

A lightweight connection check about every six hours, sampled on hosts with many listings. It shows the server answered, not that its tools work.

Too few checks for a percentage yet (1 of 1 answered).

  1. 2026-11-07: 1 of 1 checks answered

30-day availability

Aggregated from read-only remote checks; this is not a tool-execution or security guarantee.

Successful checks
1 of 1 (100%)
Average latency
696 ms
95th percentile latency
696 ms

Maintenance history

Public check and source-refresh events. Editorial and ownership records remain private.

  • · probe · passed · 696 ms · metadata changed · 13 tool(s)

Connect from your client

Each snippet registers the same endpoint; pick the client you use.

This server is operated by the named third party. Listing and endpoint checks are not an endorsement or a security audit. Review the operator's permissions, terms, and data handling before connecting. How listings are checked and corrected.

Claude Code

Run this once in a terminal. It registers the remote server. Use --scope project to write .mcp.json for the repo.
Claude Code configuration
claude mcp add --transport http renderball-mcp https://renderball.com/api/mcp

Codex

Run this once. Codex stores MCP servers in ~/.codex/config.toml (or .codex/config.toml in a trusted project).
Codex configuration
codex mcp add renderball-mcp --url https://renderball.com/api/mcp

Cursor

Merge this server into .cursor/mcp.json in your project, then enable renderball-mcp in your MCP settings.
Cursor configuration
{
  "mcpServers": {
    "renderball-mcp": {
      "url": "https://renderball.com/api/mcp"
    }
  }
}

Cline

Merge this into cline_mcp_settings.json (Cline → MCP Servers → Configure).
Cline configuration
{
  "mcpServers": {
    "renderball-mcp": {
      "type": "streamableHttp",
      "url": "https://renderball.com/api/mcp",
      "disabled": false
    }
  }
}

VS Code

Merge this server into .vscode/mcp.json. Use MCP: List Servers to start renderball-mcp and inspect its tools.
VS Code configuration
{
  "servers": {
    "renderball-mcp": {
      "type": "http",
      "url": "https://renderball.com/api/mcp"
    }
  }
}

Gemini CLI

Run this once. It writes .gemini/settings.json in the current project; pass --scope user for ~/.gemini/settings.json.
Gemini CLI configuration
gemini mcp add --transport http renderball-mcp https://renderball.com/api/mcp

Claude Desktop

Open Claude Settings > Connectors > Add custom connector, enter this server URL and enable it for the conversation. This is a manual remote-connector handoff, not a desktop JSON configuration.
Claude Desktop configuration
https://renderball.com/api/mcp

Windsurf

Merge this into ~/.codeium/windsurf/mcp_config.json, then refresh MCP in Cascade. Windsurf remote servers use serverUrl, not url.
Windsurf configuration
{
  "mcpServers": {
    "renderball-mcp": {
      "serverUrl": "https://renderball.com/api/mcp"
    }
  }
}

Let your agent find its tools

Find servers like Renderball MCP from your agent. Add Koskamo once to search the index for endpoints, access requirements, and client setup. Public discovery needs no key.

Do you run Renderball MCP?

Prove ownership with a DNS record, a well-known file, or your Official MCP Registry entry, and your edits publish immediately. Proofs are re-checked weekly; admins can still hide or remove a listing.

Claim this listing