jlnk.us · onboarding
Publish your first disposable link
jlnk.us is a remote MCP server. Point any MCP client at https://jlnk.us/mcp with your invite key, then your agent can call create_link to put a self-contained HTML page at a public, self-destructing URL.
1 What you need
An API key that looks like jlnk_…. Get one yourself: enter your email on jlnk.us, open the one-time sign-in link we email you (valid 15 minutes, single use), then Mint a key on your account page — the raw key is shown once, right there. Every key is attributable and revocable.
2 Claude Code
One command — swap in your key:
claude mcp add --transport http jlnk https://jlnk.us/mcp \
--header "Authorization: Bearer jlnk_YOUR_KEY"
Confirm it registered with claude mcp list — jlnk should expose 5 tools.
3 Claude Desktop
Desktop only understands stdio servers — the type: http shape Claude Code uses is silently skipped here. Route through the mcp-remote proxy instead. Add this to claude_desktop_config.json (Settings → Developer → Edit Config), then restart the app:
{
"mcpServers": {
"jlnk": {
"command": "npx",
"args": [
"-y", "mcp-remote", "https://jlnk.us/mcp",
"--header", "Authorization: Bearer jlnk_YOUR_KEY"
]
}
}
}
If Desktop reports it can't find npx, use the absolute path to your Node install's npx (the output of which npx) as command.
4 Other MCP clients
Anything that speaks streamable-HTTP MCP works (Cursor, Windsurf, custom agents). Use the endpoint over HTTP transport with a bearer header — the same shape as above:
{
"jlnk": {
"url": "https://jlnk.us/mcp",
"transport": "http",
"headers": { "Authorization": "Bearer jlnk_YOUR_KEY" }
}
}
To sanity-check connectivity without a client, list the tools directly:
curl -s https://jlnk.us/mcp \
-H "Authorization: Bearer jlnk_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'
A missing or bad key returns 401; a good one returns create_link, revise_link, delete_link, list_my_links, and promote_link.
5 Your first link
Just ask your agent in plain language:
Publish this to jlnk with a 24h TTL: <!doctype html><h1>Hello from an agent</h1>
Under the hood that's a create_link call:
{
"name": "create_link",
"arguments": {
"content": "<!doctype html><h1>Hello from an agent</h1>",
"ttl": "24h"
}
}
You get back a public URL like https://jlnk.us/a/<id> and an expiry timestamp. Open it logged-out in any browser: it renders inside a sandboxed frame with a small "report this page" bar. After the TTL it returns 404 and the content is deleted from storage.
6 Revising a link you already shared
Every link is versioned. What create_link gives you is version 0, published at both /a/<id> and /a/<id>/v/0. When the page needs a change, don't publish a second link — revise the one you have:
{
"name": "revise_link",
"arguments": {
"id": "<id>",
"content": "<!doctype html><h1>Hello again</h1>"
}
}
/a/<id>— the URL you already shared. Always serves the newest version, so every copy of it stays current./a/<id>/v/1— the revision, pinned./v/0keeps serving the original, byte for byte.
A revision doesn't spend a link from your daily quota, and it restarts the expiry using the TTL the link was created with — a 24h link revised at hour 23 is good for another 24. That's the point: iterating on one artifact should cost one link, not one per draft. Pass ttl to pick a different lifetime, and title/description to update the share preview. Only the key that created a link can revise it.
Old versions are not archives — they live and die with the link. When it expires or you delete it, every version's content goes with it.
7 Manage what you've published
list_my_links()— your live links, each with its current version and expiry.revise_link(id, content)— publish a new version at the same URL, no quota spent.delete_link(id)— remove one immediately, all versions. Theidis the second path segment of the URL.promote_link(id)— drop the expiry from a link that's already live, keeping its URL and content. Needs the permanent permission on your key.
TTLs are 15m / 4h / 24h / 72h (default 4h). Each payload is one HTML document up to 5 MB. Every key has a per-minute rate limit and a daily quota — you'll get a clear error if you hit either.
Good to know
- URLs are unguessable (24 random characters) and
noindex— not secret, but not enumerable or crawled. Version URLs inherit that:/v/<n>is only reachable if you already know the id. - Served content is sandboxed: scripts run, but forms, top-navigation, and same-origin access are blocked.
- Anyone can flag a page via "report this page"; abusive links are removed and the publishing key revoked.