MCP Server
Just want to connect Claude or ChatGPT? See the AI Assistants guide for a simpler walkthrough — no API keys or config files needed.
SendMeDocs includes a Model Context Protocol (MCP) server that lets AI assistants manage document requests on your behalf. Connect any MCP-compatible client and use natural language to create requests, check statuses, and download files.
Server URL:
https://sendmedocs.com/mcp
How it works
Your AI assistant connects to the MCP endpoint using either an API key or OAuth. When you ask it to do something like "send Jane a request for her photo ID", the assistant calls the appropriate tool, SendMeDocs executes it, and the result comes back — all within the conversation.
No AI model runs on the SendMeDocs server. The intelligence is entirely on the client side. SendMeDocs just answers structured tool calls using the same database and logic as the REST API.
Setup by client
Claude Desktop
API key auth via JSON config.
- Create an API key: Dashboard > Settings > API Keys > Create API Key (owner or admin role required). Copy the key — it starts with
smd_and is shown only once. - Edit
claude_desktop_config.json(Settings > Developer > Edit Config):
{
"mcpServers": {
"sendmedocs": {
"type": "streamableHttp",
"url": "https://sendmedocs.com/mcp",
"headers": {
"Authorization": "Bearer smd_your_key_here"
}
}
}
}
- Restart Claude Desktop. The SendMeDocs tools will appear in your tool list.
Claude Code
API key auth via CLI.
- Create an API key (same as Claude Desktop step 1 above)
- Run:
claude mcp add --transport http sendmedocs https://sendmedocs.com/mcp \
--header "Authorization: Bearer smd_your_key_here"
- The tools are available immediately in your next conversation.
Cursor
API key auth via JSON config.
- Create an API key (same as Claude Desktop step 1 above)
- Edit
.cursor/mcp.jsonin your project root (or global config):
{
"mcpServers": {
"sendmedocs": {
"type": "streamableHttp",
"url": "https://sendmedocs.com/mcp",
"headers": {
"Authorization": "Bearer smd_your_key_here"
}
}
}
}
- Restart Cursor. The tools appear in the MCP panel.
OpenClaw
API key auth via mcporter.
- Create an API key (same as Claude Desktop step 1 above)
- Add to your
config/mcporter.json:
{
"servers": {
"sendmedocs": {
"transport": "streamable-http",
"url": "https://sendmedocs.com/mcp",
"headers": {
"Authorization": "Bearer smd_your_key_here"
}
}
}
}
- Verify with
mcporter list sendmedocs --schemato see the available tools.
Other MCP clients
Any client that supports Streamable HTTP transport will work. You need:
- URL:
https://sendmedocs.com/mcp - Auth: either
Authorization: Bearer smd_your_key_here(API key) or OAuth 2.1 via discovery athttps://sendmedocs.com/.well-known/oauth-authorization-server
Try it out
Ask your AI assistant something like:
- "List my pending document requests"
- "Send Jane Doe at jane@example.com a request for her photo ID and proof of address" (also works with US phone numbers)
- "What's the status of request 019471a2-...?"
- "Download the files from that request"
- "Show me the available tax templates"
- "Send John Smith the Individual Tax Return template"
Available tools
| Tool | What it does |
|---|---|
search_requests |
Search and filter document requests by status, recipient name, or contact |
send_request |
Send a document request to someone via email or SMS. Costs one request. |
get_request_details |
Get full details of a specific request — items, statuses, uploaded file metadata |
download_file |
Get presigned download/view URLs for a specific uploaded file |
cancel_request |
Cancel a pending request so the recipient can no longer upload |
get_usage |
Check your commitment level, monthly requests remaining, and credit balance |
list_templates |
List available templates (system + org-specific), optionally filtered by category |
get_template |
Get a template's full details including its items |
Tool details
search_requests
| Parameter | Type | Description |
|---|---|---|
status |
string | Filter: pending, completed, or expired |
search |
string | Search by recipient name or contact (case-insensitive) |
limit |
number | Results to return (1-100, default 20) |
Returns a list of requests with id, recipient info, status, and timestamps. Use this to find request IDs before calling other tools.
send_request
| Parameter | Type | Required | Description |
|---|---|---|---|
recipient_name |
string | Yes | Recipient's display name |
recipient_contact |
string | Yes | Email or US phone number to send the upload link to |
template_id |
string | No | UUID of a template to use as the item base |
items |
array | Conditional | 1-200 items to request. Required if no template_id. |
message |
string | No | Custom message included in the notification email/SMS |
expires_at |
string | No | ISO 8601 expiration date |
locale |
string | No | Upload portal language (en, es, fr, de, pt, zh, ja, ko, ru, th, vi) |
Each item is either a prefab (photo_id, proof_of_address, proof_of_income, w9), a custom document with name and description, or a form field with type set to text, date, select, yes_no, or hidden. Use template_id with list_templates to send pre-configured item sets.
This tool sends a real email/SMS and counts as one request. Each request draws from your monthly pool. When the pool is empty, overflow requests use your purchased credit balance at $0.10 each. Your AI assistant will confirm the details with you before calling it.
get_request_details
| Parameter | Type | Required | Description |
|---|---|---|---|
request_id |
string | Yes | The request UUID |
Returns full request detail including items, their statuses, revision notes, and uploaded files with metadata. Use this to check progress or get file IDs for downloading.
download_file
| Parameter | Type | Required | Description |
|---|---|---|---|
request_id |
string | Yes | The request UUID |
file_id |
string | Yes | The file UUID (from get_request_details) |
Returns presigned URLs for downloading (5-min expiry, attachment disposition) and viewing (15-min expiry, inline disposition), plus the original filename.
cancel_request
| Parameter | Type | Required | Description |
|---|---|---|---|
request_id |
string | Yes | The request UUID |
Only pending requests can be cancelled. The recipient will no longer be able to upload.
get_usage
No parameters. Returns your current commitment level, monthly requests remaining, purchased credit balance, cost per overflow request, and whether you can send a new request.
list_templates
| Parameter | Type | Required | Description |
|---|---|---|---|
category |
string | No | Filter by category: tax, healthcare, legal, general |
Returns available templates (system-wide + your org's custom templates) with name, description, category, and item count. Use the template id with send_request's template_id parameter.
get_template
| Parameter | Type | Required | Description |
|---|---|---|---|
template_id |
string | Yes | The template UUID |
Returns the template's full details including all items with their types, options, group labels, and configuration.
Authentication
The MCP endpoint supports two authentication methods. Both resolve to the same org context with the same rate limits (60 requests per minute) and org scoping.
API keys
For developer clients (Claude Desktop, Claude Code, Cursor, OpenClaw, scripts). Create a key in the dashboard, then include it in every request:
Authorization: Bearer smd_your_key_here
OAuth 2.1
For GUI clients (claude.ai, ChatGPT, and any client that supports OAuth discovery). The client handles the entire flow automatically:
- Client fetches
/.well-known/oauth-authorization-serverto discover endpoints - Client registers itself via dynamic client registration (RFC 7591)
- User is redirected to sign in and authorize access to a specific organization
- Client receives an access token (
smd_oat_prefix, 1-hour lifetime) and a refresh token (30-day lifetime) - Client refreshes automatically when the access token expires
No manual configuration needed on the user's part — just enter the server URL and the client does the rest.
Protocol details
For developers building custom MCP clients or debugging connections.
The endpoint implements Streamable HTTP transport with these JSON-RPC methods:
| Method | Description |
|---|---|
initialize |
Handshake — returns server info and capabilities |
notifications/initialized |
Client acknowledgment (returns 202) |
tools/list |
Returns the list of available tools |
tools/call |
Executes a tool and returns the result |
# Initialize handshake
curl -X POST https://sendmedocs.com/mcp \
-H "Authorization: Bearer smd_your_key_here" \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","method":"initialize","params":{"protocolVersion":"2025-03-26","capabilities":{},"clientInfo":{"name":"test","version":"1.0"}},"id":1}'
# List available tools
curl -X POST https://sendmedocs.com/mcp \
-H "Authorization: Bearer smd_your_key_here" \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","method":"tools/list","id":2}'
# Call a tool
curl -X POST https://sendmedocs.com/mcp \
-H "Authorization: Bearer smd_your_key_here" \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","method":"tools/call","params":{"name":"search_requests","arguments":{}},"id":3}'