unulu
Server Details
AI agent website builder. Create and publish link-in-bio sites via MCP or REST API.
- Status
- Healthy
- Uptime
- 100.0% over 38 days
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-03-26
- URL
- Repository
- unulu-ai/unulu
- GitHub Stars
- 2
- Server Listing
- unulu
TDQS
Scored across 4 tools
Each tool has a clearly distinct purpose: check_handle verifies availability, create_site provisions a new site, get_state reads, and update_site mutates. The only minor overlap (update_site returns the full state like get_state) is explicitly framed as complementary, with update_site directing callers to get_state first.
All four tools follow the same unulu_verb_noun snake_case pattern (check_handle, create_site, get_state, update_site). The noun varies with the resource each acts on, but the convention is uniform and predictable.
Four tools is slightly lean for a site-management service, but each earns its place across the check/create/read/update lifecycle. Nothing is redundant, though the surface leaves little room for deletion or listing multiple sites.
Create, read, and update are fully covered, including the handle-availability pre-check and token-based auth for pre- and post-claim states. The notable gap is a delete/expire operation, which agents cannot perform directly.
Available Tools
4 toolsunulu_check_handleCheck handle availabilityARead-onlyInspect
Check whether a handle is available on unu.lu (not other platforms like Instagram, TikTok, etc.). For example, checking 'joe' tells you if joe.unu.lu is available for claiming. Use this to help users choose a handle before they visit the claim page.
| Name | Required | Description | Default |
|---|---|---|---|
| handle | Yes | The handle to check (3-30 chars, alphanumeric + hyphens) |
Output Schema
| Name | Required | Description |
|---|---|---|
| handle | Yes | |
| available | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare readOnlyHint=true and destructiveHint=false, so the safe read-only nature is known. The description adds valuable context beyond annotations by specifying the domain (unu.lu), providing an example that demonstrates the mapping to a subdomain, and mentioning that it checks availability for claiming. No contradictions detected.
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 description is three sentences, each serving a distinct purpose: state the core function, give a concrete example, and provide usage context. It is front-loaded with the main action and contains no redundant or filler content.
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 simple tool with one parameter and an output schema, the description fully covers what the tool does, how to use it, and why. The example and usage guidance make it complete. The output schema handles return details, so no further explanation is needed.
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?
The input schema already documents the handle parameter with constraints, achieving 100% coverage. The description adds semantic meaning by explaining that checking 'joe' tells you if joe.unu.lu is available, clarifying the domain format and the intent of the parameter beyond the schema's simple 'handle to check'.
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?
The description uses a specific verb 'Check' and identifies the exact resource: handle availability on unu.lu. It distinguishes itself from siblings by explicitly noting 'not other platforms like Instagram, TikTok, etc.' and provides a concrete example ('joe' -> joe.unu.lu), making the purpose immediately clear.
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?
The description states when to use the tool: 'Use this to help users choose a handle before they visit the claim page.' It also clarifies the scope, explicitly excluding other platforms, which prevents misuse. This is direct usage guidance without needing to reference sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
unulu_create_siteCreate a link-in-bio siteAInspect
Create a link-in-bio site with a name, bio, and links. Returns a live URL on unu.lu that expires in 1 hour unless claimed. Do NOT call until you have at least a name and one link from the user — gather real content first, never create with placeholder or empty content. If the user provides a handle (e.g. '_guy.a' for Instagram), construct the full URL yourself — do not ask them to paste it. When feasible, offer to find all public links for the person. Before calling: tell the user they can choose a skin on the preview page for the overall aesthetic; ask permission before adding emoji leading_icons to decorate links (for not-well-known social URLs). The response includes an assistant_message with the site URL and claim details — present these to the user. Persist claim_token and claim_code_short for subsequent updates — never ask the user for them back in the same conversation. Never create a duplicate site; always update the existing one. After creation: tell the user they can pick a custom handle when they claim; share the preview URL in a copy-paste block; offer to refine bio, links, or ordering. Keep iteration fast — apply changes immediately, don't re-confirm minor edits.
| Name | Required | Description | Default |
|---|---|---|---|
| bio | No | Short bio in first person, 1–3 sentences, capturing what's distinctive — no filler phrases like 'passionate about' or 'dedicated to'. If you lack context, write something short and honest rather than generic. Supports markdown. | |
| name | Yes | Display name / heading for the site | |
| links | No | Link-in-bio links. Order matters — place the most important link first. Well-known social links display branded icons automatically — omit leading_icon for these. | |
| skin_id | No | Optional theme skin. When omitted, the live site includes a visual theme chooser — prefer omitting so the user can pick their own. |
Output Schema
| Name | Required | Description |
|---|---|---|
| url | Yes | Live URL on unu.lu — always present as a clickable markdown link when showing to the user |
| site_id | Yes | Unique site identifier |
| expires_at | Yes | ISO 8601 expiry timestamp (~1 hour from creation) |
| claim_token | No | HMAC token for updating ephemeral (pre-claim) sites via updateSite. Present when the site is unclaimed. |
| claim_code_short | No | Backup code (XXXX-XXXX) for claiming the site via the short-code flow |
| assistant_message | Yes | Pre-formatted message with the live site link, expiry notice, and short-code claim instructions. Share with the user as-is — do not paraphrase or restructure. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond annotations, discloses expiration behavior (expires in 1 hour unless claimed), response contents (assistant_message with URL and claim details), token persistence requirements (persist claim_token and claim_code_short), and duplicate handling (always update existing). No contradiction with annotations; openWorldHint aligns with the live URL behavior.
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?
Long but packed with actionable guidance; front-loads the core action ('Create a link-in-bio site...') and then provides ordered pre- and post-steps. Slightly verbose, but every instruction serves a purpose and is structured logically.
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?
Comprehensive coverage of preconditions, creation flow, follow-up actions, and state persistence. With an output schema present and detailed annotations, this description fully equips the agent to execute correctly without requiring external knowledge.
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 already describes all parameters (100% coverage), but description adds important usage semantics: how to construct URLs from handles, when to omit leading_icon for well-known social links, and permission requirement for emoji icons. This goes beyond the schema's technical descriptions.
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?
Clearly states 'Create a link-in-bio site with a name, bio, and links' and specifies the unique output (live URL on unu.lu expiring in 1 hour). Distinguishes from siblings by noting duplicate-avoidance via updating existing sites.
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?
Provides explicit preconditions ('Do NOT call until you have at least a name and one link'), alternatives (construct full URL yourself vs asking user), and workflow (offer to find links, ask permission for icons). Also states 'Never create a duplicate site; always update the existing one', implying when to use the update path instead.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
unulu_get_stateGet site stateARead-onlyInspect
Returns the current state of a site including its name, bio, links, and URL. No authentication required. If expires_at is absent, the site has been claimed and is permanent. Accepts a site ID, a full URL (e.g. https://abc123.unu.lu), or a bare hostname (e.g. abc123.unu.lu).
| Name | Required | Description | Default |
|---|---|---|---|
| site_id | Yes | Site ID, full URL (e.g. https://abc123.unu.lu), or bare hostname (e.g. abc123.unu.lu) |
Output Schema
| Name | Required | Description |
|---|---|---|
| bio | No | |
| url | Yes | |
| name | Yes | |
| links | Yes | |
| site_id | Yes | |
| skin_id | No | |
| expires_at | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false. The description adds valuable context: 'No authentication required' and the expires_at semantics for claimed vs. permanent sites, going beyond structured data.
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?
Two sentences, front-loaded with the core function, followed by essential details. Every sentence earns its place with no redundancy or 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?
Given the output schema exists, the description need not explain return values. It covers input flexibility, authentication, and the expires_at behavioral nuance, making it complete for a simple read 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% and already describes the site_id formats. The description repeats these formats without adding additional semantic meaning beyond what the schema provides, so baseline 3 is 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?
The description states a specific verb ('Returns') and resource ('current state of a site'), listing key fields and input formats. It clearly distinguishes from siblings (create/update/check_handle) as a read-only retrieval tool.
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?
The description implies usage context: retrieving site state with flexible input forms and no auth. It doesn't explicitly name alternatives or exclusions, but the read vs. write distinction is clear from sibling names and the description.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
unulu_update_siteUpdate a siteADestructiveInspect
Update an existing site. All fields are optional — only provided fields are changed. Links replace the entire array (omit to keep existing). Before updating, always call unulu_get_state first to read the current links and their ids — do not guess link ids. Authorization depends on site lifecycle: X-Claim-Token header for ephemeral (pre-claim) sites, X-Edit-Token header for claimed (post-claim) sites. If neither token is available and the site is claimed, use requestEditAccess to obtain an edit_token. If you created the site in this conversation, you already have the claim_token — use it directly. Returns the full updated site state. Keep iteration fast — apply changes immediately without re-confirming minor edits unless ambiguous. Accepts a site ID, a full URL (e.g. https://abc123.unu.lu), or a bare hostname (e.g. abc123.unu.lu).
| Name | Required | Description | Default |
|---|---|---|---|
| bio | No | Short bio in first person, 1–3 sentences, capturing what's distinctive — no filler phrases like 'passionate about' or 'dedicated to'. If you lack context, write something short and honest rather than generic. Supports markdown. | |
| name | No | Display name / heading for the site | |
| links | No | Replaces all links — omit to keep existing links unchanged. Order matters — place the most important link first. Well-known social links display branded icons automatically — omit leading_icon for these. | |
| site_id | Yes | Site ID, full URL (e.g. https://abc123.unu.lu), or bare hostname (e.g. abc123.unu.lu) | |
| skin_id | No | Optional theme skin. When omitted, the live site includes a visual theme chooser — prefer omitting so the user can pick their own. | |
| claim_url | No | Legacy parameter — accepts a full Claim URL from older create-site responses. The server extracts the claim_token automatically. Prefer claim_token directly. | |
| edit_token | No | JWT token for claimed sites (alternative to X-Edit-Token header) | |
| claim_token | No | HMAC token for ephemeral sites (alternative to X-Claim-Token header) |
Output Schema
| Name | Required | Description |
|---|---|---|
| bio | No | |
| url | Yes | |
| name | Yes | |
| links | Yes | |
| site_id | Yes | |
| skin_id | No | |
| expires_at | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses key behaviors beyond annotations: partial update semantics ('only provided fields are changed'), the destructive nature of links replacement ('Links replace the entire array'), authorization requirements, and return value (full updated site state). It complements the annotations without contradiction.
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 description is well-organized and front-loaded with the core purpose. Each sentence adds operational value (preconditions, auth, replacement behavior, iteration guidance) without unnecessary filler. It is appropriately sized for the tool's complexity.
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 all essential operational aspects: purpose, prerequisites, authorization, destructive details, return value, and identifier formats. With an output schema present, it doesn't need to explain return structure. It is complete for a complex update 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 description coverage is 100%, so the baseline is 3. The description adds some useful context (e.g., site_id accepts URL/hostname, token alternatives), but largely reiterates schema descriptions. The mention of 'link ids' is not reflected in the schema's link item properties, which creates slight ambiguity.
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?
The description clearly states the verb and resource: 'Update an existing site.' It distinguishes from sibling tools (unulu_create_site, unulu_get_state, unulu_check_handle) by focusing on modification and providing update-specific guidance.
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?
It gives explicit when-to-use instructions, including always calling unulu_get_state first to avoid guessing link ids, and details the authorization workflow depending on lifecycle (X-Claim-Token vs X-Edit-Token), with a clear fallback to requestEditAccess. This is strong practical guidance.
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.
1 tool update
- Changed
unulu_create_site1 field changed- changed
Output schema / properties / expires_at / descriptionPrevious value: -"ISO 8601 expiry timestamp (~3 hours from creation)"New value: +"ISO 8601 expiry timestamp (~1 hour from creation)"
3 tool updates
- Removed
unulu_delete_site - Removed
unulu_freeze_site - Removed
unulu_unfreeze_site
7 tool updates
- First observed
unulu_check_handle - First observed
unulu_create_site - First observed
unulu_delete_site - First observed
unulu_freeze_site - First observed
unulu_get_state - First observed
unulu_unfreeze_site - First observed
unulu_update_site
Related MCP Connectors
The website platform for AI agents. One API to build, host, and operate real websites.
Build, edit, host, and publish websites from AI assistants. Setup: https://mcp.orivox.org/
Deploy AI-generated HTML/CSS/JS to instant public HTTPS URLs from any MCP-compatible agent.
Build and publish websites through AI conversation.
Related MCP Servers
- AlicenseAqualityDmaintenanceGenerate styled QR codes, manage dynamic short links with click analytics, and publish micro-landing pages via AI agents.1933 npm1MIT
- AlicenseAqualityCmaintenanceEnables AI agents to build, edit, and publish live websites with hosting, database, auth, and domains via the Model Context Protocol.136 npm1MIT
- AlicenseAqualityAmaintenanceSimple and free publishing of content on the web for AI Agents25,887 npmMIT
- AlicenseNot gradedqualityDmaintenanceEnables AI agents to create and manage owned-audience websites with posts, products, subscribers, domains, and analytics.67 npmMIT
Glama MCP Gateway
Add one secure layer between your agents and this server.