Five custom Claude tools running on an MCP server I built to extend my own workflow — pulling ideas from a Notion vault, suggesting palettes, voice-checking copy, scaffolding project pages. Hands-on MCP server engineering, tool design, and Claude API integration.
Most projects that use Claude treat it as a generator wrapped in code. You write a function, the function calls Claude, Claude returns text, the function parses the text back into something usable. Claude does the work; the code is plumbing.
This project flips that. Claude is the decision-maker; the tools are the constraints — rules about what fits my voice, my color library, my workflow. Three patterns, deliberately: retrieval (the tool returns options, Claude picks), critique (the tool flags problems, Claude rewrites), mutation (Claude decides, the tool writes the change).
No tool reaches for Claude. Claude reaches for the tools. The case study below is itself the proof: this page was drafted, voice-checked, and scaffolded by Claude — using the same five tools the page documents.
Pattern, name, role. Each tool is one file. Inputs are validated on every call with Zod.
index.html. Auto-numbers the project. Supports a "preview-only" mode (dry_run).The traces below are real. The card on the home page that linked you here was generated by the third tool call in this sequence.
{
"brief": "AI engineering, restrained,
design-engineer aesthetic,
signal-orange-friendly",
"limit": 4
}the candidate I picked { "name": "Off-White x Air Jordan 1 'The Ten'", "hexes": [ "#F4F0E8", "#C8102E", "#111111", "#E8601C", "#D4CAAD" ], "notes": "The benchmark. White sail carrier with Chicago Red signal. Zip-tie orange as the one controlled disruption..." }
Five custom Claude tools I built to extend my own creative workflow — find ideas in my vault, suggest a color palette, check copy in my voice, scaffold a new project page, save a new idea. The tools hand Claude the options; Claude does the picking and the writing. Proves: AI tool design, server engineering, and the idea of encoding taste as rules rather than agents.
{
"verdict": "ship",
"violation_count": 0,
"violations": [],
"note": "Heuristics passed.
Consider whether the copy actually
says something — heuristics
don't catch empty."
}ship means the rule-based checks found nothing — no hedge words, no filler transitions, no marketing warmth, no repeated phrases, no oversize sentences. The note is the honest part: rules can't catch empty writing. That's why the tool refuses to rewrite. Rewriting is a tone judgment; rule-checking is just enforcement.
@@ around line 1688 @@ - </div> + + <!-- Project 008 — Six Percent MCP (ACTIVE) --> + <a href="008-six-percent-mcp.html" class="exhibit-card live reveal" aria-label="Open Project 008 — Six Percent MCP"> + <div class="exhibit-art" aria-hidden="true"> + <div class="exhibit-art-num">008</div> + <div class="exhibit-art-glow"></div> + <div class="exhibit-art-icon">⌬</div> + </div> + <div class="exhibit-plaque"> + <div class="exhibit-plaque-num">Project 008 · MCP</div> + <div class="exhibit-plaque-title">Six Percent <span style="color:var(--signal);">MCP</span></div> + <div class="exhibit-plaque-medium">@modelcontextprotocol/sdk · Node ESM · Notion API · Zod</div> + <div class="exhibit-plaque-desc"> + [the description that just passed voice_check] + </div> + <div class="exhibit-before-after"> + <span class="ex-before">AI As Wrapper</span> + <span class="ex-arrow">→</span> + <span class="ex-after">Tools Returning Contracts</span> + </div> + <div class="exhibit-op-tags"> + <span class="ex-op-tag">// MCP</span> + <span class="ex-op-tag">// Tool Design</span> + <span class="ex-op-tag">// Claude Engineering</span> + </div> + </div> + <div class="exhibit-floor"></div> + </a> + + </div>
index.html — the project-gallery container — and inserts the new card just before it closes. Indentation matches the existing cards. The new project number is auto-detected by scanning for the existing <!-- Project NNN --> markers. dry_run returns the change as a preview, not a write — so Claude can review it before approving. After approval, the same call (without dry_run) wrote the card you saw on the home page.
The voice rules from my project's instructions, encoded as plain-text patterns. Read aloud: hedge words, filler transitions, marketing warmth. The tool flags every match with the exact excerpt and a one-line suggestion.
retrieval versus mutation.palette_suggest doesn't rank — it returns options and lets Claude reason. The options already carry their author's notes. Ranking would discard the notes; reasoning over them is the value.voice_check refuses to rewrite. The split between "what's wrong" (tool) and "what to write instead" (Claude) is intentional. Rewriting is taste; flagging is rules. They don't belong in the same tool.project_scaffold is mutation-with-preview. dry_run: true returns the proposed change first. Claude sees the change, decides, then re-calls without the flag. Two steps in one tool — preview, then commit.child_page blocks; section headings are decorative heading_2 blocks that don't actually contain the entries underneath. The tool encodes the truth, not the UI metaphor — sections live in a [section-key] tag inside the title.vault_capture still saves entries directly to the Vault root and tags the section name in the title. A more honest version would create real section pages and save the entries under those — restructuring the Vault, not working around it.voice_check violations is the same boilerplate each time. A v0.2 would route suggestions through Claude with the rule and excerpt as context — rules for flagging, Claude for the rewrite hint. Hybrid.palette_suggest output gets large when the lab grows. Beyond ~30 palettes, returning every option wastes context. The fix: pre-sort options by mood similarity (a vector-embedding pass on the server) and return the top few — still letting Claude make the final pick.project_scaffold writes only into six-percent-studio/index.html. Single target. A repo-aware version would take the gallery file as an input, opening the door to other portfolio pages or even other projects entirely.