Handoff: File Sharing for AI Agents
Server Details
Private file storage for AI agents with expiring, revocable, approval-gated share links and access logs.
- Status
- Healthy
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
- Repository
- jueluddinsf/handoff-mcp
- GitHub Stars
- 0
- Server Listing
- Handoff
TDQS
Scored across 10 tools
Each tool targets a distinct resource-action pair: account creation, file storage, file listing, share creation, share status, approval, denial, revocation, access logging, and download. The potentially confusable trio (get_share_status / get_access_log / fetch_shared_file) is clearly separated as metadata vs. attempt history vs. actual bytes. No two tools overlap in purpose.
Nine of ten tools follow a clean verb_noun snake_case pattern (create_share_link, fetch_shared_file, get_access_log, list_files, revoke_share, etc.). The lone outlier is `signup`, a bare verb with no object, which is a minor but noticeable break in the convention.
Ten tools is squarely in the well-scoped range, and each one earns its place by covering a distinct step in the file-sharing lifecycle. There is no filler or redundant convenience wrapper.
The lifecycle is nearly complete: signup, save, list, share, approve/deny, revoke, inspect status, audit access, and fetch. Minor gaps exist — no file deletion, no way to list all owned shares (you must already know the grant/token), and no way to update or extend an existing share's expiry rather than revoking and recreating it.
Available Tools
10 toolsget_access_logAInspect
Read the latest 1000 access attempts for an owned grant, including refused downloads. Use this to see whether a share was opened. Requires your API key.
| Name | Required | Description | Default |
|---|---|---|---|
| api_key | No | Secret API key from signup. Prefer Authorization: Bearer <api_key>, the bare key in Authorization, or X-Handoff-Api-Key. Pass this only when you cannot set headers. Do not write it into a file you share. | |
| grant_id | Yes | grant_id of the share to audit. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden: it does disclose that the grant must be owned, that results are capped at the latest 1000 entries, that refused downloads are included, and that an API key is required. It does not state whether older entries are reachable, how records are ordered beyond 'latest', or whether the caller needs ownership/team permissions beyond 'owned grant.'
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, zero filler, with the resource scope and the 1000-entry cap front-loaded before the usage hint and auth note.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema and no annotations, so the description is the only source for return-shape information. It says what is included (access attempts, refusals) and the count cap but not what fields each attempt exposes or whether truncation at 1000 is silent — a meaningful gap for an audit tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so both parameters are already documented in the schema, including the API key header preference and the meaning of grant_id. The description only re-asserts the API key requirement and the ownership qualifier, adding little beyond the structured fields.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Read') and resource ('latest 1000 access attempts for an owned grant'), plus a notable scope detail ('including refused downloads'). It is readily distinguishable from status/link-management siblings, though it doesn't name any of them explicitly to reinforce that distinction.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Use this to see whether a share was opened' gives a concrete triggering scenario. There are no exclusions or named alternatives (e.g., when get_share_status is preferable), so it stops short of full routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_filesAInspect
List this account's files, newest first, up to 1000. Use this to find a file_id before sharing. Returns metadata only, never bytes or download URLs. Requires your API key.
| Name | Required | Description | Default |
|---|---|---|---|
| api_key | No | Secret API key from signup. Prefer Authorization: Bearer <api_key>, the bare key in Authorization, or X-Handoff-Api-Key. Pass this only when you cannot set headers. Do not write it into a file you share. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does well: it discloses ordering, a hard 1000-item cap, that only metadata is returned (never bytes or download URLs), and that an API key is required. It omits what happens past 1000 items (truncation vs. pagination) and whether listing is scoped to owned vs. shared files.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four short clauses, each earning its place: identity/ordering, intended use, return-content boundary, and auth prerequisite. Front-loaded with the core operation and no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a no-annotation, no-output-schema, one-parameter list tool, the description covers purpose, ordering, cap, return shape, and auth — the essentials an agent needs to call it and interpret results. A brief note on what metadata fields appear or behavior at the limit would close the remaining gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single api_key parameter already carries a detailed description covering header alternatives and safety advice. The description's 'Requires your API key' only confirms the auth requirement rather than adding syntax or format meaning, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List this account's files') plus scope qualifiers — newest-first ordering and a 1000-item cap — that no sibling provides. An agent can distinguish it from get_access_log, get_share_status, and fetch_shared_file immediately.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Use this to find a file_id before sharing' gives a concrete downstream purpose that implicitly routes the agent to create_share_link/save_file as the next step. There is no explicit 'do not use this for X' exclusion and no named alternative, so it falls short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
save_fileAInspect
Save a private file for this account. Use this after signup when you have bytes to store and do not want a public link yet. Returns the file id and metadata. Does not share the file. Requires your API key.
| Name | Required | Description | Default |
|---|---|---|---|
| mime | No | MIME type, for example text/plain or application/pdf. | application/octet-stream |
| name | Yes | File name with an extension. No slashes or control characters. | |
| api_key | No | Secret API key from signup. Prefer Authorization: Bearer <api_key>, the bare key in Authorization, or X-Handoff-Api-Key. Pass this only when you cannot set headers. Do not write it into a file you share. | |
| content_base64 | Yes | Standard base64 file bytes. Do not include a data: URL prefix. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden and discloses key traits: it creates a private file, does not share it, requires an API key, and returns file id plus metadata. It omits overwrite behavior, idempotency, and failure modes, but covers the main mutation and auth context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four short sentences, front-loaded with purpose and usage. Each sentence contributes useful context: privacy, timing, return, non-sharing, and auth.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers purpose, prerequisite, privacy semantics, auth requirement, and return shape for a tool with no output schema. It is nearly complete, though it could say more about storage limits or overwrite behavior, which are not fully covered elsewhere.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all four parameters in detail. The description adds only high-level auth context and return information, not parameter-specific meaning beyond the schema, making the baseline 3 appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: save a private file for this account. It also distinguishes the operation from public-sharing siblings by saying the file is private and not shared.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear usage context: after signup, when you have bytes to store, and when you do not want a public link yet. It does not explicitly name an alternative tool or state when not to use this one, so it falls short of full routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
signupAInspect
Create a Handoff account and return an API key once. Call this first, before any other tool. No Authorization header is required. Save api_key. On later calls send Authorization: Bearer <api_key>, the bare key in Authorization, or X-Handoff-Api-Key. Pass api_key only if you cannot set headers. The key is a secret. Do not put it in a file you share.
| Name | Required | Description | Default |
|---|---|---|---|
| agent_id | No | Optional label, unique across Handoff. Letters, numbers, underscore, and hyphen. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does well: it discloses the one-time key return, the absence of an auth requirement, three accepted auth header forms for later calls, and secret-handling obligations. The main gap is error behavior — agent_id is documented as "unique across Handoff" but the description never says what happens on a collision.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The critical instruction (call first, save the key) is front-loaded and the sentences are short and purposeful. The tail-end auth-header enumeration and the "do not put it in a file you share" warning are slightly verbose for a one-time call but still earn their place as operational guidance.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a no-annotation, no-output-schema signup tool, the description covers what is returned (api_key), how to use it afterward, and how to keep it safe, which is what an agent needs. Missing only failure-mode context such as duplicate agent_id handling or whether repeated calls mint new keys.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the single parameter (agent_id) is optional, so the baseline is 3. The description adds no meaning about agent_id, and it references an "api_key" argument that does not exist in this tool's schema (additionalProperties: false), which could momentarily confuse an agent about where that parameter belongs.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Create a Handoff account") plus the salient outcome ("return an API key once"), and immediately distinguishes itself from every sibling with "Call this first, before any other tool." An agent can identify this as the bootstrap/onboarding tool without inspecting the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit ordering ("Call this first, before any other tool"), an auth condition ("No Authorization header is required"), and a fallback rule ("Pass api_key only if you cannot set headers"). The one-shot nature of the key is stated, which implicitly tells the agent not to expect to re-fetch it later.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
10 tool updates
- First observed
approve_share - First observed
create_share_link - First observed
deny_share - First observed
fetch_shared_file - First observed
get_access_log - First observed
get_share_status - First observed
list_files - First observed
revoke_share - First observed
save_file - First observed
signup
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.
Private, expiring artifact hosting for AI agents. Upload via API or MCP; links die on their own.
Related MCP Servers
- 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 gradedqualityBmaintenanceEnables AI agents to search, retrieve, and share files by meaning across connected storage, with permission-aware access control and an audit trail.Apache 2.0
- 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 gradedqualityBmaintenanceSecure file exchange MCP server enabling AI agents to upload, share, fetch, and revoke files with SHA-256 verification, malware scanning, expiry, access restrictions, and human approval workflows.4 npmMIT
Glama MCP Gateway
Add one secure layer between your agents and this server.