Over the past few months, we built and published 9 MCP servers. They cover the MCP ecosystem itself, developer tooling, infrastructure management, and SaaS integrations. All are MIT licensed and fully open source, on npm, and work with Claude Code, Cursor, and any other MCP client.

This is what we built, why we built it, and what we learned along the way.

The Servers

mcph is an MCP orchestrator. Install it once, and it connects to all your MCP servers through mcp.hosting. Instead of configuring every server locally, you configure one endpoint and manage the rest from the cloud.

npx -y @yawlabs/mcph

ctxlint is a linter for AI context files. It validates your CLAUDE.md, .cursorrules, and other context files against your actual codebase. Catches broken paths, wrong commands, stale context, and token waste. Ships with a built-in MCP server so your agent can audit its own instructions.

npx -y @yawlabs/ctxlint

mcp-compliance is a test suite that validates any MCP server against the 2025-11-25 specification. Tool schemas, error handling, protocol behavior — it checks everything. We built this to test our own servers and opened it up because the ecosystem needs it. If you're building an MCP server, run your server through it before you ship.

npx -y @yawlabs/mcp-compliance

tailscale-mcp is the largest of the nine. 99 tools covering devices, ACLs, DNS, auth keys, users, webhooks, logging, network lock, and posture management. The Tailscale API is broad, and we wanted full coverage. The hardest part was ACL updates — Tailscale uses HuJSON (JSON with comments and trailing commas), and a naive implementation would strip comments on every write. We preserve formatting by round-tripping through HuJSON parsing and using ETag-based concurrency control so two agents can't stomp on each other's changes.

npx -y @yawlabs/tailscale-mcp

npmjs-mcp turns the npm registry into a tool your agent can query. Package search, security audits, dependency trees, download stats, version comparison, org management, and provenance checks. If you're evaluating a package or auditing your dependencies, the agent can pull the data directly instead of you switching to a browser.

npx -y @yawlabs/npmjs-mcp

ssh-mcp gives AI agents SSH access with built-in diagnostics. Run commands on remote hosts, transfer files, manage tunnels, and troubleshoot connectivity issues. When something fails, the server provides structured diagnostic output instead of a raw error, so the agent can actually fix the problem.

npx -y @yawlabs/ssh-mcp

electron-mcp gives AI assistants deep knowledge of Electron app internals. IPC scaffolding generators, security auditing for contextIsolation and sandbox settings, build tooling, and development intelligence. We built it while working on the Yaw Terminal itself — having an agent that understands Electron's main/renderer split, preload scripts, and node integration makes Electron work dramatically less painful. Pair it with electron-optimize, our drop-in utilities library for temp file cleanup, window bounds validation, startup timing, cache management, and power state handling.

npx -y @yawlabs/electron-mcp

caddy-mcp manages Caddy web servers via the admin API. Configure reverse proxies, manage TLS certificates, update routes. Caddy's admin API is clean and well-documented, which made this one of the faster servers to build.

npx -y @yawlabs/caddy-mcp

lemonsqueezy-mcp connects your LemonSqueezy store to AI assistants. Products, variants, orders, subscriptions, license keys, customers, discounts, webhooks, and checkout links. We use LemonSqueezy for yaw's licensing, so this server scratches our own itch.

npx -y @yawlabs/lemonsqueezy-mcp

What We Learned

Tool descriptions are more important than tool implementations

The LLM decides which tool to call based on the name and description. If your description is ambiguous, the agent will pick the wrong tool. If it's too long, it wastes context. We spent more time writing and rewriting tool descriptions than we expected. A good rule: describe what the tool does, not what it is. "List all devices in the tailnet with their online status, IP addresses, and tags" beats "Get devices endpoint."

Return structured data, not messages

Early versions of our servers returned human-readable strings: "Successfully created auth key tskey-auth-abc123." That's fine for a chat response, but terrible for tool chaining. When the agent needs to use that key in the next step, it has to parse the string. Return structured JSON and let the agent decide how to present it.

Error responses need to be actionable

When a Tailscale API call fails with a 403, don't just return "Forbidden." Return what permission is missing, what scope the current key has, and how to fix it. The agent can't fix problems it can't diagnose. Our ssh-mcp server was built around this principle — every failure includes structured diagnostics.

Keep the tool count reasonable

tailscale-mcp has 99 tools. That's a lot. Every tool description consumes context tokens, and some MCP clients struggle with large tool lists. If we were starting over, we'd consider grouping related operations into fewer tools with a action parameter. But for full API coverage, sometimes you need the granularity.

npx distribution is great for adoption, rough for cold starts

Publishing on npm with npx -y @yawlabs/server-name makes installation trivial. But the first run downloads and installs the package, which can take several seconds. Users expect MCP servers to start instantly. We're looking at pre-built binaries and better caching to address this.

Test against the spec, not just your client

We built mcp-compliance because we kept finding edge cases where our servers worked in Claude Code but broke in other clients. The MCP spec has nuances around error codes, pagination, and schema validation that are easy to get wrong. If your server only works in one client, it's not an MCP server — it's a plugin.

What's Next

We're continuing to maintain all 9 servers and add coverage as APIs evolve. We're also building mcp.hosting as a platform for hosting, testing, and managing MCP servers at scale.

All servers are on our MCP Servers page with install commands, descriptions, and links to GitHub and npm.

Try any server in one command:

npx -y @yawlabs/tailscale-mcp # or any of the 9 servers

Browse all servers: yaw.sh/mcp-servers

Published by Yaw Labs.

Related Articles

Interested in AI tools and developer workflows? Token Limit News is our weekly newsletter.