Skip to content

MCP · local, stdio, no account

The MCP server for your coding agent.

The server runs on your machine over stdio and needs no account. It answers three questions an agent asks before adding motion: what exists for this intent under this byte budget, how is it built, and what do I run.

  1. 01Connect4 agents
  2. 02Free tools4 tools, no account
  3. 03With a Pro key3 more tools
  4. 04In CIaudit and measure
  5. 05Without MCPllms.txt and Markdown
Claude Code
# in your project
claude mcp add moonarc -- npx -y @moonarc/mcp

Cursor, VS Code and Codex take the same command in their config files, below.

01Connect

Connect your coding agent.

Every agent starts the server with npx -y @moonarc/mcp. Only the file that says so differs.

Claude Code
# in your project
claude mcp add moonarc -- npx -y @moonarc/mcp
Cursor
// .cursor/mcp.json
{
  "mcpServers": {
    "moonarc": { "command": "npx", "args": ["-y", "@moonarc/mcp"] }
  }
}
VS Code
// .vscode/mcp.json
{
  "servers": {
    "moonarc": { "type": "stdio", "command": "npx", "args": ["-y", "@moonarc/mcp"] }
  }
}
Codex
# ~/.codex/config.toml
[mcp_servers.moonarc]
command = "npx"
args = ["-y", "@moonarc/mcp"]
02Free tools

What your agent can ask.

No account and no limit. The catalogue ships inside the package, so the answers need no network.

search_motion(intent, max_js_bytes?, tier?, limit?)
Components for an intent under a JavaScript budget in raw bytes. max_js_bytes: 0 returns only the ones with no script of their own. limit: how many, best first (10 unless set, at most 50).
get_component(name)
Source, props and craft notes: easing, duration, the reduced-motion branch, ClientRouter behaviour.
get_install_command(names, method?)
The exact command. The agent runs it; the server never writes files.
get_usage()
Plan and quota. The free tier needs no account and has no limit.

Copy the source instead

get_install_command with method: "copy" answers with a shadcn CLI command, and the CLI reads components.json. An Astro project has none. Write this one instead of running shadcn init, which would add React; package.json stays as it is. Files land in src/components/moonarc/ and src/lib/moonarc/ and import one another through the @/* alias, which tsconfig.json needs (Setup has the line).

components.json
{
  "$schema": "https://ui.shadcn.com/schema.json",
  "style": "new-york",
  "rsc": false,
  "tsx": true,
  "tailwind": {
    "config": "",
    "css": "src/styles/global.css",
    "baseColor": "neutral",
    "cssVariables": true
  },
  "aliases": {
    "components": "@/components",
    "utils": "@/lib/utils",
    "lib": "@/lib"
  },
  "registries": {
    "@moonarc": "https://moonarc.dev/r/{name}.json"
  }
}
03Pro

With a Pro key.

Three more tools appear when the server finds a key in MOONARC_KEY. Your key is on your account.

audit_motion(paths, format?)
Checks your components and style sheets against 13 rules, among them transition: all, layout properties in transitions and keyframes, motion without a prefers-reduced-motion branch and astro:page-load listeners with no teardown. Each finding has its line, a severity and the fix.
measure_budget(dist, ceiling?, base?, format?)
The JavaScript each page of your build loads, measured the way this site's CI measures its own: scripts, every chunk they import and framework islands, with the router and Moonarc's share apart. Pages over your ceiling are marked.
compose_section(intent)
A hero, an FAQ, a feature grid, a logo strip, a testimonial wall, a stat row or a call to action, as ordered components with their total cost and a skeleton to adapt.

With a key, the server sends it to Polar's license API to check it, and keeps a definite answer while it runs. get_usage says which plan it validated. What Pro includes

Pass the key to the server

Your agent starts the server, and most agents pass it only a few of your environment variables. A key exported in your shell may never arrive, so name it in the agent's config:

Claude Code
# keep an option between --env and the name
claude mcp add --env MOONARC_KEY=<your key> --transport stdio moonarc -- npx -y @moonarc/mcp
Cursor
// .cursor/mcp.json: the key from your environment
{
  "mcpServers": {
    "moonarc": {
      "command": "npx",
      "args": ["-y", "@moonarc/mcp"],
      "env": { "MOONARC_KEY": "${env:MOONARC_KEY}" }
    }
  }
}
VS Code
// .vscode/mcp.json: VS Code asks for the key once and stores it
{
  "inputs": [
    { "type": "promptString", "id": "moonarc-key", "description": "Moonarc license key", "password": true }
  ],
  "servers": {
    "moonarc": {
      "type": "stdio",
      "command": "npx",
      "args": ["-y", "@moonarc/mcp"],
      "env": { "MOONARC_KEY": "${input:moonarc-key}" }
    }
  }
}
Codex
# ~/.codex/config.toml: forwards MOONARC_KEY from your environment
[mcp_servers.moonarc]
command = "npx"
args = ["-y", "@moonarc/mcp"]
env_vars = ["MOONARC_KEY"]
04CI

The same tools in CI.

The package is also a command, so a build can fail on a motion error or on a page that loads too much JavaScript.

CI steps
# with MOONARC_KEY set from a secret
npx -y @moonarc/mcp audit src
npx astro build
npx -y @moonarc/mcp measure dist --ceiling 30000
  • audit exits 1 when it finds an error.
  • measure reads the folder astro build wrote, and finds a server build's dist/client by itself. --ceiling is raw bytes per page, --base the base path when your site sets one. It exits 1 when a page is over the ceiling.
  • Both exit 2 on a usage mistake, a refused key or a folder that is not a build.
  • Your account has a workflow that sets the key from a secret.
05Without MCP

Without a tool call.

Every page on this site is also Markdown: append .md to a component or docs URL. /llms.txt is the whole catalogue in one token-light file.