HelpRange runs a remote MCP server with OAuth sign-in, publishes an OpenAPI 3.1 file and the whole API as Markdown for LLMs. Connect your AI tool in one click, or let your agent call the REST API with a scoped API key.
MCP server URL: https://www.helprange.com/mcp
A remote MCP server (Streamable HTTP, stateless JSON-RPC) with OAuth 2.1 – authorization code with PKCE and dynamic client registration. Your AI tool discovers the sign-in by itself: you log in to HelpRange, click “Allow access”, and the assistant works with your rights in the panel. No API key to copy. Connected apps are listed (and can be disconnected) in Integrations.
https://www.helprange.com/mcp
The tools list documents, folders and views, read a document's text, check data rooms, access requests and their folders, send and follow e-signature requests, create offers and share links, and upload files – every tool is in llms-full.txt and on MCP server setup. Included in the trial, Pro, Max, Unlimited and the Deal Room Pass.
The MCP server accepts OAuth sign-in only. For an unattended agent on your server (no person to click “Allow”), call the REST API with a team API key – see agent frameworks.
claude mcp add --transport http helprange https://www.helprange.com/mcpThen run /mcp in Claude Code and choose helprange to sign in.
HelpRange is in Claude's connectors directory: open claude.ai/directory (or Settings → Connectors → Browse connectors), pick HelpRange and click Connect. You can also add it by hand: Settings → Connectors → Add custom connector and paste the MCP server URL.
Add to Cursor – opens Cursor and adds the server; Cursor then asks you to sign in to HelpRange. Or add it to ~/.cursor/mcp.json (all projects) or .cursor/mcp.json (one project):
{
"mcpServers": {
"helprange": {
"url": "https://www.helprange.com/mcp"
}
}
}Install in VS Code – or from a terminal:
code --add-mcp '{"name":"helprange","type":"http","url":"https://www.helprange.com/mcp"}'Or in .vscode/mcp.json:
{
"servers": {
"helprange": {
"type": "http",
"url": "https://www.helprange.com/mcp"
}
}
}Any client that supports remote (Streamable HTTP) MCP servers with OAuth works. Most read an mcpServers block:
{
"mcpServers": {
"helprange": {
"url": "https://www.helprange.com/mcp"
}
}
}Windsurf names the field serverUrl (~/.codeium/windsurf/mcp_config.json):
{
"mcpServers": {
"helprange": {
"serverUrl": "https://www.helprange.com/mcp"
}
}
}Client settings change often – if a field name differs in your version, its MCP docs have the current one; the URL stays the same.
ChatGPT connectors: Settings → Connectors (developer mode) → Create → paste the MCP server URL, authentication OAuth → log in to HelpRange and allow.
Custom GPT action (REST API with an API key):
https://www.helprange.com/developers/openapi.json /public-api ones.Everyone who uses the GPT acts with this key – share such a GPT only inside your team, and prefer a read-only key.
Server-side agents call the REST API with a team API key in HELPRANGE_API_KEY – start with an hr_test_ key: it works on a sandbox with sample data and never sends e-mail. These are minimal examples, one or two tools each; add the operations you need from the API reference.
import { generateText, tool, stepCountIs } from 'ai';
import { z } from 'zod';
const HR = 'https://www.helprange.com/api/v2';
const headers = { Authorization: `Bearer ${process.env.HELPRANGE_API_KEY}` };
const listDocuments = tool({
description: 'List HelpRange documents with views and downloads',
inputSchema: z.object({}),
execute: async () => (await fetch(`${HR}/documents`, { headers })).json(),
});
const createLink = tool({
description: 'Create a tracked HelpRange share link for one person',
inputSchema: z.object({ fileId: z.number(), label: z.string() }),
execute: async ({ fileId, label }) =>
(await fetch(`${HR}/files/${fileId}/links`, {
method: 'POST',
headers: { ...headers, 'Content-Type': 'application/json' },
body: JSON.stringify({ label, require_email: true }),
})).json(),
});
const { text } = await generateText({
model, // any AI SDK model
tools: { listDocuments, createLink },
stopWhen: stepCountIs(5),
prompt: 'Create a link to proposal.pdf for "ACME - Anna".',
});import os
import requests
from langchain_core.tools import tool
HR = "https://www.helprange.com/api/v2"
HEADERS = {"Authorization": f"Bearer {os.environ['HELPRANGE_API_KEY']}"}
@tool
def recent_views() -> list:
"""Who opened which HelpRange document recently (newest first)."""
return requests.get(f"{HR}/views", headers=HEADERS, timeout=30).json()
@tool
def create_link(file_id: int, label: str) -> dict:
"""Create a tracked HelpRange share link for one person; the viewer must enter their e-mail."""
r = requests.post(f"{HR}/files/{file_id}/links", headers=HEADERS, timeout=30,
json={"label": label, "require_email": True})
return r.json()
llm_with_tools = llm.bind_tools([recent_views, create_link]) # llm: any chat model with tool callingimport os
import requests
from llama_index.core.agent.workflow import FunctionAgent
from llama_index.core.tools import FunctionTool
HR = "https://www.helprange.com/api/v2"
HEADERS = {"Authorization": f"Bearer {os.environ['HELPRANGE_API_KEY']}"}
def document_stats(document_id: int) -> dict:
"""Views, downloads and seconds per page of one HelpRange document."""
return requests.get(f"{HR}/documents/{document_id}", headers=HEADERS, timeout=30).json()
async def main(llm): # llm: any LlamaIndex LLM with function calling
agent = FunctionAgent(tools=[FunctionTool.from_defaults(fn=document_stats)], llm=llm)
return await agent.run("How long did people read page 3 of document 250?")import os
import requests
from agents import Agent, Runner, function_tool
HR = "https://www.helprange.com/api/v2"
HEADERS = {"Authorization": f"Bearer {os.environ['HELPRANGE_API_KEY']}"}
@function_tool
def invite_guest(data_room_id: int, email: str) -> dict:
"""Invite a guest to a HelpRange data room (they get the room's invitation e-mail)."""
r = requests.post(f"{HR}/data-rooms/{data_room_id}/guests", headers=HEADERS, timeout=30, json={"email": email})
return r.json()
agent = Agent(name="Deal assistant", instructions="Manage HelpRange data rooms.", tools=[invite_guest])
result = Runner.run_sync(agent, "Invite jane@example.com to data room 10.")
print(result.final_output)Drop this section into your project's AGENTS.md (or CLAUDE.md, .cursor/rules) so your coding agent knows the base URL, auth, key endpoints, errors and test mode. Also at /developers/agents.md.
## Using HelpRange in this project
HelpRange (secure document sharing, tracked links, virtual data rooms) is called through its REST API.
- Base URL: `https://www.helprange.com/api/v2` (JSON in, JSON out; uploads also as multipart/form-data).
- Auth: `Authorization: Bearer $HELPRANGE_API_KEY` – a team API key from HelpRange Settings → API keys. Never commit
the key or send it from browser code; read it from the environment.
- Test mode: keys starting with `hr_test_` work on a sandbox with sample data – no e-mail is sent, only addresses at
example.com / example.org / *.test are accepted, nothing touches live data. Use a test key in development and CI;
responses carry `"livemode": false`.
- Scopes: each key has scopes (`documents:read`, `documents:write`, `links:read`, `links:write`, `rooms:read`,
`rooms:write`, `analytics:read`, `team:read`). 403 `insufficient_scope` names the missing one in `required_scope`.
- Full reference (Markdown, for LLMs): https://www.helprange.com/developers/llms-full.txt · OpenAPI 3.1: https://www.helprange.com/developers/openapi.json
· Human docs: https://www.helprange.com/developers/api
Key endpoints:
- `GET /api/v2/me` – Who is connected
- `GET /api/v2/folders` – List folders
- `GET /api/v2/documents` – List documents
- `POST /api/v2/files` – Upload a file
- `POST /api/v2/files/{file_id}/links` – Create a share link
- `GET /api/v2/documents/{file_id}/links` – List share links of a document
- `GET /api/v2/documents/{file_id}` – Document statistics
- `GET /api/v2/views` – Recent document views
- `GET /api/v2/data-rooms` – List data rooms
- `GET /api/v2/data-rooms/{data_room_id}` – Data room details
- `POST /api/v2/data-rooms/{data_room_id}/documents` – Add documents to a data room
- `POST /api/v2/data-rooms/{data_room_id}/guests` – Invite a guest
- `POST /api/v2/signature-requests` – Send a document for e-signature
- `POST /api/v2/offers` – Create an offer
- `GET /api/v2/activity` – Team activity
Errors: JSON `{"error": "…"}`, some with `code`. 400 invalid input (the message names the field), 401 bad / revoked /
expired key, 402 plan without API access, 403 missing scope, 404 not found or not yours, 409 / 423 frozen data room,
413 file too large, 429 rate limit – wait `Retry-After` seconds (also `retry_after` in the body).
Retries / idempotency: there is no Idempotency-Key header. GETs are safe to retry. Give every share link a unique
`label` (per document): retrying a create with the same label answers 400 instead of making a duplicate – then list
the document's links (`GET /api/v2/documents/{file_id}/links`). Inviting someone who is already a guest answers 200
with `already_a_guest: true`. Back off on 429 and 5xx.
Rules worth knowing: `expires_on` must be today or later (`YYYY-MM-DD`); `views_limit` 0 or null = no limit;
booleans accept true/false, 1/0 or "true"/"false"; a passcode of only spaces = no passcode. The API never e-mails
share links – send the returned `url` yourself. Usage limits per team: 3,600 requests an hour (120 a minute), 300
writes an hour, 2,000 new links and 1,000 guests a day.
Webhooks (set up in Settings → Integrations, not through the API): verify `HelpRange-Signature: t=…,v1=…` =
HMAC-SHA256(secret, "<t>.<raw body>"), reject timestamps older than 5 minutes, deduplicate on the event `id`, answer
2xx fast. Docs: https://www.helprange.com/developers/webhooks
Point your assistant at the docs in a format made for LLMs (llmstxt.org), generated from the same OpenAPI file, MCP tool list and webhook code as the reference:
Worked examples with prompts: recipes.