About docshare
docshare is an MCP server and CLI for managing EveryPage tracked PDF links. It covers uploads, readership tracking, recipient-specific variants, and webhooks.
Key features
- 01Upload and replace PDFs
- 02Configure link access settings
- 03Track readership and events
- 04Manage recipient-specific variants
- 05Manage webhook endpoints
Use cases
- 01Share a PDF with a tracked link
- 02Review reader activity and drop-off
- 03Create links for named recipients
- 04Update or remove shared documents
MCP support
Exposes EveryPage PDF sharing, readership, variant, webhook, and account operations as tools for MCP clients. Read-only mode limits the available tools to seven read operations.
Configuration
Local server config is the same for every client. Copy it into your client’s MCP config file.
Tools
15Saved tool list · updated 1w ago
| Parameter | Type | Required | Description |
|---|---|---|---|
| source | string | Yes | A local file path, or any https URL: for a URL, the server fetches the user-supplied address itself (without sending your EveryPage key) and uploads the bytes it returns. The bytes must start with the PDF magic %PDF-. |
| settings | object | No | FileSettings fields to apply in the same call: viewerMode (standard|scroll|flipbook|swipe|magazine), password (empty string clears), allowDownload, requireEmail, notifyOnView, deleteAt (date-time), neverExpire, viewLimit (0 clears), gateDomains, gateFields, gateHeading, slug, watermark, pageRange. |
Details
From the project READMEdocshare
Hand someone a PDF and actually know what happened to it. docshare talks to EveryPage: you upload a document once, share the tracked link it gives back, and from then on every open, download, and email-gate completion is recorded against that link — or, with variants, against the exact recipient you sent it to.
There are fifteen tools. Sharing and lifecycle:
everypage_share_pdf uploads a PDF from a local path or an
https URL and can apply its share settings in the same
call; everypage_list_files and everypage_get_file
browse what you have shared; everypage_update_file_settings
changes the passcode, expiry, download permission, viewer
mode, email gate, view limit, page range, or slug;
everypage_replace_content swaps the PDF behind a live
link while the link and its history stay put; and
everypage_delete_file trashes a document, or purges it
for good when you ask for that explicitly.
Readership: everypage_get_readership reports who read a
document, how far they got, and where they dropped off,
while everypage_list_events streams recent views,
downloads, or captured leads behind a polling cursor you
carry from one call to the next (a cursor only works for
the stream type it came from).
Variants and webhooks: everypage_create_variants makes
one tracked link per named recipient, everypage_list_variants,
everypage_update_variant, and everypage_delete_variant
manage them (including GDPR redaction of a recipient's
name), everypage_list_webhooks and everypage_manage_webhook
look after webhook endpoints and their delivery health,
and everypage_account shows the connected account, its
plan, and what that plan allows.
A file argument is forgiving about form: paste the UUID,
the short link id, or the full share URL — /embed/ links
and links carrying ?via= work too. Uploads are checked
before they leave the machine: the bytes must start with
the PDF magic %PDF-, and a PDF fetched from an https URL
is downloaded without your EveryPage key, which is only
ever sent to EveryPage itself.
Configuration
export EVERYPAGE_API_KEY="..." # required
export EVERYPAGE_BASE_URL="https://everypage.co" # optional override
export EVERYPAGE_READ_ONLY="true" # optional: read tools only
Without EVERYPAGE_API_KEY, every tool fails with
EVERYPAGE_API_KEY is not set before any request is made.
With EVERYPAGE_READ_ONLY=true, only the seven read tools
(everypage_list_files, everypage_get_file,
everypage_get_readership, everypage_list_events,
everypage_list_variants, everypage_list_webhooks,
everypage_account) are listed, and calling any other
tool is refused.
CLI
Each tool is a subcommand taking one JSON argument string:
npx @reneturcios/docshare everypage_share_pdf '{"source":"./deck.pdf","settings":{"requireEmail":true}}'
npx @reneturcios/docshare everypage_list_events '{"type":"view","limit":20}'
npx @reneturcios/docshare everypage_create_variants '{"file":"https://everypage.co/s/abc123?via=email","labels":["Ana","Ben"]}'
npx @reneturcios/docshare --version
Output is the tool's result text (normally the upstream
JSON). Exit codes: 0 on success, 1 on a runtime error
(including a validation or upstream failure), 2 on a
usage error.
MCP server
npx -y @reneturcios/docshare mcp
MCP client config:
{
"mcpServers": {
"docshare": {
"command": "npx",
"args": ["-y", "@reneturcios/docshare", "mcp"],
"env": { "EVERYPAGE_API_KEY": "..." }
}
}
}
Docker
docker run -i -e EVERYPAGE_API_KEY=... ghcr.io/cloudcorprecords/docshare
docker run --rm -e EVERYPAGE_API_KEY=... ghcr.io/cloudcorprecords/docshare everypage_account '{}'
Development
npm install
npm run build # tsc -> dist/
npm test # tsx --test test/*.test.ts (fake fetch + fake file reader, no network)
npm run dev # run the CLI from source
License
MIT — Copyright (c) 2026 Rene Turcios
Comments
New to MCP?
From what the protocol is to installing your first server, these answers cover most first questions.
An open protocol that defines how AI applications connect to external tools and data in a uniform way. Clients talk to the model; MCP servers provide tools, resources and prompt templates. They exchange standard messages, so one server can be reused by many clients.