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 listjlnk 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 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

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

← back to jlnk.us