このMCPでできること
Publishes and manages posts, replies, messages, media, and automations across connected social platforms.
ツール
入力スキーマ
{'type': 'object', 'required': ['accountId'], 'properties': {'approve': {'type': 'boolean', 'description': 'Default true.'}, 'replyId': {'type': 'string', 'description': 'Omit to list the pending queue instead.'}, 'accountId': {'type': 'string'}, 'workspaceId': {'type': 'string', 'description': 'Which workspace this is for. Only needed when the account has more than one — the error tells you the ids when it matters. Leave it out if it is already decided; do not ask the person again.'}}}
入力スキーマ
{'type': 'object', 'properties': {'accountId': {'type': 'string', 'description': 'Limit to one Naver Blog account. Omit to cover every connected Naver Blog account.'}, 'workspaceId': {'type': 'string', 'description': 'Which workspace this is for. Only needed when the account has more than one — the error tells you the ids when it matters. Leave it out if it is already decided; do not ask the person again.'}}}
入力スキーマ
{'type': 'object', 'required': ['accountId', 'templateId', 'params'], 'properties': {'name': {'type': 'string'}, 'params': {'type': 'object', 'description': "The template's params."}, 'enabled': {'type': 'boolean', 'description': 'Default false.'}, 'accountId': {'type': 'string', 'description': 'Connected account id from list_accounts.'}, 'templateId': {'type': 'string', 'description': 'Template id from list_automation_templates.'}, 'workspaceId': {'type': 'string', 'description': 'Which workspace this is for. Only needed when the account has more than one — the error tells you the ids when it matters. Leave it out if it is already decided; do not ask the person again.'}}}
入力スキーマ
{'type': 'object', 'required': ['accountId', 'post', 'deliver'], 'properties': {'name': {'type': 'string'}, 'post': {'type': 'string', 'description': 'Our post id, the platform post id, a link to the post, "any", or "next".'}, 'match': {'enum': ['contains', 'is', 'whole_word', 'begins_with', 'thumbs_up', 'not_contains'], 'type': 'string'}, 'deliver': {'type': 'object', 'properties': {'link': {'type': 'string', 'description': 'Legacy: one url appended to the text. Prefer links.'}, 'text': {'type': 'string'}, 'links': {'type': 'array', 'items': {'type': 'object', 'required': ['title', 'url'], 'properties': {'url': {'type': 'string'}, 'title': {'type': 'string', 'description': 'At most 20 characters.'}}}, 'maxItems': 3}, 'mediaId': {'type': 'string'}, 'mediaKind': {'enum': ['file', 'image', 'video'], 'type': 'string'}}, 'description': 'What to send after the tap: text, up to three link buttons, and/or a media id.'}, 'enabled': {'type': 'boolean', 'description': 'Default false. Prefer leaving it off and calling enable_automation after the person confirms.'}, 'message': {'type': 'string', 'description': 'The opening DM (private reply). One message. Required unless openingDm is false.'}, 'askEmail': {'type': 'boolean', 'description': 'Ask for their email after the tap and store it in contact field `email`. Three tries, then continue without.'}, 'followUp': {'type': 'string', 'description': 'Sent followUpAfterMinutes later if none of deliver.links was clicked. Needs openingDm and at least one link.'}, 'keywords': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Trigger words in the comment. Empty means every comment.'}, 'accountId': {'type': 'string', 'description': 'Connected Instagram or Facebook account id from list_accounts.'}, 'openingDm': {'type': 'boolean', 'description': 'Default true. false: deliver goes out as the private reply itself (no button, no window afterwards).'}, 'emailRetry': {'type': 'string'}, 'buttonTitle': {'type': 'string', 'description': 'Button under the opening DM, at most 20 characters.'}, 'publicReply': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Optional public replies under the comment; one is picked at random.'}, 'workspaceId': {'type': 'string', 'description': 'Which workspace this is for. Only needed when the account has more than one — the error tells you the ids when it matters. Leave it out if it is already decided; do not ask the person again.'}, 'emailMessage': {'type': 'string'}, 'recheckTitle': {'type': 'string'}, 'requireFollow': {'type': 'boolean', 'description': 'Instagram only. Deliver only to followers; others are asked to follow and check again.'}, 'notFollowingMessage': {'type': 'string'}, 'followUpAfterMinutes': {'type': 'number', 'description': '1 to 1380 (23 hours). Default 60.'}}}
入力スキーマ
{'type': 'object', 'required': ['id'], 'properties': {'id': {'type': 'string', 'description': "A publish id (post_…), the post's own id on the channel, or a post link (the URL you would open in a browser to see it). Links work for posts written in the channel's own app too, as long as the account is connected here."}, 'workspaceId': {'type': 'string', 'description': 'Which workspace this is for. Only needed when the account has more than one — the error tells you the ids when it matters. Leave it out if it is already decided; do not ask the person again.'}}}
入力スキーマ
{'type': 'object', 'required': ['replyId', 'postId'], 'properties': {'postId': {'type': 'string', 'description': "The post the reply sits under. A publish id (post_…), the post's own id on the channel, or a post link (the URL you would open in a browser to see it). Links work for posts written in the channel's own app too, as long as the account is connected here."}, 'replyId': {'type': 'string', 'description': 'Reply id from list_replies'}, 'workspaceId': {'type': 'string', 'description': 'Which workspace this is for. Only needed when the account has more than one — the error tells you the ids when it matters. Leave it out if it is already decided; do not ask the person again.'}}}
入力スキーマ
{'type': 'object', 'required': ['platform'], 'properties': {'topic': {'enum': ['overview', 'directives', 'attributes', 'inline', 'blocks', 'highlight', 'media', 'limits'], 'type': 'string', 'description': 'Which section. overview (default) sketches the whole thing; directives, attributes, inline, blocks, highlight, media and limits go deep.'}, 'platform': {'type': 'string', 'description': 'Platform id, e.g. naver_blog. Only naver_blog has body markup today.'}, 'workspaceId': {'type': 'string', 'description': 'Which workspace this is for. Only needed when the account has more than one — the error tells you the ids when it matters. Leave it out if it is already decided; do not ask the person again.'}}}
入力スキーマ
{'type': 'object', 'required': ['blog'], 'properties': {'blog': {'type': 'string', 'description': 'The blog id or any link to the blog (blog.naver.com/<id>, m.blog.naver.com/<id>/<logNo>, PostView.naver?blogId=<id>).'}, 'workspaceId': {'type': 'string', 'description': 'Which workspace this is for. Only needed when the account has more than one — the error tells you the ids when it matters. Leave it out if it is already decided; do not ask the person again.'}}}
入力スキーマ
{'type': 'object', 'required': ['id'], 'properties': {'id': {'type': 'string'}, 'workspaceId': {'type': 'string', 'description': 'Which workspace this is for. Only needed when the account has more than one — the error tells you the ids when it matters. Leave it out if it is already decided; do not ask the person again.'}}}
入力スキーマ
{'type': 'object', 'required': ['id'], 'properties': {'id': {'type': 'string'}, 'workspaceId': {'type': 'string', 'description': 'Which workspace this is for. Only needed when the account has more than one — the error tells you the ids when it matters. Leave it out if it is already decided; do not ask the person again.'}}}
入力スキーマ
{'type': 'object', 'required': ['seeds'], 'properties': {'seeds': {'type': 'array', 'items': {'type': 'string'}, 'description': '1-10 seed keywords.'}, 'workspaceId': {'type': 'string', 'description': 'Which workspace this is for. Only needed when the account has more than one — the error tells you the ids when it matters. Leave it out if it is already decided; do not ask the person again.'}}}
入力スキーマ
{'type': 'object', 'required': ['blog'], 'properties': {'blog': {'type': 'string', 'description': 'The blog to follow: its id (the part after blog.naver.com/) or any link to it.'}, 'mutual': {'type': 'boolean', 'description': 'true for a mutual-neighbor request. Default false.'}, 'message': {'type': 'string', 'description': 'Message sent with a mutual request. Naver shows it to the other blog. Ignored otherwise.'}, 'accountId': {'type': 'string', 'description': 'Which connected account to act as. Only needed when the workspace has more than one Naver Blog.'}, 'workspaceId': {'type': 'string', 'description': 'Which workspace this is for. Only needed when the account has more than one — the error tells you the ids when it matters. Leave it out if it is already decided; do not ask the person again.'}}}
入力スキーマ
{'type': 'object', 'required': ['id'], 'properties': {'id': {'type': 'string', 'description': 'Automation id from list_automations.'}, 'workspaceId': {'type': 'string', 'description': 'Which workspace this is for. Only needed when the account has more than one — the error tells you the ids when it matters. Leave it out if it is already decided; do not ask the person again.'}}}
入力スキーマ
{'type': 'object', 'required': ['id'], 'properties': {'id': {'type': 'string'}, 'refresh': {'type': 'boolean', 'description': 'Re-read the profile from the channel first.'}, 'workspaceId': {'type': 'string', 'description': 'Which workspace this is for. Only needed when the account has more than one — the error tells you the ids when it matters. Leave it out if it is already decided; do not ask the person again.'}}}
入力スキーマ
{'type': 'object', 'required': ['id'], 'properties': {'id': {'type': 'string', 'description': "A publish id (post_…), the post's own id on the channel, or a post link (the URL you would open in a browser to see it). Links work for posts written in the channel's own app too, as long as the account is connected here."}, 'workspaceId': {'type': 'string', 'description': 'Which workspace this is for. Only needed when the account has more than one — the error tells you the ids when it matters. Leave it out if it is already decided; do not ask the person again.'}}}
入力スキーマ
{'type': 'object', 'required': ['keyword'], 'properties': {'limit': {'type': 'number', 'description': 'How many days, default 100.'}, 'keyword': {'type': 'string', 'description': 'The keyword, as you would send it to research_naver_keywords.'}, 'workspaceId': {'type': 'string', 'description': 'Which workspace this is for. Only needed when the account has more than one — the error tells you the ids when it matters. Leave it out if it is already decided; do not ask the person again.'}}}
入力スキーマ
{'type': 'object', 'required': ['id'], 'properties': {'id': {'type': 'string', 'description': "A publish id (post_…), the post's own id on the channel, or a post link (the URL you would open in a browser to see it). Links work for posts written in the channel's own app too, as long as the account is connected here."}, 'workspaceId': {'type': 'string', 'description': 'Which workspace this is for. Only needed when the account has more than one — the error tells you the ids when it matters. Leave it out if it is already decided; do not ask the person again.'}}}
入力スキーマ
{'type': 'object', 'required': ['accountId'], 'properties': {'accountId': {'type': 'string', 'description': 'The connected account to ask about. Required: these values are per account.'}, 'workspaceId': {'type': 'string', 'description': 'Which workspace this is for. Only needed when the account has more than one — the error tells you the ids when it matters. Leave it out if it is already decided; do not ask the person again.'}}}
入力スキーマ
{'type': 'object', 'properties': {'accountId': {'type': 'string', 'description': 'Limit to one account. Omit to cover every connected channel.'}, 'workspaceId': {'type': 'string', 'description': 'Which workspace this is for. Only needed when the account has more than one — the error tells you the ids when it matters. Leave it out if it is already decided; do not ask the person again.'}}}
入力スキーマ
{'type': 'object', 'required': ['replyId', 'postId'], 'properties': {'hide': {'type': 'boolean', 'description': 'true hides it, false shows it again. Defaults to true.'}, 'postId': {'type': 'string', 'description': "The post the reply sits under. A publish id (post_…), the post's own id on the channel, or a post link (the URL you would open in a browser to see it). Links work for posts written in the channel's own app too, as long as the account is connected here."}, 'replyId': {'type': 'string', 'description': 'Reply id from list_replies'}, 'workspaceId': {'type': 'string', 'description': 'Which workspace this is for. Only needed when the account has more than one — the error tells you the ids when it matters. Leave it out if it is already decided; do not ask the person again.'}}}
入力スキーマ
{'type': 'object', 'required': ['id'], 'properties': {'id': {'type': 'string', 'description': "A publish id (post_…), the post's own id on the channel, or a post link (the URL you would open in a browser to see it). Links work for posts written in the channel's own app too, as long as the account is connected here. On Naver Blog a link to someone else's post works too."}, 'replyTo': {'type': 'string', 'description': 'Reply id from list_replies to like that reply instead of the post.'}, 'workspaceId': {'type': 'string', 'description': 'Which workspace this is for. Only needed when the account has more than one — the error tells you the ids when it matters. Leave it out if it is already decided; do not ask the person again.'}}}
入力スキーマ
{'type': 'object', 'properties': {'workspaceId': {'type': 'string', 'description': 'Which workspace this is for. Only needed when the account has more than one — the error tells you the ids when it matters. Leave it out if it is already decided; do not ask the person again.'}}}
入力スキーマ
{'type': 'object', 'required': ['id'], 'properties': {'id': {'type': 'string'}, 'limit': {'type': 'integer'}, 'before': {'type': 'string'}, 'workspaceId': {'type': 'string', 'description': 'Which workspace this is for. Only needed when the account has more than one — the error tells you the ids when it matters. Leave it out if it is already decided; do not ask the person again.'}}}
入力スキーマ
{'type': 'object', 'properties': {'workspaceId': {'type': 'string', 'description': 'Which workspace this is for. Only needed when the account has more than one — the error tells you the ids when it matters. Leave it out if it is already decided; do not ask the person again.'}}}
入力スキーマ
{'type': 'object', 'properties': {'workspaceId': {'type': 'string', 'description': 'Which workspace this is for. Only needed when the account has more than one — the error tells you the ids when it matters. Leave it out if it is already decided; do not ask the person again.'}}}
入力スキーマ
{'type': 'object', 'properties': {'limit': {'type': 'number', 'description': '1-100, defaults to 25'}, 'accountId': {'type': 'string', 'description': 'Limit to one account. Omit to cover every connected channel.'}, 'workspaceId': {'type': 'string', 'description': 'Which workspace this is for. Only needed when the account has more than one — the error tells you the ids when it matters. Leave it out if it is already decided; do not ask the person again.'}}}
入力スキーマ
{'type': 'object', 'properties': {'kind': {'enum': ['dm', 'mention'], 'type': 'string'}, 'limit': {'type': 'integer'}, 'state': {'enum': ['open', 'closed'], 'type': 'string'}, 'search': {'type': 'string'}, 'unread': {'type': 'boolean'}, 'accountId': {'type': 'string'}, 'workspaceId': {'type': 'string', 'description': 'Which workspace this is for. Only needed when the account has more than one — the error tells you the ids when it matters. Leave it out if it is already decided; do not ask the person again.'}}}
入力スキーマ
{'type': 'object', 'properties': {'unread': {'type': 'boolean'}, 'accountId': {'type': 'string'}, 'workspaceId': {'type': 'string', 'description': 'Which workspace this is for. Only needed when the account has more than one — the error tells you the ids when it matters. Leave it out if it is already decided; do not ask the person again.'}}}
入力スキーマ
{'type': 'object', 'properties': {'accountId': {'type': 'string', 'description': 'Limit to one Naver Blog account. Omit to cover every connected Naver Blog account.'}, 'workspaceId': {'type': 'string', 'description': 'Which workspace this is for. Only needed when the account has more than one — the error tells you the ids when it matters. Leave it out if it is already decided; do not ask the person again.'}}}
入力スキーマ
{'type': 'object', 'properties': {'limit': {'type': 'number', 'description': 'How many, default 50.'}, 'workspaceId': {'type': 'string', 'description': 'Which workspace this is for. Only needed when the account has more than one — the error tells you the ids when it matters. Leave it out if it is already decided; do not ask the person again.'}}}
入力スキーマ
{'type': 'object', 'properties': {'workspaceId': {'type': 'string', 'description': 'Which workspace this is for. Only needed when the account has more than one — the error tells you the ids when it matters. Leave it out if it is already decided; do not ask the person again.'}}}
入力スキーマ
{'type': 'object', 'properties': {'sort': {'enum': ['scheduled'], 'type': 'string', 'description': "scheduled orders by the post's date ascending (soonest first) and drops paging. Omit for newest first."}, 'limit': {'type': 'number', 'description': '1-100, defaults to 20'}, 'since': {'type': 'string', 'description': 'YYYY-MM-DD or ISO 8601. Only posts dated at or after this. A scheduled post is dated by its scheduledAt, a sent post by when it was created.'}, 'until': {'type': 'string', 'description': 'YYYY-MM-DD or ISO 8601. Only posts dated at or before this (a date means the whole day).'}, 'before': {'type': 'string', 'description': "A publish id from a previous page's nextBefore. Returns the ones older than it."}, 'status': {'type': 'string', 'description': 'Narrow to one or more statuses, comma separated: scheduled, draft, publishing, published, partial, failed or cancelled. Omit for everything.'}, 'workspaceId': {'type': 'string', 'description': 'Which workspace this is for. Only needed when the account has more than one — the error tells you the ids when it matters. Leave it out if it is already decided; do not ask the person again.'}}}
入力スキーマ
{'type': 'object', 'required': ['id'], 'properties': {'id': {'type': 'string', 'description': "A publish id (post_…), the post's own id on the channel, or a post link (the URL you would open in a browser to see it). Links work for posts written in the channel's own app too, as long as the account is connected here."}, 'workspaceId': {'type': 'string', 'description': 'Which workspace this is for. Only needed when the account has more than one — the error tells you the ids when it matters. Leave it out if it is already decided; do not ask the person again.'}}}
入力スキーマ
{'type': 'object', 'required': ['id'], 'properties': {'id': {'type': 'string', 'description': 'Media id from media_presign'}, 'workspaceId': {'type': 'string', 'description': 'Which workspace this is for. Only needed when the account has more than one — the error tells you the ids when it matters. Leave it out if it is already decided; do not ask the person again.'}}}
入力スキーマ
{'type': 'object', 'required': ['url'], 'properties': {'url': {'type': 'string', 'description': 'Public https URL of the image or video file itself.'}, 'altText': {'type': 'string', 'description': 'What the image shows, for people using screen readers. Applied to carousel items.'}, 'aiGenerated': {'type': 'boolean', 'description': 'true when the image or video was generated or substantially changed with AI. Naver Blog photos get its AI-use label; Instagram, YouTube and TikTok get their AI declaration turned on unless you set it to false. Leave it out when unsure.'}, 'workspaceId': {'type': 'string', 'description': 'Which workspace this is for. Only needed when the account has more than one — the error tells you the ids when it matters. Leave it out if it is already decided; do not ask the person again.'}}}
入力スキーマ
{'type': 'object', 'required': ['fileName', 'contentType', 'bytes'], 'properties': {'bytes': {'type': 'number', 'description': 'File size in bytes'}, 'width': {'type': 'number', 'description': 'Pixel width, if you know it'}, 'height': {'type': 'number', 'description': 'Pixel height, if you know it'}, 'altText': {'type': 'string', 'description': 'What the image shows, for people using screen readers. Write it whenever you can see the image. Applied to carousel items.'}, 'fileName': {'type': 'string'}, 'aiGenerated': {'type': 'boolean', 'description': 'true when the image or video was generated or substantially changed with AI. Naver Blog photos get its AI-use label; Instagram, YouTube and TikTok get their AI declaration turned on unless you set it to false. Leave it out when unsure.'}, 'contentType': {'type': 'string', 'description': 'image/jpeg or image/png or image/webp or image/gif or video/mp4 or video/quicktime or video/webm'}, 'workspaceId': {'type': 'string', 'description': 'Which workspace this is for. Only needed when the account has more than one — the error tells you the ids when it matters. Leave it out if it is already decided; do not ask the person again.'}}}
入力スキーマ
{'type': 'object', 'properties': {'note': {'type': 'string', 'description': 'One line shown on the upload page, e.g. what you need them to upload.'}, 'workspaceId': {'type': 'string', 'description': 'Which workspace this is for. Only needed when the account has more than one — the error tells you the ids when it matters. Leave it out if it is already decided; do not ask the person again.'}}}
入力スキーマ
{'type': 'object', 'required': ['token'], 'properties': {'token': {'type': 'string', 'description': 'The token from media_upload_link.'}, 'offset': {'type': 'integer', 'description': 'Skip this many images before returning previews (default 0).'}, 'workspaceId': {'type': 'string', 'description': 'Which workspace this is for. Only needed when the account has more than one — the error tells you the ids when it matters. Leave it out if it is already decided; do not ask the person again.'}}}
入力スキーマ
{'type': 'object', 'required': ['content'], 'properties': {'form': {'type': 'string', 'description': 'Form preset id (default photo-story). GET /v1/naver/forms lists them.'}, 'forms': {'anyOf': [{'enum': ['all'], 'type': 'string'}, {'type': 'array', 'items': {'type': 'string'}}], 'description': '"all" for every preset, or a list of preset ids. Returns layouts[] instead of one layout.'}, 'content': {'type': 'string', 'description': 'The markdown body you plan to publish.'}, 'mediaIds': {'type': 'array', 'items': {'type': 'string'}, 'description': 'The media ids you will attach. Photos not referenced in the body get placed.'}, 'workspaceId': {'type': 'string', 'description': 'Which workspace this is for. Only needed when the account has more than one — the error tells you the ids when it matters. Leave it out if it is already decided; do not ask the person again.'}}}
入力スキーマ
{'type': 'object', 'required': ['id'], 'properties': {'id': {'type': 'string', 'description': "A publish id (post_…), the post's own id on the channel, or a post link (the URL you would open in a browser to see it). Links work for posts written in the channel's own app too, as long as the account is connected here."}, 'workspaceId': {'type': 'string', 'description': 'Which workspace this is for. Only needed when the account has more than one — the error tells you the ids when it matters. Leave it out if it is already decided; do not ask the person again.'}}}
入力スキーマ
{'type': 'object', 'required': ['accountIds'], 'properties': {'wait': {'type': 'boolean', 'description': 'Hold the response until the post is really out. Text waits up to 10 seconds, posts with media up to 75 seconds. If it is still going after that you get the usual publishing response and should poll get_post. Defaults to false. Ignored with scheduledAt or draft.'}, 'draft': {'type': 'boolean', 'description': 'true saves the post as a draft on uplika without sending anything. Use it when the person wants to review before it goes out. They finish it in the dashboard, or you call update_post and publish_now.'}, 'batchId': {'type': 'string', 'description': 'Optional tag (letters, digits, - or _) to group posts made together, for example the same text sent to two workspaces. Pass the same value on each call.'}, 'content': {'type': 'string', 'description': 'Post text'}, 'options': {'type': 'object', 'properties': {'tiktok': {'type': 'object', 'properties': {'title': {'type': 'string', 'maxLength': 90, 'description': "Required for a photo post, up to 90 characters. A video post has no title field at all and passing one is rejected; a video's text comes from content."}, 'isAigc': {'type': 'boolean', 'description': 'Declare that the content was generated by AI. Worth setting when you made the video or images. An attached media marked aiGenerated turns this on automatically unless you set it to false.'}, 'content': {'type': 'string', 'description': 'Text for this channel only. When set it replaces the shared content for this channel, and the length and media checks use it. Leave it out to use the shared content.'}, 'postMode': {'enum': ['direct', 'draft'], 'type': 'string', 'description': "direct (default) posts to the profile. draft sends it to the creator's TikTok inbox; they open the notification and finish it in the app, choosing the visibility themselves. While this app awaits the Content Posting audit this is the only way to get something out publicly: a direct post can only be SELF_ONLY, but on this path we send no visibility at all. The trade is that it is not on the profile until the person finishes it, so there is no link and no metrics in the meantime."}, 'disableDuet': {'type': 'boolean', 'description': 'Turn duets off for this post. Video posts only.'}, 'privacyLevel': {'type': 'string', 'description': 'Required unless postMode is draft. One of the values that get_publish_options returns for this account, e.g. PUBLIC_TO_EVERYONE, MUTUAL_FOLLOW_FRIENDS, FOLLOWER_OF_CREATOR or SELF_ONLY. The list differs per account, so do not hard-code it.'}, 'disableStitch': {'type': 'boolean', 'description': 'Turn stitches off for this post. Video posts only.'}, 'disableComment': {'type': 'boolean', 'description': 'Turn comments off for this post. Cannot be set to false if the creator disabled comments account-wide.'}, 'brandContentToggle': {'type': 'boolean', 'description': 'Declare paid partnership content ("Branded Content"). TikTok does not allow branded content to be private, so this cannot be combined with privacyLevel SELF_ONLY.'}, 'brandOrganicToggle': {'type': 'boolean', 'description': 'Declare that the post promotes the creator\'s own brand ("Your Brand"). Leave it out rather than sending false: not declaring and declaring \'no\' are different statements.'}, 'videoCoverTimestampMs': {'type': 'number', 'minimum': 0, 'description': 'Which frame to use as the cover, in milliseconds into the video. TikTok does not accept a cover image file, only a timestamp.'}}, 'description': "TikTok settings. privacyLevel is REQUIRED for a normal post and has no default on purpose: TikTok's rules say the person must choose visibility deliberately, so we ask for it instead of guessing. Call get_publish_options first to see which values this account may use right now, whether it can post at all, and its video length limit. TikTok has no text-only posts, cannot mix a video and photos, and has no API for deleting a post or reading comments. While this app is awaiting TikTok's Content Posting audit a direct post can only be SELF_ONLY and comes back with no link and no metrics; if the person wants it public in the meantime, use postMode draft instead."}, 'bluesky': {'type': 'object', 'properties': {'langs': {'type': 'array', 'items': {'type': 'string', 'pattern': '^[a-zA-Z]{2,3}(-[a-zA-Z0-9]{2,8})*$', 'description': 'One BCP-47 code.'}, 'maxItems': 3, 'description': 'The language of the text, 1-3 BCP-47 codes like ["ko"] or ["en", "ko"]. Feed generators filter on this, so without it the post never appears in language-scoped feeds. Bluesky has no post editing, so this cannot be fixed after publishing. Set it to the language the text is actually written in.'}, 'content': {'type': 'string', 'description': 'Text for this channel only. When set it replaces the shared content for this channel, and the length and media checks use it. Leave it out to use the shared content.'}}, 'description': 'Bluesky settings. Optional, but langs is worth setting on every post.'}, 'threads': {'type': 'object', 'properties': {'content': {'type': 'string', 'description': 'Text for this channel only. When set it replaces the shared content for this channel, and the length and media checks use it. Leave it out to use the shared content.'}, 'topicTag': {'type': 'string', 'maxLength': 64, 'description': 'One topic to tag the post with, like a category. Threads takes exactly one and rejects periods and ampersands in it. On a thread it goes on the first piece only. Leave it out unless the person asked for a topic.'}}, 'description': 'Threads settings. Optional.'}, 'youtube': {'type': 'object', 'required': ['title'], 'properties': {'tags': {'type': 'array', 'items': {'type': 'string', 'description': 'One search tag.'}, 'description': 'Search tags. 500 characters across all of them; a tag with a space costs two extra for the quotes YouTube adds.'}, 'title': {'type': 'string', 'maxLength': 100, 'description': 'Video title, up to 100 characters. Required. Cannot contain < or >.'}, 'content': {'type': 'string', 'description': 'Text for this channel only. When set it replaces the shared content for this channel, and the length and media checks use it. Leave it out to use the shared content.'}, 'publishAt': {'type': 'string', 'description': "ISO 8601 time to make the video public. Only works with privacyStatus private, and only on a video that was never public. This is YouTube's own scheduling; for scheduling across channels use scheduledAt on the post."}, 'categoryId': {'type': 'string', 'description': 'YouTube category id. Defaults to 22 (People & Blogs). Leave it out unless the person named a category.'}, 'madeForKids': {'type': 'boolean', 'description': "Whether this video is directed at children. This is a legal declaration about someone else's channel. Leave it out unless the person tells you, and the channel's own default applies."}, 'privacyStatus': {'enum': ['public', 'unlisted', 'private'], 'type': 'string', 'description': 'Defaults to private. We pass this through as you set it. If YouTube applies something else, the result carries a warning saying what it actually applied.'}, 'thumbnailMediaId': {'type': 'string', 'description': 'Media id of a JPEG or PNG up to 2MB to use as the thumbnail. Long-form only: YouTube does not take custom thumbnails on Shorts, and a vertical video of three minutes or less becomes a Short. The channel also has to be verified before YouTube accepts one.'}, 'containsSyntheticMedia': {'type': 'boolean', 'description': 'Set true when the video contains realistic altered or synthetic content, including AI generated footage of real-looking people, places or events. An attached media marked aiGenerated turns this on automatically unless you set it to false.'}}, 'description': 'Required when a YouTube account is in accountIds. The post content becomes the video description.'}, 'facebook': {'type': 'object', 'properties': {'link': {'type': 'string', 'description': 'Makes a link post with a preview card. Cannot be combined with media.'}, 'title': {'type': 'string', 'description': 'Reel title, separate from the caption.'}, 'content': {'type': 'string', 'description': 'Text for this channel only. When set it replaces the shared content for this channel, and the length and media checks use it. Leave it out to use the shared content.'}, 'contentType': {'enum': ['feed', 'story', 'reel'], 'type': 'string', 'description': 'What kind of post. Defaults to reel for a single video and feed otherwise. A Facebook story is rejected if you send any text: publish the story with no content, and put the words in a feed post instead. A story also takes exactly one image or video and no first comment.'}, 'firstComment': {'type': 'string', 'description': 'A comment we post right after publishing. Not on stories, and not on scheduled posts. If it fails the post still goes up, with a warning.'}, 'scheduledPublishTime': {'type': 'string', 'description': "ISO 8601 time to publish a feed post later, 10 minutes to 28 days from now. Feed posts only, not reels or stories. Cannot be combined with firstComment (a scheduled post is not live yet, so nothing to comment on). This is Facebook's own scheduling; for scheduling across channels use scheduledAt on the post."}}, 'description': 'Facebook Page settings. Optional: plain text publishes without it.'}, 'telegram': {'type': 'object', 'properties': {'content': {'type': 'string', 'description': 'Text for this channel only. When set it replaces the shared content for this channel, and the length and media checks use it. Leave it out to use the shared content.'}}, 'description': 'Telegram has no channel-specific settings. Note the caption limit: with media attached the text is capped at 1,024 characters instead of 4,096.'}, 'instagram': {'type': 'object', 'properties': {'content': {'type': 'string', 'description': 'Text for this channel only. When set it replaces the shared content for this channel, and the length and media checks use it. Leave it out to use the shared content.'}, 'userTags': {'type': 'array', 'items': {'type': 'object', 'required': ['username'], 'properties': {'x': {'type': 'number', 'description': '0 to 1 from the left. Photos only.'}, 'y': {'type': 'number', 'description': '0 to 1 from the top. Photos only.'}, 'username': {'type': 'string', 'description': 'Username without @.'}, 'mediaIndex': {'type': 'number', 'description': 'Which carousel slide, from 0.'}}, 'description': 'One tagged account.'}, 'description': 'Tag accounts on the media. Photos need x and y between 0 and 1; videos take the username alone. mediaIndex picks the carousel slide.'}, 'contentType': {'enum': ['feed', 'story', 'reel'], 'type': 'string', 'description': 'What kind of post. Defaults to reel for a single video and feed otherwise. Stories show no caption and take one image or video.'}, 'shareToFeed': {'type': 'boolean', 'description': 'Reels only. false keeps the reel out of the main feed.'}, 'coverMediaId': {'type': 'string', 'description': 'Media id of a JPEG up to 8MB to use as the reel cover. Reels only.'}, 'firstComment': {'type': 'string', 'description': 'A comment we post right after publishing, often used for hashtags. Not on stories. If it fails the post still goes up, with a warning.'}, 'collaborators': {'type': 'array', 'items': {'type': 'string', 'description': "A public professional account's username, without @."}, 'maxItems': 3, 'description': 'Up to 3 public professional accounts to invite as collaborators. They appear only after accepting. Not on stories.'}, 'isAiGenerated': {'type': 'boolean', 'description': 'Set true to label the media as AI-generated on Instagram. An attached media marked aiGenerated turns this on automatically unless you set it to false.'}, 'thumbOffsetMs': {'type': 'number', 'minimum': 0, 'description': 'Reel cover frame in milliseconds. Ignored when coverMediaId is set.'}}, 'description': 'Instagram settings. Optional: a plain post with media works without it.'}, 'naver_blog': {'type': 'object', 'required': ['title'], 'properties': {'form': {'enum': ['bubble-info', 'divider-tutorial', 'photo-review', 'place-list', 'news-event', 'table-explain', 'mood-review', 'photo-story'], 'type': 'string', 'description': 'Form preset for the template layout (default photo-story). GET /v1/naver/forms lists the presets; naver_layout with forms: "all" shows them side by side.'}, 'tags': {'type': 'array', 'items': {'type': 'string', 'description': 'One tag without # and without spaces.'}, 'maxItems': 30, 'description': 'Up to 30 tags without the # sign and without spaces. Ignored when draftOnly is true.'}, 'title': {'type': 'string', 'maxLength': 100, 'description': 'Required. The post title, up to 100 characters.'}, 'layout': {'enum': ['template', 'as-is'], 'type': 'string', 'description': "template (default) reshapes the body into the blog's house form before it goes out: #/## titles become underlined quote headings, a thin rule sits between sections, and photos you did not place with media: references go one per section (leftovers pair up at the end). Text is never changed. Call naver_layout first to see the result. Use as-is when the person dictated the structure or you placed everything yourself."}, 'content': {'type': 'string', 'description': 'Text for this channel only. When set it replaces the shared content for this channel, and the length and media checks use it. Leave it out to use the shared content. On Naver Blog this is where the Markdown body goes when the other channels get plain text.'}, 'category': {'type': 'string', 'description': 'The category name instead of its id, exactly as it appears in naverBlog.categories from list_accounts. If the blog does not have it you get naver_category_unknown with the list to pick from; if the person just created it, call refresh_account first.'}, 'fontSize': {'enum': ['11', '13', '15', '16', '19', '24', '28', '30', '34', '38'], 'type': 'number', 'maximum': 34, 'minimum': 10, 'description': "Body font size in px, one of the editor's sizes (11-38). Omit for the editor default."}, 'openType': {'enum': ['public', 'neighbor', 'mutual', 'private'], 'type': 'string', 'description': 'Who can see it. public (default), neighbor, mutual (mutual neighbors only), or private. Ignored when draftOnly is true.'}, 'draftOnly': {'type': 'boolean', 'description': 'Save as a draft in Naver instead of publishing. The user finishes it by hand, or you publish it later with publish_naver_draft. categoryId, tags and openType are not stored on a draft; pass them when you publish it. Different from draft on the post, which keeps the whole post on uplika.'}, 'tempLogNo': {'type': 'string', 'description': 'Set by publish_naver_draft: the Naver temp-saved draft to publish as it is. The body is ignored; the extension loads that draft in the editor and presses publish.'}, 'categoryId': {'type': 'string', 'description': 'The id of a category on the connected blog. list_accounts returns them under naverBlog.categories. Give this or category (the name); there is no default, and without one Naver files the post under the wrong board. Not needed and ignored when draftOnly is true (a draft has no board until it is published).'}, 'fontFamily': {'enum': ['nanumgothic', 'nanummyeongjo', 'nanumbarungothic', 'nanumsquare', 'maruburi'], 'type': 'string', 'description': 'Body font, one of nanumgothic, nanummyeongjo, nanumbarungothic, nanumsquare, maruburi. Omit for the editor default.'}, 'alignCenter': {'type': 'boolean', 'description': "Center every paragraph and image that has no alignment of its own. A photo line's own {.left} / {.center} / {.right} wins."}, 'scheduledAt': {'type': 'string', 'description': "Same as scheduledAt on the post: ISO 8601 with a timezone offset, 10 minutes to a year out. Uplika holds the post and sends it to Naver at that time; Naver's own reservation is not used. Prefer scheduledAt on the post. Not allowed together with draftOnly or on a post that also targets other channels."}, 'seoKeywords': {'type': 'object', 'properties': {'main': {'type': 'string', 'maxLength': 100, 'description': 'The main keyword, verbatim in the title and the first line.'}, 'subs': {'type': 'array', 'items': {'type': 'string', 'maxLength': 100, 'description': 'One sub keyword.'}, 'maxItems': 5, 'description': 'Sub keywords, one per section title.'}, 'measuredAt': {'type': 'string', 'description': 'ISO 8601 date the numbers were measured.'}}, 'description': 'The search keywords this post targets, from keyword research (POST /v1/naver/keywords/judge): main is the one keyword the title leads with, subs (2-5) become the section titles one each. Not used when publishing; stored with the post and read by the SEO check.'}}, 'description': "Naver Blog settings. Required when a target is a Naver Blog account. Naver Blog has no official API: the post is written by the user's browser extension, so it goes out only while that browser is open. list_accounts tells you whether the extension is online; if it is offline the post queues for up to 7 days and you should say so. The body is Markdown, plus Naver-only markup for things Markdown has no word for (highlighting, styled tables, collages, maps, events): call describe_grammar with platform naver_blog for the syntax and its traps. Reference uploaded media inline with ``; ids you reference this way do not have to repeat in mediaIds, and media you pass but never reference goes at the end. When other channels are in the same post, put the Markdown in options.naver_blog.content so the shared content stays plain text."}}, 'description': 'Per-channel settings, keyed by channel id. Only the channels you are posting to need an entry. Every channel takes content to override the shared text for that channel alone.'}, 'mediaIds': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Media ids from media_presign (confirmed with media_complete), media_from_url or media_upload_link. On Naver Blog you can leave out ids the body already points at with media:<id>; we pick those up from the text.'}, 'topicTag': {'type': 'string', 'description': 'One topic to tag the post with, like a category. Only some channels take one, and those reject periods and ampersands in it. If any channel in accountIds does not take topics the whole call is refused, so publish to it separately. On a thread it goes on the first piece only. Leave it out unless the person asked for a topic.'}, 'accountIds': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Account ids from select_channels'}, 'automation': {'type': 'object', 'properties': {'name': {'type': 'string'}, 'params': {'type': 'object'}, 'enabled': {'type': 'boolean'}, 'template': {'type': 'string'}}, 'description': "Attach an automation to this post in the same call. template defaults to comment_to_dm; params are that template's params (see list_automation_templates) minus post, which is this post. Created as a draft unless enabled: true. Targets on channels without comments or DMs (YouTube, Telegram, Naver Blog, Bluesky, TikTok) are skipped and named in the response."}, 'scheduledAt': {'type': 'string', 'description': 'ISO 8601 time with a timezone offset (2026-09-20T09:00:00+09:00) to send the post at, on every channel. 10 minutes to 365 days from now. We keep the post as scheduled until then; the person can still change or cancel it.'}, 'threadItems': {'type': 'array', 'items': {'type': 'object', 'required': ['content'], 'properties': {'content': {'type': 'string'}, 'mediaIds': {'type': 'array', 'items': {'type': 'string'}}}}, 'description': 'Split a long post into a chain instead of calling publish and then reply. The first item is the root and the rest become replies under it, in order. We handle the ordering and the waiting. Each item obeys the character limit on its own. Pass either content or threadItems, not both. If a later item fails, the ones already up stay up and the response tells you where to resume.'}, 'workspaceId': {'type': 'string', 'description': 'Which workspace this is for. Only needed when the account has more than one — the error tells you the ids when it matters. Leave it out if it is already decided; do not ask the person again.'}}}
入力スキーマ
{'type': 'object', 'required': ['logNo'], 'properties': {'tags': {'type': 'array', 'items': {'type': 'string'}, 'description': "Replace the draft's tags (no #)."}, 'wait': {'type': 'boolean', 'description': 'Hold until the extension finishes, up to 75 seconds. Past that it returns while still going out; read it with get_post.'}, 'logNo': {'type': 'string', 'description': "The draft's logNo from list_naver_drafts."}, 'title': {'type': 'string', 'description': "Replace the draft's title."}, 'category': {'type': 'string', 'description': 'Category by name instead of id.'}, 'openType': {'enum': ['public', 'neighbor', 'mutual', 'private'], 'type': 'string', 'description': "Visibility. Default: the draft's own setting."}, 'accountId': {'type': 'string', 'description': 'Which Naver Blog account. Required only when the workspace has more than one.'}, 'categoryId': {'type': 'string', 'description': "Category id from list_accounts. Default: the draft's own."}, 'workspaceId': {'type': 'string', 'description': 'Which workspace this is for. Only needed when the account has more than one — the error tells you the ids when it matters. Leave it out if it is already decided; do not ask the person again.'}}}
入力スキーマ
{'type': 'object', 'required': ['id'], 'properties': {'id': {'type': 'string', 'description': "A publish id (post_…), the post's own id on the channel, or a post link (the URL you would open in a browser to see it). Links work for posts written in the channel's own app too, as long as the account is connected here."}, 'wait': {'type': 'boolean', 'description': 'Hold the response until the post is really out, same as on publish.'}, 'workspaceId': {'type': 'string', 'description': 'Which workspace this is for. Only needed when the account has more than one — the error tells you the ids when it matters. Leave it out if it is already decided; do not ask the person again.'}}}
入力スキーマ
{'type': 'object', 'required': ['id', 'version', 'doc'], 'properties': {'id': {'type': 'string'}, 'doc': {'type': 'object', 'required': ['v', 'triggers', 'start', 'nodes'], 'properties': {'v': {'type': 'integer', 'const': 1}, 'nodes': {'type': 'object', 'additionalProperties': {'type': 'object', 'required': ['type'], 'properties': {'all': {'type': 'array', 'items': {'type': 'object', 'required': ['field', 'op'], 'properties': {'op': {'enum': ['eq', 'ne', 'gt', 'lt', 'has', 'not_has', 'contains'], 'type': 'string'}, 'key': {'type': 'string'}, 'field': {'enum': ['tag', 'follows_us', 'we_follow', 'follower_count', 'verified', 'window_open', 'opted_in', 'last_interaction_hours', 'field', 'intent', 'sentiment', 'text', 'clicked'], 'type': 'string'}, 'value': {}}}}, 'else': {'type': ['string', 'null'], 'description': 'Id of the next node, or null to stop.'}, 'flow': {'type': 'string'}, 'mode': {'enum': ['window', 'private_reply', 'public_reply'], 'type': 'string', 'description': 'send: window = inside the 24-hour window, private_reply = one DM to a commenter, public_reply = comment under the post.'}, 'next': {'type': ['string', 'null'], 'description': 'Id of the next node, or null to stop.'}, 'then': {'type': ['string', 'null'], 'description': 'Id of the next node, or null to stop.'}, 'type': {'enum': ['send', 'condition', 'action', 'delay', 'random', 'goto', 'ai', 'ask'], 'type': 'string'}, 'field': {'type': 'string', 'description': 'ask: contact field the answer is stored in (e.g. email).'}, 'items': {'type': 'array', 'items': {'type': 'object', 'required': ['type'], 'properties': {'key': {'type': 'string'}, 'tag': {'type': 'string'}, 'type': {'enum': ['add_tag', 'remove_tag', 'set_field', 'clear_field', 'opt_in', 'opt_out', 'open_conversation', 'close_conversation', 'assign', 'hide_reply', 'approve_reply', 'follow', 'like_comment'], 'type': 'string'}, 'value': {'type': 'string'}, 'mutual': {'type': 'boolean', 'description': 'follow: ask for a mutual neighbor relation (Naver). Default false.'}, 'userId': {'type': 'string'}, 'message': {'type': 'string', 'description': 'follow: message on the mutual request.'}}}}, 'retry': {'type': 'string'}, 'blocks': {'type': 'array', 'items': {'type': 'object', 'required': ['type'], 'properties': {'url': {'type': 'string'}, 'text': {'type': 'string'}, 'type': {'enum': ['text', 'image', 'video', 'audio', 'file', 'delay', 'card', 'gallery'], 'type': 'string'}, 'cards': {'type': 'array', 'items': {'type': 'object'}}, 'title': {'type': 'string'}, 'buttons': {'type': 'array', 'items': {'type': 'object', 'required': ['id', 'title', 'kind'], 'properties': {'id': {'type': 'string'}, 'url': {'type': 'string'}, 'kind': {'enum': ['postback', 'url'], 'type': 'string'}, 'next': {'type': ['string', 'null'], 'description': 'Id of the next node, or null to stop.'}, 'title': {'type': 'string', 'description': 'At most 20 characters.'}}}}, 'mediaId': {'type': 'string'}, 'seconds': {'type': 'number'}, 'imageUrl': {'type': 'string'}, 'subtitle': {'type': 'string'}}}}, 'buttons': {'type': 'array', 'items': {'type': 'object', 'required': ['id', 'title', 'kind'], 'properties': {'id': {'type': 'string'}, 'url': {'type': 'string'}, 'kind': {'enum': ['postback', 'url'], 'type': 'string'}, 'next': {'type': ['string', 'null'], 'description': 'Id of the next node, or null to stop.'}, 'title': {'type': 'string', 'description': 'At most 20 characters.'}}}, 'maxItems': 3}, 'seconds': {'type': 'number'}, 'branches': {'type': 'array', 'items': {'type': 'object', 'required': ['weight'], 'properties': {'next': {'type': ['string', 'null'], 'description': 'Id of the next node, or null to stop.'}, 'weight': {'type': 'number'}}}}, 'escalate': {'type': ['string', 'null'], 'description': 'Id of the next node, or null to stop.'}, 'maxTries': {'type': 'integer', 'description': 'ask: default 3. After that the flow continues without a value.'}, 'maxTurns': {'type': 'integer'}, 'validate': {'enum': ['email', 'none'], 'type': 'string', 'description': 'ask: how to check the answer. Wrong answers get `retry`, up to maxTries.'}, 'usePersona': {'type': 'boolean'}, 'instruction': {'type': 'string'}, 'quickReplies': {'type': 'array', 'items': {'type': 'object', 'required': ['id', 'title'], 'properties': {'id': {'type': 'string'}, 'next': {'type': ['string', 'null'], 'description': 'Id of the next node, or null to stop.'}, 'title': {'type': 'string'}}}, 'maxItems': 13}}}}, 'start': {'type': ['string', 'null']}, 'layout': {'type': 'object', 'additionalProperties': {'type': 'object', 'properties': {'x': {'type': 'number'}, 'y': {'type': 'number'}}}}, 'template': {'type': 'object', 'properties': {'id': {'type': 'string'}, 'params': {'type': 'object'}}}, 'triggers': {'type': 'array', 'items': {'type': 'object', 'required': ['kind'], 'properties': {'at': {'type': 'string'}, 'ref': {'type': 'string'}, 'tag': {'type': 'string'}, 'kind': {'enum': ['comment', 'live_comment', 'message', 'story_reply', 'story_mention', 'referral', 'mention', 'contact_created', 'tag_added', 'tag_removed', 'field_changed', 'schedule'], 'type': 'string'}, 'post': {'oneOf': [{'enum': ['any', 'next'], 'type': 'string'}, {'type': 'object', 'required': ['postId'], 'properties': {'postId': {'type': 'string'}}}], 'description': 'comment triggers: { postId } | "any" | "next". "next" binds to the next post you publish.'}, 'field': {'type': 'string'}, 'keywords': {'type': ['object', 'null'], 'required': ['match', 'values'], 'properties': {'match': {'enum': ['is', 'contains', 'whole_word', 'begins_with', 'thumbs_up', 'not_contains'], 'type': 'string'}, 'values': {'type': 'array', 'items': {'type': 'string'}}}}, 'publicReply': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Also reply publicly under the comment. Several entries are picked at random.'}}}, 'minItems': 1}}, 'description': "One automation flow. triggers start it, nodes are the steps, start names the first node. Waiting is not a node: a send node with buttons and next: null waits for the person to tap one, and that button's next continues. A loop must pass through such a wait."}, 'name': {'type': 'string'}, 'version': {'type': 'integer'}, 'workspaceId': {'type': 'string', 'description': 'Which workspace this is for. Only needed when the account has more than one — the error tells you the ids when it matters. Leave it out if it is already decided; do not ask the person again.'}}}
入力スキーマ
{'type': 'object', 'required': ['id'], 'properties': {'id': {'type': 'string'}, 'workspaceId': {'type': 'string', 'description': 'Which workspace this is for. Only needed when the account has more than one — the error tells you the ids when it matters. Leave it out if it is already decided; do not ask the person again.'}}}
入力スキーマ
{'type': 'object', 'required': ['accountId'], 'properties': {'accountId': {'type': 'string', 'description': 'The account id from list_accounts.'}, 'workspaceId': {'type': 'string', 'description': 'Which workspace this is for. Only needed when the account has more than one — the error tells you the ids when it matters. Leave it out if it is already decided; do not ask the person again.'}}}
入力スキーマ
{'type': 'object', 'required': ['id', 'content'], 'properties': {'id': {'type': 'string', 'description': "A publish id (post_…), the post's own id on the channel, or a post link (the URL you would open in a browser to see it). Links work for posts written in the channel's own app too, as long as the account is connected here."}, 'wait': {'type': 'boolean', 'description': 'Hold the response until the reply is really out, up to 10 seconds, so you can say it is live. If it is still going you get the usual publishing response; poll get_post. Defaults to false.'}, 'secret': {'type': 'boolean', 'description': 'Naver Blog only: post it as a secret comment that only the blog owner can read. Other channels refuse it.'}, 'content': {'type': 'string'}, 'replyTo': {'type': 'string', 'description': 'Reply id from list_replies. Omit to reply to the post itself.'}, 'workspaceId': {'type': 'string', 'description': 'Which workspace this is for. Only needed when the account has more than one — the error tells you the ids when it matters. Leave it out if it is already decided; do not ask the person again.'}}}
入力スキーマ
{'type': 'object', 'required': ['keywords'], 'properties': {'topic': {'type': 'string', 'description': 'What the post is about, one line. Goes into draftPrompt; without it the prompt tells the writer to pick a subject that fits the main keyword.'}, 'keywords': {'type': 'array', 'items': {'type': 'string'}, 'description': '1-60 keywords, as the person would search them.'}, 'seedText': {'type': 'string', 'description': "What the person asked for, kept as the report's label. Defaults to the first five keywords."}, 'workspaceId': {'type': 'string', 'description': 'Which workspace this is for. Only needed when the account has more than one — the error tells you the ids when it matters. Leave it out if it is already decided; do not ask the person again.'}}}
入力スキーマ
{'type': 'object', 'required': ['id'], 'properties': {'id': {'type': 'string', 'description': "A publish id (post_…), the post's own id on the channel, or a post link (the URL you would open in a browser to see it). Links work for posts written in the channel's own app too, as long as the account is connected here."}, 'force': {'type': 'boolean', 'description': 'Retry even though a Naver target is naver_draft_unknown (pass it only after list_naver_drafts shows the draft is not there), or even though another post with the same content is on the same account (duplicate_post).'}, 'workspaceId': {'type': 'string', 'description': 'Which workspace this is for. Only needed when the account has more than one — the error tells you the ids when it matters. Leave it out if it is already decided; do not ask the person again.'}}}
入力スキーマ
{'type': 'object', 'required': ['q'], 'properties': {'q': {'type': 'string', 'description': 'The search words, as a viewer would type them.'}, 'max': {'type': 'number', 'description': '1-50, default 25.'}, 'order': {'enum': ['viewCount', 'date', 'relevance'], 'type': 'string', 'description': 'Default viewCount.'}, 'topic': {'type': 'string', 'description': 'The video the person wants to make, one line. Goes into prompt.'}, 'format': {'enum': ['all', 'shorts', 'long'], 'type': 'string', 'description': 'Default all.'}, 'period': {'enum': ['7d', '1m', '3m', '6m', '1y'], 'type': 'string', 'description': 'How far back. Omit for no limit.'}, 'workspaceId': {'type': 'string', 'description': 'Which workspace this is for. Only needed when the account has more than one — the error tells you the ids when it matters. Leave it out if it is already decided; do not ask the person again.'}}}
入力スキーマ
{'type': 'object', 'properties': {'scope': {'anyOf': [{'enum': ['all'], 'type': 'string'}, {'type': 'array', 'items': {'type': 'string'}}], 'description': 'Omit to list candidates, "all" for every active channel, or an array of platform names, handles or account ids.'}, 'workspaceId': {'type': 'string', 'description': 'Which workspace this is for. Only needed when the account has more than one — the error tells you the ids when it matters. Leave it out if it is already decided; do not ask the person again.'}}}
入力スキーマ
{'type': 'object', 'required': ['id'], 'properties': {'id': {'type': 'string', 'description': 'Conversation id from list_conversations.'}, 'text': {'type': 'string'}, 'draftId': {'type': 'string', 'description': 'Message id of an AI draft to send instead of new text.'}, 'mediaId': {'type': 'string', 'description': 'Optional media id from media_presign.'}, 'workspaceId': {'type': 'string', 'description': 'Which workspace this is for. Only needed when the account has more than one — the error tells you the ids when it matters. Leave it out if it is already decided; do not ask the person again.'}}}
入力スキーマ
{'type': 'object', 'required': ['id', 'aiGenerated'], 'properties': {'id': {'type': 'string', 'description': 'Media id from media_presign, media_from_url or media_upload_status.'}, 'aiGenerated': {'type': 'boolean', 'description': 'true to mark as AI-made, false to clear.'}, 'workspaceId': {'type': 'string', 'description': 'Which workspace this is for. Only needed when the account has more than one — the error tells you the ids when it matters. Leave it out if it is already decided; do not ask the person again.'}}}
入力スキーマ
{'type': 'object', 'required': ['id'], 'properties': {'id': {'type': 'string', 'description': "A publish id (post_…), the post's own id on the channel, or a post link (the URL you would open in a browser to see it). Links work for posts written in the channel's own app too, as long as the account is connected here."}, 'wait': {'type': 'boolean', 'description': 'Only when editing a post that is already live: hold the response until the edit has gone through or not, up to 75 seconds. Past that it returns while still working, with next telling you to read get_post.'}, 'draft': {'type': 'boolean', 'description': 'true turns a scheduled post back into a draft.'}, 'content': {'type': 'string', 'description': 'New post text.'}, 'options': {'type': 'object', 'description': 'Per-channel settings, same shape as on publish. Replaces the whole object.'}, 'mediaIds': {'type': 'array', 'items': {'type': 'string'}, 'description': "New media, in order. Replaces the current set. On a Naver Blog post the body's media: references already are the list, so leave this out unless you add media to the end of the post without placing it."}, 'accountIds': {'type': 'array', 'items': {'type': 'string'}, 'description': 'New target accounts, from select_channels. Replaces the current set.'}, 'scheduledAt': {'type': ['string', 'null'], 'description': 'New send time (ISO 8601 with offset, 10 minutes to 365 days out), or null to keep the post as a draft instead.'}, 'threadItems': {'type': 'array', 'items': {'type': 'object', 'required': ['content'], 'properties': {'content': {'type': 'string'}, 'mediaIds': {'type': 'array', 'items': {'type': 'string'}}}}, 'description': 'Replace the whole chain: [{ content, mediaIds? }], first item is the root. Only while the post is scheduled or a draft, and only for Threads and Bluesky. Leave it out to keep the current items (content then edits just the first one). Exclusive with content.'}, 'workspaceId': {'type': 'string', 'description': 'Which workspace this is for. Only needed when the account has more than one — the error tells you the ids when it matters. Leave it out if it is already decided; do not ask the person again.'}, 'sourceVersion': {'type': 'string', 'description': "Only for a Naver post written in Naver's editor: the sourceVersion that came with the source you edited (from naver_source_required or get_post). It tells uplika the content was made from the post's current source."}}}
最近のツール変更
類似のMCPサーバー
captapi
Retrieves social media profiles, posts, engagement metrics, comments, marketplace listings, events, and Meta advertising data acr…
SendIt
Plans, generates, approves, schedules, publishes, and analyzes social media content across LinkedIn, Instagram, Threads, TikTok, …
aidelly
Supports agency social media operations including content creation, approvals, scheduling, publishing, repurposing, analytics, ec…
LinkedIn MCP Server (Salesbot)
Supports LinkedIn lead discovery, contact enrichment, CRM pipelines, campaign sequencing, message approval and human-reviewed out…
excalibur-mcp
Creates, schedules, manages, and measures formatted posts for X, with OAuth, snippets, writing voice, and post performance tracki…
Prowlo — Reddit & X for AI agents
Indexes and searches Reddit and X-related social data, discovers communities, monitors keywords, finds engagement opportunities, …
ChiefLab
Runs approval-gated product launch workflows with channel-specific marketing drafts, social publishing, email actions, measuremen…
Meta Ads (Facebook & Instagram)
Reads and manages Meta advertising campaigns, ad sets, ads, creatives, audiences, business accounts, pages, pixels, budgets, targ…