MCP 服务器

ProductClank

com.productclank/productclank
商业与运营 营销与广告 社交媒体 公开且可连接 MCP 2025-11-25

此 MCP 可以做什么

Creates and manages social promotion, discovery, content, and creator-participation campaigns across multiple social platforms.

add_delegate
Hand a campaign to a human
Add a ProductClank user as a delegate on a campaign so they can view and manage it from the webapp's My Campaigns page. Free. Useful to hand oversight of an agent-created campaign to its human owner (the connected user's own id works too).
输入模式
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['campaign_id', 'user_id'], 'properties': {'user_id': {'type': 'string', 'description': 'ProductClank User id to grant webapp access to'}, 'campaign_id': {'type': 'string'}}, 'additionalProperties': False}
analyze_url
Derive a campaign brief from a product URL
Read a product's website and propose the two fields create_campaign requires: keywords and search_context (plus a suggested title). 3 credits, charged only when a brief comes back. Creates nothing — no campaign, no product, no discovery, and no commitment to create one. USE THIS ONLY WHEN YOU CANNOT FETCH THE PAGE YOURSELF. If you can browse from this client, do the derivation in the conversation instead: it is free, you can iterate with the user before anything is spent, and you know what they have told you about their audience — a one-shot page read does not. Reach for this when web access is unavailable or the fetch failed, and say plainly that it costs 3 credits before calling. It returns 8-15 keywords: put them in front of the user and cut to the 3-8 that match how their buyers actually talk, because create_campaign is what the campaign then runs on.
可访问外部资源
输入模式
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['url'], 'properties': {'url': {'type': 'string', 'description': "The product's website"}, 'platform': {'enum': ['twitter', 'linkedin', 'reddit', 'youtube'], 'type': 'string', 'description': 'Platform the brief is written for â\x80\x94 the vocabulary adapts (videos on YouTube, threads on Reddit). Pass the same value you will pass to create_campaign. Defaults to twitter.'}, 'product_id': {'type': 'string', 'description': 'Existing product UUID (search_products / create_product) â\x80\x94 its name and tagline sharpen the brief.'}, 'product_name': {'type': 'string', 'description': "Overrides the listing's name"}, 'product_tagline': {'type': 'string', 'description': "Overrides the listing's tagline"}}, 'additionalProperties': False}
boost_post
Boost a social post
Rally the ProductClank community to engage with a specific social post. Creates a boost campaign and spends the user's credits: 'replies' generates 10 AI reply drafts (200 credits); 'quote' generates 10 AI-drafted QUOTE POSTS (200 credits) — a repost WITH each member's own text, shown above the quoted post in their followers' feeds, the highest-reach action; 'likes' (30 likes) and 'repost' (10 reposts) cost 300. Supports Twitter/X, Instagram, TikTok, LinkedIn, Reddit, Farcaster, and YouTube (replies + likes on YouTube; reposts only on X and Farcaster; quote posts only on X) — the platform is auto-detected from the URL. product_id is OPTIONAL: link a product (from search_products or create_product) to tailor replies with the product name, or omit it for a tweet-first boost that uses generic amplification language. Confirm the action and its credit cost with the user before calling.
可访问外部资源
输入模式
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['post_url'], 'properties': {'post_url': {'type': 'string', 'format': 'uri', 'description': 'Full URL of the post to boost (any supported platform)'}, 'product_id': {'type': 'string', 'description': 'Optional product UUID (from search_products or create_product). Omit for a tweet-first boost.'}, 'action_type': {'enum': ['replies', 'likes', 'repost', 'quote'], 'type': 'string', 'description': "How the community engages. Default: replies. Reposts are Twitter/Farcaster only; quote posts (repost with the member's own drafted text) are X only."}, 'reply_guidelines': {'type': 'string', 'description': 'Optional guidance for the tone and content of community replies or quote posts'}}, 'additionalProperties': False}
check_balance
Check credit balance
Return the connected user's ProductClank credit balance and plan. Use before launching a campaign to confirm they have enough credits (a content campaign costs 1000; a reply or quote-post boost 200; likes/reposts 300; a discovery campaign 10 to create + 12/post discovered).
只读
输入模式
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'properties': {}}
create_campaign
Create a discovery campaign
Create a Communiply discovery campaign: it continuously finds relevant social posts (by keyword) and drafts replies for them. BEFORE calling: the keywords and search_context are YOURS to derive, and deriving them well is most of the campaign's quality — actually fetch and read the product's website (and any docs or pages the user pointed at), work out who the audience is and the phrases they use when they have the problem the product solves, and build keywords + search_context from that. Do it in this conversation, for free — it is not billed, and you can iterate with the user before anything is spent. If you cannot browse the web from this client, SAY SO to the user and build from what they tell you instead — never silently guess from the product's name alone. Credits pay only for what you cannot do here: scraping the platforms, real community members posting, and proof verification. Costs 10 credits to create; discovering posts is billed separately via generate_posts (12 credits/post). Needs a product_id (search_products / create_product). Two ways to run it, and the user picks: PRIVATE (the default here) keeps drafts in their workbench to review and post themselves — reversible, no further cost; PUBLIC puts the drafts in the ProductClank earn feed so community members post them from their own accounts — that is the reach the platform exists for, and each network-posted reply bills the user extra credits. Default to private when the user has not said, and relay the decision_offer in the result so they can choose. On X, also ask what the replies are for (reply_approach): awareness (the product and its site in the thread) or sales (flag each post to the brand/founder as a lead, tagging the accounts they choose in reply_tag_accounts). Pick the `platform` the product's audience actually talks on — X (default), LinkedIn, Reddit or YouTube — and for Reddit/YouTube narrow it with target_subreddits / target_youtube_channels. Topic research auto-runs in the background at create (~30s); read it with get_research before spending on generate_posts. Confirm the credit cost with the user before calling.
可访问外部资源
输入模式
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['product_id', 'title', 'keywords', 'search_context'], 'properties': {'title': {'type': 'string', 'description': "Campaign title, e.g. 'Grow Acme â\x80\x94 AI devtools conversations'"}, 'keywords': {'type': 'array', 'items': {'type': 'string'}, 'maxItems': 20, 'minItems': 1, 'description': "Search keywords/phrases to discover posts with (3â\x80\x938 focused phrases work best). Derive these from the product's actual site and audience â\x80\x94 the words people use when they HAVE the problem ('CI is so slow', 'alternatives to X'), not the product's own marketing vocabulary or its name."}, 'platform': {'enum': ['twitter', 'linkedin', 'reddit', 'youtube'], 'type': 'string', 'description': "Which network to work: twitter (default), linkedin, reddit, youtube. This is WHERE discovery looks â\x80\x94 distinct from `sources` in update_campaign, which is HOW it looks there. Pick from where the product's audience actually is; it is fixed once the campaign discovers its first post."}, 'product_id': {'type': 'string', 'description': 'Product UUID (from search_products or create_product)'}, 'visibility': {'enum': ['public', 'private'], 'type': 'string', 'description': "Who posts the drafted replies. private (default) = they wait in the user's workbench for the user to post; public = the community earn feed distributes them and network members post them, billing the user per posted reply. Reversible either way â\x80\x94 ask the user rather than assuming."}, 'reply_length': {'enum': ['very-short', 'short', 'medium', 'long', 'mixed'], 'type': 'string'}, 'reply_approach': {'enum': ['mention', 'flag'], 'type': 'string', 'description': "X campaigns only (the API rejects it elsewhere). What the replies are FOR â\x80\x94 ask the user, it changes every reply: 'mention' (default) = AWARENESS: replies put the product and its site in the conversation so thread readers see it â\x80\x94 right when the goal is visibility, traffic or brand presence. 'flag' = SALES: replies tag the brand and/or founder and point them at the post's author as a lead (e.g. '@brand @founder check out what Nick is struggling with, might be something you can help with'), so the founder can step in and convert â\x80\x94 right when the goal is signups, demos or deals. Neither style pretends the replier has used the product. With 'flag', set reply_tag_accounts."}, 'search_context': {'type': 'string', 'description': "One or two sentences on what conversations to find and why the product is relevant to them. Write it from having actually read the product's site and this conversation â\x80\x94 who the audience is, what pain they voice, what makes the product a natural mention. This steers both discovery and the relevance gate, so a generic sentence produces generic (billed) posts."}, 'post_visibility': {'enum': ['public', 'private'], 'type': 'string', 'description': "Visibility of each discovered post, independent of the campaign. 'public' campaign + 'private' posts = HELD mode: drafts are found and written but nobody can claim them until publish_posts releases the ones the user approves. Use it whenever the user wants to review wording before real people post."}, 'mention_accounts': {'type': 'array', 'items': {'type': 'string'}, 'description': "X handles to name-drop in 'mention'-approach replies (e.g. the product's account). Also a discovery input: posts that mention these accounts are surfaced too â\x80\x94 so to choose who 'flag' replies tag, use reply_tag_accounts, not this."}, 'reply_guidelines': {'type': 'string', 'description': 'Custom guidelines for reply drafting (defaults are built from the campaign context)'}, 'reply_style_tags': {'type': 'array', 'items': {'type': 'string'}, 'description': "Tone tags for drafted replies, e.g. ['helpful', 'builder-to-builder']"}, 'target_subreddits': {'type': 'array', 'items': {'type': 'string'}, 'maxItems': 25, 'description': "Reddit only, and enforced server-side: sending this on a non-Reddit campaign is REJECTED with an error, never silently ignored. Subreddits to rotate through, with or without the 'r/' prefix. Omit to search all of Reddit. Note Reddit allows at most one posted reply per subreddit per day, so breadth beats depth here."}, 'reply_tag_accounts': {'type': 'array', 'items': {'type': 'string'}, 'maxItems': 2, 'description': "X only, used with reply_approach 'flag': up to 2 handles to tag, brand first then the founder (e.g. ['acme', 'jane_founder']) â\x80\x94 so the user can choose brand, personal or both. Omit to fall back to mention_accounts, then the product's X handle. Ignored with 'mention' (the result warns)."}, 'target_youtube_channels': {'type': 'array', 'items': {'type': 'string'}, 'maxItems': 25, 'description': 'YouTube only, and enforced server-side: sending this on a non-YouTube campaign is REJECTED with an error, never silently ignored. Channel handles, ids or URLs to pull recent videos from, alongside the keyword search. Omit for keyword search alone.'}}, 'additionalProperties': False}
create_content_campaign
Launch a content campaign
Launch a content campaign: rally the ProductClank community to create content (posts, threads, videos) for a product. Spends 1000 credits. The platform's AI expands your brief into a full campaign and auto-activates it; community submissions and winner selection happen in the ProductClank web app. Requires a product_id from search_products. Preview with suggest_content_campaign and confirm the 1000-credit cost with the user before calling.
输入模式
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['product_id', 'campaign_message'], 'properties': {'product_id': {'type': 'string', 'description': 'Product UUID from search_products'}, 'references': {'type': 'string', 'description': 'Links or references to include in the campaign'}, 'campaign_goals': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Campaign goals, e.g. ["awareness", "signups"]'}, 'target_audience': {'type': 'string', 'description': 'Who the campaign should reach'}, 'campaign_message': {'type': 'string', 'description': "The core brief: what you want the community to create (e.g. 'Share how you use <product> in your daily workflow')."}, 'preferred_platform': {'type': 'string', 'description': 'Preferred platform, e.g. "x" or "farcaster"'}, 'additional_guidelines': {'type': 'string', 'description': "Extra do's/don'ts for creators"}}, 'additionalProperties': False}
create_product
List a product on ProductClank
List a new product on ProductClank as a token-free listing (no crypto/token, no wallet). At minimum pass a `url` — the server auto-fills the name, tagline, description, logo, and X handle from the site; any field you pass explicitly overrides what's extracted. Socials are optional. Use this when search_products finds no existing match and the user wants to run a boost or campaign for a product that isn't listed yet. Returns the new product's id (and reuses an existing listing if one already matches, rather than duplicating). FREE — no credits charged. Confirm the product details with the user before calling.
可访问外部资源
输入模式
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'properties': {'url': {'type': 'string', 'format': 'uri', 'description': 'Product website URL â\x80\x94 auto-fills the listing. Provide this or `name`.'}, 'logo': {'type': 'string', 'format': 'uri', 'description': 'Logo image URL (optional; otherwise auto-resolved from the site).'}, 'name': {'type': 'string', 'description': 'Product name. Optional if `url` is given (extracted from the site); required otherwise.'}, 'tagline': {'type': 'string', 'description': 'One-line value proposition (optional; overrides extracted).'}, 'twitter': {'type': 'string', 'description': 'X/Twitter handle or profile URL (optional).'}, 'website': {'type': 'string', 'format': 'uri', 'description': 'Canonical website, if different from `url` (optional).'}, 'category': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Category tags (optional).'}, 'description': {'type': 'string', 'description': 'Short description of what the product does (optional).'}}, 'additionalProperties': False}
credit_history
Credit transaction history
The connected user's credit transactions (purchases, campaign spend, participation rewards), newest first. Free, read-only. Use to account for what this connector has spent or earned. Top-ups are NOT available in-connector — send the user to app.productclank.com/credits/purchase when the balance runs low.
只读
输入模式
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'properties': {'limit': {'type': 'integer', 'maximum': 100, 'minimum': 1, 'description': 'Default 20'}, 'offset': {'type': 'integer', 'minimum': 0}}, 'additionalProperties': False}
edit_reply
Edit a reply draft
Rewrite the text of ONE reply draft before the community posts it. Free. Use it when the user wants different wording on a specific draft from get_posts — the edit lands on the exact reply a creator will claim, so it is what gets posted. Refuses a reply a creator has already claimed (already_claimed): edit before you publish. 280 characters on X, 2000 elsewhere.
输入模式
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['campaign_id', 'reply_id', 'reply_text'], 'properties': {'reply_id': {'type': 'string', 'description': 'Reply id from get_posts'}, 'reply_text': {'type': 'string', 'minLength': 1, 'description': 'The full replacement text'}, 'campaign_id': {'type': 'string'}}, 'additionalProperties': False}
find_open_campaigns
Find campaigns to participate in
Discover content and take-action campaigns the connected user can join and earn from: every active public campaign plus campaigns from communities the user belongs to. Each item has a kind — 'content' (create a post/thread/video about the product) or 'take_action' (do a concrete action like voting or starring, with URL/description proof). Free, read-only. Follow with get_campaign_brief before doing any work.
只读
输入模式
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'properties': {'kind': {'enum': ['content', 'take_action'], 'type': 'string', 'description': 'Filter by campaign kind'}, 'limit': {'type': 'integer', 'maximum': 100, 'minimum': 1, 'description': 'Default 25'}}, 'additionalProperties': False}
find_opportunities
Find earning opportunities
Browse unclaimed drafts from active campaigns the connected user can earn from: each item is a real social post plus a pre-drafted text, with the `platform` it lives on (X, Reddit, YouTube, LinkedIn) and an `actionType` — `reply` (post it as a reply under the target post) or `quote` (X only: post it as a QUOTE of the target post, the text above the quoted post, from the user's own account). Free, read-only. Flow: pick an opportunity → the user posts it (verbatim or personalized) from their own account → call submit_participation with the URL of what they posted. The user needs that platform's handle linked on their ProductClank profile for the reward to be attributable. Likes and reposts are proved with a screenshot and stay in the web app (app.productclank.com/feed).
只读
输入模式
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'properties': {'limit': {'type': 'integer', 'maximum': 100, 'minimum': 1, 'description': 'Default 25'}, 'offset': {'type': 'integer', 'minimum': 0}, 'campaign_id': {'type': 'string', 'description': 'Restrict to one campaign'}}, 'additionalProperties': False}
generate_posts
Discover posts & draft replies
Run the campaign's discovery pipeline: scrapes social platforms for posts matching the keywords and drafts a community reply for each. Costs 12 credits PER POST discovered (a typical run finds 5–20 posts, so 60–240 credits) and can take a few minutes. Check check_balance first and confirm the spend with the user. Then use get_posts to read results and review_posts to prune irrelevant ones.
可访问外部资源
输入模式
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['campaign_id'], 'properties': {'campaign_id': {'type': 'string'}}, 'additionalProperties': False}
get_campaign
Get campaign details & stats
Get one campaign's configuration (keywords, search context, reply settings incl. reply_approach — 'mention' awareness vs 'flag' leads to the founder — and reply_tag_accounts) plus live stats: posts discovered, replies by status. Free. Use to check progress after generate_posts or before adjusting the campaign.
只读
输入模式
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['campaign_id'], 'properties': {'campaign_id': {'type': 'string', 'description': 'Campaign UUID (from list_campaigns or create_campaign)'}}, 'additionalProperties': False}
get_campaign_activity
What's new on a campaign
Catch up on a campaign since the last check: posts discovered, replies claimed by community members, LIVE links to what they actually posted, and the engagement those replies drew. Free, and it never scrapes — safe to call at the start of every session. Pass `since` (the `checked_at` from the previous call) to get only what is new; omit it for the last 24 hours. Use this to resume a standing growth operation across chats, then get_campaign_results for the cumulative picture.
只读
输入模式
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['campaign_id'], 'properties': {'limit': {'type': 'integer', 'maximum': 100, 'minimum': 1, 'description': 'Items per list, default 20'}, 'since': {'type': 'string', 'description': 'ISO 8601 timestamp â\x80\x94 the `checked_at` returned by the previous call. Default: 24 hours ago.'}, 'campaign_id': {'type': 'string'}}, 'additionalProperties': False}
get_campaign_brief
Read a campaign's participation brief
The full brief for one campaign: what to create or do (action message, brief sections, content types), how submissions are judged (eligibility + selection criteria), rewards, deadline, and how many submissions the user has left. Free, read-only. If the brief links external instructions (e.g. a skill file), fetch and follow them. Then: create the content or take the action WITH the user, and call submit_campaign_work with the proof.
只读
输入模式
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['campaign_id'], 'properties': {'campaign_id': {'type': 'string', 'description': 'Campaign id from find_open_campaigns'}}, 'additionalProperties': False}
get_campaign_results
Campaign results & cost per usable reply
The cumulative scorecard for a campaign: the funnel (posts discovered → kept → replies drafted → claimed → posted → approved), the approval rate, whether posted replies survived on-platform, the engagement they drew, total credits spent broken down by operation, and the cost per usable reply. Free, and it never scrapes — unlike the web report it costs nothing to poll. Use it to answer 'is this working and what am I paying for it?'.
只读
输入模式
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['campaign_id'], 'properties': {'campaign_id': {'type': 'string'}}, 'additionalProperties': False}
get_content_campaign_results
Content campaign results
See what a content campaign actually produced: how many people submitted, the LIVE links to the content they published, which submissions were approved or rejected, and any winners picked. Free and read-only — safe to poll. This is how you close the loop on create_content_campaign; without it you only know a campaign was paid for, not whether it worked. Right after launch expect state 'processing' (the AI brief is still generating) and zero submissions — that is normal, not a failure. Accepts the campaign UUID or its public campaign number.
只读
输入模式
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['campaign_id'], 'properties': {'limit': {'type': 'integer', 'maximum': 100, 'minimum': 1, 'description': 'Submissions per page (default 50)'}, 'offset': {'type': 'integer', 'minimum': 0, 'description': 'Pagination offset'}, 'status': {'enum': ['pending', 'approved', 'rejected'], 'type': 'string', 'description': 'Only return submissions in this review state'}, 'campaign_id': {'type': 'string', 'description': 'Campaign UUID or public campaign number from create_content_campaign'}}, 'additionalProperties': False}
get_content_queue
Read the content queue with scores
The space's drafts as the user sees them in 'All Content': text, platform, status, and the reviewer's score / verdict / one-line fix. FREE. Use it to present drafts for approval one by one (show the text, the score against review_threshold, and the reviewer's summary), and after write_content_candidates to read back how your drafts scored. status: active (default — pending + reviewed + staged), pending, reviewed, staged (approved by the user, awaiting publish), discarded.
只读
输入模式
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['space_id'], 'properties': {'limit': {'type': 'integer', 'maximum': 100, 'minimum': 1}, 'status': {'enum': ['active', 'pending', 'reviewed', 'staged', 'discarded'], 'type': 'string'}, 'space_id': {'type': 'string'}}, 'additionalProperties': False}
get_content_workspace
Read a brand's content calibration
The brand's voice, platforms, post types, platform playbook, review threshold, topic inventory and any per-channel style guides for one content space. FREE. Read this BEFORE writing any draft so you write in the brand's own voice, and at the start of any content conversation to know what is already set up. `enabled:false` means the space has no content engine yet — offer setup_content_space.
只读
输入模式
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['space_id'], 'properties': {'space_id': {'type': 'string', 'description': 'The space (from list_content_spaces, or any Amplify space the user owns).'}}, 'additionalProperties': False}
get_earnings
Check participation earnings
The connected user's participation totals: points, credit balance, and reply stats (submitted / approved / rejected / strikes) for work submitted through this connector. Free, read-only.
只读
输入模式
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'properties': {}}
get_my_submissions
Check campaign submission status
The connected user's submissions to one campaign: pending / approved / rejected, with the reviewer's notes. Free, read-only. Use to report outcomes back to the user after submit_campaign_work.
只读
输入模式
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['campaign_id'], 'properties': {'campaign_id': {'type': 'string'}}, 'additionalProperties': False}
get_posts
Read discovered posts & reply drafts
Read a campaign's discovered posts with their drafted replies. Free. Use after generate_posts to inspect what was found, then review_posts / regenerate_replies to refine.
只读
输入模式
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['campaign_id'], 'properties': {'limit': {'type': 'integer', 'maximum': 200, 'minimum': 1, 'description': 'Default 50'}, 'offset': {'type': 'integer', 'minimum': 0}, 'status': {'enum': ['filtered', 'discovered', 'rejected'], 'type': 'string'}, 'campaign_id': {'type': 'string'}, 'include_replies': {'type': 'boolean', 'description': 'Default true'}}, 'additionalProperties': False}
get_research
Read cached campaign research
Read the cached topic/competitor analysis for a campaign (from run_research). Free. Also reports which of its findings the campaign is actually searching: expanded keywords and exclusion terms always apply, while phrases / influencer accounts / lists / competitors stay dormant until their source is enabled via update_campaign.
只读
输入模式
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['campaign_id'], 'properties': {'campaign_id': {'type': 'string'}}, 'additionalProperties': False}
get_support_status
Check support tickets
Read the status of issues you reported with report_issue, and ProductClank's replies. Without ticket_id: your recent tickets (look for has_reply:true). With ticket_id: the full conversation. Free, read-only. Check at the start of a session if you reported something earlier.
只读
输入模式
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'properties': {'limit': {'type': 'integer', 'maximum': 50, 'minimum': 1, 'description': 'Default 20 (list mode).'}, 'ticket_id': {'type': 'string'}}, 'additionalProperties': False}
list_campaigns
List the user's campaigns
List ALL the connected user's discovery/boost campaigns, newest first — including ones created in the ProductClank web app, not just via this connector. Free. Use to find a campaign id before get_campaign / generate_posts / get_posts.
只读
输入模式
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'properties': {'limit': {'type': 'integer', 'maximum': 100, 'minimum': 1, 'description': 'Default 20'}, 'offset': {'type': 'integer', 'minimum': 0}, 'status': {'enum': ['active', 'paused', 'completed'], 'type': 'string'}}, 'additionalProperties': False}
list_content_spaces
List content spaces
List the ProductClank content spaces you can draft into — spaces the user owns, delegates for, or manages that have their content engine turned on. Returns { space_id, name }. Call this first to resolve the space_id for write_content_candidates, and confirm the target space with the user.
只读
输入模式
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'properties': {}}
manage_content_topics
Manage the topic inventory
The inventory of aspects a brand talks about. FREE. action 'list' reads it; 'add' appends topics (≤12; keywords proposed when omitted); 'update' edits or pauses one (is_active:false keeps it but stops using it); 'remove' deletes one; 'suggest' brainstorms new KB-grounded ideas that differ from the existing topics — put them to the user, then 'add' the keepers.
可能执行破坏性操作
输入模式
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['space_id', 'action'], 'properties': {'label': {'type': 'string', 'description': 'update: new label.'}, 'action': {'enum': ['list', 'add', 'update', 'remove', 'suggest'], 'type': 'string'}, 'topics': {'type': 'array', 'items': {'type': 'object', 'required': ['label'], 'properties': {'label': {'type': 'string', 'description': "The theme, e.g. 'Why distribution beats building'."}, 'keywords': {'type': 'array', 'items': {'type': 'string'}, 'description': '2â\x80\x934 broad, short search terms. Omit and the engine proposes them.'}, 'search_context': {'type': 'string', 'description': 'The angle or audience for this theme.'}}, 'additionalProperties': False}, 'maxItems': 12, 'description': 'add: the topics to append.'}, 'keywords': {'type': 'array', 'items': {'type': 'string'}, 'description': 'update: replacement keywords.'}, 'space_id': {'type': 'string'}, 'topic_id': {'type': 'string', 'description': 'update / remove: which topic.'}, 'is_active': {'type': 'boolean', 'description': 'update: false pauses the topic.'}, 'search_context': {'type': 'string', 'description': 'update: new angle.'}}, 'additionalProperties': False}
publish_posts
Publish held drafts to the community
Release chosen posts (and their reply drafts) to the community earn feed. Free. This is the approval step for a campaign created with post_visibility 'private' (held mode): drafts are found and written but nobody can claim them until you publish them. Pass the post_ids the user approved, or all:true. If the campaign is still private this makes it public — which turns on per-posted-reply billing (20 credits each) — so the API demands confirm:true; only pass it after the user has agreed. Unlike update_campaign's visibility flip, this touches only the posts you name and leaves future drafts held.
输入模式
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['campaign_id'], 'properties': {'all': {'type': 'boolean', 'description': 'Release every held post in the campaign'}, 'confirm': {'type': 'boolean', 'description': 'Required only when the campaign itself is still private â\x80\x94 confirms the user agreed to community distribution and per-reply billing'}, 'post_ids': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Post ids from get_posts to release. Omit with all:true to release every held post.'}, 'campaign_id': {'type': 'string'}}, 'additionalProperties': False}
regenerate_replies
Regenerate reply drafts with feedback
Redraft the replies of specific posts with an edit request (e.g. 'shorter, no emojis, lead with the user's problem'). Costs 5 credits per reply regenerated; already-claimed replies are refused. Get post ids from get_posts. Confirm the spend with the user.
输入模式
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['campaign_id', 'post_ids', 'edit_request'], 'properties': {'post_ids': {'type': 'array', 'items': {'type': 'string'}, 'maxItems': 50, 'minItems': 1, 'description': 'Post UUIDs whose replies to redraft'}, 'campaign_id': {'type': 'string'}, 'edit_request': {'type': 'string', 'description': 'How the replies should change'}}, 'additionalProperties': False}
report_issue
Report an issue to ProductClank support
Tell the ProductClank team a tool failed, returned something that doesn't make sense, or that you're stuck and can't finish the user's task. Free. A human is alerted and replies (read it with get_support_status). Use this INSTEAD of retrying a failing call in a loop — but not for expected guards the error already explains (insufficient credits, a confirmation prompt, a spend cap): relay those to the user. Include the failing tool, its error code/status and what you tried. If the error_code is a known one, the result carries `self_help` — a fix you can apply right away. Tell the user in one line that you reported it. To add detail to an earlier report pass its ticket_id rather than opening a new one.
输入模式
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['message'], 'properties': {'tool': {'type': 'string', 'description': 'The ProductClank tool that failed, e.g. generate_posts.'}, 'context': {'type': 'object', 'description': 'Arguments you passed, the error text, what you already tried. Never include secrets.', 'additionalProperties': {}}, 'message': {'type': 'string', 'maxLength': 5000, 'minLength': 10, 'description': 'What you were trying to do, what happened, and what you expected.'}, 'category': {'enum': ['bug', 'stuck', 'unexpected_result', 'docs', 'billing', 'feature_request', 'other'], 'type': 'string', 'description': "Default 'other'."}, 'severity': {'enum': ['low', 'normal', 'high', 'blocking'], 'type': 'string', 'description': "'blocking' = you cannot continue the user's task. Default 'normal'."}, 'ticket_id': {'type': 'string', 'description': 'Follow up on a ticket you opened earlier.'}, 'error_code': {'type': 'string', 'description': 'The machine error code from the failed call, if shown.'}, 'http_status': {'type': 'integer', 'description': 'Status from the failed call, if shown.'}}, 'additionalProperties': False}
review_posts
AI-review posts for relevance
Score every discovered post against relevancy rules and delete the irrelevant ones (kept when dry_run:true). Costs 2 credits per post reviewed — dry runs are billed too, since the AI review runs either way. Start with dry_run:true to preview the verdicts, then re-run with dry_run:false to prune. Confirm the spend with the user.
可能执行破坏性操作
输入模式
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['campaign_id'], 'properties': {'dry_run': {'type': 'boolean', 'description': 'Preview verdicts without deleting (default false; still billed)'}, 'threshold': {'type': 'integer', 'maximum': 10, 'minimum': 1, 'description': 'Delete posts scoring below this (default 5)'}, 'campaign_id': {'type': 'string'}, 'review_rules': {'type': 'string', 'description': "Relevancy rules, e.g. 'Keep only posts where the author has a real problem our product solves'. Falls back to rules saved on the campaign."}}, 'additionalProperties': False}
revise_content_draft
Approve, revise, or discard a draft
Act on one draft in the user's queue. `stage` = the user approved it (mark ready to publish; publishing itself happens in the web tool). `discard` drops it. `revise` rewrites it in the brand voice per a one-click preset — shorter, longer, punchier, deeper, simpler, more_specific, less_salesy, more_casual, more_formal — and/or a typed instruction (2 credits). `fix` makes the surgical change the reviewer's notes asked for (2). `humanize` strips the AI feel and keeps everything else (2). `review` scores it against the brand voice (2). `edit` replaces the text with what the user wrote (free). Any text change clears the old score. Stage and discard are the USER's decisions — act on their say-so, never on your own judgment. If the user's reaction should apply to every future draft (not just this one), use teach_content_voice instead.
可能执行破坏性操作
输入模式
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['space_id', 'draft_id', 'action'], 'properties': {'text': {'type': 'string', 'description': 'edit: the replacement text.'}, 'action': {'enum': ['stage', 'discard', 'revise', 'fix', 'humanize', 'review', 'edit'], 'type': 'string'}, 'preset': {'enum': ['shorter', 'longer', 'punchier', 'deeper', 'simpler', 'more_specific', 'less_salesy', 'more_casual', 'more_formal'], 'type': 'string', 'description': 'revise: the calibration chip the user clicked.'}, 'draft_id': {'type': 'string', 'description': 'From get_content_queue or a write_content_candidates result.'}, 'space_id': {'type': 'string'}, 'instruction': {'type': 'string', 'description': "revise / fix / humanize: the user's note in their words."}}, 'additionalProperties': False}
run_research
Research the campaign's topic (free)
FREE pre-flight before spending credits: analyzes the campaign's keywords/topic and returns expanded keywords, high-intent phrases, influencer accounts, relevant X lists, and competitors. The EXPANDED KEYWORDS and exclusion terms are applied automatically by the next generate_posts run. Everything else is NOT: phrases, influencer accounts, lists and competitors are only searched once their source is enabled — the result reports which are dormant, and update_campaign (free) switches them on. Cached for 7 days — pass force:true to refresh.
可访问外部资源
输入模式
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['campaign_id'], 'properties': {'force': {'type': 'boolean', 'description': 'Force a fresh analysis even if a cached one exists'}, 'campaign_id': {'type': 'string'}}, 'additionalProperties': False}
search_products
Search ProductClank products
Search the user's ProductClank products by name and return their IDs. A product_id is required to create or boost a campaign — use this to resolve it, then confirm the match with the user.
只读
输入模式
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['query'], 'properties': {'limit': {'type': 'integer', 'maximum': 20, 'minimum': 1, 'description': 'Max results (default 5)'}, 'query': {'type': 'string', 'description': 'Product name or keyword to search for'}}, 'additionalProperties': False}
set_campaign_schedule
Put discovery on a schedule
Turn standing discovery on or off for a campaign. Calling this is free, but switching it ON authorizes spend that happens LATER and unattended: an hourly job runs discovery on its own and bills the user 12 credits per post it finds, with nobody in the loop. So there are two steps and you must not skip the first. STEP 1 — call with enabled:true and NO confirmed flag: nothing is changed and you get back the projected daily and monthly cost, the balance, and how many days of runway that is. STEP 2 — show the user those numbers, get a real yes, then call again with confirmed:true. Never send confirmed:true on your own initiative, on an assumption, or because the user said something general like 'keep it going' — the user has to have seen a number. Turning it OFF (enabled:false) is always safe and needs no confirmation; do it whenever the user asks to stop. Limits on this path are deliberately lower than the website's: up to 4 runs/day, up to 20 posts/run, and never more than 600 projected credits/day. Read the current schedule with get_campaign.
输入模式
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['campaign_id', 'enabled'], 'properties': {'enabled': {'type': 'boolean', 'description': 'true starts standing discovery, false stops it'}, 'confirmed': {'type': 'boolean', 'description': 'Set true ONLY after the user has seen the projected cost from a previous call and explicitly agreed to it. Omit on the first call â\x80\x94 that is what produces the projection.'}, 'campaign_id': {'type': 'string'}, 'posts_per_run': {'type': 'integer', 'maximum': 20, 'minimum': 1, 'description': "Target posts per run (1-20). Defaults to the campaign's current setting, else 5. Each post found bills 12 credits."}, 'frequency_per_day': {'type': 'integer', 'maximum': 4, 'minimum': 1, 'description': "Discovery runs per day (1-4). Defaults to the campaign's current setting, else 1."}}, 'additionalProperties': False}
setup_content_space
Set up (or update) a brand's content space
Turn the content engine on for a brand from an onboarding conversation, or update its settings later. FREE with structured fields. Collect the answers FIRST (use the setup_content_space prompt: brand & site → audience → tone with the archetype options → platforms → post types → 3–8 topics → example posts), read them back to the user for a yes, THEN call this once. Target an existing space with space_id, or create a fresh solo space for the brand with new_space:{name}. First-time setup needs at least `voice` and `platforms`. Topics are appended (≤12 per call; keywords proposed when omitted). Pass `brand_doc` only when the user hands over a written brand template (it costs 5 credits to structure); answers you collected go in the fields for free. Nothing is published by this tool.
输入模式
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'properties': {'voice': {'type': 'string', 'description': "Voice & style as a tight paragraph: tone in 3â\x80\x935 words, do's and don'ts, typical length, emoji / hashtag / link policy, words to use and avoid, and the feel of any example posts the user shared."}, 'topics': {'type': 'array', 'items': {'type': 'object', 'required': ['label'], 'properties': {'label': {'type': 'string', 'description': "The theme, e.g. 'Why distribution beats building'."}, 'keywords': {'type': 'array', 'items': {'type': 'string'}, 'description': '2â\x80\x934 broad, short search terms. Omit and the engine proposes them.'}, 'search_context': {'type': 'string', 'description': 'The angle or audience for this theme.'}}, 'additionalProperties': False}, 'maxItems': 12, 'description': 'The inventory of themes to post about (3â\x80\x938 to start).'}, 'space_id': {'type': 'string', 'description': 'Existing space to enable/update (one of space_id / new_space is required).'}, 'brand_doc': {'type': 'string', 'description': 'A filled brand template the user pasted â\x80\x94 costs 5 credits to structure.'}, 'new_space': {'type': 'object', 'required': ['name'], 'properties': {'name': {'type': 'string', 'description': 'Brand or product name â\x80\x94 becomes the space name.'}, 'description': {'type': 'string'}}, 'description': 'Create a solo Amplify space for this brand (idempotent on name).', 'additionalProperties': False}, 'platforms': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Where the brand posts, e.g. ["X", "LinkedIn"]. One draft per platform is written per topic.'}, 'brand_name': {'type': 'string', 'description': 'Defaults to the space name.'}, 'post_types': {'type': 'string', 'description': 'The kinds of posts they want (how-tos, build-in-public notes, hot takes, customer wins, thesis dropsâ\x80¦).'}, 'review_threshold': {'type': 'integer', 'maximum': 100, 'minimum': 0, 'description': 'Reviewer pass bar (default 75).'}, 'platform_playbook': {'type': 'string', 'description': 'Per-platform notes, e.g. "X: short and punchy. LinkedIn: longer, more reflective."'}, 'trending_source_handles': {'type': 'array', 'items': {'type': 'string'}, 'maxItems': 20, 'description': "X accounts to pin for 'Trending on X' (news outlets, analysts, competitors)."}}, 'additionalProperties': False}
submit_campaign_work
Submit campaign participation proof
Submit the user's work for a campaign. Three ways to prove it, and any one is enough: proof_url (content they published or an action they took), media_url (a hosted image or video made for the task — the ad-hoc creative case: a demo clip, a mockup, a designed asset), and description (max 500 chars). Media must already be hosted somewhere public and reachable — this API takes links, never uploads; a direct image link is shown to the reviewer inline, anything else (a video, a Loom) is shown as a link they open. If a URL is an X post it must be published by the user's linked X handle (author-verified); other URLs are accepted as-is. Lands as PENDING — the campaign owner reviews and rewards ship on approval (community campaigns pay Stars, public ones leaderboard points). Duplicate URLs are rejected. Check status afterward with get_my_submissions.
可访问外部资源
输入模式
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['campaign_id'], 'properties': {'media_url': {'type': 'string', 'format': 'uri', 'description': 'Public URL of an image or video produced for the task. Must already be hosted (upload it wherever the user keeps files first) â\x80\x94 direct image links render inline for the reviewer; videos and Loom-style links show as a link.'}, 'proof_url': {'type': 'string', 'format': 'uri', 'description': 'URL of the published content or action proof (X post, video, voting page, â\x80¦)'}, 'campaign_id': {'type': 'string'}, 'description': {'type': 'string', 'maxLength': 500, 'description': 'What was done, or context for the reviewer'}}, 'additionalProperties': False}
submit_participation
Submit a posted reply or quote post to earn
Submit the URL of what the connected user posted for a claimed opportunity (reply_id from find_opportunities). Works for X, Reddit, YouTube and LinkedIn replies, and X quote posts (actionType `quote`: pass the URL of the user's own quote post, NOT the original — the backend checks it was posted by their linked X handle and that it actually quotes the target post; a plain tweet or a quote of something else is rejected). Every claim is attributed to the user's linked handle for that platform, so they must have it connected on their ProductClank profile — X replies are additionally author-verified against the live post at submit time, and the others are verified afterwards by the same checks that cover web submissions. If the platform handle is missing the call fails saying which one to add. Awards points, and credits when the campaign grants them. Rejected submissions add strikes (3 strikes = blocked), so only submit replies the user actually posted.
可访问外部资源
输入模式
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['reply_id', 'reply_url'], 'properties': {'reply_id': {'type': 'string', 'description': "The reply draft's id from find_opportunities"}, 'reply_url': {'type': 'string', 'format': 'uri', 'description': 'URL of the reply (or, for a quote opportunity, the quote post) the user posted'}}, 'additionalProperties': False}
suggest_content_campaign
Preview a content campaign
Preview a content campaign for a product BEFORE launching it. FREE — nothing is created and no credits are charged. Returns an AI-drafted campaign (title, description, call-to-action) plus whether the user can afford to launch it (1000 credits). Show the user the draft AND the credit cost, get an explicit yes, then call create_content_campaign — never launch off the back of the preview alone. Requires a product_id from search_products; write the campaign_message brief from what you know about the product.
只读
输入模式
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['product_id', 'campaign_message'], 'properties': {'product_id': {'type': 'string', 'description': 'Product UUID from search_products'}, 'references': {'type': 'string', 'description': 'Links or references to include in the campaign'}, 'campaign_goals': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Campaign goals, e.g. ["awareness", "signups"]'}, 'target_audience': {'type': 'string', 'description': 'Who the campaign should reach'}, 'campaign_message': {'type': 'string', 'description': "The core brief: what you want the community to create (e.g. 'Share how you use <product> in your daily workflow')."}, 'preferred_platform': {'type': 'string', 'description': 'Preferred platform, e.g. "x" or "farcaster"'}, 'additional_guidelines': {'type': 'string', 'description': "Extra do's/don'ts for creators"}}, 'additionalProperties': False}
teach_content_voice
Turn feedback into a standing rule
Teach the engine. The user's reaction — 'too long', 'punchier hooks', 'never say leverage', 'more first-person on LinkedIn' — becomes a durable rule in the brand's voice KB, so every future draft and review honors it. 1 credit. Use it when feedback should STICK; use revise_content_draft when it is about one draft only. Pass draft_id when the reaction was to a specific draft so the rule is grounded in an example. The rule is applied immediately by default (the user owns the space); apply:false leaves it pending in the web Settings instead. Tell the user in one line what was learned.
输入模式
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['space_id', 'feedback'], 'properties': {'apply': {'type': 'boolean', 'description': 'Default true. false â\x86\x92 leave pending for the user to approve in Settings.'}, 'draft_id': {'type': 'string', 'description': 'The draft it was about, if any.'}, 'feedback': {'type': 'string', 'description': "The user's reaction, in their words."}, 'space_id': {'type': 'string'}}, 'additionalProperties': False}
update_campaign
Tune a running campaign
Adjust a live campaign without recreating it. Free — nothing here spends credits, though the next generate_posts run bills as usual. Keywords MERGE (add_keywords never drops what is already there). `sources` is how research findings get applied: high-intent phrases, influencer accounts and lists that run_research found stay dormant until you enable their source. `relevance_threshold` moves the bar the relevance gate keeps posts above (new campaigns start lenient at 5; raise it when discovery is noisy). `is_active:false` pauses discovery so nothing more is found or billed. `visibility` decides who posts the drafts — flipping to 'public' also releases the already-discovered drafts to the community, so only do it when the user has said yes. `target_subreddits` / `target_youtube_channels` re-aim discovery within its platform (send an empty array to clear and search the whole platform). `platform` itself can only change while the campaign has discovered nothing — after that it is fixed, and a second campaign is the answer. On X, `reply_approach` switches what the replies do (awareness 'mention' vs sales 'flag', which tags reply_tag_accounts at the lead) — confirm with the user, it changes every future draft. Changes apply to the NEXT generate_posts run; existing posts are not re-scored.
输入模式
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['campaign_id'], 'properties': {'confirm': {'type': 'boolean', 'description': 'Required (true) when setting visibility to public â\x80\x94 confirms the user agreed to community distribution and per-posted-reply billing. Without it the API returns confirmation_required.'}, 'sources': {'type': 'array', 'items': {'enum': ['keywords', 'phrases', 'influencers', 'lists', 'competitors'], 'type': 'string'}, 'description': "Which discovery sources run. 'keywords' is always included. Enable 'phrases'/'influencers'/'lists'/'competitors' to actually USE what run_research found â\x80\x94 they do nothing until enabled."}, 'platform': {'enum': ['twitter', 'linkedin', 'reddit', 'youtube'], 'type': 'string', 'description': "Which network discovery works. Only changeable while the campaign has discovered nothing â\x80\x94 otherwise it returns platform_locked, because switching would mix two platforms' posts and proof rules in one campaign."}, 'is_active': {'type': 'boolean', 'description': 'false pauses discovery, true resumes it'}, 'visibility': {'enum': ['public', 'private'], 'type': 'string', 'description': 'Who posts the drafted replies. private = the user posts them from the workbench; public = the community earn feed distributes them and members post them, billing the user per posted reply. Flipping to public REQUIRES confirm: true â\x80\x94 ask the user first, then pass it.'}, 'campaign_id': {'type': 'string'}, 'add_keywords': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Keywords to add â\x80\x94 merged with the existing list, duplicates ignored'}, 'reply_approach': {'enum': ['mention', 'flag'], 'type': 'string', 'description': "X campaigns only (REJECTED elsewhere). 'mention' = awareness: replies put the product and its site in the conversation. 'flag' = sales: replies tag the brand and/or founder at the post's author as a lead. Applies to drafts written from now on."}, 'post_visibility': {'enum': ['public', 'private'], 'type': 'string', 'description': "Visibility of posts discovered FROM NOW ON, without touching the campaign flag or existing posts. 'private' turns on held mode (release with publish_posts); 'public' makes new drafts claimable on arrival. No confirm needed."}, 'remove_keywords': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Keywords to drop (at least one must remain)'}, 'monitor_accounts': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Specific handles the influencers source should watch; enables that source automatically'}, 'target_subreddits': {'type': 'array', 'items': {'type': 'string'}, 'maxItems': 25, 'description': 'Reddit only, enforced server-side â\x80\x94 sending it on a non-Reddit campaign is REJECTED, not ignored. REPLACES the list rather than appending; [] clears it and searches all of Reddit. To add one, read the current list with get_campaign first and send the full merged list.'}, 'reply_tag_accounts': {'anyOf': [{'type': 'array', 'items': {'type': 'string'}, 'maxItems': 2}, {'type': 'null'}], 'description': "X only, for 'flag': up to 2 handles to tag, brand first then founder (brand, personal or both). REPLACES the list; null or [] clears it (falls back to mention_accounts, then the product's X handle)."}, 'relevance_threshold': {'type': 'integer', 'maximum': 10, 'minimum': 1, 'description': 'Keep only posts scoring at or above this on semantic relevance (new campaigns start at 5)'}, 'target_youtube_channels': {'type': 'array', 'items': {'type': 'string'}, 'maxItems': 25, 'description': 'YouTube only, enforced server-side â\x80\x94 sending it on a non-YouTube campaign is REJECTED, not ignored. REPLACES the list rather than appending; [] clears it and runs keyword search alone. To add one, read the current list with get_campaign first and send the full merged list.'}}, 'additionalProperties': False}
write_content_candidates
Draft content candidates
Draft one or more posts into a ProductClank content space. FREE. Call get_content_workspace FIRST and write in that brand's voice, post types and topics — the drafts are scored against exactly that voice by the reviewer a moment after they land, and the scores show in get_content_queue. `platform` must be one of the space's platforms (omit it to use the first). Candidates land in the user's 'All Content' queue for approval; nothing is auto-published. Up to 25 per call. This drafts into the user's OWN content pipeline — it is NOT a community content campaign (use create_content_campaign for that).
输入模式
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['space_id', 'candidates'], 'properties': {'space_id': {'type': 'string', 'description': 'Target content space UUID from list_content_spaces.'}, 'candidates': {'type': 'array', 'items': {'type': 'object', 'required': ['text'], 'properties': {'text': {'type': 'string', 'description': 'The post body / draft text (required).'}, 'title': {'type': 'string', 'description': 'Short internal label / topic for the draft.'}, 'platform': {'type': 'string', 'description': 'Target platform label, e.g. "ProductClank X", "LinkedIn", "Farcaster".'}, 'template': {'type': 'string', 'description': 'Content template, e.g. "Build-in-Public" or "Proof Point". Defaults to Build-in-Public.'}}, 'additionalProperties': False}, 'maxItems': 25, 'minItems': 1, 'description': '1â\x80\x9325 draft candidates to write.'}}, 'additionalProperties': False}
已添加
get_support_status
2026年10月1日 02:54
已添加
report_issue
2026年10月1日 02:54
已更改
find_opportunities
2026年10月1日 02:54
已更改
update_campaign
2026年10月1日 02:54
已更改
get_campaign
2026年10月1日 02:54
已更改
create_campaign
2026年10月1日 02:54
已添加
analyze_url
2026年9月25日 03:03
已添加
publish_posts
2026年9月21日 03:00
已添加
edit_reply
2026年9月21日 03:00
已更改
update_campaign
2026年9月21日 03:00
已更改
create_campaign
2026年9月21日 03:00
已添加
get_earnings
2026年9月17日 12:36
已添加
get_my_submissions
2026年9月17日 12:36
已添加
submit_campaign_work
2026年9月17日 12:36
已添加
get_campaign_brief
2026年9月17日 12:36
已添加
find_open_campaigns
2026年9月17日 12:36
已添加
submit_participation
2026年9月17日 12:36
已添加
find_opportunities
2026年9月17日 12:36
已添加
add_delegate
2026年9月17日 12:36
已添加
set_campaign_schedule
2026年9月17日 12:36
已添加
update_campaign
2026年9月17日 12:36
已添加
get_campaign_results
2026年9月17日 12:36
已添加
get_campaign_activity
2026年9月17日 12:36
已添加
regenerate_replies
2026年9月17日 12:36
已添加
review_posts
2026年9月17日 12:36
已添加
get_posts
2026年9月17日 12:36
已添加
generate_posts
2026年9月17日 12:36
已添加
get_research
2026年9月17日 12:36
已添加
run_research
2026年9月17日 12:36
已添加
get_campaign
2026年9月17日 12:36