Picsee Short Link
PicSee URL shortener with QR code generation, analytics charts, and link management via MCP Server. Use when the user asks to shorten a URL, generate QR code...
技能说明
name: picsee-short-link description: Shorten URLs using PicSee (pse.is). Stores API token in skills/picsee-short-link/config.json (optional). Use when the user asks to shorten a URL, create a short link, or mentions PicSee. Supports both unauthenticated mode (basic shortening) and authenticated mode (analytics, editing, search, custom thumbnails for Advanced plan users). metadata: { "openclaw": { "emoji": "🔗", "configPaths": ["skills/picsee-short-link/config.json"], "requires": { "bins": ["curl", "jq"] }, "externalApis": ["api.pics.ee", "chrome-ext.picsee.tw", "api.qrserver.com", "quickchart.io"], "writesPaths": ["/tmp/*.png", "skills/picsee-short-link/config.json"] } }
PicSee Short Link
Quick URL shortener with optional analytics.
Security & Scope
This skill performs the following operations:
File operations:
- Reads/writes
skills/picsee-short-link/config.json(stores API token in plaintext, optional) - Writes QR code images to
/tmp/<shortcode>.png(only if user requests QR) - Writes analytics charts to
/tmp/<encodeId>_analytics.png(only if user requests visualization)
Network operations:
- HTTPS API calls to
api.pics.ee(authenticated mode, PicSee API) - HTTPS API calls to
chrome-ext.picsee.tw(unauthenticated mode, PicSee API) - HTTPS API calls to
api.qrserver.com(QR code generation, optional) - HTTPS API calls to
quickchart.io(chart generation, optional)
Security notes:
- API token is stored in plaintext in workspace config file (not system-wide)
- All API calls use HTTPS
- No data is sent to third parties except PicSee API and user-requested QR/chart services
- Token is never logged or transmitted except to PicSee API
Scope: Core function is URL shortening. Analytics, QR codes, and charts are optional features that require explicit user request.
Fast Track: Shorten a URL
For 99% of requests, use this workflow:
-
Check config: Read
skills/picsee-short-link/config.json- If NOT exist → Go to First-Time Setup (see below)
- If exists → Check
statusfield and proceed
-
Call API:
-
Unauthenticated (no token):
curl -X POST https://chrome-ext.picsee.tw/v1/links \ -H "Content-Type: application/json" \ -d '{"url":"<LONG_URL>","domain":"pse.is","externalId":"openclaw"}' -
Authenticated (has token):
# Read token from config.json first TOKEN=$(jq -r '.apiToken' ~/.openclaw/workspace/skills/picsee-short-link/config.json) curl -X POST https://api.pics.ee/v1/links \ -H "Authorization: Bearer $TOKEN" \ -H "Content-Type: application/json" \ -d '{"url":"<LONG_URL>","domain":"pse.is","externalId":"openclaw"}'(Token stored in
config.json→apiTokenfield)
-
-
Display result (code block for easy copying):
https://pse.is/abc123Then ask user if they want a QR code? if user is unauthenticated, also ask if they want to add their API token for analytics/editing features.
-
QR code (ONLY if user explicitly asks):
curl -o /tmp/qrcode.png "https://api.qrserver.com/v1/create-qr-code/?size=300x300&data=<SHORT_URL>"Then send via
messagetool withfilePath:"/tmp/qrcode.png"
Done. No need to ask about analytics unless user requests them.
First-Time Setup (if no config exists)
Detection: Check if skills/picsee-short-link/config.json exists. If NOT exist → first-time user.
Ask user (explain features):
"Would you like to provide a PicSee API token to unlock advanced features? (y/n)
With token (authenticated mode), you can:
- View link analytics and daily click stats
- List your short links (filter by date range)
- Search short links
- Edit links (change destination URL) — Advanced plan only
- Customize thumbnails/titles — Advanced plan only
Without token (unauthenticated mode), you can:
- Create basic short links (no analytics)
To get your API token: Go to https://picsee.io/ → Click avatar (top-right) → Settings → API → Copy token"
If user says YES:
-
Wait for token (alphanumeric string, e.g.,
abc123def456...) -
Create
skills/picsee-short-link/config.json:{ "status": "authenticated", "apiToken": "<user_token>", "setupDate": "YYYY-MM-DD" } -
Verify token by calling API status:
TOKEN=$(jq -r '.apiToken' ~/.openclaw/workspace/skills/picsee-short-link/config.json) curl -X GET https://api.pics.ee/v2/my/api/status \ -H "Authorization: Bearer $TOKEN" -
Show user their plan tier (free/basic/advanced) and quota info.
If user says NO:
-
Create
skills/picsee-short-link/config.json:{ "status": "unauthenticated", "setupDate": "YYYY-MM-DD" } -
Explain: "You can create short links in unauthenticated mode. To unlock analytics/editing later, just ask me to add your API token."
Advanced Features (Authenticated Mode Only)
View Link Analytics
Extract encodeId from short URL (e.g., pse.is/abc123 → abc123), then:
TOKEN=$(jq -r '.apiToken' ~/.openclaw/workspace/skills/picsee-short-link/config.json)
curl -X GET "https://api.pics.ee/v1/links/<ENCODE_ID>/overview?dailyClicks=true" \
-H "Authorization: Bearer $TOKEN"
Response includes:
totalClicks,uniqueClicksdailyClicksarray (date + click counts)
Generate chart (if user asks for visualization):
- Extract daily clicks data from API response using jq
- Build QuickChart URL with chart config (line chart, total/unique clicks over time)
- Download chart image
Example:
# After getting API response, parse data and generate chart
ENCODE_ID="abc123"
TOKEN=$(jq -r '.apiToken' ~/.openclaw/workspace/skills/picsee-short-link/config.json)
# Fetch analytics
RESPONSE=$(curl -s -X GET "https://api.pics.ee/v1/links/$ENCODE_ID/overview?dailyClicks=true" \
-H "Authorization: Bearer $TOKEN")
# Parse dates and clicks (example - adjust based on actual response structure)
DATES=$(echo "$RESPONSE" | jq -r '.data.dailyClicks[].date' | jq -R -s -c 'split("\n")[:-1]')
TOTAL=$(echo "$RESPONSE" | jq -r '.data.dailyClicks[].totalClicks' | jq -s -c '.')
UNIQUE=$(echo "$RESPONSE" | jq -r '.data.dailyClicks[].uniqueClicks' | jq -s -c '.')
# Build QuickChart config (URL-encoded JSON)
CHART_CONFIG=$(cat <<EOF | jq -R -s -c '@uri'
{
"type": "line",
"data": {
"labels": $DATES,
"datasets": [
{
"label": "Total Clicks",
"data": $TOTAL,
"borderColor": "rgb(75, 192, 192)",
"fill": false
},
{
"label": "Unique Clicks",
"data": $UNIQUE,
"borderColor": "rgb(255, 99, 132)",
"fill": false
}
]
},
"options": {
"title": {
"display": true,
"text": "Link Analytics - $ENCODE_ID"
},
"scales": {
"yAxes": [{
"ticks": {
"beginAtZero": true
}
}]
}
}
}
EOF
)
# Download chart
curl -o "/tmp/${ENCODE_ID}_analytics.png" "https://quickchart.io/chart?c=$CHART_CONFIG"
- Send chart via
messagetool withfilePath: "/tmp/<encodeId>_analytics.png"
List Recent Links
TOKEN=$(jq -r '.apiToken' ~/.openclaw/workspace/skills/picsee-short-link/config.json)
curl -X POST "https://api.pics.ee/v2/links/overview?isAPI=false&limit=50&startTime=<ISO8601_DATE>" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json"
Date format: YYYY-MM-DDTHH:MM:SS (no timezone suffix)
⚠️ IMPORTANT: startTime Parameter Behavior
The startTime parameter FILTERS results backwards from that timestamp. It returns links created on or before the specified date, in reverse chronological order (newest first).
Examples:
-
To query December 2025:
- Use:
startTime=2025-12-31T23:59:59(last day of month, not first!) - This returns all links up to Dec 31, including Dec 1–31
- Use:
-
To query a specific month:
- Use the LAST DAY of that month at
23:59:59 - December →
2025-12-31T23:59:59 - January →
2026-01-31T23:59:59
- Use the LAST DAY of that month at
-
To query a specific date range:
- Use
startTime= end date of range - Combine with
limitto control how many results returned - Adjust limit if you need older entries
- Use
Common mistake: Using the first day of a month will miss data from that month.
Check Plan Tier
TOKEN=$(jq -r '.apiToken' ~/.openclaw/workspace/skills/picsee-short-link/config.json)
curl -X GET https://api.pics.ee/v2/my/api/status \
-H "Authorization: Bearer $TOKEN"
Plan values: "free", "basic", "advanced"
Feature restrictions:
- Free/Basic: Create links, view analytics, list links
- Advanced only: Edit links, custom thumbnails/titles, UTM params, tracking pixels
Edit Short Link (Advanced plan only)
TOKEN=$(jq -r '.apiToken' ~/.openclaw/workspace/skills/picsee-short-link/config.json)
curl -X PUT https://api.pics.ee/v2/links/<ENCODE_ID> \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"url":"<NEW_DESTINATION_URL>"}'
If user is NOT on Advanced plan: Block and suggest creating a new link instead.
Delete Short Link
TOKEN=$(jq -r '.apiToken' ~/.openclaw/workspace/skills/picsee-short-link/config.json)
curl -X POST https://api.pics.ee/v2/links/<ENCODE_ID>/delete \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"value":"delete"}'
(Use "recover" to restore)
Mode Summary
| Mode | Base URL | Auth Required | Features |
|---|---|---|---|
| Unauthenticated | chrome-ext.picsee.tw | No | Create links only |
| Authenticated | api.pics.ee | Yes | Create + analytics + list + edit (plan-dependent) |
Default: Unauthenticated (fastest, no setup).
Output Guidelines
- Short URLs: Always in code blocks for easy copying
- Language: All responses in user's language
- No jargon: Avoid "API call", "endpoint", "JSON" in user-facing messages
- Charts: English labels, professional styling, save to
/tmp/and send viamessagetool
Quick Reference
Token location: skills/picsee-short-link/config.json → apiToken field
Config location: skills/picsee-short-link/config.json
Default domain: pse.is
externalId: Always openclaw
Error Handling
- Unauthenticated mode + user requests analytics: Reply: "This feature requires login. Provide your PicSee API token to unlock it."
- Non-Advanced plan + user requests edit: Reply: "Editing links requires the Advanced plan. You can create a new link instead."
- Invalid token: Reply: "Invalid API token. Get a new one from https://picsee.io/ → Settings → API"
如何使用「Picsee Short Link」?
- 打开小龙虾AI(Web 或 iOS App)
- 点击上方「立即使用」按钮,或在对话框中输入任务描述
- 小龙虾AI 会自动匹配并调用「Picsee Short Link」技能完成任务
- 结果即时呈现,支持继续对话优化