Developers · Build with AI

Use HelpRange from Claude, Cursor and your AI agents

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.

Add to Cursor Install in VS Code

MCP server URL: https://www.helprange.com/mcp

The MCP server

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

Claude Code

claude mcp add --transport http helprange https://www.helprange.com/mcp

Then run /mcp in Claude Code and choose helprange to sign in.

Claude (claude.ai, Desktop and mobile)

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.

Cursor

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"
    }
  }
}

VS Code (GitHub Copilot agent mode)

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"
    }
  }
}

Windsurf and other MCP clients

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 and Custom GPTs

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):

  1. Create a team API key in HelpRange Settings → API keys with only the scopes the GPT needs (e.g. the Read-only preset).
  2. In the GPT editor: Configure → Create new action → Import from URL and paste https://www.helprange.com/developers/openapi.json
  3. Authentication → API Key, auth type Bearer, and paste the key.
  4. Remove the operations the GPT does not need (the editor may limit how many one action can hold) and the older /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.

Agent frameworks

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.

Vercel AI SDK (TypeScript) Example

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".',
});

LangChain (Python) Example

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 calling

LlamaIndex (Python) Example

import 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?")

OpenAI Agents SDK (Python) Example

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)

AGENTS.md for your repository

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

llms.txt

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.