RoboWrite
Ce que fait ce MCP
Supports brand setup, content briefs, AI-generated drafts, editorial review, quality checks, and publishing workflows.
Outils
Schéma d’entrée
{'type': 'object', 'required': ['brief_id'], 'properties': {'brief_id': {'type': 'string', 'title': 'Brief Id', 'format': 'uuid'}}, 'additionalProperties': False}
Schéma d’entrée
{'type': 'object', 'required': ['review_id', 'body'], 'properties': {'body': {'type': 'object', 'title': 'ReviewAssignmentRequest', 'required': ['content_version_id', 'request_id', 'reviewer_id', 'expected_assignment_revision'], 'properties': {'request_id': {'type': 'string', 'title': 'Request Id', 'format': 'uuid'}, 'reviewer_id': {'type': 'string', 'title': 'Reviewer Id', 'pattern': '^\\S+$', 'maxLength': 256, 'minLength': 1}, 'content_version_id': {'type': 'string', 'title': 'Content Version Id', 'format': 'uuid'}, 'expected_assignment_revision': {'type': 'integer', 'title': 'Expected Assignment Revision', 'minimum': 0}}, 'additionalProperties': False}, 'review_id': {'type': 'string', 'title': 'Review Id', 'format': 'uuid'}}, 'additionalProperties': False}
Schéma d’entrée
{'type': 'object', 'required': ['content_item_id', 'body'], 'properties': {'body': {'type': 'object', 'title': 'EditorialCheckRequest', 'required': ['expected_base_version_id', 'request_id'], 'properties': {'request_id': {'type': 'string', 'title': 'Request Id', 'format': 'uuid'}, 'expected_base_version_id': {'type': 'string', 'title': 'Expected Base Version Id', 'format': 'uuid'}}, 'additionalProperties': False}, 'content_item_id': {'type': 'string', 'title': 'Content Item Id', 'format': 'uuid'}}, 'additionalProperties': False}
Schéma d’entrée
{'type': 'object', 'required': ['setup_id', 'body', 'idempotency_key'], 'properties': {'body': {'type': 'object', 'title': 'PublicBrandSetupConfirm', 'properties': {'dos': {'type': 'array', 'items': {'type': 'string', 'maxLength': 300}, 'title': 'Dos', 'maxItems': 30}, 'name': {'type': 'string', 'title': 'Name', 'maxLength': 255, 'minLength': 1}, 'tone': {'enum': ['professional', 'casual', 'friendly', 'authoritative', 'playful', 'empathetic', 'technical', 'conversational'], 'type': 'string', 'title': 'Tone', 'description': 'Brand voice tone values used on brand read/write surfaces.'}, 'donts': {'type': 'array', 'items': {'type': 'string', 'maxLength': 300}, 'title': 'Donts', 'maxItems': 30}, 'tagline': {'anyOf': [{'type': 'string', 'maxLength': 500}, {'type': 'null'}], 'title': 'Tagline'}, 'industry': {'type': 'string', 'title': 'Industry', 'maxLength': 100, 'minLength': 1}, 'description': {'anyOf': [{'type': 'string', 'maxLength': 4000}, {'type': 'null'}], 'title': 'Description'}, 'phrases_to_avoid': {'type': 'array', 'items': {'type': 'string', 'maxLength': 300}, 'title': 'Phrases To Avoid', 'maxItems': 30}, 'mission_statement': {'anyOf': [{'type': 'string', 'maxLength': 4000}, {'type': 'null'}], 'title': 'Mission Statement'}}, 'description': 'Reviewed edits to research suggestions. Omit a field to keep its suggestion.', 'additionalProperties': False}, 'setup_id': {'type': 'string', 'title': 'Setup Id', 'format': 'uuid'}, 'idempotency_key': {'type': 'string', 'pattern': '^[!-~]+$', 'maxLength': 128, 'minLength': 1, 'description': 'Stable operation key. Reuse for the same request after a dropped response; use a new key for a new intended operation.'}}, 'additionalProperties': False}
Schéma d’entrée
{'type': 'object', 'required': ['body', 'idempotency_key'], 'properties': {'body': {'type': 'object', 'title': 'PublicBriefCreate', 'required': ['title', 'brand_id'], 'properties': {'cta': {'anyOf': [{'type': 'string', 'maxLength': 500}, {'type': 'null'}], 'title': 'Cta'}, 'tone': {'anyOf': [{'enum': ['confident', 'operational', 'bold'], 'type': 'string', 'title': 'ContentTone'}, {'type': 'null'}]}, 'notes': {'anyOf': [{'type': 'string', 'maxLength': 5000}, {'type': 'null'}], 'title': 'Notes'}, 'title': {'type': 'string', 'title': 'Title', 'maxLength': 500, 'minLength': 1}, 'format': {'enum': ['blog_post', 'landing_page', 'linkedin_post', 'linkedin_article', 'twitter_post', 'twitter_thread', 'newsletter', 'video_script', 'podcast_outline', 'case_study', 'whitepaper', 'ebook', 'infographic', 'webinar', 'email_sequence'], 'type': 'string', 'title': 'ContentFormat', 'default': 'blog_post', 'description': 'Output format for content generation.'}, 'outline': {'type': 'array', 'items': {'type': 'string'}, 'title': 'Outline', 'maxItems': 20, 'description': 'Ordered H2 titles. Mapped to structured brief sections.'}, 'summary': {'anyOf': [{'type': 'string', 'maxLength': 5000}, {'type': 'null'}], 'title': 'Summary'}, 'brand_id': {'type': 'string', 'title': 'Brand Id', 'format': 'uuid'}, 'pillar_id': {'anyOf': [{'type': 'string', 'format': 'uuid'}, {'type': 'null'}], 'title': 'Pillar Id'}, 'must_avoid': {'type': 'array', 'items': {'type': 'string'}, 'title': 'Must Avoid', 'maxItems': 20}, 'must_cover': {'type': 'array', 'items': {'type': 'string'}, 'title': 'Must Cover', 'maxItems': 20}, 'description': {'anyOf': [{'type': 'string', 'maxLength': 5000}, {'type': 'null'}], 'title': 'Description'}, 'source_urls': {'type': 'array', 'items': {'type': 'string'}, 'title': 'Source Urls', 'maxItems': 20, 'description': 'Reference URLs threaded into generation as citable source material.'}, 'content_goal': {'anyOf': [{'type': 'string', 'maxLength': 5000}, {'type': 'null'}], 'title': 'Content Goal'}, 'example_urls': {'type': 'array', 'items': {'type': 'string'}, 'title': 'Example Urls', 'maxItems': 20, 'description': 'Inspiration-only reference URLs. Never used as source-verification input.'}, 'funnel_stage': {'anyOf': [{'enum': ['tofu', 'mofu', 'bofu'], 'type': 'string', 'title': 'FunnelStage', 'description': 'Marketing funnel position.'}, {'type': 'null'}]}, 'search_intent': {'anyOf': [{'enum': ['informational', 'navigational', 'transactional', 'commercial'], 'type': 'string', 'title': 'SearchIntent', 'description': 'User intent classification for SEO.'}, {'type': 'null'}]}, 'competitor_urls': {'type': 'array', 'items': {'type': 'string'}, 'title': 'Competitor Urls', 'maxItems': 20}, 'primary_keyword': {'anyOf': [{'type': 'string', 'maxLength': 255}, {'type': 'null'}], 'title': 'Primary Keyword'}, 'source_topic_id': {'anyOf': [{'type': 'string', 'format': 'uuid'}, {'type': 'null'}], 'title': 'Source Topic Id'}, 'audience_details': {'anyOf': [{'type': 'string', 'maxLength': 5000}, {'type': 'null'}], 'title': 'Audience Details'}, 'target_word_count': {'anyOf': [{'type': 'integer', 'maximum': 10000, 'minimum': 100}, {'type': 'null'}], 'title': 'Target Word Count'}, 'secondary_keywords': {'type': 'array', 'items': {'type': 'string'}, 'title': 'Secondary Keywords', 'maxItems': 20}, 'attached_document_ids': {'type': 'array', 'items': {'type': 'string', 'format': 'uuid'}, 'title': 'Attached Document Ids', 'maxItems': 10, 'description': 'Document library IDs pinned to this brief for prompt-injection (AD-0075).'}}, 'description': 'Developer-authored brief spec (request).\n\nSupply an explicit owned ``brand_id``. ``status`` is server-set. ``outline``\nis an ordered list of H2 titles; supply plain strings, not Markdown.', 'additionalProperties': False}, 'idempotency_key': {'type': 'string', 'pattern': '^[!-~]+$', 'maxLength': 128, 'minLength': 1, 'description': 'Stable operation key. Reuse for the same request after a dropped response; use a new key for a new intended operation.'}}, 'additionalProperties': False}
Schéma d’entrée
{'type': 'object', 'required': ['body', 'idempotency_key'], 'properties': {'body': {'type': 'object', 'title': 'PublicContentItemCreate', 'required': ['brief_id', 'property_id', 'title'], 'properties': {'title': {'type': 'string', 'title': 'Title', 'maxLength': 500, 'minLength': 1}, 'format': {'enum': ['blog_post', 'landing_page', 'linkedin_post', 'linkedin_article', 'twitter_post', 'twitter_thread', 'newsletter', 'video_script', 'podcast_outline', 'case_study', 'whitepaper', 'ebook', 'infographic', 'webinar', 'email_sequence'], 'type': 'string', 'title': 'ContentFormat', 'default': 'blog_post', 'description': 'Output format for content generation.'}, 'brief_id': {'type': 'string', 'title': 'Brief Id', 'format': 'uuid'}, 'property_id': {'type': 'string', 'title': 'Property Id', 'format': 'uuid'}}, 'description': 'Bind a brief to a publishing property (request).\n\n``property_id`` is required — the caller chooses the publication target.', 'additionalProperties': False}, 'idempotency_key': {'type': 'string', 'pattern': '^[!-~]+$', 'maxLength': 128, 'minLength': 1, 'description': 'Stable operation key. Reuse for the same request after a dropped response; use a new key for a new intended operation.'}}, 'additionalProperties': False}
Schéma d’entrée
{'type': 'object', 'required': ['body', 'idempotency_key'], 'properties': {'body': {'type': 'object', 'title': 'PublicPropertyCreate', 'required': ['name', 'url', 'brand_id'], 'properties': {'url': {'type': 'string', 'title': 'Url', 'maxLength': 255, 'minLength': 1}, 'name': {'type': 'string', 'title': 'Name', 'maxLength': 255, 'minLength': 1}, 'role': {'enum': ['primary', 'secondary', 'experimental'], 'type': 'string', 'title': 'PropertyRole', 'default': 'primary', 'description': 'Strategic role of property in content ecosystem.'}, 'purpose': {'enum': ['thought_leadership', 'lead_generation', 'brand_awareness', 'community', 'support', 'sales_enablement'], 'type': 'string', 'title': 'PropertyPurpose', 'default': 'thought_leadership', 'description': 'Primary business purpose of the property.'}, 'brand_id': {'type': 'string', 'title': 'Brand Id', 'format': 'uuid'}, 'description': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Description'}, 'channel_type': {'enum': ['blog', 'linkedin', 'twitter', 'newsletter', 'youtube', 'podcast'], 'type': 'string', 'title': 'ChannelType', 'default': 'blog', 'description': 'Publishing channel/platform type.'}, 'publish_policy': {'enum': ['draft_only', 'cms_publish'], 'type': 'string', 'title': 'PublishPolicy', 'default': 'draft_only', 'description': 'This MCP tool defaults to draft_only: collect finished pages without CMS publishing. Set cms_publish explicitly only for an approved CMS destination; the REST API has a separate default.'}}, 'description': "Create a publishing property from the caller's own input.\n\nSupply an explicit owned ``brand_id``. Server-assigned fields\n(``verified``, ``created_at``) are also omitted; unknown keys return\n**422**.", 'additionalProperties': False}, 'idempotency_key': {'type': 'string', 'pattern': '^[!-~]+$', 'maxLength': 128, 'minLength': 1, 'description': 'Stable operation key. Reuse for the same request after a dropped response; use a new key for a new intended operation.'}}, 'additionalProperties': False}
Schéma d’entrée
{'type': 'object', 'required': ['brand_id', 'body', 'idempotency_key'], 'properties': {'body': {'type': 'object', 'title': 'PublicTopicCreate', 'required': ['title', 'primary_keyword'], 'properties': {'title': {'type': 'string', 'title': 'Title', 'maxLength': 500, 'minLength': 1}, 'intent': {'enum': ['informational', 'navigational', 'transactional', 'commercial'], 'type': 'string', 'title': 'SearchIntent', 'default': 'informational', 'description': 'User intent classification for SEO.'}, 'premise': {'anyOf': [{'type': 'string', 'maxLength': 5000}, {'type': 'null'}], 'title': 'Premise'}, 'pillar_id': {'anyOf': [{'type': 'string', 'format': 'uuid'}, {'type': 'null'}], 'title': 'Pillar Id'}, 'funnel_stage': {'enum': ['tofu', 'mofu', 'bofu'], 'type': 'string', 'title': 'FunnelStage', 'default': 'tofu', 'description': 'Marketing funnel position.'}, 'primary_keyword': {'type': 'string', 'title': 'Primary Keyword', 'maxLength': 200, 'minLength': 1}, 'suggested_format': {'enum': ['blog_post', 'landing_page', 'linkedin_post', 'linkedin_article', 'twitter_post', 'twitter_thread', 'newsletter', 'video_script', 'podcast_outline', 'case_study', 'whitepaper', 'ebook', 'infographic', 'webinar', 'email_sequence'], 'type': 'string', 'title': 'ContentFormat', 'default': 'blog_post', 'description': 'Output format for content generation.'}, 'secondary_keywords': {'type': 'array', 'items': {'type': 'string'}, 'title': 'Secondary Keywords', 'maxItems': 20}}, 'description': "Create a topic from the caller's own input, then generate content from it.\n\nSupply the angle and keywords; scoring signals are derived by the system.\nA newly created topic is immediately eligible for ``POST /content/generate``.\n``primary_keyword`` is required — generation seeds from it (title/premise\nalone are not enough and would produce generic content).", 'additionalProperties': False}, 'brand_id': {'type': 'string', 'title': 'Brand Id', 'format': 'uuid'}, 'idempotency_key': {'type': 'string', 'pattern': '^[!-~]+$', 'maxLength': 128, 'minLength': 1, 'description': 'Stable operation key. Reuse for the same request after a dropped response; use a new key for a new intended operation.'}}, 'additionalProperties': False}
Schéma d’entrée
{'type': 'object', 'required': ['review_id', 'body'], 'properties': {'body': {'type': 'object', 'title': 'ReviewDecisionRequest', 'required': ['content_version_id', 'request_id', 'action'], 'properties': {'action': {'enum': ['approve', 'reject', 'request_revision'], 'type': 'string', 'title': 'ReviewAction'}, 'feedback': {'anyOf': [{'type': 'string', 'maxLength': 10000}, {'type': 'null'}], 'title': 'Feedback'}, 'request_id': {'type': 'string', 'title': 'Request Id', 'format': 'uuid'}, 'content_version_id': {'type': 'string', 'title': 'Content Version Id', 'format': 'uuid'}}, 'additionalProperties': False}, 'review_id': {'type': 'string', 'title': 'Review Id', 'format': 'uuid'}}, 'additionalProperties': False}
Schéma d’entrée
{'type': 'object', 'required': ['content_item_id', 'from_version_id', 'to_version_id'], 'properties': {'to_version_id': {'type': 'string', 'title': 'To Version Id', 'format': 'uuid'}, 'content_item_id': {'type': 'string', 'title': 'Content Item Id', 'format': 'uuid'}, 'from_version_id': {'type': 'string', 'title': 'From Version Id', 'format': 'uuid'}}, 'additionalProperties': False}
Schéma d’entrée
{'type': 'object', 'required': ['content_item_id', 'body'], 'properties': {'body': {'type': 'object', 'title': 'EditorialEditRequest', 'required': ['expected_base_version_id', 'request_id'], 'properties': {'target': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Target'}, 'request_id': {'type': 'string', 'title': 'Request Id', 'format': 'uuid'}, 'replacement': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Replacement'}, 'markdown_body': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Markdown Body'}, 'expected_base_version_id': {'type': 'string', 'title': 'Expected Base Version Id', 'format': 'uuid'}}, 'additionalProperties': False}, 'content_item_id': {'type': 'string', 'title': 'Content Item Id', 'format': 'uuid'}}, 'additionalProperties': False}
Schéma d’entrée
{'type': 'object', 'required': ['item_id', 'idempotency_key'], 'properties': {'body': {'anyOf': [{'type': 'object', 'title': 'PublicGenerateItemRequest', 'properties': {'direction': {'anyOf': [{'type': 'object', 'title': 'PublicDirection', 'properties': {'tone': {'anyOf': [{'enum': ['confident', 'operational', 'bold'], 'type': 'string', 'title': 'ContentTone'}, {'type': 'null'}]}, 'point_of_view': {'anyOf': [{'enum': ['you', 'we', 'neutral'], 'type': 'string', 'title': 'PointOfView'}, {'type': 'null'}]}, 'reading_level': {'anyOf': [{'enum': ['practitioner', 'executive', 'beginner'], 'type': 'string', 'title': 'ReadingLevel'}, {'type': 'null'}]}, 'content_length': {'anyOf': [{'enum': ['brief', 'standard', 'in_depth'], 'type': 'string', 'title': 'ContentLength'}, {'type': 'null'}]}, 'content_structure': {'anyOf': [{'enum': ['how_to', 'framework', 'deep_dive', 'opinion'], 'type': 'string', 'title': 'ContentStructure'}, {'type': 'null'}]}}, 'description': 'Optional writing-direction knobs for item generation (all optional).', 'additionalProperties': False}, {'type': 'null'}]}, 'citation_mode': {'anyOf': [{'enum': ['structured_only', 'inline'], 'type': 'string', 'title': 'CitationMode', 'description': 'Whether the published article body shows source citations.\n\n``STRUCTURED_ONLY`` (default) strips inline links to clean prose; the used\nsources are still captured as metadata. ``INLINE`` keeps the links and\nappends a ``## Sources`` section.'}, {'type': 'null'}]}, 'source_verification_failure_mode': {'anyOf': [{'enum': ['repair_then_fail', 'fail_fast'], 'type': 'string', 'title': 'SourceVerificationFailureMode', 'description': 'Recovery behavior; source verification is always mandatory.'}, {'type': 'null'}]}}, 'description': 'Optional per-generation styling for item-generate (request).', 'additionalProperties': False}, {'type': 'null'}], 'title': 'Body'}, 'item_id': {'type': 'string', 'title': 'Item Id', 'format': 'uuid'}, 'idempotency_key': {'type': 'string', 'pattern': '^[!-~]+$', 'maxLength': 128, 'minLength': 1, 'description': 'Stable operation key. Reuse for the same request after a dropped response; use a new key for a new intended operation.'}}, 'additionalProperties': False}
Schéma d’entrée
{'type': 'object', 'required': ['body'], 'properties': {'body': {'type': 'object', 'title': 'PublicPillarStrategyRequest', 'required': ['brand_id'], 'properties': {'brand_id': {'type': 'string', 'title': 'Brand Id', 'format': 'uuid'}, 'num_pillars': {'type': 'integer', 'title': 'Num Pillars', 'default': 5}, 'force_refresh': {'type': 'boolean', 'title': 'Force Refresh', 'default': False}, 'keyword_segment': {'anyOf': [{'type': 'object', 'title': 'PublicKeywordSegment', 'properties': {'seeds': {'type': 'array', 'items': {'type': 'string'}, 'title': 'Seeds'}}, 'description': 'Request-side seed scoping for keyword inventory. v1 accepts seeds only.', 'additionalProperties': False}, {'type': 'null'}]}}, 'description': 'Request to generate a clusters-first pillar strategy for a brand.', 'additionalProperties': False}}, 'additionalProperties': False}
Schéma d’entrée
{'type': 'object', 'required': [], 'properties': {}, 'additionalProperties': False}
Schéma d’entrée
{'type': 'object', 'required': ['brand_id'], 'properties': {'brand_id': {'type': 'string', 'title': 'Brand Id', 'format': 'uuid'}}, 'additionalProperties': False}
Schéma d’entrée
{'type': 'object', 'required': ['setup_id'], 'properties': {'setup_id': {'type': 'string', 'title': 'Setup Id', 'format': 'uuid'}}, 'additionalProperties': False}
Schéma d’entrée
{'type': 'object', 'required': ['brief_id'], 'properties': {'brief_id': {'type': 'string', 'title': 'Brief Id', 'format': 'uuid'}}, 'additionalProperties': False}
Schéma d’entrée
{'type': 'object', 'required': ['content_item_id'], 'properties': {'limit': {'type': 'integer', 'title': 'Limit', 'default': 50, 'maximum': 200, 'minimum': 1, 'description': 'Versions page size. Ignored when latest_only or version is set. Newest version first. Standard public pagination bounds (1–200, default 50).'}, 'offset': {'type': 'integer', 'title': 'Offset', 'default': 0, 'minimum': 0, 'description': 'Versions page offset. Ignored when latest_only or version is set.'}, 'include': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Include', 'description': "Comma-separated optional projections. Pass 'scoring' to include per-version quality signals (geo/draft scores, warnings); pass 'sources' to include the research sources cited in each version (marker, source_name, source_url); pass 'assertion_provenance' to include the per-assertion provenance receipt (sentence, sentence_index, url, marker); pass 'compliance' to include each version's regulated-content policy findings (kind, message, excerpt). Any may be combined."}, 'version': {'anyOf': [{'type': 'integer', 'minimum': 1}, {'type': 'null'}], 'title': 'Version', 'description': 'Return only this version number. Mutually exclusive with `latest_only`; an unknown version number is a 404.'}, 'latest_only': {'type': 'boolean', 'title': 'Latest Only', 'default': False, 'description': 'Return only the current version instead of paging the revision history. Use this for page-by-page download.'}, 'content_item_id': {'type': 'string', 'title': 'Content Item Id', 'format': 'uuid'}}, 'additionalProperties': False}
Schéma d’entrée
{'type': 'object', 'required': ['document_id'], 'properties': {'document_id': {'type': 'string', 'title': 'Document Id', 'format': 'uuid'}}, 'additionalProperties': False}
Schéma d’entrée
{'type': 'object', 'required': ['job_id'], 'properties': {'job_id': {'type': 'string', 'title': 'Job Id', 'format': 'uuid'}}, 'additionalProperties': False}
Schéma d’entrée
{'type': 'object', 'required': ['run_id'], 'properties': {'run_id': {'type': 'string', 'title': 'Run Id', 'format': 'uuid'}}, 'additionalProperties': False}
Schéma d’entrée
{'type': 'object', 'required': ['property_id'], 'properties': {'property_id': {'type': 'string', 'title': 'Property Id', 'format': 'uuid'}}, 'additionalProperties': False}
Schéma d’entrée
{'type': 'object', 'required': ['review_id'], 'properties': {'review_id': {'type': 'string', 'title': 'Review Id', 'format': 'uuid'}}, 'additionalProperties': False}
Schéma d’entrée
{'type': 'object', 'required': ['content_item_id'], 'properties': {'content_item_id': {'type': 'string', 'title': 'Content Item Id', 'format': 'uuid'}}, 'additionalProperties': False}
Schéma d’entrée
{'type': 'object', 'required': ['topic_id'], 'properties': {'q': {'anyOf': [{'type': 'string', 'maxLength': 500}, {'type': 'null'}], 'title': 'Q'}, 'limit': {'type': 'integer', 'title': 'Limit', 'default': 50, 'maximum': 200, 'minimum': 1}, 'format': {'anyOf': [{'enum': ['blog_post', 'landing_page', 'linkedin_post', 'linkedin_article', 'twitter_post', 'twitter_thread', 'newsletter', 'video_script', 'podcast_outline', 'case_study', 'whitepaper', 'ebook', 'infographic', 'webinar', 'email_sequence'], 'type': 'string', 'title': 'ContentFormat', 'description': 'Output format for content generation.'}, {'type': 'null'}], 'title': 'Format'}, 'offset': {'type': 'integer', 'title': 'Offset', 'default': 0, 'minimum': 0}, 'status': {'anyOf': [{'enum': ['planned', 'ready', 'generating', 'draft', 'in_review', 'approved', 'published', 'cancelled'], 'type': 'string', 'title': 'TaskStatus', 'description': 'Workflow status of content tasks.'}, {'type': 'null'}], 'title': 'Status'}, 'keyword': {'anyOf': [{'type': 'string', 'maxLength': 255}, {'type': 'null'}], 'title': 'Keyword'}, 'brand_id': {'anyOf': [{'type': 'string', 'format': 'uuid'}, {'type': 'null'}], 'title': 'Brand Id'}, 'brief_id': {'anyOf': [{'type': 'string', 'format': 'uuid'}, {'type': 'null'}], 'title': 'Brief Id'}, 'topic_id': {'type': 'string', 'title': 'Topic Id', 'format': 'uuid'}, 'pillar_id': {'anyOf': [{'type': 'string', 'format': 'uuid'}, {'type': 'null'}], 'title': 'Pillar Id'}, 'property_id': {'anyOf': [{'type': 'string', 'format': 'uuid'}, {'type': 'null'}], 'title': 'Property Id'}, 'content_type': {'anyOf': [{'enum': ['blog_post', 'landing_page', 'linkedin_post', 'linkedin_article', 'twitter_post', 'twitter_thread', 'newsletter', 'video_script', 'podcast_outline', 'case_study', 'whitepaper', 'ebook', 'infographic', 'webinar', 'email_sequence'], 'type': 'string', 'title': 'ContentFormat', 'description': 'Output format for content generation.'}, {'type': 'null'}], 'title': 'Content Type'}, 'created_from': {'anyOf': [{'type': 'string', 'format': 'date-time'}, {'type': 'null'}], 'title': 'Created From'}, 'created_before': {'anyOf': [{'type': 'string', 'format': 'date-time'}, {'type': 'null'}], 'title': 'Created Before'}}, 'additionalProperties': False}
Schéma d’entrée
{'type': 'object', 'required': [], 'properties': {'limit': {'type': 'integer', 'title': 'Limit', 'default': 100, 'maximum': 200, 'minimum': 1, 'description': 'Results per page'}, 'offset': {'type': 'integer', 'title': 'Offset', 'default': 0, 'minimum': 0, 'description': 'Pagination offset'}}, 'additionalProperties': False}
Schéma d’entrée
{'type': 'object', 'required': [], 'properties': {'q': {'anyOf': [{'type': 'string', 'maxLength': 500}, {'type': 'null'}], 'title': 'Q'}, 'limit': {'type': 'integer', 'title': 'Limit', 'default': 50, 'maximum': 200, 'minimum': 1}, 'format': {'anyOf': [{'enum': ['blog_post', 'landing_page', 'linkedin_post', 'linkedin_article', 'twitter_post', 'twitter_thread', 'newsletter', 'video_script', 'podcast_outline', 'case_study', 'whitepaper', 'ebook', 'infographic', 'webinar', 'email_sequence'], 'type': 'string', 'title': 'ContentFormat', 'description': 'Output format for content generation.'}, {'type': 'null'}], 'title': 'Format'}, 'offset': {'type': 'integer', 'title': 'Offset', 'default': 0, 'minimum': 0}, 'status': {'anyOf': [{'enum': ['planned', 'ready', 'generating', 'draft', 'in_review', 'approved', 'published', 'cancelled'], 'type': 'string', 'title': 'TaskStatus', 'description': 'Workflow status of content tasks.'}, {'type': 'null'}], 'title': 'Status'}, 'keyword': {'anyOf': [{'type': 'string', 'maxLength': 255}, {'type': 'null'}], 'title': 'Keyword'}, 'brand_id': {'anyOf': [{'type': 'string', 'format': 'uuid'}, {'type': 'null'}], 'title': 'Brand Id'}, 'pillar_id': {'anyOf': [{'type': 'string', 'format': 'uuid'}, {'type': 'null'}], 'title': 'Pillar Id'}, 'property_id': {'anyOf': [{'type': 'string', 'format': 'uuid'}, {'type': 'null'}], 'title': 'Property Id'}, 'created_from': {'anyOf': [{'type': 'string', 'format': 'date-time'}, {'type': 'null'}], 'title': 'Created From'}, 'created_before': {'anyOf': [{'type': 'string', 'format': 'date-time'}, {'type': 'null'}], 'title': 'Created Before'}}, 'additionalProperties': False}
Schéma d’entrée
{'type': 'object', 'required': [], 'properties': {'q': {'anyOf': [{'type': 'string', 'maxLength': 500}, {'type': 'null'}], 'title': 'Q'}, 'limit': {'type': 'integer', 'title': 'Limit', 'default': 50, 'maximum': 200, 'minimum': 1}, 'format': {'anyOf': [{'enum': ['blog_post', 'landing_page', 'linkedin_post', 'linkedin_article', 'twitter_post', 'twitter_thread', 'newsletter', 'video_script', 'podcast_outline', 'case_study', 'whitepaper', 'ebook', 'infographic', 'webinar', 'email_sequence'], 'type': 'string', 'title': 'ContentFormat', 'description': 'Output format for content generation.'}, {'type': 'null'}], 'title': 'Format'}, 'offset': {'type': 'integer', 'title': 'Offset', 'default': 0, 'minimum': 0}, 'status': {'anyOf': [{'enum': ['planned', 'ready', 'generating', 'draft', 'in_review', 'approved', 'published', 'cancelled'], 'type': 'string', 'title': 'TaskStatus', 'description': 'Workflow status of content tasks.'}, {'type': 'null'}], 'title': 'Status'}, 'keyword': {'anyOf': [{'type': 'string', 'maxLength': 255}, {'type': 'null'}], 'title': 'Keyword'}, 'brand_id': {'anyOf': [{'type': 'string', 'format': 'uuid'}, {'type': 'null'}], 'title': 'Brand Id'}, 'brief_id': {'anyOf': [{'type': 'string', 'format': 'uuid'}, {'type': 'null'}], 'title': 'Brief Id'}, 'pillar_id': {'anyOf': [{'type': 'string', 'format': 'uuid'}, {'type': 'null'}], 'title': 'Pillar Id'}, 'property_id': {'anyOf': [{'type': 'string', 'format': 'uuid'}, {'type': 'null'}], 'title': 'Property Id'}, 'content_type': {'anyOf': [{'enum': ['blog_post', 'landing_page', 'linkedin_post', 'linkedin_article', 'twitter_post', 'twitter_thread', 'newsletter', 'video_script', 'podcast_outline', 'case_study', 'whitepaper', 'ebook', 'infographic', 'webinar', 'email_sequence'], 'type': 'string', 'title': 'ContentFormat', 'description': 'Output format for content generation.'}, {'type': 'null'}], 'title': 'Content Type'}, 'created_from': {'anyOf': [{'type': 'string', 'format': 'date-time'}, {'type': 'null'}], 'title': 'Created From'}, 'created_before': {'anyOf': [{'type': 'string', 'format': 'date-time'}, {'type': 'null'}], 'title': 'Created Before'}}, 'additionalProperties': False}
Schéma d’entrée
{'type': 'object', 'required': [], 'properties': {'q': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Q', 'description': 'Optional case-insensitive filename substring filter'}, 'limit': {'type': 'integer', 'title': 'Limit', 'default': 50, 'maximum': 200, 'minimum': 1, 'description': 'Results per page'}, 'offset': {'type': 'integer', 'title': 'Offset', 'default': 0, 'minimum': 0, 'description': 'Pagination offset'}, 'status': {'anyOf': [{'enum': ['uploaded', 'extracting', 'summarizing', 'ready', 'failed', 'archived'], 'type': 'string', 'title': 'DocumentStatus', 'description': 'Lifecycle states for a knowledge-library document.\n\nTypical happy path:\n``uploaded → extracting → summarizing → ready``.\n\nAny stage may transition to ``failed`` (see ``failed_stage`` for which\nstage failed). ``ready → archived`` soft-removes the document from the\nlibrary while retaining the row for audit; archived documents are\nexcluded from list and detail reads.'}, {'type': 'null'}], 'title': 'Status', 'description': 'Optional processing-status filter'}, 'category': {'anyOf': [{'enum': ['brand_guidelines', 'product_service', 'customer_persona', 'marketing_material', 'case_study', 'technical_spec', 'other'], 'type': 'string', 'title': 'DocumentCategory', 'description': 'Top-level category chosen by the user at upload time (Q6/Q7).\n\nNo automatic classification: the value here is canonical and chosen\nby the human uploader. Reclassification is delete + re-upload.'}, {'type': 'null'}], 'title': 'Category', 'description': 'Optional document-category filter'}}, 'additionalProperties': False}
Schéma d’entrée
{'type': 'object', 'required': ['content_item_id', 'content_version_id'], 'properties': {'content_item_id': {'type': 'string', 'title': 'Content Item Id', 'format': 'uuid'}, 'content_version_id': {'type': 'string', 'title': 'Content Version Id', 'format': 'uuid'}}, 'additionalProperties': False}
Schéma d’entrée
{'type': 'object', 'required': [], 'properties': {'limit': {'type': 'integer', 'title': 'Limit', 'default': 50, 'maximum': 200, 'minimum': 1}, 'offset': {'type': 'integer', 'title': 'Offset', 'default': 0, 'minimum': 0}, 'status': {'anyOf': [{'enum': ['pending', 'queued', 'running', 'awaiting_review', 'completed', 'completed_with_errors', 'failed', 'cancelled'], 'type': 'string', 'title': 'JobStatus', 'description': 'Status of a background job.\n\nTerminal states: ``completed``, ``completed_with_errors``, ``failed``,\n``cancelled``. Active (in-progress) states: ``queued``, ``running``.\n\n``awaiting_review`` is a third class: not terminal (work may resume after a\nhuman action) and not active (no automatic progress is being made). Pollers\nshould treat it as stop-and-review rather than keep waiting for a terminal\nstatus. It is intentionally in neither ``is_terminal`` nor ``is_active``.'}, {'type': 'null'}], 'title': 'Status'}, 'brand_id': {'anyOf': [{'type': 'string', 'format': 'uuid'}, {'type': 'null'}], 'title': 'Brand Id'}, 'brief_id': {'anyOf': [{'type': 'string', 'format': 'uuid'}, {'type': 'null'}], 'title': 'Brief Id'}, 'job_type': {'anyOf': [{'type': 'string', 'pattern': '\\S', 'minLength': 1}, {'type': 'null'}], 'title': 'Job Type', 'description': 'Exact stored job-type name, including retired types. Must not be blank.'}, 'property_id': {'anyOf': [{'type': 'string', 'format': 'uuid'}, {'type': 'null'}], 'title': 'Property Id'}, 'created_from': {'anyOf': [{'type': 'string', 'format': 'date-time'}, {'type': 'null'}], 'title': 'Created From'}, 'created_before': {'anyOf': [{'type': 'string', 'format': 'date-time'}, {'type': 'null'}], 'title': 'Created Before'}, 'content_item_id': {'anyOf': [{'type': 'string', 'format': 'uuid'}, {'type': 'null'}], 'title': 'Content Item Id'}}, 'additionalProperties': False}
Schéma d’entrée
{'type': 'object', 'required': [], 'properties': {'limit': {'type': 'integer', 'title': 'Limit', 'default': 50, 'maximum': 200, 'minimum': 1, 'description': 'Results per page'}, 'offset': {'type': 'integer', 'title': 'Offset', 'default': 0, 'minimum': 0, 'description': 'Pagination offset'}, 'status': {'anyOf': [{'enum': ['active', 'paused', 'archived'], 'type': 'string', 'title': 'ContentStatus', 'description': 'Lifecycle status for content entities.'}, {'type': 'null'}], 'title': 'Status'}, 'brand_id': {'anyOf': [{'type': 'string', 'format': 'uuid'}, {'type': 'null'}], 'title': 'Brand Id', 'description': 'Filter by brand'}, 'active_only': {'type': 'boolean', 'title': 'Active Only', 'default': True}}, 'additionalProperties': False}
Schéma d’entrée
{'type': 'object', 'required': [], 'properties': {'limit': {'type': 'integer', 'title': 'Limit', 'default': 50, 'maximum': 200, 'minimum': 1, 'description': 'Results per page'}, 'offset': {'type': 'integer', 'title': 'Offset', 'default': 0, 'minimum': 0, 'description': 'Pagination offset'}, 'channel_type': {'anyOf': [{'enum': ['blog', 'linkedin', 'twitter', 'newsletter', 'youtube', 'podcast'], 'type': 'string', 'title': 'ChannelType', 'description': 'Publishing channel/platform type.'}, {'type': 'null'}], 'title': 'Channel Type', 'description': 'Optional channel-type filter'}, 'verified_only': {'type': 'boolean', 'title': 'Verified Only', 'default': False, 'description': 'Only return verified properties'}}, 'additionalProperties': False}
Schéma d’entrée
{'type': 'object', 'required': [], 'properties': {}, 'additionalProperties': False}
Schéma d’entrée
{'type': 'object', 'required': [], 'properties': {'limit': {'type': 'integer', 'title': 'Limit', 'default': 50, 'maximum': 200, 'minimum': 1}, 'offset': {'type': 'integer', 'title': 'Offset', 'default': 0, 'minimum': 0}, 'content_item_id': {'anyOf': [{'type': 'string', 'format': 'uuid'}, {'type': 'null'}], 'title': 'Content Item Id'}}, 'additionalProperties': False}
Schéma d’entrée
{'type': 'object', 'required': ['brand_id'], 'properties': {'limit': {'type': 'integer', 'title': 'Limit', 'default': 50, 'maximum': 200, 'minimum': 1, 'description': 'Results per page'}, 'intent': {'anyOf': [{'enum': ['informational', 'navigational', 'transactional', 'commercial'], 'type': 'string', 'title': 'SearchIntent', 'description': 'User intent classification for SEO.'}, {'type': 'null'}], 'title': 'Intent', 'description': 'Search intent filter'}, 'offset': {'type': 'integer', 'title': 'Offset', 'default': 0, 'minimum': 0, 'description': 'Pagination offset'}, 'status': {'anyOf': [{'enum': ['suggested', 'selected', 'rejected', 'converted', 'expired'], 'type': 'string', 'title': 'TopicIdeaStatus', 'description': 'Lifecycle status of topic ideas in the bank.'}, {'type': 'null'}], 'title': 'Status', 'description': 'Filter by status'}, 'keyword': {'anyOf': [{'type': 'string', 'maxLength': 120, 'minLength': 1}, {'type': 'null'}], 'title': 'Keyword', 'description': 'Filter by keyword across title, primary, and secondary keywords'}, 'sort_by': {'enum': ['total_score', 'search_volume', 'keyword_difficulty', 'created_at'], 'type': 'string', 'title': '_TopicSortBy', 'default': 'total_score', 'description': 'Sort field'}, 'brand_id': {'type': 'string', 'title': 'Brand Id', 'format': 'uuid', 'description': 'Brand whose topics to list'}, 'min_score': {'type': 'number', 'title': 'Min Score', 'default': 0, 'maximum': 5, 'minimum': 0, 'description': 'Minimum total score'}, 'pillar_id': {'anyOf': [{'type': 'string', 'format': 'uuid'}, {'type': 'null'}], 'title': 'Pillar Id', 'description': 'Filter by pillar'}, 'min_volume': {'anyOf': [{'type': 'integer', 'minimum': 0}, {'type': 'null'}], 'title': 'Min Volume', 'description': 'Minimum search volume'}, 'sort_order': {'enum': ['asc', 'desc'], 'type': 'string', 'title': 'SortDirection', 'default': 'desc', 'description': 'Sort order'}, 'property_id': {'anyOf': [{'type': 'string', 'format': 'uuid'}, {'type': 'null'}], 'title': 'Property Id', 'description': 'Property context for scores'}, 'decision_band': {'anyOf': [{'enum': ['auto_brief', 'light_review', 'expert_review', 'reject_or_hold'], 'type': 'string', 'title': 'DecisionBand', 'description': 'Opportunity-engine editorial routing band.'}, {'type': 'null'}], 'title': 'Decision Band', 'description': 'Filter by editorial routing band'}, 'max_difficulty': {'anyOf': [{'type': 'number', 'maximum': 100, 'minimum': 0}, {'type': 'null'}], 'title': 'Max Difficulty', 'description': 'Maximum keyword difficulty'}}, 'additionalProperties': False}
Schéma d’entrée
{'type': 'object', 'required': ['content_item_id'], 'properties': {'content_item_id': {'type': 'string', 'title': 'Content Item Id', 'format': 'uuid'}}, 'additionalProperties': False}
Schéma d’entrée
{'type': 'object', 'required': ['body'], 'properties': {'body': {'type': 'object', 'title': 'ReviewCreateRequest', 'required': ['content_version_id'], 'properties': {'content_version_id': {'type': 'string', 'title': 'Content Version Id', 'format': 'uuid'}}, 'additionalProperties': False}}, 'additionalProperties': False}
Schéma d’entrée
{'type': 'object', 'required': ['content_item_id', 'body'], 'properties': {'body': {'type': 'object', 'title': 'EditorialRestoreRequest', 'required': ['expected_base_version_id', 'request_id', 'source_version_id'], 'properties': {'request_id': {'type': 'string', 'title': 'Request Id', 'format': 'uuid'}, 'source_version_id': {'type': 'string', 'title': 'Source Version Id', 'format': 'uuid'}, 'expected_base_version_id': {'type': 'string', 'title': 'Expected Base Version Id', 'format': 'uuid'}}, 'additionalProperties': False}, 'content_item_id': {'type': 'string', 'title': 'Content Item Id', 'format': 'uuid'}}, 'additionalProperties': False}
Schéma d’entrée
{'type': 'object', 'required': ['content_item_id', 'body', 'idempotency_key'], 'properties': {'body': {'type': 'object', 'title': 'EditorialRewriteRequest', 'required': ['expected_base_version_id'], 'properties': {'tone': {'anyOf': [{'type': 'string', 'maxLength': 128}, {'type': 'null'}], 'title': 'Tone'}, 'scope': {'enum': ['section', 'full'], 'type': 'string', 'title': 'EditorialRewriteScope', 'default': 'full'}, 'section_id': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Section Id'}, 'instructions': {'anyOf': [{'type': 'string', 'maxLength': 5000}, {'type': 'null'}], 'title': 'Instructions'}, 'target_length': {'anyOf': [{'type': 'integer', 'minimum': 1}, {'type': 'null'}], 'title': 'Target Length'}, 'allow_broader_repair': {'type': 'boolean', 'title': 'Allow Broader Repair', 'default': False}, 'expected_base_version_id': {'type': 'string', 'title': 'Expected Base Version Id', 'format': 'uuid'}}, 'additionalProperties': False}, 'content_item_id': {'type': 'string', 'title': 'Content Item Id', 'format': 'uuid'}, 'idempotency_key': {'type': 'string', 'pattern': '^[!-~]+$', 'maxLength': 128, 'minLength': 1, 'description': 'Stable operation key. Reuse for the same request after a dropped response; use a new key for a new intended operation.'}}, 'additionalProperties': False}
Schéma d’entrée
{'type': 'object', 'required': ['body', 'idempotency_key'], 'properties': {'body': {'type': 'object', 'title': 'PublicBrandSetupCreate', 'required': ['website_url'], 'properties': {'website_url': {'type': 'string', 'title': 'Website Url', 'maxLength': 2048, 'minLength': 1}}, 'description': 'Start research for one website without creating or changing a brand.', 'additionalProperties': False}, 'idempotency_key': {'type': 'string', 'pattern': '^[!-~]+$', 'maxLength': 128, 'minLength': 1, 'description': 'Stable operation key. Reuse for the same request after a dropped response; use a new key for a new intended operation.'}}, 'additionalProperties': False}
Schéma d’entrée
{'type': 'object', 'required': ['brand_id', 'body'], 'properties': {'body': {'type': 'object', 'title': 'PublicBrandUpdate', 'properties': {'dos': {'type': 'array', 'items': {'type': 'string'}, 'title': 'Dos'}, 'tone': {'enum': ['professional', 'casual', 'friendly', 'authoritative', 'playful', 'empathetic', 'technical', 'conversational'], 'type': 'string', 'title': 'Tone', 'description': 'Brand voice tone values used on brand read/write surfaces.'}, 'donts': {'type': 'array', 'items': {'type': 'string'}, 'title': 'Donts'}, 'description': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Description'}, 'phrases_to_avoid': {'type': 'array', 'items': {'type': 'string'}, 'title': 'Phrases To Avoid'}, 'mission_statement': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Mission Statement'}}, 'description': "Partial update of a brand's voice fields.\n\nClosed allowlist: ``description``, ``tone``, ``phrases_to_avoid``,\n``donts``, ``dos``, ``mission_statement``. Unknown keys return **422**.\n\nOmitted keys are left unchanged. ``description`` and ``mission_statement``\naccept ``null`` to clear. ``tone`` and the arrays reject ``null`` (**422**);\nsend ``[]`` to clear an array. Does not regenerate an AI voice directive.", 'additionalProperties': False}, 'brand_id': {'type': 'string', 'title': 'Brand Id', 'format': 'uuid'}}, 'additionalProperties': False}
Schéma d’entrée
{'type': 'object', 'required': ['brief_id', 'body'], 'properties': {'body': {'type': 'object', 'title': 'PublicBriefUpdate', 'properties': {'cta': {'anyOf': [{'type': 'string', 'maxLength': 500}, {'type': 'null'}], 'title': 'Cta'}, 'tone': {'anyOf': [{'enum': ['confident', 'operational', 'bold'], 'type': 'string', 'title': 'ContentTone'}, {'type': 'null'}]}, 'notes': {'anyOf': [{'type': 'string', 'maxLength': 5000}, {'type': 'null'}], 'title': 'Notes'}, 'title': {'type': 'string', 'title': 'Title', 'maxLength': 500, 'minLength': 1}, 'format': {'enum': ['blog_post', 'landing_page', 'linkedin_post', 'linkedin_article', 'twitter_post', 'twitter_thread', 'newsletter', 'video_script', 'podcast_outline', 'case_study', 'whitepaper', 'ebook', 'infographic', 'webinar', 'email_sequence'], 'type': 'string', 'title': 'Format', 'description': 'Output format for content generation.'}, 'outline': {'anyOf': [{'type': 'array', 'items': {'type': 'string'}, 'maxItems': 20}, {'type': 'null'}], 'title': 'Outline'}, 'summary': {'anyOf': [{'type': 'string', 'maxLength': 5000}, {'type': 'null'}], 'title': 'Summary'}, 'pillar_id': {'anyOf': [{'type': 'string', 'format': 'uuid'}, {'type': 'null'}], 'title': 'Pillar Id'}, 'must_avoid': {'anyOf': [{'type': 'array', 'items': {'type': 'string'}, 'maxItems': 20}, {'type': 'null'}], 'title': 'Must Avoid'}, 'must_cover': {'anyOf': [{'type': 'array', 'items': {'type': 'string'}, 'maxItems': 20}, {'type': 'null'}], 'title': 'Must Cover'}, 'description': {'anyOf': [{'type': 'string', 'maxLength': 5000}, {'type': 'null'}], 'title': 'Description'}, 'source_urls': {'anyOf': [{'type': 'array', 'items': {'type': 'string'}, 'maxItems': 20}, {'type': 'null'}], 'title': 'Source Urls'}, 'content_goal': {'anyOf': [{'type': 'string', 'maxLength': 5000}, {'type': 'null'}], 'title': 'Content Goal'}, 'example_urls': {'anyOf': [{'type': 'array', 'items': {'type': 'string'}, 'maxItems': 20}, {'type': 'null'}], 'title': 'Example Urls'}, 'funnel_stage': {'anyOf': [{'enum': ['tofu', 'mofu', 'bofu'], 'type': 'string', 'title': 'FunnelStage', 'description': 'Marketing funnel position.'}, {'type': 'null'}]}, 'search_intent': {'anyOf': [{'enum': ['informational', 'navigational', 'transactional', 'commercial'], 'type': 'string', 'title': 'SearchIntent', 'description': 'User intent classification for SEO.'}, {'type': 'null'}]}, 'competitor_urls': {'anyOf': [{'type': 'array', 'items': {'type': 'string'}, 'maxItems': 20}, {'type': 'null'}], 'title': 'Competitor Urls'}, 'primary_keyword': {'anyOf': [{'type': 'string', 'maxLength': 255}, {'type': 'null'}], 'title': 'Primary Keyword'}, 'audience_details': {'anyOf': [{'type': 'string', 'maxLength': 5000}, {'type': 'null'}], 'title': 'Audience Details'}, 'target_word_count': {'anyOf': [{'type': 'integer', 'maximum': 10000, 'minimum': 100}, {'type': 'null'}], 'title': 'Target Word Count'}, 'secondary_keywords': {'anyOf': [{'type': 'array', 'items': {'type': 'string'}, 'maxItems': 20}, {'type': 'null'}], 'title': 'Secondary Keywords'}, 'attached_document_ids': {'anyOf': [{'type': 'array', 'items': {'type': 'string', 'format': 'uuid'}, 'maxItems': 10}, {'type': 'null'}], 'title': 'Attached Document Ids'}}, 'description': 'Partial update for a developer-authored brief.\n\nEvery field is optional; only supplied fields are patched. Brand and\nstatus are not editable here. Omitting a key leaves it unchanged. An\nexplicit ``null`` clears a nullable field. ``secondary_keywords``,\n``outline``, ``must_cover``, ``must_avoid``, ``source_urls``,\n``example_urls``, ``competitor_urls``, and ``attached_document_ids`` also\naccept ``[]`` to empty the set. Editing any field that affects generation\non an already-approved brief moves its status back to ``draft`` so the\nnext generation re-enters review. Explicit ``null`` is rejected with a\n**422** on ``title`` and ``format``.', 'additionalProperties': False}, 'brief_id': {'type': 'string', 'title': 'Brief Id', 'format': 'uuid'}}, 'additionalProperties': False}
Modifications récentes des outils
Serveurs MCP similaires
Hermoso
Supports ad research, competitor analysis, video and static ad creation, campaign policy checks, content publishing, and performa…
Heista
Analyzes video advertising, builds brand intelligence profiles, researches markets, and generates advertising scripts and creativ…
Spook SEO
Provides SEO analysis, keyword and content generation, AEO checks, ad copy tools and automated article generation and publishing.
VarynForge
Supports SEO research and content planning through niche analysis, competitor and keyword research, opportunity discovery, and wr…
AfterLaunch: the agentic growth marketing engine
Runs growth-marketing workflows covering SEO, AI-search visibility, competitor analysis, content planning, distribution channels,…
ai-content-drop
Generates AI images, videos, UGC clips, avatars, and finished ads, while organizing creative assets and campaign boards.
Newswire Com
Searches and retrieves recent press releases from Newswire.com's public newsroom feed.
Prnewswire
Searches and retrieves recent press releases from PR Newswire's public all-releases feed.