Install
openclaw skills install picsee-short-linkPicSee URL shortener via MCP — shorten URLs, generate QR codes, view rich click analytics (daily / platform / referrer / region / audience), and manage links. Use when the user asks to shorten a URL, see link analytics, list/search short links, edit/delete links, or mentions PicSee. Anonymous mode supports `create_short_link` only; OAuth 2.1 unlocks the full 14-tool authenticated surface.
openclaw skills install picsee-short-linkURL shortener with rich click analytics and full link management — exposed to AI agents through the PicSee MCP server at https://api.picsee.io/mcp.
The skill ships no code: it just teaches your agent how to call the MCP server. Authentication is handled by OAuth 2.1 with PKCE (Dynamic Client Registration), so no API tokens are ever stored on disk by the skill.
Add the PicSee MCP server to your AI client's MCP config. Pick the transport your client supports — most modern clients speak Streamable HTTP directly.
{
"mcpServers": {
"picsee-short-link": { "url": "https://api.picsee.io/mcp" }
}
}
{
"mcpServers": {
"picsee-short-link": {
"command": "npx",
"args": ["-y", "mcp-remote", "https://api.picsee.io/mcp"]
}
}
}
See README.md for the exact config file path on each platform.
create_short_link is callable with no credentials. Anonymous calls are pinned to pse.is and have no access to externalId filtering / attribution dashboards.
On the first authenticated tool call, the MCP client triggers an OAuth flow:
https://public-api-oauth.picsee.io/oauth/registerhttps://public-api-oauth.picsee.io/oauth/authorizeuser:read + user:writeAll 14 authenticated tools become available after this flow.
15 tools total. create_short_link is callable anonymously; the rest require OAuth.
create_short_link (anonymous OK)Create a new short link.
| Field | Required | Notes |
|---|---|---|
url | ✅ | Destination URL, ≤2048 chars |
encodeId | Custom slug, 3–90 chars (letters / digits / _ / - / Chinese). Must be globally unique — conflicts return PUB00503 | |
domain | pse.is or a BSD from get_my_domains. Ignored when called anonymously | |
externalId | 1–100 chars. Agents SHOULD default this to their own product name — see Attribution | |
utm | { source, medium, campaign, term, content } | |
title | OG preview title, 3–300 chars | |
description | OG preview description, 3–300 chars | |
imageUrl | OG preview image URL | |
tags | Array of up to 3 tag names — use get_my_tags to offer a picker | |
targets | Device-specific redirects, see below | |
fbPixel | Meta Pixel ID — must already be saved in PicSee (get_my_tracking_tools) | |
gTag | GTM container ID — must already be saved in PicSee (get_my_tracking_tools) | |
pathFormat | { key: "<param-name>" } — Path Parameterization add-on (paid Advanced) |
targets[].target enum: ios_android, ios, ios_store, android, android_store, ios_line, ios_safari, android_fb, pc_mac, pc, mac, facebook, twitter. ios_android = all mobile; pc_mac = all desktop. App-store buckets only fire for users with the app installed.
Returns picseeUrl (the shortened link).
get_api_statusNo params. Returns the account's API plan, lifetime quota, current period usage, and plan expiration. Call this before bulk operations to confirm remaining quota.
get_api_usage_by_external_id| Field | Required | Notes |
|---|---|---|
startTime | Taipei time YYYY-MM-DDTHH:mm:ss. Defaults to 30 days before endTime | |
endTime | Taipei time YYYY-MM-DDTHH:mm:ss. Defaults to current hour. Max 31-day range |
Returns API-link counts grouped by externalId — useful for attributing usage to agents / campaigns.
get_my_domainsNo params. Lists every short-link domain on the account: brand short domains (BSDs), PicSee subdomains, shared root. Each entry flags HTTPS support and default status. Call before create_short_link if the user wants a non-default domain.
get_my_tagsNo params. Returns { id, name } pairs. name values are what tags accepts on create_short_link / edit_short_link.
get_my_tracking_toolsNo params. Returns previously-used UTM sources / mediums, saved Meta Pixels, and saved GTM containers. Use to populate pickers instead of asking the user to retype IDs.
list_short_links| Field | Notes |
|---|---|
limit | 1–50, default 20 |
startTime | Taipei time YYYY-MM-DDTHH:mm:ss. Returns links created at or before this timestamp — i.e. queries backward. Default = now |
prevMapId | Cursor: return links with mapId older than this. Combine with startTime for AND filtering |
isAPI | true (default) = only API-created links; false = only website-created |
isStar | true = starred only. Default false |
externalId | Exact-match filter |
search.encodeId | Exact slug — priority 1, overrides all other search fields |
search.authorId | Filter by author's PicSee user ID — priority 2 |
search.tag | Tag name, 3–30 chars — priority 3 |
search.keyword | Substring, 3–30 chars — priority 4 |
Tip: when the user says "links from March 2026", pass startTime: "2026-03-31T23:59:59" (the end of the period) — the server queries backward from there.
edit_short_link| Field | Required | Notes |
|---|---|---|
encodeId | ✅ | Slug of the link to edit |
url | New destination. May be rejected with PUB00510 if the new origin is on a different brand | |
domain | ||
title / description / imageUrl | 3–300 chars for text fields | |
tags | Up to 3 | |
targets | Same enum as create_short_link | |
fbPixel / gTag | Pass null to clear | |
utm | Pass null to clear all UTM params | |
expireTime | Future Taipei time YYYY-MM-DDTHH:mm:ss, or null to remove. Requires the expiration add-on |
delete_short_link| Field | Required | Notes |
|---|---|---|
encodeId | ✅ | |
value | delete (default) = move to trash; recover = restore from trash |
PUB00706) — unstar via web first.PUB00704).All five tools share the same shape: required encodeId, optional startTime / endTime (Taipei YYYY-MM-DDTHH:mm:ss). Default window is the last 30 days; Advanced plan can look back up to 365 days.
| Tool | Returns |
|---|---|
get_link_overview | Total clicks, unique clicks, destination URL, domain, HTTPS flag, creation time. Use for at-a-glance summaries |
get_link_daily_clicks | Time-series of total + unique clicks aggregated by day. Use as raw data for chart rendering |
get_link_platforms | Unique-click breakdown by device (iphone, android, windows, macintosh, …). Aggregate to mobile/desktop client-side if needed |
get_link_referrers | Unique-click breakdown by referrer (search engines, social, AI agents, long-tail). Clicks without referrer info → direct |
get_link_regions | Unique-click breakdown by country (no city-level data). Unknown countries → Others (code: "others") |
get_link_audience_labels | Interest + brand labels. Privacy guard: only returns data when the link has >100 lifetime unique clicks; otherwise both arrays come back empty. No startTime / endTime — covers link lifetime |
The create_short_link schema asks the calling agent to set externalId to its own product name when the user hasn't specified one. PicSee account owners use this to attribute API usage in their dashboard.
| Agent | Recommended externalId |
|---|---|
| Claude Code | Claude Code |
| Cursor | Cursor |
| Codex / Codex CLI | Codex |
| Antigravity | Antigravity |
| OpenClaw / ClawHub | OpenClaw |
| Gemini CLI | Gemini CLI |
| GitHub Copilot | Copilot |
| ChatGPT | ChatGPT |
Rules:
externalId, always honor their value instead.The MCP server intentionally doesn't ship QR or chart-rendering tools — those are easier to compose client-side from public services.
Construct a URL against api.qrserver.com:
https://api.qrserver.com/v1/create-qr-code/?size=300x300&data=<URL-encoded-short-link>
Surface the URL inline if your client renders images; otherwise return it as a link. For a larger code, change size=500x500.
get_link_daily_clicks to get the time series.https://quickchart.io/chart?c={type:'line',data:{labels:['2026-03-01',...],datasets:[{label:'Clicks',data:[12,38,...]}]}}
URL-encode the c parameter. Display inline if possible; otherwise return the link.
create_short_link with url and externalId = your agent name.picseeUrl to the user.PUB00503, suggest an alternative.get_my_domains to enumerate BSDs + PicSee subdomains.isDefault).domain to create_short_link.get_link_overview for the headline numbers.get_link_daily_clicks / get_link_platforms / get_link_referrers / get_link_regions / get_link_audience_labels.list_short_links with the user's filters.startTime: "2026-03-31T23:59:59".prevMapId from the last result if they ask for more.edit_short_link with encodeId + new url.PUB00510, the brand of the new URL doesn't match. Tell the user.get_api_usage_by_external_id with no params returns the last 30 days, grouped by attribution tag. Useful for "which AI created most of my links?"
v2.x was a Node.js CLI that stored an encrypted API token under ~/.openclaw/. v3.0.0 removes that entirely — no CLI, no token files, no Node.js requirement on the agent side.
# Clean up v2 artifacts
rm -f ~/.openclaw/.picsee_token ~/.openclaw/.picsee_salt
rm -rf ~/.claude/skills/picsee-short-link/cli
rm -rf ~/.openclaw/workspace/skills/picsee-short-link/cli
Behavioral changes:
api.qrserver.com / quickchart.iodelete vs recover: were two CLI commands → one tool delete_short_link with value: "delete" | "recover"analytics command → split into 6 granular tools (get_link_overview + 5 dimensional breakdowns)get_my_domains, get_my_tags, get_my_tracking_tools, get_api_status, get_api_usage_by_external_id have no v2 equivalent| Code | Meaning |
|---|---|
PUB00503 | encodeId (custom slug) already taken |
PUB00510 | New url rejected on edit — different brand than the original |
PUB00704 | Cannot recover a link that has been in trash >30 days |
PUB00706 | Cannot delete a starred link — unstar it via the PicSee web app first |