A side-by-side look at the Handover.tools and SaC — Software as Content MCP servers: transport, auth, tools, quality signals, and the config to install either one in Claude, Cursor, Windsurf or VS Code.
Verdict: choose Handover.tools for developer tools work; choose SaC — Software as Content for developer tools as a local process. You can also run both side by side in one mcpServers block.
handoff_put, handoff_get, handoff_revoke.Rows where the two servers differ are marked.
| Spec | H Handover.tools | |
|---|---|---|
| Category | Developer Tools | Developer Tools |
| Quality signal | 53/100 · Good | 45/100 · Fair |
| Install command | Not confirmed yet | Confirmed |
| Transport | — | Local subprocess (stdio) |
| Auth | No auth required | API key required |
| Pricing | Free | BYOK (pay the provider) |
| Required env vars | None listed | None listed |
| Verified owner | Community listing | Community listing |
| GitHub stars | 0 | 3 |
| Directory activity | 0 views 0 installs 0 upvotes | 3 views 0 installs 0 upvotes |
| Tools | 8 | Not listed |
| Full listing | View Handover.tools | View SaC — Software as Content |
handoff_putStore a piece of context and get back a short code. The person gives the link handover.tools/<code> to an agent on another device and it can fetch the content — no copy-paste of long text. The code is 8 letters, easy to type on a phone. NOT ENCRYPTED: the server can read what you store, so never put credentials, tokens, or private data in it. Content becomes unreadable after the TTL expires, and by default it can only be fetched once. The response also returns a revoke_key — keep it for the rest of this session so you can destroy the content immediately with handoff_revoke if the person changes their mind. Writes are limited to a small number per day; reads are not.handoff_getFetch content stored by handoff_put using its 8-character code. The code is case-insensitive and hyphens are ignored, so 'kvmtrhxp' and 'KVMT-RHXP' are the same; the person may give it as a link like handover.tools/kvmtrhxp, and passing that is fine too. Return the content to the person verbatim and complete: it can be fetched only once. If the code is unknown, already fetched, or expired, content is null with a reason — these cases are deliberately indistinguishable.handoff_revokeDestroy content stored by handoff_put right now, before its TTL runs out and whether or not it has been fetched. Requires the revoke_key returned by handoff_put — the person fetching with the short code cannot revoke, only the writer can. Use this the moment someone says they sent the wrong thing, or changed their mind. Revoking an already gone item is not an error: the outcome is reported as 'already_gone'.channel_openStart pairing two agents on different machines for a multi-round exchange (e.g. one explores, the other studies and asks follow-up questions). Use the local client at https://handover.tools/client/channel.py — do not call this by hand. The client generates a secret password locally, and this call returns only a 3-character nameplate; the person gives nameplate + password (8 letters) to the other machine. The server never sees the password, so it cannot impersonate either side (SPAKE2). The person stays in the loop: send only after they approve, fetch only when they ask. Counts as one write against the daily write quota.channel_joinSecond half of pairing, run by the local client at https://handover.tools/client/channel.py. Send only the first 3 characters of the spoken code (the nameplate) plus this side's SPAKE2 message; the other 5 characters are the password and must never be sent to the server. The nameplate is consumed on success. Returns this side's key and the peer's SPAKE2 message. Unknown, used, or expired nameplates are deliberately indistinguishable.channel_sendRelay one ciphertext to the other side of a paired channel. The ciphertext must come from the local client at https://handover.tools/client/channel.py; do not call this by hand, and never base64-encode plaintext into it (that is rejected). Only send after the person has seen and approved the draft — the server cannot enforce this, the calling agent must. Returns the message's sequence number and how far the peer has read.channel_fetchUse the local client at https://handover.tools/client/channel.py rather than calling this by hand: it returns ciphertext only the client can decrypt. Returns the peer's messages this side has not fetched yet, and marks them read so the peer can see they arrived. Call only when the person asks. peek=true reads without marking; after=N re-reads from sequence N (recovery). Side A also receives the peer's SPAKE2 message here to finish pairing. Large backlogs are paged: more=true means fetch again.channel_closeEither side can close. Deletes the channel, both keys, and every stored message immediately. The other side's next fetch reports not_found_or_closed.No tool names declared yet. Check the project README from the listing page.
Paste either block (or both) into your client config, e.g. claude_desktop_config.json or ~/.cursor/mcp.json. We only show a config when the install command is confirmed.
No confirmed install command for Handover.tools yet — follow the setup steps linked from its listing page rather than a guessed package name.
{
"mcpServers": {
"sac-software-as-content": {
"command": "uvx",
"args": [
"sac-sdk"
]
}
}
}