# RunPR MCP Skill

Use this file to wire RunPR into Claude Code, OpenClaw, or any MCP-compatible agent.

[Public API and MCP guide](https://runpr.ai/docs) · [OpenAPI reference](https://runpr.ai/openapi.json) · [Server card](https://runpr.ai/api/mcp/server-card)

## Setup

1. MCP access is currently support-provisioned for paid or trialing workspaces. Contact RunPR support to enable access for your organization and arrange secure delivery of its API key. There is no self-service API-key screen yet; never send a key in chat or email.
2. Configure your MCP client with:
   - Endpoint: `https://runpr.ai/api/mcp`
   - Auth header: `Authorization: Bearer <your-org-api-key>`

## Tools

### find_reporters
Find the journalist who wrote a given article. Returns name, outlet, and beat. Emails are gated by contact unlocks in RunPR.

```json
{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"find_reporters","arguments":{"sourceUrl":"https://techcrunch.com/..."}}}
```

### cycle_match
Score how well a pitch matches what a specific journalist has been covering recently. Returns a 0–100 score and category (aligned / tangential / off_topic).

```json
{"jsonrpc":"2.0","id":2,"method":"tools/call","params":{"name":"cycle_match","arguments":{"artifactId":"clx...","journalistId":"jrn..."}}}
```

### tailor_pitch
Tailor a pitch for a specific journalist. Metered against your organization's pitch quota exactly like the RunPR UI. Returns original and tailored subject + body.

```json
{"jsonrpc":"2.0","id":3,"method":"tools/call","params":{"name":"tailor_pitch","arguments":{"artifactId":"clx...","journalistId":"jrn..."}}}
```

### empathy_check
Run a journalist-perspective adversary review on a pitch. Pass an artifactId or raw pitchBody. Returns objections with severity and a send / revise / do_not_send verdict.

```json
{"jsonrpc":"2.0","id":4,"method":"tools/call","params":{"name":"empathy_check","arguments":{"pitchSubject":"Your funding round","pitchBody":"Hi Sarah, I saw your recent piece..."}}}
```

### submit_draft
Submit a pitch draft into the RunPR approval queue. **Always lands in the queue — never sends automatically.** A human must approve in the RunPR UI before anything goes out.

```json
{"jsonrpc":"2.0","id":5,"method":"tools/call","params":{"name":"submit_draft","arguments":{"accountId":"acc...","title":"Pitch: Series B for TechCo","content":"...","subject":"Quick note on AI infra","toName":"Sarah Lee","toEmail":"sarah@example.com"}}}
```

### needs_attention
Return the same buckets shown on the RunPR Needs Attention page: bounced, opened_again, opened_aging, not_opened, awaiting_approval.

```json
{"jsonrpc":"2.0","id":6,"method":"tools/call","params":{"name":"needs_attention","arguments":{"bucket":"awaiting_approval","limit":10}}}
```

### outcomes
Pitch outcome analytics: open rate, reply rate, per-outlet and per-type performance, and weekly trend.

```json
{"jsonrpc":"2.0","id":7,"method":"tools/call","params":{"name":"outcomes","arguments":{"days":30}}}
```

## Protocol

- JSON-RPC 2.0 over Streamable HTTP POST. Send Content-Type: application/json and Accept: application/json, text/event-stream.
- Initialize using the MCP handshake, then use tools/list to retrieve current tool schemas. SDK clients handle the handshake. GET returns 405 because standalone SSE is not enabled.
- This endpoint uses organization API keys, not organization service tokens or OAuth. Keys are organization-wide, without per-tool scopes.
- Stateless: each request is independent; no session token required.
- Auth: `Authorization: Bearer <org-api-key>` on every request.
- Rate limit: 60 requests per minute per organization, shared across server instances. Normal model and drafting quotas also apply.

## Human approval is required before anything sends

Sending is deliberately not a tool. `submit_draft` always lands in the approval queue. RunPR's human gate is the differentiator: your agent can do the research and drafting work; a human decides what goes out.
