{"name":"io.github.ndesv21/socialclaw","slug":"ndesv21-socialclaw","title":null,"description":"Connect any AI agent to 11+ social platforms: schedule, publish & track posts via hosted MCP.","url":"https://mcp.market/server/ndesv21-socialclaw","rating":null,"grade":"A","score":91,"certified":false,"status":"active","category":"ai","tags":["ai"],"presence":{"score":52,"stars":105,"forks":29,"downloads_week":83,"last_push_at":"2026-10-12T14:41:21.000Z","license":"MIT"},"uptime":{"percent":100,"checks":28,"ok":28,"last_checked_at":"2026-11-15T11:05:49.166Z","last_ok_at":"2026-11-15T11:05:49.166Z","latency_ms":315},"claimed":false,"transport":"mixed","callable_via_gateway":true,"default_price_micros":0,"repository":"https://github.com/ndesv21/socialclaw","website":"https://getsocialclaw.com","version":"0.1.20","remotes":[{"type":"streamable-http","url":"https://getsocialclaw.com/mcp","headers":[{"description":"Bearer <SocialClaw workspace API key>","isRequired":true,"isSecret":true,"name":"Authorization"}]}],"packages":[{"registryType":"npm","registryBaseUrl":"https://registry.npmjs.org","identifier":"socialclaw","version":"0.1.20","runtimeHint":"npx","transport":{"type":"stdio"},"runtimeArguments":[{"isRequired":true,"value":"mcp","type":"positional"}],"environmentVariables":[{"description":"SocialClaw workspace API key from https://getsocialclaw.com/dashboard","isRequired":true,"isSecret":true,"name":"SOCIALCLAW_API_KEY"}]}],"tools":[{"name":"account_capabilities","description":"Get publish capabilities and provider rules for connected accounts: what media is allowed, text limits, and whether publishing is currently possible. Pass accountId for one account, or provider to filter, or neither for all.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"accountId":{"type":"string","description":"Optional account id."},"provider":{"type":"string","description":"Optional provider filter."}}}},{"name":"apply_schedule","description":"Create a publishing run from a schedule document. Posts are scheduled or published through connected accounts. Send an idempotencyKey so retries do not create duplicate runs.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"schedule":{"type":"object","description":"SocialClaw schedule document. Minimal shape: { timezone, posts: [{ account, name, description, publish_at, media_link? }] }. Campaign documents use { timezone, campaigns: [...] }. Per-post provider settings go in settings, e.g. TikTok inbox mode: settings: { tiktokPostMode: \"draft\" } sends the media to TikTok's inbox notification flow instead of publishing, and the creator finishes the post inside the TikTok app.","additionalProperties":true},"idempotencyKey":{"type":"string","description":"Stable key to deduplicate retries."}},"required":["schedule"]}},{"name":"cancel_post","description":"Cancel a scheduled post before it publishes.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"postId":{"type":"string"}},"required":["postId"]}},{"name":"connect_account","description":"Start connecting one of the user's own social accounts to their SocialClaw workspace. For most providers this returns an authorizeUrl; give it to the user so they sign in with the provider themselves (SocialClaw never sees their password). Telegram and Discord have no sign-in page: Telegram takes the bot token and chat id of a bot the user created and made admin of their channel, and Discord takes a webhook URL the user created for their channel. Only pass values the user gave you for this purpose.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"provider":{"type":"string","description":"Provider to connect."},"botToken":{"type":"string","description":"Telegram only: token of the user's own bot, from @BotFather."},"chatId":{"type":"string","description":"Telegram chat target, e.g. @yourchannel (telegram only)."},"webhookUrl":{"type":"string","description":"Discord only: webhook URL the user created in their channel settings."}},"required":["provider"]}},{"name":"delete_instagram_comment","description":"Permanently delete an Instagram comment on the user's media. Prefer hide_instagram_comment when unsure.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"account":{"type":"string","description":"Instagram connected-account id or handle."},"commentId":{"type":"string"}},"required":["account","commentId"]}},{"name":"get_analytics","description":"Get analytics snapshots for a post, an account, or a run. scope must be post, account, or run; id is the matching identifier.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"scope":{"type":"string","enum":["post","account","run"]},"id":{"type":"string"},"window":{"type":"string","description":"Optional analytics window, e.g. 7d."}},"required":["scope","id"]}},{"name":"get_asset","description":"Get one media asset from the user's SocialClaw library by id, including its status (uploading, ready, or failed), import progress, and publicUrl. Use it after upload_asset returns status uploading, until the asset is ready.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"assetId":{"type":"string","description":"Asset id returned by upload_asset or list_assets."}},"required":["assetId"]}},{"name":"get_instagram_account_insights","description":"Get an Instagram account's insight trend (a daily time series, e.g. reach) over the last N days.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"account":{"type":"string","description":"Instagram connected-account id or handle."},"metric":{"type":"string","description":"Account metric, default reach (e.g. reach, profile_views, accounts_engaged)."},"days":{"type":"number","description":"Window in days (2-30, default 14)."}},"required":["account"]}},{"name":"get_instagram_comments","description":"Read the comments and replies people left on one of the user's own Instagram posts, so the user can review and answer them. Use list_instagram_media first to get a mediaId.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"account":{"type":"string","description":"Instagram connected-account id or handle."},"mediaId":{"type":"string","description":"The IG media id from list_instagram_media."},"limit":{"type":"number","description":"Max comments to return (default 25, capped at 100)."},"after":{"type":"string","description":"Pagination cursor from a previous response."}},"required":["account","mediaId"]}},{"name":"get_instagram_media_insights","description":"Get analytics for one Instagram post (reach, likes, comments, saved, shares, views). Use list_instagram_media for the mediaId.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"account":{"type":"string","description":"Instagram connected-account id or handle."},"mediaId":{"type":"string"},"mediaProductType":{"type":"string","description":"Optional: FEED, REELS, or STORY — refines which metrics are requested."}},"required":["account","mediaId"]}},{"name":"get_instagram_messages","description":"Read the messages in an Instagram direct-message conversation.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"account":{"type":"string","description":"Instagram connected-account id or handle."},"conversationId":{"type":"string","description":"Conversation id from list_instagram_conversations."},"limit":{"type":"number","description":"Max messages (default 25, capped at 100)."},"after":{"type":"string","description":"Pagination cursor from a previous response."}},"required":["account","conversationId"]}},{"name":"get_instagram_profile","description":"Get an Instagram account's profile stats: followers, follows, media count, bio.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"account":{"type":"string","description":"Instagram connected-account id or handle."}},"required":["account"]}},{"name":"get_post","description":"Get one post including its delivery state and provider identifiers.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"postId":{"type":"string"}},"required":["postId"]}},{"name":"get_profile","description":"Identify the connected SocialClaw workspace: its stable id, name, and plan. Use it to confirm which workspace you are acting on.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{}}},{"name":"hide_instagram_comment","description":"Hide or unhide an Instagram comment on the user's media. Set hidden=false to unhide.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"account":{"type":"string","description":"Instagram connected-account id or handle."},"commentId":{"type":"string"},"hidden":{"type":"boolean","description":"true to hide (default), false to unhide."}},"required":["account","commentId"]}},{"name":"list_accounts","description":"List connected social accounts in the SocialClaw workspace. Optionally filter by provider (x, facebook, instagram_business, instagram, threads, linkedin, linkedin_page, pinterest, tiktok, telegram, discord, youtube, reddit, wordpress).","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"provider":{"type":"string","description":"Optional provider filter."}}}},{"name":"list_assets","description":"List media (images/videos) the user has uploaded to their SocialClaw library, newest first. Each asset includes a publicUrl usable directly as media_link in validate_schedule/apply_schedule. Use this to find a previously uploaded file (e.g. from the dashboard) to post. Optionally filter by kind (image/video), mime, or a text query over filename/id.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"query":{"type":"string","description":"Optional text match over filename, id, kind, mime, or url."},"kind":{"type":"string","description":"Filter by media kind: image or video.","enum":["image","video"]},"mime":{"type":"string","description":"Optional mime prefix filter, e.g. video/mp4."},"sort":{"type":"string","description":"created_desc (default, newest first) or created_asc.","enum":["created_desc","created_asc"]},"limit":{"type":"number","description":"Maximum assets to return. Defaults to 24, capped at 48."}}}},{"name":"list_instagram_conversations","description":"List the Instagram direct-message conversations for an account, most recent first. Each conversation includes `counterpart` (the other person's {id, username}) — use its id as the recipientId when replying; `participants` also lists the account itself.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"account":{"type":"string","description":"Instagram connected-account id or handle."},"limit":{"type":"number","description":"Max conversations (default 25, capped at 100)."},"after":{"type":"string","description":"Pagination cursor from a previous response."}},"required":["account"]}},{"name":"list_instagram_media","description":"List an Instagram account's recent posts (caption, permalink, timestamp, comment count) so you can find one to read or moderate comments on. account is the connected-account id or handle.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"account":{"type":"string","description":"Instagram connected-account id or handle."},"limit":{"type":"number","description":"Max media to return (default 25, capped at 100)."},"after":{"type":"string","description":"Pagination cursor from a previous response."}},"required":["account"]}},{"name":"list_instagram_mentions","description":"List recent @mentions of the workspace's Instagram accounts (captured from Instagram mention webhooks).","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"limit":{"type":"number","description":"Max mentions (default 30, capped at 100)."}}}},{"name":"list_posts","description":"List posts in the workspace with optional filters.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"runId":{"type":"string"},"status":{"type":"string","description":"e.g. scheduled, published, action_required, failed, canceled."},"account":{"type":"string","description":"Account handle filter."},"provider":{"type":"string"},"campaignId":{"type":"string"},"limit":{"type":"number","description":"Maximum posts to return. Defaults to 20 and is capped at 50."},"offset":{"type":"number","description":"Offset for paging through results."}}}},{"name":"post_attempts","description":"List publish attempts for a post, including provider errors. Use this to debug failed posts.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"postId":{"type":"string"}},"required":["postId"]}},{"name":"preview_campaign","description":"Preview how a campaign schedule document expands into concrete posts and steps without creating anything.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"schedule":{"type":"object","description":"SocialClaw schedule document. Minimal shape: { timezone, posts: [{ account, name, description, publish_at, media_link? }] }. Campaign documents use { timezone, campaigns: [...] }. Per-post provider settings go in settings, e.g. TikTok inbox mode: settings: { tiktokPostMode: \"draft\" } sends the media to TikTok's inbox notification flow instead of publishing, and the creator finishes the post inside the TikTok app.","additionalProperties":true}},"required":["schedule"]}},{"name":"publish_draft","description":"Publish a previously created draft run, optionally at a given ISO-8601 start time.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"runId":{"type":"string","description":"Draft run id."},"startAt":{"type":"string","description":"Optional ISO-8601 publish start time."}},"required":["runId"]}},{"name":"react_instagram_message","description":"React to a received Instagram direct message (e.g. love).","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"account":{"type":"string","description":"Instagram connected-account id or handle."},"conversationId":{"type":"string"},"messageId":{"type":"string"},"recipientId":{"type":"string","description":"The other participant's Instagram-scoped user id (IGSID)."},"reaction":{"type":"string","description":"Reaction name, default love."}},"required":["account","conversationId","messageId","recipientId"]}},{"name":"refresh_analytics","description":"Fetch fresh analytics for a published post from the provider and store a new snapshot, then return it. Supported providers: Instagram, TikTok, YouTube, Reddit, X, Pinterest, Snapchat (others return an unsupported snapshot). Call this before get_analytics when you need current numbers rather than the last stored snapshot.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"postId":{"type":"string","description":"The published post id to refresh."},"window":{"type":"string","description":"Optional analytics window, e.g. 7d (default lifetime)."}},"required":["postId"]}},{"name":"reply_instagram_comment","description":"Reply to an Instagram comment on the user's media.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"account":{"type":"string","description":"Instagram connected-account id or handle."},"commentId":{"type":"string"},"message":{"type":"string","description":"The reply text."}},"required":["account","commentId","message"]}},{"name":"retry_post","description":"Retry a failed post.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"postId":{"type":"string"}},"required":["postId"]}},{"name":"run_status","description":"Get the status summary of a publishing run and its posts.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"runId":{"type":"string"}},"required":["runId"]}},{"name":"send_instagram_message","description":"Send an Instagram direct message — a text reply, or an image/video attachment via attachment_url. Only allowed within 24 hours of the recipient's last message unless a message tag (e.g. HUMAN_AGENT) is supplied.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"account":{"type":"string","description":"Instagram connected-account id or handle."},"conversationId":{"type":"string","description":"Conversation id (for routing/storage)."},"recipientId":{"type":"string","description":"The recipient's Instagram-scoped user id (IGSID)."},"text":{"type":"string","description":"Message body (omit when sending an attachment)."},"attachment_url":{"type":"string","description":"Public URL of an image/video to send as an attachment."},"attachment_type":{"type":"string","description":"Attachment type: image (default), video, or audio.","enum":["image","video","audio"]},"tag":{"type":"string","description":"Optional message tag, e.g. HUMAN_AGENT, to reply outside the 24h window."}},"required":["account","conversationId","recipientId"]}},{"name":"upload_asset","description":"Add an image or video to the user's SocialClaw media library so it can be attached to a post. Pass exactly one of: file (a file the user attached in this chat), sourceUrl (a direct public http(s) link to the image or video file, not a web page), or contentBase64 (small files only). Files up to 1 GB are supported through file or sourceUrl. The result is the asset: when status is ready, use its publicUrl as media_link in validate_schedule/apply_schedule. Large videos may come back with status uploading; then call get_asset with the asset id until status is ready (or failed) before scheduling.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"file":{"type":"object","description":"A file the user attached in the conversation.","properties":{"download_url":{"type":"string","description":"Temporary download URL of the attached file."},"file_id":{"type":"string","description":"Id of the attached file."},"mime_type":{"type":"string","description":"Mime type of the attached file, if known."},"file_name":{"type":"string","description":"Original name of the attached file, if known."}},"required":["download_url","file_id"]},"sourceUrl":{"type":"string","description":"Direct public http(s) URL of the image or video file."},"filename":{"type":"string","description":"Optional filename including extension, e.g. launch.png. Inferred from the file or URL when omitted."},"contentBase64":{"type":"string","description":"Base64-encoded file content. Small files only; prefer file or sourceUrl."}}}},{"name":"validate_schedule","description":"Validate a schedule document against provider rules, media limits, account state, and publish times WITHOUT creating any posts. Always run this before apply_schedule.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"schedule":{"type":"object","description":"SocialClaw schedule document. Minimal shape: { timezone, posts: [{ account, name, description, publish_at, media_link? }] }. Campaign documents use { timezone, campaigns: [...] }. Per-post provider settings go in settings, e.g. TikTok inbox mode: settings: { tiktokPostMode: \"draft\" } sends the media to TikTok's inbox notification flow instead of publishing, and the creator finishes the post inside the TikTok app.","additionalProperties":true}},"required":["schedule"]}},{"name":"workspace_health","description":"Get workspace health, including connection state across providers. Pass provider to check one provider's connections.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"provider":{"type":"string","description":"Optional provider to check connection health for."}}}},{"name":"workspace_usage","description":"Get workspace usage counters and plan entitlement consumption.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{}}}],"scan":{"score":91,"grade":"A","scanned_at":"2026-11-04T23:50:01.500Z","report":{"scannerVersion":"0.1.10","scannedAt":"2026-11-04T23:50:01.467Z","components":{"code":{"score":25,"max":25,"notes":["12 source files scanned"]},"reliability":{"score":20,"max":20,"notes":["remote reachable in 1236ms"]},"poisoning":{"score":15,"max":15,"notes":["34 tool descriptions checked"]},"auth":{"score":8,"max":15,"notes":["API key sent as a header"]},"maintenance":{"score":15,"max":15,"notes":["last push 23 days ago"]},"identity":{"score":8,"max":10,"notes":["registry namespace matches repository owner","GitHub account older than a year"]}},"findings":[],"inputs":{"probes":[{"url":"https://getsocialclaw.com/mcp","reachable":true,"authRequired":false,"latencyMs":1236,"serverInfo":{"name":"socialclaw","version":"0.1.16"}}],"packages":[{"registryType":"npm","identifier":"socialclaw","version":"0.1.20","found":true,"license":"MIT","hasInstallScripts":false,"dependencyCount":0,"publishedAt":"2026-08-04T23:45:08.942Z","repositoryUrl":"git+https://github.com/ndesv21/socialclaw.git"}],"repo":{"found":true,"owner":"ndesv21","repo":"socialclaw","archived":false,"pushedAt":"2026-10-12T14:41:21Z","stars":105,"forks":29,"openIssues":0,"ownerType":"User","ownerAvatarUrl":"https://avatars.githubusercontent.com/u/147517448?v=4","ownerCreatedAt":"2023-10-10T12:56:50Z","license":"MIT"},"icon":{"url":"https://getsocialclaw.com/branding/socialclaw-app-icon.png","source":"registry","width":512,"height":512},"presence":{"stars":105,"forks":29,"downloadsWeek":83,"license":"MIT","lastPushAt":"2026-10-12T14:41:21.000Z","score":52}}}},"grade_history":[],"reviews":[]}