---
name: manage-liinks-profile
description: Read and edit a Liinks link-in-bio profile (blocks, styles, socials), poll its audience data, and report its analytics, via the Liinks MCP server or REST API.
---

# Manage a Liinks profile

## When to use

Use this skill when a user asks you to change or read their Liinks page: add/edit/remove links or text blocks, restyle the theme, update bio/socials, check new form submissions or subscribers, report how the page performed (views, clicks, top links, traffic sources), or confirm what the live page looks like.

## Setup

1. If your client supports OAuth, just add the MCP server URL: the user logs in and approves a consent screen, no key needed. Otherwise the user creates an API key in the Liinks dashboard: Admin → Settings → API Keys (any account, no plan required).
2. Preferred: connect the MCP server at `https://www.liinks.co/api/mcp` (Streamable HTTP) with header `Authorization: Bearer liinks_live_<token>`. Tools: `list_profiles`, `get_profile`, `update_profile`, `set_styles`, `set_socials`, `add_block`, `update_block`, `remove_block`, `reorder_blocks`, `list_form_submissions`, `list_subscribers`, `get_analytics`, `get_analytics_breakdown`, `screenshot_profile`.
3. Alternative: call the REST API at `https://www.liinks.co/api/v1` with the same header. Spec: `https://www.liinks.co/api/openapi.json`.

## Working rules

- Terminology: an *account* owns login and billing; a *profile* is the identity you manage; its *page* is the public site (liinks.co/slug); a *tab* is a content section within that page, including Home. Pro supports multiple profiles, each with its own page. The legacy API names `pages`, `pageId`, and `/pages` still refer to tabs.
- Always list profiles first (`list_profiles` / `GET /profiles`) and operate on a returned id.
- Read before writing (`get_profile`) — updates are partial, and reorders must include every block id on the tab.
- `set_socials` replaces the whole social row: send the complete new list, never just the additions.
- Deletes are permanent. To take something down temporarily, hide it: `update_block` with `{ "hidden": true }`.
- After visual changes, verify with `screenshot_profile` and describe the result to the user.
- For performance questions, `get_analytics` (default: last 30 days; pass `start` for "this week") already ranks blocks by clicks and includes a previous-period comparison — report the headline numbers and the top and bottom blocks, then offer a concrete change. `ctr` and `engagement` are fractions.
- Errors come back as `{ "error": { "code", "message", "details?" } }`; on `validation_error` read `details.issues` and self-correct. On `rate_limited`, wait `details.retryAfterSeconds`.

Questions or issues: hello@liinks.co
