Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Compiled CLI covering all 52 endpoints of the Anytype local API — objects, properties, tags, search, chat, files — one binary, no MCP server needed.
.claude/skills/sickn33-anywrite/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-01 | ✗→✓ | ▲ Improved | 7% | 0% |
| case-02 | ✗→✓ | ▲ Improved | 129% | 0% |
| case-03 | ✗→✓ | ▲ Improved | 101% | 0% |
| case-04 | ✗→✓ | ▲ Improved | 8% | 0% |
| case-06 | ✗→✓ | ▲ Improved | -11% | 0% |
anywrite is a single compiled Bun/TypeScript CLI for the Anytype desktop app's local HTTP API — all 52 endpoints across spaces, objects, properties, tags, types, templates, lists, chat, files, members, search, and auth — as one binary with zero runtime dependencies. It exists as a low-context alternative to Anytype's official MCP server: rather than exposing 52 always-loaded tools to every agent session, anywrite is a normal CLI wired as a skill that costs zero context until it's actually invoked, and is equally usable from a terminal or any script.
This repository does not ship the anywrite executable. The user must install or build a reviewed upstream release outside the current workspace and provide its explicit absolute path. Before use, verify that path is an executable regular file, is not a symlink, and is not a workspace-relative dist/ artifact. Never auto-discover or execute ./dist/anywrite from the repository being worked on.
The Anytype desktop app must be running locally (default http://localhost:31009). Authenticate once:
bash"/absolute/path/to/anywrite" auth --status # shows configured yes/no and where the key came from "/absolute/path/to/anywrite" auth # challenge flow — a 4-digit code appears in the app "/absolute/path/to/anywrite" auth --code 1234 # non-interactive form of the same exchange
The key is written to ~/.anywrite/config.json and is never printed by any command.
anywrite <resource> <action> [positionals] [--flag value]Resources: spaces, objects, properties, tags, types, templates, lists, files, members, search, chat, auth. Output is JSON by default; add --pretty for a human view, --json as an escape hatch for anything the typed flags don't model yet. space/type/property positionals accept a name or an id — names are resolved to ids automatically.
bash"/absolute/path/to/anywrite" objects create <space> --type task --name "Buy milk" "/absolute/path/to/anywrite" objects update <space> <object_id> --status "Done"
bash"/absolute/path/to/anywrite" search global --query "task" --types task "/absolute/path/to/anywrite" files upload <space> --file ./image.png
bash"/absolute/path/to/anywrite" chat messages <space> <chat_id> --all
space/type/property and let the CLI resolve them to ids.--pretty for human review.--json when a brand-new API field isn't yet covered by a typed flag.--icon; omit the flag entirely instead.lists add/remove to work on sets — they only apply to collections.--body on create but --markdown on update.~/.anywrite/config.json and is never printed by any command, including auth --status.ANYTYPE_API_KEY env var, then ~/.anywrite/config.json, then a read-only fallback to an existing ~/.anytype-cli/config.yaml.200, never 410.lists add/remove silently does nothing on a set.Solution: These only work on collections, not sets.
Solution: This is intentional — file upload dedupes by content hash.
Solution: Chat paginates by cursor; every other resource paginates by offset.
@docx - When the deliverable is a Word document rather than an Anytype object.| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→pass | 8,770 | 4,452 | -49% | 1 | 1 | 0% | 2,204 | 2,349 | +7% | 0 | 0 | — |
case-02 | fail→pass | 4,799 | 4,150 | -14% | 1 | 1 | 0% | 912 | 2,085 | +129% | 0 | 0 | — |
case-03 | fail→pass | 4,603 | 4,525 | -2% | 1 | 1 | 0% | 1,016 | 2,042 | +101% | 0 | 0 | — |
case-04 | fail→pass | 10,499 | 3,720 | -65% | 1 | 1 | 0% | 1,864 | 2,022 | +8% | 0 | 0 | — |
case-05 | pass→pass | 8,873 | 4,001 | -55% | 1 | 1 | 0% | 1,391 | 1,917 | +38% | 0 | 0 | — |
case-06 | fail→pass | 10,947 | 2,648 | -76% | 1 | 1 | 0% | 1,893 | 1,690 | -11% | 0 | 0 | — |
case-07 | fail→pass | 11,558 | 2,044 | -82% | 1 | 1 | 0% | 1,859 | 1,597 | -14% | 0 | 0 | — |
case-08 | fail→pass | 9,896 | 1,877 | -81% | 1 | 1 | 0% | 1,393 | 1,564 | +12% | 0 | 0 | — |
case-09 | pass→pass | 11,039 | 4,538 | -59% | 1 | 1 | 0% | 1,932 | 1,997 | +3% | 0 | 0 | — |
case-10 | fail→pass | 7,611 | 3,104 | -59% | 1 | 1 | 0% | 1,379 | 1,818 | +32% | 0 | 0 | — |
case-11 | pass→pass | 10,041 | 1,740 | -83% | 1 | 1 | 0% | 1,710 | 1,544 | -10% | 0 | 0 | — |
case-12 | fail→pass | 9,900 | 2,772 | -72% | 1 | 1 | 0% | 1,567 | 1,756 | +12% | 0 | 0 | — |
case-13 | pass→pass | 7,019 | 2,663 | -62% | 1 | 1 | 0% | 1,159 | 1,756 | +52% | 0 | 0 | — |
case-14 | pass→pass | 3,295 | 3,357 | +2% | 1 | 1 | 0% | 534 | 1,621 | +204% | 0 | 0 | — |
case-15 | pass→pass | 14,777 | 2,278 | -85% | 1 | 1 | 0% | 2,374 | 1,644 | -31% | 0 | 0 | — |
case-16 | fail→pass | 13,948 | 2,390 | -83% | 1 | 1 | 0% | 2,236 | 1,565 | -30% | 0 | 0 | — |
case-17 | pass→pass | 9,343 | 1,915 | -80% | 1 | 1 | 0% | 1,683 | 1,573 | -7% | 0 | 0 | — |
case-18 | pass→pass | 7,033 | 3,012 | -57% | 1 | 1 | 0% | 1,175 | 1,710 | +46% | 0 | 0 | — |
case-19 | pass→pass | 6,688 | 1,588 | -76% | 1 | 1 | 0% | 1,062 | 1,540 | +45% | 0 | 0 | — |
case-20 | fail→pass | 10,754 | 2,253 | -79% | 1 | 1 | 0% | 1,731 | 1,739 | +0% | 0 | 0 | — |
case-21 | fail→pass | 9,103 | 4,591 | -50% | 1 | 1 | 0% | 1,648 | 2,096 | +27% | 0 | 0 | — |
case-22 | fail→pass | 8,248 | 2,972 | -64% | 1 | 1 | 0% | 1,412 | 1,861 | +32% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted. The headline lift of +59 percentage points is the difference between those two pass rates over the 22 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.