MCP Server Builder
anthropics/skills
Guides the design and implementation of Model Context Protocol servers in TypeScript or Python, from tool naming and error messages to evaluation.
How Limoni measures and stores text — UAX. An agent skill from thebanri/limoni.
$ npx skills add thebanri/limoni --skill limoni-text-rendering -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install thebanri/limoni limoni-text-rendering --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/thebanri/limoni.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.claude/skills/limoni-text-rendering .claude/skills/limoni-text-rendering && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "limoni-text-rendering" agent skill from https://github.com/thebanri/limoni/tree/main/.claude/skills/limoni-text-rendering into .claude/skills/limoni-text-rendering/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "limoni-text-rendering", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/thebanri/limoni/tree/main/.claude/skills/limoni-text-renderingType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add thebanri/limoni --skill limoni-text-rendering -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install thebanri/limoni limoni-text-rendering --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/thebanri/limoni.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.claude/skills/limoni-text-rendering .agents/skills/limoni-text-rendering && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "limoni-text-rendering" agent skill from https://github.com/thebanri/limoni/tree/main/.claude/skills/limoni-text-rendering into .agents/skills/limoni-text-rendering/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "limoni-text-rendering", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add thebanri/limoni --skill limoni-text-rendering -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install thebanri/limoni limoni-text-rendering --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/thebanri/limoni.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.claude/skills/limoni-text-rendering .cursor/skills/limoni-text-rendering && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "limoni-text-rendering" agent skill from https://github.com/thebanri/limoni/tree/main/.claude/skills/limoni-text-rendering into .cursor/skills/limoni-text-rendering/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "limoni-text-rendering", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/thebanri/limoni.git --path .claude/skills/limoni-text-rendering--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add thebanri/limoni --skill limoni-text-rendering -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install thebanri/limoni limoni-text-rendering --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/thebanri/limoni.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.claude/skills/limoni-text-rendering .gemini/skills/limoni-text-rendering && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "limoni-text-rendering" agent skill from https://github.com/thebanri/limoni/tree/main/.claude/skills/limoni-text-rendering into .gemini/skills/limoni-text-rendering/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "limoni-text-rendering", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install thebanri/limoni limoni-text-renderingInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add thebanri/limoni --skill limoni-text-rendering -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/thebanri/limoni.git skills-src && mkdir -p .github/skills && cp -r skills-src/.claude/skills/limoni-text-rendering .github/skills/limoni-text-rendering && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "limoni-text-rendering" agent skill from https://github.com/thebanri/limoni/tree/main/.claude/skills/limoni-text-rendering into .github/skills/limoni-text-rendering/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "limoni-text-rendering", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add thebanri/limoni --skill limoni-text-rendering -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install thebanri/limoni limoni-text-rendering --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/thebanri/limoni.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.claude/skills/limoni-text-rendering .opencode/skills/limoni-text-rendering && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "limoni-text-rendering" agent skill from https://github.com/thebanri/limoni/tree/main/.claude/skills/limoni-text-rendering into .opencode/skills/limoni-text-rendering/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "limoni-text-rendering", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
limoni-text-renderingHow Limoni measures and stores text — UAX. An agent skill from thebanri/limoni.
Limoni Text Rendering is an agent skill from thebanri/limoni. How Limoni measures and stores text — UAX
Its SKILL.md is about 1.9k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.
It works with Model Context Protocol. The repository describes itself as: Terminal UI engine for Go that tests can click and AI agents can drive (MCP). Zero-allocation rendering, immediate mode + Elm architecture, 3D, images, charts, accessibility… The licence is Apache-2.0.
Read from SKILL.md and the folder at commit 025c5d5. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Shell commands in SKILL.md call:
gogitpython3From the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md. Its commands use git, which can reach the network depending on how they are called.
From URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Limoni Text Rendering loads about 1.9k tokens when it runs. Until then it costs about 16 tokens; SKILL.md has 923 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from thebanri/limoni at commit 025c5d5, republished under its Apache-2.0 licence (© thebanri). 923 words, ~1,896 tokens.
.claude/skills/limoni-text-rendering/SKILL.md (or your agent's skills folder).A cell holds one rune, but a character can be several code points. Multi-code-
point clusters are interned and the cell stores a handle above the Unicode range
(cell.RuneClusterBase), so Cell stays 16 bytes and plain text never touches
the table.
| Path | What it owns |
|---|---|
core/grapheme/gen.go | //go:build ignore generator; reads the UCD, writes tables.go |
core/grapheme/tables.go | generated ranges + property bits (GCB, ExtPict, InCB, emoji, width) |
core/grapheme/grapheme.go | Next, RuneWidth, StringWidth, Count, GB3–GB999 |
core/grapheme/mode.go | clusters on/off (LIMONI_GRAPHEME=0), mode 2027 sequences |
core/cell/clusters.go | interning, NextCluster, ClusterContent, AppendContent |
core/buffer/*.go | SetStringWithin writes clusters; the diff emits them |
Regenerating for a new Unicode version: download the files gen.go lists
(GraphemeBreakProperty.txt, emoji-data.txt, DerivedCoreProperties.txt,
EastAsianWidth.txt, extracted/DerivedGeneralCategory.txt), run
go run gen.go -version <v> -dir <ucd>, and replace
testdata/GraphemeBreakTest.txt too.
EastAsianWidth.txt has
@missing defaults; ignoring them mismeasures whole unassigned blocks.GraphemeBreakTest.txt pass. Breaking GB11, GB9c or GB12/13 on purpose fails
3, 16 and 6 cases — use that when changing the state machine.CSI ? 2027 h), which
Ghostty, WezTerm, foot and Contour implement. Others advance per code point,
so the diff re-anchors the cursor after every cluster: CHA in stream and
inline mode, a forgotten cursor position in sparse mode. Without it, one
family emoji shifts the rest of the row. core/buffer/cluster_test.go
interprets the output the way such a terminal would.1 << 20 clusters; past it a cluster degrades to
its first code point rather than growing the process without limit.LIMONI_GRAPHEME=0 (or cell.SetGraphemeClusters(false)) restores one
code point per cell and stops the mode 2027 request.Segmentation is on the hot path; integrating it first cost 20–90% across the draw benchmarks. What recovered it:
cell.AppendContent must stay inlinable. Budget is 80; inlining
utf8.AppendRune into it pushed the cost to 143 and the diff lost a quarter
of its speed. Keep the ASCII byte fast path first and everything else in
appendContentSlow. Check with go build -gcflags=-m.Buffer.SetStringWithin, cell.StringWidth and
grapheme.Next: printable ASCII followed by another ASCII byte is a
one-column cluster, no segmentation needed.Next returns right after the first
rune unless it is Prepend. This is the common shape of UI text.bmpProps[0x10000] and
pictProps for U+1F000–U+1FFFF, filled from propTable in init, cover
nearly everything a UI draws. 136 KB static, emoji width 10.7ns → 4.5ns.Final measured cost against the previous commit, same machine, -count=3
medians: TextHeavyFrame +5% (three symbols per line), Diff_FullChanges +2%,
HundredLayers and Diff_PartialChanges unchanged, zero allocations throughout.
Absolute figures drift with the machine's state. Compare commits on one machine in one sitting:
git worktree add --detach /tmp/base HEAD # or the commit before the change
(cd /tmp/base && go test ./benchmarks -run '^$' -bench X -count=3)
go test ./benchmarks -run '^$' -bench X -count=3
git worktree remove /tmp/baseThen follow the repo's benchmark honesty rules: publish the delta and say the table's absolute numbers were not re-measured, rather than quietly editing rows.
Widgets measure in columns and cut on cluster boundaries. Use these, never
utf8.RuneCountInString as a width or string([]rune(s)[:n]) to cut:
| Need | Use |
|---|---|
| width of a string | cell.StringWidth |
| longest prefix fitting n columns | cell.Truncate(s, n) — a substring, no allocation |
| draw cut text with "…" / "..." | setEllipsized / setClipped (widgets) — prefix and suffix drawn separately, no concatenation |
| cursor movement / deletion by cluster | clusterBounds(text, runeIndex) (widgets) |
| skip columns when scrolling sideways | skipColumns (logview.go) |
Traps paid for here:
clipToWidth skipped zero-width runes without advancing the byte
offset and returned "e\xcc" — invalid UTF-8. Check utf8.ValidString in
truncation tests.TextInputState.Text stays []rune for compatibility; a cached
string (str()) is rebuilt only when Text changes, which is what keeps Draw
allocation-free.\u200D and \u0301 into the literal
characters, which a normaliser can silently rewrite. Check with
python3 -c "print([hex(ord(c)) for c in set(open(f).read()) if ord(c) in (0x301,0x200d)])".Markdown measures words by cluster at parse time (StyledSegment.WordWidths)
and lays them out cluster by cluster (appendClusters); the palette's match
highlighting (drawHighlighted) walks clusters too. FuzzyMatch scores by
rune, which is a ranking choice, not a layout one.
Writing a row of cells that includes a wide character's continuation cell
through SetCell/SetCellDirect is safe: setContinuation keeps the wide
character on its left. Before that, the continuation counted as a narrow cell
overwriting the right half and blanked the character — every CJK character
and emoji in Markdown drew as spaces. TestWritingContinuationKeepsTheWideCharacter.
driver.ProbeQueries asks DECRQM 2027 and measures: it writes a ZWJ family
emoji and reads the cursor back. CapabilityProfile.ClusterWidths (→
DiffOptions.ClusterWidths) is true when mode 2027 is on or the family measured
2 columns; the diff then skips appendClusterResync. Keep the
cell.IsCluster(...) && !opts.ClusterWidths order: the other order cost 5% on
BenchmarkDiff_FullChanges, because the option load ran for every cell.
© thebanri, Apache-2.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
Just SKILL.md in .claude/skills/limoni-text-rendering of thebanri/limoni.
Open the folder on GitHubat commit 025c5d5
Limoni Text Rendering next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Limoni Text Rendering this skillthebanri/limoni | 152 | — | ~1.9k | Automated safety check: Pass | Apache-2.0 | |
| MCP Server Builderanthropics/skills | 180k | 63 repos | ~2.3k | Automated safety check: Pass | Apache-2.0 | |
| MCP Server BuildershareAI-lab/learn-claude-code | 78k | 5 repos | ~1.2k | Automated safety check: Pass | MIT | |
| MCP Integration for Pluginsanthropics/claude-plugins-official | 38k | 11 repos | ~3.1k | Automated safety check: Pass | Apache-2.0 | |
| Figma use_figma Plugin API Ruleswarpdotdev/warp | 65k | 4 repos | ~4.4k | Automated safety check: Pass | AGPL-3.0 | |
| Stitch to Remotion Walkthrough Videosgoogle-labs-code/stitch-skills | 8.4k | 6 repos | ~3.2k | Automated safety check: Notes | Apache-2.0 |
anthropics/skills
Guides the design and implementation of Model Context Protocol servers in TypeScript or Python, from tool naming and error messages to evaluation.
shareAI-lab/learn-claude-code
Walks through building MCP servers in Python or TypeScript that expose tools, resources and prompts to Claude, with templates, registration and testing.
anthropics/claude-plugins-official
Explains how to bundle Model Context Protocol servers in a Claude Code plugin, covering config files, stdio, SSE, HTTP and WebSocket server types, and authentication.
warpdotdev/warp
Required groundwork before any use_figma call: the rules and reference files for running JavaScript in a Figma file through the Plugin API without common failures.
google-labs-code/stitch-skills
Builds walkthrough videos from Stitch design projects using Remotion, with transitions, zoom effects and text overlays on each screen.
coollabsio/coolify
A skill your agent uses for Laravel MCP development. An agent skill from coollabsio/coolify.
thebanri/limoni
How Limoni exposes applications to AI agents and tests — the semantic tree, the automation socket, cmd/limoni-mcp, and the uitest package.
thebanri/limoni
Where allocations hide in a Limoni frame, how to find them, how to compare benchmarks honestly, and the release and CI checks that catch what one machine cannot.
thebanri/limoni
zest, the log viewer built on Limoni — how its store, filtering and LogView fit together, how it is verified (in-process, in kitty, over MCP, in the browser), and what it deliberately does not do.
Works with
How Limoni measures and stores text — UAX. An agent skill from thebanri/limoni. Limoni Text Rendering is an agent skill from thebanri/limoni.
Run `npx skills add thebanri/limoni --skill limoni-text-rendering -a claude-code`. Or copy the skill folder (.claude/skills/limoni-text-rendering in thebanri/limoni) into .claude/skills/limoni-text-rendering in your project. Claude Code loads it when a task matches its description.
Run `npx skills add thebanri/limoni --skill limoni-text-rendering -a codex`. Or copy the skill folder (.claude/skills/limoni-text-rendering in thebanri/limoni) into .agents/skills/limoni-text-rendering in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add thebanri/limoni --skill limoni-text-rendering -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/limoni-text-rendering, .gemini/skills/limoni-text-rendering, .github/skills/limoni-text-rendering and .opencode/skills/limoni-text-rendering in your project.
Going by SKILL.md and its folder, Limoni Text Rendering needs the command-line tools its instructions call (go, git and python3). Our summary lists: Python 3.
SKILL.md contains no URLs. Its commands use git, which can reach the network depending on how they are called. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Limoni Text Rendering is published under the Apache-2.0 licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 1.9k tokens (SKILL.md is roughly 7.6k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Limoni Text Rendering: MCP Server Builder (anthropics/skills, 180k stars), MCP Server Builder (shareAI-lab/learn-claude-code, 78k stars), MCP Integration for Plugins (anthropics/claude-plugins-official, 38k stars) and Figma use_figma Plugin API Rules (warpdotdev/warp, 65k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
thebanri (a GitHub user) maintains it in thebanri/limoni, which has 152 GitHub stars. The repository holds 4 skills in this directory. The repository was last updated on October 5, 2026.
Source: thebanri/limoni on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.