Skip to main content

ContentRX MCP server — content-design review for Claude Code, Cursor, and any MCP client.

Project description

contentrx-mcp

ContentRX as an MCP server — content-design review for Claude Code, Cursor, Claude desktop, and any other MCP client.

This is the surface that turns ContentRX from "a thing designers run on Figma frames" into "a thing your AI agent consults before writing a button label." It speaks Model Context Protocol over stdio and exposes two tools (this release) backed by the public ContentRX API.

Install

# One-line install + run via uv
uvx contentrx-mcp

# Or install in a project venv
pip install contentrx-mcp
contentrx-mcp

The server speaks MCP over stdio; you don't run it standalone — your MCP client launches it.

Configure your MCP client

You need a ContentRX API key (cx_...). Generate one at content-rx.vercel.app/dashboard — it's shown once at mint time, so save it before closing the page.

Claude desktop

Add to ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) or the equivalent on Linux/Windows:

{
  "mcpServers": {
    "contentrx": {
      "command": "uvx",
      "args": ["contentrx-mcp"],
      "env": {
        "CONTENTRX_API_KEY": "cx_your_key_here"
      }
    }
  }
}

Restart Claude desktop. The two tools appear in the tools picker.

Claude Code

claude mcp add contentrx -- uvx contentrx-mcp
# Then set the env var in your shell or in the project's mcp config:
export CONTENTRX_API_KEY=cx_your_key_here

Cursor

Cursor's MCP config (Settings → MCP) takes the same shape as Claude desktop's. Use the same command / args / env block.

Tools

evaluate_copy — full review (counts against quota)

Check UI copy against the 47-standard content-design library.

evaluate_copy(
  text: str,                      # the string to check
  moment_hint: str | None,        # optional: "error_recovery", "onboarding", etc.
  context: str | None,            # optional free-text context (reserved)
) -> {
  overall_verdict: "pass" | "fail" | "error",
  content_type: str,              # e.g. "error_message", "button_cta"
  moment: str,                    # e.g. "error_recovery"
  violations: [{standard_id, issue, suggestion, severity, ...}],
  passes: [{standard_id, rule}],
  summary: str | None,
}

Counts against your monthly quota (Free: 25, Pro: 5,000, Team: 5,000 × seats).

classify_moment — quick moment probe (no quota cost)

Classify what UI moment a string represents — without running the full evaluation. Useful for planning copy before you write it.

classify_moment(text: str) -> {
  content_type: str,              # e.g. "confirmation"
  moment: str,                    # e.g. "completing_task"
}

Free of quota. Rate-limited at 60/min per user (same bucket as evaluate_copy).

explain_violation — rule rationale + examples (no quota cost)

Look up the full text + pass/fail examples for any standard ID. The violations[].standard_id field of an evaluate_copy result is the typical input here.

explain_violation(standard_id: str) -> {
  id, rule, correct, incorrect, rule_type, category_id, category_name,
  relevant_content_types, content_type_notes,
}

Public — works without an API key. Useful even before you have an account, for spec browsing.

list_standards — filterable rule catalog (no quota cost)

Browse the standards library. Optional moment filter narrows to rules that "matter" for the moment (i.e. emphasized or relaxed; suppressed rules are excluded).

list_standards(moment: str | None) -> {
  total: int,
  moment_filter: str | None,
  standards: [{id, rule, rule_type, relevant_content_types}],
}

Public — works without an API key.

Resources

Three read-only resources the LLM can pull into context:

URI What
contentrx://standards Markdown index of every standard in the library
contentrx://standards/{id} A single standard — rule, examples, notes, content-type guidance
contentrx://moments The 13 UI moments + each one's standards-weight adjustments

Resources don't require an API key.

Prompts

/review_ui_copy [focus?]

Multi-step review workflow. Walks every UI string in a file or diff through classify_momentevaluate_copy (and explain_violation where useful), then summarizes violations by severity with rule citations.

/review_ui_copy                              # uses file/diff in context
/review_ui_copy src/app/dashboard/page.tsx   # focus a specific file
/review_ui_copy "Click here to learn more"   # focus a single string

Appears as a slash command in Claude desktop and Cursor.

Environment variables

Var Default Purpose
CONTENTRX_API_KEY required Your cx_... token from the dashboard
CONTENTRX_API_URL https://content-rx.vercel.app Override for local dev or self-hosting
CONTENTRX_INSECURE_HTTP unset Set to 1 to allow http:// for local dev — refuses otherwise so a typo can't leak the token

Errors

The server returns structured errors instead of stack traces. Every tool result is either a normal payload or:

{
  "error": "Rate limit hit. Try again in 30s.",
  "kind": "RateLimitError",
  "retry_after_seconds": 30
}

kind values: AuthError, AuthFailedError, QuotaExhaustedError, RateLimitError, ContentRXError. MCP clients can branch on kind to retry, prompt the user to upgrade, or stop.

Development

cd mcp-server
pip install -e ".[dev]"
pytest tests/

# Local dev against npm run dev:
export CONTENTRX_API_URL=http://localhost:3000
export CONTENTRX_INSECURE_HTTP=1
export CONTENTRX_API_KEY=cx_...     # mint via npm run dev dashboard
contentrx-mcp                        # speaks MCP over stdio

The MCP CLI from mcp[cli] is useful for poking the server without a real client:

mcp dev contentrx-mcp                # opens the inspector UI

Release checklist

See mcp-server/CLAUDE.md for the version-bump + PyPI publish flow.

License

MIT — same as the ContentRX project.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

contentrx_mcp-0.2.0.tar.gz (20.4 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

contentrx_mcp-0.2.0-py3-none-any.whl (15.6 kB view details)

Uploaded Python 3

File details

Details for the file contentrx_mcp-0.2.0.tar.gz.

File metadata

  • Download URL: contentrx_mcp-0.2.0.tar.gz
  • Upload date:
  • Size: 20.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.14.3

File hashes

Hashes for contentrx_mcp-0.2.0.tar.gz
Algorithm Hash digest
SHA256 337a6a3655a346f527b4fc430ee86f51ffc9207fd2d49ccaeb85783977e17414
MD5 dc4015045cdbe6c1bb705c288f33f530
BLAKE2b-256 047acdccc0a801a701545bb8246d5bbeba5c9e354c5278e71949d87451e1ce10

See more details on using hashes here.

File details

Details for the file contentrx_mcp-0.2.0-py3-none-any.whl.

File metadata

  • Download URL: contentrx_mcp-0.2.0-py3-none-any.whl
  • Upload date:
  • Size: 15.6 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.14.3

File hashes

Hashes for contentrx_mcp-0.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 adae530f7d0b52efbc4aff71072d185b25e51e0cfa4d669e50ad1115484464af
MD5 442df91e004005266947fcb37784849c
BLAKE2b-256 993c84a2251c1946776713e516e90bf601e28c90a34024418407e9150d2c6a59

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page