{
  "markdown": "# Riveter MCP Server\n\nAn [MCP (Model Context Protocol)](https://modelcontextprotocol.io) server that connects AI assistants like Claude and Cursor to the [Riveter API](https://riveterhq.com). Run enrichments, build datasets, scrape webpages, manage monitors, and more — directly from your assistant.\n\nTools are generated dynamically from Riveter's [OpenAPI spec](https://docs.riveterhq.com/openapi.yaml), so they stay up to date automatically.\n\nTwo ways to connect:\n\n- **Hosted** — `https://mcp.riveterhq.com/mcp`. Nothing to install. Works from claude.ai, Claude Desktop, Cowork, Claude mobile, ChatGPT, Claude Code, and Cursor.\n- **Local (`npx`)** — this npm package, run on your machine over stdio. Use it when your client cannot reach remote servers.\n\n## Setup\n\n### 1a. Hosted server (no API key needed up front)\n\nAdd `https://mcp.riveterhq.com/mcp` as a custom connector and click Connect. A browser window opens on Riveter: sign in and click **Allow**. Riveter creates an API key for that connection; it is listed in [Settings → API keys](https://app.riveterhq.com/settings/api), and revoking it disconnects the client.\n\n**Claude Code:**\n\n```bash\nclaude mcp add --transport http riveter https://mcp.riveterhq.com/mcp\n```\n\nThen run `/mcp` and choose Authenticate.\n\n**Cursor:**\n\n```json\n{\n  \"mcpServers\": {\n    \"riveter\": {\n      \"url\": \"https://mcp.riveterhq.com/mcp\"\n    }\n  }\n}\n```\n\nIf the client cannot open a browser, pass a key as a header instead: `Authorization: Bearer sk_riv_your_key_here` (Claude Code `--header \"Authorization: Bearer sk_riv_...\"`, Cursor `\"headers\": { \"Authorization\": \"Bearer sk_riv_...\" }`).\n\n### 1b. Local server (npx)\n\nGet a Riveter API key at [app.riveterhq.com/settings/api](https://app.riveterhq.com/settings/api).\n\n**Claude Desktop** — open the config file:\n\n- **macOS:** `~/Library/Application Support/Claude/claude_desktop_config.json`\n- **Windows:** `%APPDATA%\\Claude\\claude_desktop_config.json`\n\nAdd the Riveter server:\n\n```json\n{\n  \"mcpServers\": {\n    \"riveter\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"--prefer-online\", \"riveter-mcp-server@latest\"],\n      \"env\": {\n        \"RIVETER_API_KEY\": \"sk_riv_your_key_here\"\n      }\n    }\n  }\n}\n```\n\n**Cursor / Windsurf** — add the same `riveter` entry to your MCP config (e.g. `~/.cursor/mcp.json`).\n\n**Claude Code:**\n\n```bash\nclaude mcp add riveter --env RIVETER_API_KEY=sk_riv_your_key_here -- npx -y riveter-mcp-server\n```\n\n**Codex:**\n\n```bash\ncodex mcp add riveter --env RIVETER_API_KEY=sk_riv_your_key_here -- npx -y riveter-mcp-server\n```\n\n**Keeping the tools current:** the local server loads the API definition once, when your client starts it, and keeps that process running. After Riveter ships an API change, restart your AI client (or the MCP server from its settings page) to load the new tools. `--prefer-online riveter-mcp-server@latest` makes the same restart also pick up new server versions. The hosted server needs no restart; it reloads the API definition every 10 minutes.\n\n## Environment variables\n\nLocal (stdio) server — `dist/index.js`:\n\n| Variable               | Required | Default                                   | Description          |\n| ---------------------- | -------- | ----------------------------------------- | -------------------- |\n| `RIVETER_API_KEY`      | Yes      | —                                         | Your Riveter API key |\n| `RIVETER_API_BASE_URL` | No       | `https://api.riveterhq.com/v1`            | API base URL         |\n| `RIVETER_OPENAPI_URL`  | No       | `https://docs.riveterhq.com/openapi.yaml` | OpenAPI spec URL     |\n\nHosted (Streamable HTTP) server — `dist/http.js`, deployed by Riveter:\n\n| Variable                   | Default                            | Description                                                          |\n| -------------------------- | ---------------------------------- | -------------------------------------------------------------------- |\n| `PORT`                     | `8080`                             | Listen port                                                          |\n| `MCP_PUBLIC_URL`           | `https://mcp.riveterhq.com/mcp`    | Public URL, exactly as users enter it (RFC 9728 `resource`)          |\n| `OAUTH_ISSUER_URL`         | `https://app.riveterhq.com`        | Authorization server advertised in the protected resource metadata   |\n| `SPEC_REFRESH_INTERVAL_MS` | `600000`                           | How often the spec is re-fetched; `0` disables                        |\n| `RIVETER_API_BASE_URL`, `RIVETER_OPENAPI_URL` | as above        |                                                                      |\n\nThe hosted server holds no API key. It forwards the caller's `Authorization: Bearer ...` header to the API on every call and answers `401` with a `WWW-Authenticate` challenge when the header is missing.\n\n## How it works\n\nOn startup, the server:\n\n1. Fetches the OpenAPI spec from `docs.riveterhq.com/openapi.yaml`\n2. Parses each endpoint into an MCP tool with typed parameters and annotations (`readOnlyHint` from `GET`, `destructiveHint` from `DELETE` or the spec's `x-mcp-destructive`, `openWorldHint` from the spec's `x-mcp-open-world`)\n3. Uses the spec's `info.x-mcp-instructions` as the short server-level `instructions` (the long API overview stays on the docs site)\n4. Serves the tools over stdio (local) or Streamable HTTP (hosted)\n\nWhen the API docs are updated, the local server picks up the changes the next time your assistant launches, and the hosted server re-fetches the spec every 10 minutes — no rebuild or republish needed.\n\n## Development\n\nThis package lives in the `riveter` monorepo under `mcp-server/`. From the repo root:\n\n```bash\npnpm --filter riveter-mcp-server test   # build + unit + e2e + spec-contract tests\n```\n\nThe spec-contract tests parse the repo's real `public/api_docs/openapi.yaml` (and the legacy spec), so a spec change that would break tool generation fails CI. To publish: bump the version in `package.json`, `server.json`, and `src/server.ts`, then run `pnpm publish` from `mcp-server/`.\n\nRun the hosted server locally with `pnpm dev:http` (defaults to port 8080; set `MCP_PUBLIC_URL=http://localhost:8080/mcp`). The hosted service is deployed from `Dockerfile` by Render (`mcp-server` in the root `render.yaml`).\n\n## Support\n\nQuestions or issues? See the [Riveter API docs](https://docs.riveterhq.com) or contact [support@riveterhq.com](mailto:support@riveterhq.com).\n\n## License\n\nMIT",
  "bytes": 6457,
  "sha": "b16924b3118861896bfb0511079dbb4739d3b95f2a6d960887f3dd4e69991ecc",
  "repo_slug": "riveterhq/riveter",
  "fonte": "npm",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/mcp_io_github_codywatters_riveter_48fcd749/readme"
}