Handoff
Provides Windsurf (Codeium) configuration for connecting to Handoff, enabling the editor's agent to save files and manage controlled share links.
Provides VS Code / GitHub Copilot MCP configuration so Copilot agents can use Handoff to save files and create share links with expiry, open limits, and approval.
Provides Hermes Agent configuration for connecting to Handoff, allowing the agent to store files and manage share links and access logs.
Provides LangChain MCP adapter configuration so LangChain agents can call Handoff tools to save files and create or revoke share links.
Provides LangGraph MCP adapter configuration so LangGraph agents can call Handoff tools to save files and create or revoke share links.
Provides OpenAI Agents SDK integration via MCPServerStreamableHttp, enabling agents to save files and create controlled share links with Handoff.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Handoffsave report.pdf and create a link that expires in 24h, max 3 opens"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Handoff: File Sharing for AI Agents
Private file storage and controlled share links for AI agents, with no human signup.
Handoff gives an agent somewhere to put a file and a safe way to hand it to someone else. That someone can be a human or another agent. The agent saves the file privately, then creates a share link with the rules it needs: an expiry, a maximum number of opens, an optional human approval step, and a specific recipient agent. It can check status, revoke, and read the access log at any time.
Remote MCP server:
https://hand-off.space/mcp(Streamable HTTP)Auth:
Authorization: Bearer <api_key>. An agent gets a key by callingPOST /v1/signup, with no email, card or human account.Registry name:
io.github.jueluddinsf/handoff
This repository holds docs and listing metadata. The service is hosted, so you have nothing to install.
Use it when an agent needs to…
Deliver a report to a human. The agent saves
report.pdf, then sends a link that expires in 24 hours and opens at most 3 times.Hand a file to another agent. The link works only when the named recipient agent presents its own key.
Wait for a human before releasing a file. The link stays locked (
pending_approval) until the owner approves it.Take something back. Revoke a link, and see every successful and refused open.
Related MCP server: librechat-personal-files-mcp
Quickstart: REST (3 calls)
BASE=https://hand-off.space
# 1. Sign up. The key is shown once, so store it.
curl -s -X POST $BASE/v1/signup -H 'content-type: application/json' -d '{"agent_id":"my-agent"}'
# → {"account_id":"…","api_key":"hf_…","agent_id":"my-agent","caps":{…}}
export HANDOFF_API_KEY=hf_...
# 2. Save a file privately (base64 bytes)
curl -s -X POST $BASE/v1/files -H "authorization: Bearer $HANDOFF_API_KEY" -H 'content-type: application/json' \
-d "{\"name\":\"report.md\",\"mime\":\"text/markdown\",\"content_base64\":\"$(printf '# Q3 report' | base64)\"}"
# → {"id":"FILE_ID","name":"report.md",…}
# 3. Create a share link
curl -s -X POST $BASE/v1/files/FILE_ID/grants -H "authorization: Bearer $HANDOFF_API_KEY" -H 'content-type: application/json' \
-d '{"audience":"anyone_with_link","expires_in_hours":24,"max_opens":3}'
# → {"grant_id":"…","url":"https://hand-off.space/g/…"}Give the url to the recipient. It downloads with a plain GET.
Quickstart: MCP (3 tool calls)
Connect your client to
https://hand-off.space/mcp(configs below).Get a key. Call the
signupMCP tool, orPOST /v1/signupas shown above. Put the key in your client'sAuthorization: Bearer …header and reconnect.The keyless
signuptool is rolling out. If your client shows only the six tools below, usePOST /v1/signup.Call
save_file→create_share_link, then hand over the returnedurl.
Tools
Tool | What it does |
| Save a file privately: |
| List your files, newest first. |
|
|
| Approval, expiry, revocation and |
| Permanently revoke a link. |
| Up to the latest 1,000 opens and refusals for a link. |
Client configuration
In each config below, replace YOUR_HANDOFF_API_KEY with your key, or use the environment-variable form shown.
Claude Code
claude mcp add --transport http handoff https://hand-off.space/mcp \
--header "Authorization: Bearer YOUR_HANDOFF_API_KEY"You can also commit a project-scoped .mcp.json, which is the file in this repo. Claude Code expands ${HANDOFF_API_KEY} from your environment:
{ "mcpServers": { "handoff": { "type": "http", "url": "https://hand-off.space/mcp",
"headers": { "Authorization": "Bearer ${HANDOFF_API_KEY}" } } } }Claude Desktop
Claude Desktop custom connectors don't take a static header, so bridge with mcp-remote in claude_desktop_config.json:
{
"mcpServers": {
"handoff": {
"command": "npx",
"args": ["-y", "mcp-remote", "https://hand-off.space/mcp",
"--header", "Authorization:${HANDOFF_AUTH}"],
"env": { "HANDOFF_AUTH": "Bearer YOUR_HANDOFF_API_KEY" }
}
}
}Cursor (~/.cursor/mcp.json or .cursor/mcp.json)
{
"mcpServers": {
"handoff": {
"url": "https://hand-off.space/mcp",
"headers": { "Authorization": "Bearer ${env:HANDOFF_API_KEY}" }
}
}
}VS Code / GitHub Copilot (.vscode/mcp.json)
{
"inputs": [
{ "type": "promptString", "id": "handoff_api_key", "description": "Handoff API key", "password": true }
],
"servers": {
"handoff": {
"type": "http",
"url": "https://hand-off.space/mcp",
"headers": { "Authorization": "Bearer ${input:handoff_api_key}" }
}
}
}Cline (cline_mcp_settings.json)
Set "type": "streamableHttp" explicitly. If you leave it out, Cline falls back to legacy SSE.
{
"mcpServers": {
"handoff": {
"type": "streamableHttp",
"url": "https://hand-off.space/mcp",
"headers": { "Authorization": "Bearer YOUR_HANDOFF_API_KEY" },
"disabled": false,
"autoApprove": []
}
}
}Windsurf (~/.codeium/windsurf/mcp_config.json)
{
"mcpServers": {
"handoff": {
"serverUrl": "https://hand-off.space/mcp",
"headers": { "Authorization": "Bearer ${env:HANDOFF_API_KEY}" }
}
}
}OpenAI Agents SDK (Python)
import asyncio, os
from agents import Agent, Runner
from agents.mcp import MCPServerStreamableHttp
async def main():
async with MCPServerStreamableHttp(
name="handoff",
params={
"url": "https://hand-off.space/mcp",
"headers": {"Authorization": f"Bearer {os.environ['HANDOFF_API_KEY']}"},
},
cache_tools_list=True,
) as handoff:
agent = Agent(
name="Reporter",
instructions="Write the report, save it with Handoff, and reply with a share link that expires in 24h.",
mcp_servers=[handoff],
)
print((await Runner.run(agent, "Summarize Q3 sales into report.md and share it.")).final_output)
asyncio.run(main())LangChain / LangGraph (langchain-mcp-adapters)
import os
from langchain_mcp_adapters.client import MultiServerMCPClient
from langchain.agents import create_agent
client = MultiServerMCPClient({
"handoff": {
"transport": "streamable_http",
"url": "https://hand-off.space/mcp",
"headers": {"Authorization": f"Bearer {os.environ['HANDOFF_API_KEY']}"},
}
})
tools = await client.get_tools()
agent = create_agent("openai:gpt-4.1", tools) # or langgraph.prebuilt.create_react_agentHermes Agent (~/.hermes/config.yaml)
mcp_servers:
handoff:
url: "https://hand-off.space/mcp"
headers:
Authorization: "Bearer YOUR_HANDOFF_API_KEY"Any other MCP client
Setting | Value |
URL |
|
Transport | Streamable HTTP (stateless, |
Header |
|
More step-by-step setup for agents is in llms-install.md.
Agent Skill (no MCP needed)
This repo also ships an Agent Skill that teaches any skills-capable agent (Claude Code, Codex, Copilot, Cursor and others) to use the REST API:
npx skills add jueluddinsf/handoff-mcpUse with Grok Bot
Add Handoff as a custom MCP connector:
Setting | Value |
URL |
|
Header |
|
Get a key with the signup MCP tool, or with POST /v1/signup if that tool is not listed. The key is shown once. Put it in the header and reconnect.
Or have the bot follow skills/handoff/SKILL.md and call the REST API over plain HTTP.
Example prompts:
Save this report to Handoff and send me a link that expires in 24h.
Share this file with my other agent only.
Show me who opened the link, then revoke it.
Recipes
Agent → human report, with an expiry
save_file(report.pdf) → create_share_link(audience="anyone_with_link", expires_in_hours=24, max_opens=3) → send the url. Use get_access_log to confirm it was opened.
Agent → agent handoff
Agent A calls create_share_link(audience="agent", audience_value="agent-b"). Agent B downloads with its own key:
curl -L -H "authorization: Bearer $AGENT_B_KEY" -o out.bin "$URL"Any other caller gets 401 {"error":"unauthorized"}.
Human-approval gate
create_share_link(..., requires_approval=true). Until the owner approves, opens return 403 {"error":"pending_approval"}. To approve or deny:
curl -X POST -H "authorization: Bearer $HANDOFF_API_KEY" $BASE/v1/grants/GRANT_ID/approve # or /denyLimits (free, unclaimed accounts)
100 MB total, 50 files, 10 MB per file, 200 successful opens per day.
Allowed file types: txt, md, csv, json, pdf, png, jpg, gif, webp, svg, xml, yaml, log, docx, xlsx, pptx.
Executables, scripts, HTML and archives are refused.
Signup is rate-limited per IP.
Download responses
Status | Error | Meaning |
|
| The link is past its expiry. |
|
| The link hit its max opens or the daily cap. |
|
| Revoked, denied, or still waiting for approval. |
|
| The link is for a different agent. |
Security model
Files are private by default. Every share is an explicit grant with its own token.
Downloads are served as
application/octet-streamattachments withContent-Security-Policy: sandboxandnosniff.Every attempt, successful or refused, is logged.
API keys are stored hashed and shown once.
Report security issues privately (see CONTRIBUTING.md).
License
MIT. This applies to the docs and examples in this repository. The hosted service is operated by Juel Uddin.
This server cannot be deployed
Maintenance
Related MCP Connectors
Your agents' private file sharing: each file your AI makes gets a short link that needs sign-in.
Share documents privately from an AI agent. The agent gets a link; it cannot read the file.
Upload any file, get a tracked shareable link. DocSend for AI agents.
Send files as tracked links from any AI agent and see who opened them, page by page.
Related MCP Servers
AlicenseNot gradedqualityDmaintenanceEnables AI agents to securely transfer files between machines via encrypted, expiring share links, with tools for upload, download, status checks, and link management.MIT- AlicenseNot gradedqualityBmaintenanceEnables LibreChat agents to manage per-user private files, persistent documentation, RAG indexing and semantic search, and publish files via secure opaque public links.MIT
- AlicenseNot gradedqualityDmaintenanceEnables AI agents to store files or JSON and share them with humans or other agents via signed links or password-protected addresses, with paid-per-call USDC settlement.MIT
- AlicenseNot gradedqualityAmaintenanceEnables AI agents to store artifacts with versioning, share them via revocable links, and manage team templates.516,612 npm2AGPL 3.0