abdulmejidshemsuawel/postsyncer/SKILL.md
Manages social media through PostSyncer using REST and/or MCP. Use when scheduling, posting, or managing content across Instagram, TikTok, YouTube, X (Twitter), LinkedIn, Facebook, Threads, Bluesky, Pinterest, Telegram, Mastodon. Covers posts, media library (list, import URLs, delete, multipart file upload), media folders (CRUD), comments with optional `media` attachments, labels, campaigns, and analytics. Accounts must be pre-connected in the PostSyncer app.
npx skillsauth add openclaw/skills postsyncer-social-media-assistantInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Autonomously manage social media through PostSyncer using the REST API.
workspaces, accounts, posts, and (if you use them) labels, campaigns.env: POSTSYNCER_API_TOKEN=your_tokenPostSyncer MCP uses the same Bearer token as REST. Typical tools: list-workspaces, list-accounts, post CRUD, list-media, get-media, upload-media-from-url, delete-media, list-folders, create-folder, get-folder, update-folder, delete-folder, comments, labels, campaigns, analytics.
Multipart file upload is only via REST: POST /api/v1/media/upload/file (not exposed as an MCP tool). Use upload-media-from-url or REST URL import when the client cannot send multipart.
All requests go to https://postsyncer.com/api/v1 with the header:
Authorization: Bearer $POSTSYNCER_API_TOKEN
Content-Type: application/json
Use web_fetch, curl, or any HTTP tool available. Always read $POSTSYNCER_API_TOKEN from the environment.
List Workspaces — GET /api/v1/workspaces
curl "https://postsyncer.com/api/v1/workspaces" \
-H "Authorization: Bearer $POSTSYNCER_API_TOKEN"
Returns workspaces with id, name, slug, timezone.
List Accounts — GET /api/v1/accounts
curl "https://postsyncer.com/api/v1/accounts" \
-H "Authorization: Bearer $POSTSYNCER_API_TOKEN"
Returns accounts with id, platform, username, workspace_id.
Requires the posts ability. Responses include id, workspace_id, folder_id, and asset metadata.
List Media — GET /api/v1/media
curl -G "https://postsyncer.com/api/v1/media" \
--data-urlencode "workspace_id=12" \
--data-urlencode "page=1" \
--data-urlencode "per_page=50" \
-H "Authorization: Bearer $POSTSYNCER_API_TOKEN"
Query params: workspace_id, folder_id, root_only (true/false), page, per_page (max 100).
Get Media — GET /api/v1/media/{media_id}
curl "https://postsyncer.com/api/v1/media/999" \
-H "Authorization: Bearer $POSTSYNCER_API_TOKEN"
Import from URLs — POST /api/v1/media/upload/url
curl -X POST "https://postsyncer.com/api/v1/media/upload/url" \
-H "Authorization: Bearer $POSTSYNCER_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{"workspace_id": 12, "urls": ["https://example.com/photo.jpg"], "folder_id": null}'
Upload file (multipart) — POST /api/v1/media/upload/file
Use multipart/form-data with fields such as workspace_id, file (and optional chunk/chunk metadata if your client uses chunked upload). Not JSON.
Delete Media — DELETE /api/v1/media/{media_id} (confirm first)
curl -X DELETE "https://postsyncer.com/api/v1/media/999" \
-H "Authorization: Bearer $POSTSYNCER_API_TOKEN"
Requires the posts ability.
List Folders — GET /api/v1/folders
curl -G "https://postsyncer.com/api/v1/folders" \
--data-urlencode "workspace_id=12" \
--data-urlencode "root=1" \
-H "Authorization: Bearer $POSTSYNCER_API_TOKEN"
Query params: workspace_id, parent_id, root (top-level only).
Create Folder — POST /api/v1/folders
curl -X POST "https://postsyncer.com/api/v1/folders" \
-H "Authorization: Bearer $POSTSYNCER_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{"workspace_id": 12, "name": "Campaign assets", "color": "#3b82f6", "parent_id": null}'
Get Folder — GET /api/v1/folders/{id}
Update Folder — PUT /api/v1/folders/{id}
curl -X PUT "https://postsyncer.com/api/v1/folders/5" \
-H "Authorization: Bearer $POSTSYNCER_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{"name": "Renamed folder"}'
Delete Folder — DELETE /api/v1/folders/{id} (confirm first)
List Posts — GET /api/v1/posts
curl "https://postsyncer.com/api/v1/posts?page=1&per_page=20&include_comments=false" \
-H "Authorization: Bearer $POSTSYNCER_API_TOKEN"
Query params: page, per_page (max 100), include_comments (true/false).
Get Post — GET /api/v1/posts/{id}
curl "https://postsyncer.com/api/v1/posts/123" \
-H "Authorization: Bearer $POSTSYNCER_API_TOKEN"
Create Post — POST /api/v1/posts
curl -X POST "https://postsyncer.com/api/v1/posts" \
-H "Authorization: Bearer $POSTSYNCER_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"workspace_id": 12,
"schedule_type": "schedule",
"content": [{"text": "Caption #hashtags", "media": [42, "https://example.com/image.jpg"]}],
"accounts": [{"id": 136}, {"id": 95, "settings": {"board_id": 123}}],
"schedule_for": {"date": "2026-03-26", "time": "14:30", "timezone": "America/New_York"},
"labels": [5],
"repeatable": false
}'
schedule_type: publish_now | schedule | draftschedule_for: Required when schedule_type is schedule. Date YYYY-MM-DD, time HH:MMcontent: Array of thread items. Each needs text and/or media: an array of library media IDs (integers) and/or HTTPS URL strings (import or list media first when you want stable IDs)accounts: Array of {id, settings?}. Platform-specific options go in settingsUpdate Post — PUT /api/v1/posts/{id}
curl -X PUT "https://postsyncer.com/api/v1/posts/123" \
-H "Authorization: Bearer $POSTSYNCER_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{"content": [{"text": "Updated caption"}], "schedule_for": {"date": "2026-03-27", "time": "10:00"}}'
Only posts that have not been published yet can be updated.
Delete Post — DELETE /api/v1/posts/{id} (confirm with user first)
curl -X DELETE "https://postsyncer.com/api/v1/posts/123" \
-H "Authorization: Bearer $POSTSYNCER_API_TOKEN"
List Comments — GET /api/v1/comments
curl -G "https://postsyncer.com/api/v1/comments" \
--data-urlencode "post_id=123" \
--data-urlencode "per_page=20" \
--data-urlencode "include_replies=true" \
-H "Authorization: Bearer $POSTSYNCER_API_TOKEN"
Query params: post_id (required), per_page, page, include_replies, platform.
Get Comment — GET /api/v1/comments/{id}
curl "https://postsyncer.com/api/v1/comments/456" \
-H "Authorization: Bearer $POSTSYNCER_API_TOKEN"
Create Comment / Reply — POST /api/v1/comments
curl -X POST "https://postsyncer.com/api/v1/comments" \
-H "Authorization: Bearer $POSTSYNCER_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{"post_id": 123, "content": "Reply text", "parent_comment_id": null, "media": [42]}'
Optional media: array of integer library IDs and/or HTTPS URLs (same shape as post content[].media; do not use a deprecated media_urls field).
Update Comment — PUT /api/v1/comments/{id}
curl -X PUT "https://postsyncer.com/api/v1/comments/456" \
-H "Authorization: Bearer $POSTSYNCER_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{"content": "Updated reply text"}'
Hide Comment — POST /api/v1/comments/{id}/hide
curl -X POST "https://postsyncer.com/api/v1/comments/456/hide" \
-H "Authorization: Bearer $POSTSYNCER_API_TOKEN"
Delete Comment — DELETE /api/v1/comments/{id} (confirm first)
curl -X DELETE "https://postsyncer.com/api/v1/comments/456" \
-H "Authorization: Bearer $POSTSYNCER_API_TOKEN"
Sync Comments from Platforms — POST /api/v1/comments/sync
curl -X POST "https://postsyncer.com/api/v1/comments/sync" \
-H "Authorization: Bearer $POSTSYNCER_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{"post_id": 123}'
List Labels — GET /api/v1/labels
curl "https://postsyncer.com/api/v1/labels" \
-H "Authorization: Bearer $POSTSYNCER_API_TOKEN"
Get Label — GET /api/v1/labels/{id}
Create Label — POST /api/v1/labels
curl -X POST "https://postsyncer.com/api/v1/labels" \
-H "Authorization: Bearer $POSTSYNCER_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{"name": "Campaign 2026", "color": "#3b82f6", "workspace_id": 12}'
Update Label — PUT /api/v1/labels/{id}
Delete Label — DELETE /api/v1/labels/{id} (confirm first)
All analytics endpoints require the posts API ability.
All Workspaces — GET /api/v1/analytics
curl "https://postsyncer.com/api/v1/analytics" \
-H "Authorization: Bearer $POSTSYNCER_API_TOKEN"
By Workspace — GET /api/v1/analytics/workspaces/{workspace_id}
curl "https://postsyncer.com/api/v1/analytics/workspaces/12" \
-H "Authorization: Bearer $POSTSYNCER_API_TOKEN"
By Post — GET /api/v1/analytics/posts/{post_id}
curl "https://postsyncer.com/api/v1/analytics/posts/123" \
-H "Authorization: Bearer $POSTSYNCER_API_TOKEN"
By Account — GET /api/v1/analytics/accounts/{account_id}
curl "https://postsyncer.com/api/v1/analytics/accounts/136" \
-H "Authorization: Bearer $POSTSYNCER_API_TOKEN"
Sync Post Analytics — POST /api/v1/analytics/posts/{post_id}/sync
curl -X POST "https://postsyncer.com/api/v1/analytics/posts/123/sync" \
-H "Authorization: Bearer $POSTSYNCER_API_TOKEN"
Queues background jobs to refresh metrics. Does not return metrics directly — call GET after sync.
Delete Account — DELETE /api/v1/accounts/{id} (destructive, confirm first)
curl -X DELETE "https://postsyncer.com/api/v1/accounts/136" \
-H "Authorization: Bearer $POSTSYNCER_API_TOKEN"
Pass per-platform options in accounts[].settings when creating/updating posts:
Pinterest: {"board_id": 123456}
X/Twitter:
{"reply_settings": "everyone", "for_super_followers_only": false, "quote_tweet_id": null, "reply": {"in_reply_to_tweet_id": null}, "community_id": null, "share_with_followers": true}
TikTok:
{"privacy_level": "PUBLIC_TO_EVERYONE", "disable_comment": false, "disable_duet": false, "disable_stitch": false, "post_mode": "DIRECT_POST"}
Instagram: {"post_type": "POST"} — options: REELS, STORIES, POST
YouTube:
{"video_type": "video", "title": "My Video", "privacyStatus": "public", "notifySubscribers": true}
LinkedIn: {"visibility": "PUBLIC"} — options: PUBLIC, CONNECTIONS, LOGGED_IN
Bluesky: {"website_card": {"uri": "https://...", "title": "...", "description": "..."}}
Telegram: {"disable_notification": false, "protect_content": false}
GET /api/v1/workspaces → get workspace_idGET /api/v1/accounts → get ids for target platformsPOST /api/v1/media/upload/url (or MCP upload-media-from-url) → use returned ids in content[].mediaPOST /api/v1/posts with schedule_type: "schedule" and schedule_forGET /api/v1/posts → find post idPOST /api/v1/comments/sync with post_idGET /api/v1/comments?post_id=123&include_replies=truePOST /api/v1/comments with post_id and optional parent_comment_idGET /api/v1/analytics/posts/{id} for a specific postPOST /api/v1/analytics/posts/{id}/sync, then re-fetchGET /workspaces and GET /accounts to discover IDs; use GET /folders and GET /media when organizing or attaching library assetsschedule_type: "draft" or confirm before publish_nowstatus in the response| Status | Meaning |
|--------|---------|
| 401 | Token missing or invalid |
| 403 | Token lacks required ability (e.g. posts) |
| 404 | Resource not found or no access |
| 422 | Validation error — check required fields and formats |
| 429 | Rate limited — wait before retrying |
tools
Use when the user wants to connect to, test, or use the McDonalds service at mcp.mcd.cn, including checking authentication, probing MCP endpoints, listing tools, or calling McDonalds MCP tools through a reusable local CLI.
development
Web scraping platform — Twitter/X data, Vinted marketplace, and general web scraping API
development
SlowMist AI Agent Security Review — comprehensive security framework for skills, repositories, URLs, on-chain addresses, and products (Claude Code version)
data-ai
去除中文文本中的 AI 写作痕迹,使其读起来自然。基于维基百科 AI 写作特征指南,检测 24 种 AI 模式。触发词:humanizer-cn、去除 AI 痕迹、去除 AI 写作痕迹、中文文本人性化。