---
title: "MCP server for AI assistants"
description: "Connect Claude, Cursor or any MCP client to EveryPage so it can share PDFs as tracked links and report who read them."
canonical: "https://everypage.co/docs/developers/mcp-server"
plan: "free"
last-updated: "2026-09-09"
---

# MCP server for AI assistants

The EveryPage MCP server lets an AI assistant use your EveryPage account: upload a PDF and hand back a tracked share link, then answer questions about who read it and how far they got.

It speaks the [Model Context Protocol](https://modelcontextprotocol.io), so it works with any MCP client — Claude Code, the Claude apps, Cursor, VS Code, and others. It is open source ([MIT](https://github.com/EveryPageApp/everypage-mcp)) and published to npm as `everypage-mcp`; the MCP registry entry is `co.everypage/mcp`, and the same manifest is served at [/.well-known/mcp.json](https://everypage.co/.well-known/mcp.json) for agents that discover servers by well-known URL.

## Setup

Create an API key in your [account settings](https://everypage.co/account) — it starts with `ep_live_` and is shown once — then point your client at the server.

**Claude Code**

```bash
claude mcp add everypage --env EVERYPAGE_API_KEY=ep_live_... -- npx -y everypage-mcp
```

**Everything that reads a JSON config** (Claude Desktop, Cursor, VS Code, …)

```json
{
  "mcpServers": {
    "everypage": {
      "command": "npx",
      "args": ["-y", "everypage-mcp"],
      "env": { "EVERYPAGE_API_KEY": "ep_live_..." }
    }
  }
}
```

The server runs locally, launched by your client — there is nothing to host. It needs Node 20 or newer. Because it runs on your machine, it can read a PDF straight off your disk when you ask it to share one.

## Configuration

| Variable | Required | Default | Meaning |
| --- | --- | --- | --- |
| `EVERYPAGE_API_KEY` | yes | — | An API key (`ep_live_…`), or an OAuth access token (`ep_at_…`) limited to its granted scopes |
| `EVERYPAGE_BASE_URL` | no | `https://everypage.co` | API origin override, for development instances |
| `EVERYPAGE_READ_ONLY` | no | `false` | `true` exposes only the read-only tools — nothing can upload, change or delete |

## Tools

Fifteen tools, grouped by what you would actually ask for.

**Documents** — `everypage_share_pdf` (upload from a path or URL and return the share link, embed code and QR URL, applying share settings in the same call), `everypage_list_files`, `everypage_get_file`, `everypage_update_file_settings`, `everypage_delete_file`, `everypage_replace_content` (Pro).

**Readership** — `everypage_get_readership` (a summary: readers, read time, completion, countries, drop-off page, most re-read page) and `everypage_list_events` (recent reads, downloads or captured leads, with a polling cursor).

**Per-recipient links** (Pro) — `everypage_create_variants`, `everypage_list_variants`, `everypage_update_variant`, `everypage_delete_variant`.

**Account and delivery** — `everypage_list_webhooks`, `everypage_manage_webhook`, `everypage_account`.

Two prompts ship as slash commands: `readership_digest` and `send_tracked_copies`.

## Behaviour worth knowing

**Any way of naming a document works.** Every tool taking a document accepts a UUID, a short link id, or a share URL pasted from the browser — including `/embed/` links and ones with `?via=` on the end.

**Your key stays local.** It lives in your MCP client's config and is sent only to everypage.co. When you ask the server to share a PDF from a third-party URL, that download is made with no EveryPage credentials attached.

**Uploads stream and are checked first.** A local file is read off disk rather than into memory, and is verified as a PDF and checked against your plan's size cap before anything is sent.

**Deleting is reversible by default.** `everypage_delete_file` trashes the document; permanent destruction needs an explicit `purge`. Irreversible tools are marked with the protocol's `destructiveHint`, so clients that support confirmation prompts ask first. Set `EVERYPAGE_READ_ONLY=true` if you want write tools withheld entirely.

**Event cursors are per stream.** `everypage_list_events` returns a `nextCursor` valid only for the same `type` — the `view`, `download` and `gate` streams have independent id sequences. See [Events feed](https://everypage.co/docs/developers/events-feed).

## Plan gating

The server works on every plan; what it can do follows the account. Sharing documents and reading readership work on free. Passcodes, view limits, read notifications and page-level statistics need Basic. Per-recipient links, the email-capture gate, content replacement, watermarks and page ranges need Pro. A refusal always names the plan required, so the assistant can tell you rather than retrying.

## Related

- [API keys and scopes](https://everypage.co/docs/developers/api-keys) — creating the key this needs
- [Events feed](https://everypage.co/docs/developers/events-feed) — the cursor semantics behind `everypage_list_events`
- [Developer API](https://everypage.co/developers) — the HTTP API the server calls
