unulu

API & MCP Documentation

Create, read, and update link-in-bio sites programmatically. Connect via MCP server or REST API — no authentication required.

MCP Server (recommended for agents)

Any MCP-compatible AI agent can connect and call tools directly. No authentication required. Rate limited.

Transport
Streamable HTTP (event-stream compatible)
URL
https://mcp.unulu.ai
Discovery
/.well-known/mcp/server.json

Add to your MCP client config:

{
  "mcpServers": {
    "unulu": {
      "type": "streamable-http",
      "url": "https://mcp.unulu.ai"
    }
  }
}

Authentication & site ownership

Creating a site, reading site state, and checking handle availability work anonymously. Updating a site requires proof of ownership: use the claim_token returned when an unclaimed site is created, or an edit_token for a claimed site. In a single assistant conversation this is usually automatic because the create response includes the claim token.

REST API

Standard REST endpoints. No API key or account required. Rate limited.

Base URL
https://api.unulu.ai
Spec
/openapi.json

Endpoints

Core endpoints available via both MCP tools and REST:

MethodPathDescriptionMCP tool
POST/api/sitesCreate a link-in-bio siteunulu_create_site
GET/api/sites/{site_id}Get site stateunulu_get_state
PATCH/api/sites/{site_id}Update a siteunulu_update_site
GET/api/claims/check-handleCheck handle availabilityunulu_check_handle

Additional REST-only endpoints:

MethodPathDescription
DELETE/api/sites/{site_id}Delete a site
POST/api/sites/{site_id}/report-abuseReport a site for abuse
POST/api/feature-votesSubmit a feature vote
POST/api/sites/{site_id}/request-editRequest edit access
GET/api/sites/{site_id}/edit-verifyVerify edit access

MCP surface

Claude and other MCP clients primarily use the four public tools. For clients that support additional MCP surfaces, unulu also exposes one optional prompt and one optional widget resource:

What you can build

Link-in-bio sites with:

Machine-readable docs

Claude tool-use examples

Three worked examples showing how Claude calls unulu tools via MCP.

1. Create a site

User: “Build a link-in-bio site for Alex Chen with GitHub and LinkedIn links.”

{
  "tool": "unulu_create_site",
  "input": {
    "name": "Alex Chen",
    "bio": "Full-stack developer. Open source contributor.",
    "links": [
      {
        "title": "GitHub",
        "url": "https://github.com/alexchen"
      },
      {
        "title": "LinkedIn",
        "url": "https://linkedin.com/in/alexchen"
      }
    ]
  }
}

Response:

{
  "site_id": "st_abc123",
  "url": "https://k7m2x.unu.lu",
  "expires_at": "2026-03-09T15:00:00Z",
  "assistant_message": "Your site is live at [k7m2x.unu.lu](https://k7m2x.unu.lu). It expires in 1 hour — claim it to keep it permanently.",
  "claim_token": "eyJ...",
  "claim_code_short": "A7K2-M9X4"
}

2. Update an existing site

User: “Add my portfolio link and switch to the gradient theme.”

Claude first calls unulu_get_state to read the current links, then sends the full updated list:

{
  "tool": "unulu_update_site",
  "input": {
    "site_id": "st_abc123",
    "skin_id": "midnight-gradient",
    "links": [
      {
        "title": "GitHub",
        "url": "https://github.com/alexchen"
      },
      {
        "title": "LinkedIn",
        "url": "https://linkedin.com/in/alexchen"
      },
      {
        "title": "Portfolio",
        "url": "https://alexchen.dev"
      }
    ],
    "claim_token": "eyJ..."
  }
}

3. Check handle availability

User: “Is the handle alexchen available?”

{
  "tool": "unulu_check_handle",
  "input": {
    "handle": "alexchen"
  }
}

Response:

{
  "available": true,
  "handle": "alexchen"
}

Troubleshooting

Support & policies

Live example

See a live site at unulu.unu.lu.

Back to unulu\u2122