AfterLaunch: the agentic growth marketing engine
What this MCP does
Runs growth-marketing workflows covering SEO, AI-search visibility, competitor analysis, content planning, distribution channels, experiments, and performance measurement.
Tools
Input schema
{'type': 'object', 'required': ['move_id', 'target'], 'properties': {'note': {'type': ['string', 'null'], 'maxLength': 2000}, 'target': {'enum': ['agent_pull', 'share', 'open', 'claude_cloud', 'cursor', 'codex'], 'type': 'string'}, 'move_id': {'type': 'string', 'description': 'Move id (uuid).'}, 'operation': {'enum': ['accept', 'retry'], 'type': 'string', 'description': 'Defaults to accept. Retry requires expected_attempt_id; use null only with the exact legacy state and updated_at.'}, 'expected_attempt_id': {'type': ['string', 'null'], 'description': 'Required for retry. Pass the exact managed attempt, or null for a legacy job.'}, 'expected_legacy_state': {'type': ['string', 'null'], 'description': 'get_move: prepared_result.legacy_state ?? state.'}, 'expected_legacy_updated_at': {'type': ['string', 'null']}}, 'additionalProperties': False}
Input schema
{'type': 'object', 'required': ['move_id'], 'properties': {'move_id': {'type': 'string', 'description': 'Move id (uuid), from list_feed.'}}, 'additionalProperties': False}
Input schema
{'type': 'object', 'properties': {}, 'additionalProperties': False}
Input schema
{'type': 'object', 'required': ['pack_id'], 'properties': {'pack_id': {'enum': ['small', 'medium', 'large'], 'type': 'string', 'description': 'The refill pack size: small, medium or large. The founder sees the price on the checkout page.'}}, 'additionalProperties': False}
Input schema
{'type': 'object', 'required': ['provider'], 'properties': {'provider': {'type': 'string', 'description': 'Which connector to disconnect: ga4, gsc, gbp, linkedin or reddit.'}}, 'additionalProperties': False}
Input schema
{'type': 'object', 'required': ['prompt_id', 'prompt_text'], 'properties': {'reason': {'enum': ['not_relevant', 'wrong_voice', 'wrong_angle', 'wrong_timing', 'low_quality', 'duplicate', 'other'], 'type': 'string', 'description': 'Why it is being set aside. Closed vocabulary; unknown keys are ignored by the learning loop.'}, 'prompt_id': {'type': 'string', 'description': 'The tracked question id, from get_visibility.'}, 'prompt_text': {'type': 'string', 'description': 'The tracked question text, from get_visibility. Both fields are required: together they identify the gap.'}}, 'additionalProperties': False}
Input schema
{'type': 'object', 'properties': {'limit': {'type': 'integer', 'maximum': 200, 'minimum': 1, 'description': 'How many entries to return (1 to 200, default 50).'}}, 'additionalProperties': False}
Input schema
{'type': 'object', 'properties': {}, 'additionalProperties': False}
Input schema
{'type': 'object', 'properties': {}, 'additionalProperties': False}
Input schema
{'type': 'object', 'properties': {}, 'additionalProperties': False}
Input schema
{'type': 'object', 'properties': {}, 'additionalProperties': False}
Input schema
{'type': 'object', 'properties': {}, 'additionalProperties': False}
Input schema
{'type': 'object', 'properties': {'limit': {'type': 'integer', 'maximum': 50, 'minimum': 1}, 'idea_id': {'type': 'string', 'format': 'uuid'}, 'experiment_id': {'type': 'string', 'format': 'uuid'}}, 'additionalProperties': False}
Input schema
{'type': 'object', 'required': ['slug'], 'properties': {'slug': {'type': 'string', 'description': 'The page slug, from list_kb_pages.'}}, 'additionalProperties': False}
Input schema
{'type': 'object', 'properties': {'loop_type': {'type': 'string', 'description': 'Optional loop type, e.g. daily_brief or linkedin_post.'}}, 'additionalProperties': False}
Input schema
{'type': 'object', 'required': ['move_id'], 'properties': {'move_id': {'type': 'string', 'description': 'Move id (uuid), from list_feed or get_standup.'}}, 'additionalProperties': False}
Input schema
{'type': 'object', 'properties': {}, 'additionalProperties': False}
Input schema
{'type': 'object', 'required': ['output_id'], 'properties': {'output_id': {'type': 'string', 'description': 'The output id (uuid).'}}, 'additionalProperties': False}
Input schema
{'type': 'object', 'properties': {'window_days': {'type': 'integer', 'maximum': 90, 'minimum': 7, 'description': 'How many days the scoreboard covers (7 to 90, default 14). Out-of-range values are clamped, never rejected.'}}, 'additionalProperties': False}
Input schema
{'type': 'object', 'properties': {'include_pages': {'type': 'boolean', 'description': 'Include the per-page audit detail. Default false: the grouped issues only.'}}, 'additionalProperties': False}
Input schema
{'type': 'object', 'properties': {}, 'additionalProperties': False}
Input schema
{'type': 'object', 'properties': {}, 'additionalProperties': False}
Input schema
{'type': 'object', 'properties': {}, 'additionalProperties': False}
Input schema
{'type': 'object', 'properties': {'prompt_id': {'type': 'string', 'description': 'Drill into one tracked question by its id (from the prompts list) for the engine answer text and citations.'}}, 'additionalProperties': False}
Input schema
{'type': 'object', 'properties': {'register': {'enum': ['brand', 'personal', 'imported'], 'type': 'string', 'description': "Which voice to read. Omit for the current one. Use 'personal' for anything the founder posts in their own name."}}, 'additionalProperties': False}
Input schema
{'type': 'object', 'properties': {}, 'additionalProperties': False}
Input schema
{'type': 'object', 'properties': {'since': {'type': 'string', 'description': 'ISO-8601. Returns only moves first seen after it. Pass the newest first_seen_at you already hold so a move is never returned twice.'}, 'verbosity': {'enum': ['compact', 'full'], 'type': 'string', 'description': "Default 'compact': no material bodies, so a long board stays cheap to read; has_draft and draft_kind say whether each move carries an inspectable artefact, an assignment, or nothing readable. Use 'full' only when you need every body at once."}, 'include_resolved': {'type': 'boolean', 'description': 'Include resolved moves (shipped, skipped, archived, expired) as well as the live ones. Default false.'}}, 'additionalProperties': False}
Input schema
{'type': 'object', 'properties': {}, 'additionalProperties': False}
Input schema
{'type': 'object', 'properties': {}, 'additionalProperties': False}
Input schema
{'type': 'object', 'properties': {}, 'additionalProperties': False}
Input schema
{'type': 'object', 'properties': {}, 'additionalProperties': False}
Input schema
{'type': 'object', 'required': ['job_id', 'attempt_id'], 'properties': {'job_id': {'type': 'string', 'description': 'Job id (uuid), from list_queue.'}, 'attempt_id': {'type': ['string', 'null'], 'description': 'Exact attempt id from list_queue; null only for a stored legacy job.'}, 'session_url': {'type': 'string', 'description': 'Your own session URL, if you have one, so the founder can open where the work is happening.'}}, 'additionalProperties': False}
Input schema
{'type': 'object', 'required': ['poll_token'], 'properties': {'poll_token': {'type': 'string', 'description': 'The poll_token start_connection returned.'}}, 'additionalProperties': False}
Input schema
{'type': 'object', 'required': ['title', 'why', 'kind', 'target'], 'properties': {'why': {'type': 'string', 'maxLength': 600, 'minLength': 20, 'description': 'Why it is worth their time, in one or two sentences.'}, 'kind': {'enum': ['community_reply', 'community_answer'], 'type': 'string', 'description': 'community_answer for a question thread; otherwise community_reply.'}, 'draft': {'type': 'string', 'maxLength': 8000, 'description': 'Optional: your drafted reply.'}, 'title': {'type': 'string', 'maxLength': 140, 'minLength': 10, 'description': 'The thread, as the founder would name it.'}, 'target': {'type': 'string', 'description': 'The https address of the thread itself.'}, 'sources': {'type': 'array', 'items': {'type': 'string'}, 'maxItems': 5, 'description': 'Optional: up to five https addresses behind the why.'}}, 'additionalProperties': False}
Input schema
{'type': 'object', 'required': ['text', 'trigger', 'number', 'caveat'], 'properties': {'held': {'type': 'boolean', 'description': 'True to record it and block its use.'}, 'text': {'type': 'string', 'maxLength': 300, 'minLength': 10, 'description': 'The claim in one sentence.'}, 'caveat': {'type': 'string', 'maxLength': 500, 'minLength': 10, 'description': 'What it does not prove, against your own interest.'}, 'number': {'type': 'string', 'maxLength': 200, 'minLength': 1, 'description': 'The measurement, with its unit and comparison.'}, 'trigger': {'type': 'array', 'items': {'type': 'string', 'maxLength': 60, 'minLength': 2}, 'maxItems': 10, 'minItems': 1, 'description': 'Keywords saying when this claim is relevant.'}}, 'additionalProperties': False}
Input schema
{'type': 'object', 'required': ['operation'], 'properties': {'why': {'type': 'string', 'maxLength': 5000, 'minLength': 1}, 'text': {'type': 'string', 'maxLength': 20000, 'minLength': 1}, 'title': {'type': 'string', 'maxLength': 300, 'minLength': 1}, 'channel': {'enum': ['x'], 'type': 'string'}, 'idea_id': {'type': 'string', 'format': 'uuid'}, 'run_key': {'type': 'string', 'maxLength': 160, 'minLength': 1}, 'research': {'type': 'object', 'required': ['outcome', 'summary', 'method', 'limitations', 'sources'], 'properties': {'method': {'type': 'string', 'maxLength': 5000, 'minLength': 1}, 'outcome': {'enum': ['supported', 'not_supported', 'inconclusive'], 'type': 'string'}, 'sources': {'type': 'array', 'items': {'type': 'object', 'required': ['title', 'url', 'observed_at'], 'properties': {'url': {'type': 'string', 'format': 'uri', 'maxLength': 2048}, 'title': {'type': 'string', 'maxLength': 300, 'minLength': 1}, 'observed_at': {'type': 'string', 'format': 'date-time'}}, 'additionalProperties': False}, 'maxItems': 50}, 'summary': {'type': 'string', 'maxLength': 5000, 'minLength': 1}, 'limitations': {'type': 'string', 'maxLength': 5000, 'minLength': 1}}, 'additionalProperties': False}, 'claim_ids': {'type': 'array', 'items': {'type': 'string', 'format': 'uuid'}, 'maxItems': 20}, 'operation': {'enum': ['idea', 'draft', 'research'], 'type': 'string'}, 'source_url': {'type': 'string', 'format': 'uri', 'maxLength': 2048}, 'action_kind': {'enum': ['social_post'], 'type': 'string'}, 'source_idea': {'type': 'object', 'required': ['title', 'needs_data'], 'properties': {'kind': {'enum': ['opinion', 'educational', 'amplify'], 'type': 'string'}, 'link': {'type': 'string', 'format': 'uri', 'maxLength': 2048}, 'angle': {'type': 'string', 'maxLength': 3000, 'minLength': 1}, 'score': {'type': 'number', 'maximum': 10, 'minimum': 0}, 'title': {'type': 'string', 'maxLength': 300, 'minLength': 1}, 'channels': {'type': 'array', 'items': {'enum': ['x', 'linkedin', 'article', 'seo'], 'type': 'string'}, 'maxItems': 4, 'minItems': 1, 'uniqueItems': True}, 'needs_data': {'type': 'boolean'}}, 'additionalProperties': False}, 'adopt_legacy': {'type': 'object', 'required': ['output_id', 'action_kind'], 'properties': {'output_id': {'type': 'string', 'format': 'uuid'}, 'action_kind': {'enum': ['social_post', 'community_reply'], 'type': 'string'}}, 'additionalProperties': False}, 'expected_updated_at': {'type': 'string', 'format': 'date-time'}}, 'additionalProperties': False}
Input schema
{'type': 'object', 'required': ['insight', 'kind'], 'properties': {'kind': {'enum': ['preference', 'voice', 'fact', 'outcome'], 'type': 'string', 'description': 'preference = a standing choice about how they work. voice = how they write (a rule they approved goes to record_voice_rule). fact = something true about the product. outcome = what a shipped move earned.'}, 'insight': {'type': 'string', 'maxLength': 500, 'minLength': 10, 'description': "The durable insight, as one plain sentence in the founder's own terms."}, 'source_move_id': {'type': 'string', 'description': 'Optional growth move id (uuid), from list_feed, when the insight surfaced while working one.'}}, 'additionalProperties': False}
Input schema
{'type': 'object', 'required': ['text'], 'properties': {'text': {'type': 'string', 'maxLength': 200, 'minLength': 10, 'description': 'The rule as approved, in one sentence.'}}, 'additionalProperties': False}
Input schema
{'type': 'object', 'required': ['output_id', 'draft'], 'properties': {'draft': {'type': 'string', 'description': 'The replacement draft body, 1 to 20000 characters.'}, 'output_id': {'type': 'string', 'description': 'Output id (uuid), from list_outputs.'}, 'draft_fence': {'type': 'object', 'required': ['move_id', 'move_state', 'move_updated_at', 'job_id', 'attempt_id', 'job_state', 'job_updated_at', 'candidate_id', 'draft'], 'properties': {'draft': {'type': 'string', 'maxLength': 20000}, 'job_id': {'type': ['string', 'null'], 'format': 'uuid'}, 'move_id': {'type': 'string', 'format': 'uuid'}, 'job_state': {'type': ['string', 'null']}, 'attempt_id': {'type': ['string', 'null'], 'format': 'uuid'}, 'move_state': {'type': 'string'}, 'candidate_id': {'type': 'string', 'format': 'uuid'}, 'job_updated_at': {'type': ['string', 'null'], 'format': 'date-time'}, 'move_updated_at': {'type': 'string', 'format': 'date-time'}}, 'description': 'For a content pilot edit, return draft_fence unchanged from get_move or get_output. Refresh after a conflict.', 'additionalProperties': False}}, 'additionalProperties': False}
Input schema
{'type': 'object', 'required': ['scan', 'idempotency_key'], 'properties': {'scan': {'enum': ['ai_visibility'], 'type': 'string', 'description': "The scan to refresh. Only 'ai_visibility' today."}, 'idempotency_key': {'type': 'string', 'description': 'Client-minted key (1-200 chars). Reuse the same key on a retry.'}}, 'additionalProperties': False}
Input schema
{'type': 'object', 'required': ['idempotency_key'], 'properties': {'idempotency_key': {'type': 'string', 'description': 'Client-minted key (1-200 chars). Reuse the same key on a retry.'}}, 'additionalProperties': False}
Input schema
{'type': 'object', 'required': ['job_id', 'attempt_id', 'state'], 'properties': {'state': {'enum': ['running', 'ready_for_review', 'shipped', 'failed'], 'type': 'string'}, 'job_id': {'type': 'string', 'description': 'Job id (uuid), from list_queue.'}, 'asset_url': {'type': 'string', 'description': 'URL of the prepared asset. This does not claim publication.'}, 'attempt_id': {'type': ['string', 'null'], 'description': 'Exact attempt id; null only when list_queue identified a legacy job.'}, 'fail_reason': {'type': 'string', 'maxLength': 500, 'description': "Required with 'failed': what stopped you."}, 'receipt_url': {'type': 'string', 'description': 'A permalink to the proof.'}, 'session_url': {'type': 'string', 'description': 'Your own session URL, if you have one.'}, 'prepared_content': {'type': 'string', 'maxLength': 20000, 'description': 'Prepared result body for ready_for_review.'}}, 'additionalProperties': False}
Input schema
{'type': 'object', 'required': ['move_id', 'operation', 'job_id', 'expected_attempt_id'], 'properties': {'note': {'type': ['string', 'null'], 'maxLength': 2000}, 'job_id': {'type': ['string', 'null']}, 'move_id': {'type': 'string'}, 'asset_url': {'type': ['string', 'null']}, 'operation': {'enum': ['revise', 'withdraw', 'adopt_legacy_result', 'correct_publication'], 'type': 'string', 'description': 'adopt_legacy_result requires a null expected attempt, exact move CAS, exact legacy job CAS when job_id is present, and inspected prepared content or asset URL.'}, 'prepared_content': {'type': ['string', 'null'], 'maxLength': 20000}, 'expected_attempt_id': {'type': ['string', 'null'], 'description': 'Exact managed attempt. Null identifies legacy work and requires exact move CAS plus legacy job CAS when job_id is present.'}, 'expected_move_state': {'enum': ['pending', 'taken_on', 'shipped', 'skipped', 'archived', 'expired', None], 'type': ['string', 'null']}, 'expected_legacy_state': {'type': ['string', 'null'], 'description': 'get_move: prepared_result.legacy_state ?? state.'}, 'expected_move_updated_at': {'type': ['string', 'null']}, 'expected_legacy_updated_at': {'type': ['string', 'null']}}, 'additionalProperties': False}
Input schema
{'type': 'object', 'required': ['output_id', 'action'], 'properties': {'action': {'enum': ['ship', 'skip'], 'type': 'string', 'description': "'ship' resolves it as done / posted without publishing; 'skip' dismisses it."}, 'output_id': {'type': 'string', 'description': 'Output id (uuid), from list_outputs.'}}, 'additionalProperties': False}
Input schema
{'type': 'object', 'required': ['axes'], 'properties': {'axes': {'type': 'object', 'description': "Keyed by axis id, each { lean, strength }. lean is 'a' or 'b', the pole this voice sits nearer; strength is the share of that axis's observations that fell on the leaning side, so 0.5 is an even split and 1 is every observation one way.", 'additionalProperties': {'type': 'object', 'required': ['lean', 'strength'], 'properties': {'lean': {'enum': ['a', 'b'], 'type': 'string'}, 'strength': {'type': 'number', 'maximum': 1, 'minimum': 0.5}}, 'additionalProperties': False}}}, 'additionalProperties': False}
Input schema
{'type': 'object', 'required': ['move_id', 'completion_kind', 'job_id', 'attempt_id', 'founder_confirmed'], 'properties': {'note': {'type': ['string', 'null'], 'maxLength': 2000}, 'job_id': {'type': ['string', 'null']}, 'move_id': {'type': 'string', 'description': 'Move id (uuid), from list_feed.'}, 'attempt_id': {'type': ['string', 'null']}, 'planned_url': {'type': ['string', 'null'], 'description': "Future address of a prepared page on the founder's own site."}, 'published_url': {'type': ['string', 'null'], 'description': 'The actual public URL, when the completed task has one. This is distinct from a prepared asset.'}, 'completion_kind': {'enum': ['prepared_result', 'independent_work'], 'type': 'string'}, 'founder_confirmed': {'type': 'boolean', 'const': True}, 'expected_move_state': {'enum': ['pending', 'taken_on', 'shipped', 'skipped', 'archived', 'expired', None], 'type': ['string', 'null'], 'description': 'Required with expected_move_updated_at for independent_work.'}, 'expected_legacy_state': {'type': ['string', 'null'], 'description': 'get_move: prepared_result.legacy_state ?? state.'}, 'expected_move_updated_at': {'type': ['string', 'null'], 'description': 'Required with expected_move_state for independent_work.'}, 'expected_legacy_updated_at': {'type': ['string', 'null']}}, 'additionalProperties': False}
Input schema
{'type': 'object', 'required': ['move_id'], 'properties': {'move_id': {'type': 'string', 'description': 'Move id (uuid), from list_feed.'}, 'feedback_key': {'enum': ['not_relevant', 'wrong_voice', 'wrong_angle', 'wrong_timing', 'low_quality', 'duplicate', 'other'], 'type': 'string', 'description': 'Why it was dismissed. Closed vocabulary; unknown keys are ignored by the learning loop.'}, 'feedback_note': {'type': 'string', 'maxLength': 500, 'description': 'Optional free-text detail alongside feedback_key.'}}, 'additionalProperties': False}
Input schema
{'type': 'object', 'required': ['provider'], 'properties': {'provider': {'type': 'string', 'description': 'Which connector to connect. Use a provider id from list_connections: ga4, gsc, gbp, linkedin or reddit.'}}, 'additionalProperties': False}
Input schema
{'type': 'object', 'required': ['text'], 'properties': {'text': {'type': 'string', 'maxLength': 200, 'minLength': 10, 'description': 'The customer question to track, as a person would ask an AI assistant, e.g. "What is the best invoicing tool for UK freelancers?".'}}, 'additionalProperties': False}
Input schema
{'type': 'object', 'required': ['move_id'], 'properties': {'move_id': {'type': 'string', 'description': 'Move id (uuid), from list_feed.'}}, 'additionalProperties': False}
Input schema
{'type': 'object', 'required': ['text'], 'properties': {'text': {'type': 'string', 'description': 'The tracked question to remove, from list_tracked_prompts. Matched ignoring case and punctuation.'}}, 'additionalProperties': False}
Input schema
{'type': 'object', 'required': ['move_id', 'draft_content'], 'properties': {'move_id': {'type': 'string', 'description': 'Move id (uuid), from list_feed.'}, 'draft_fence': {'type': 'object', 'required': ['move_id', 'move_state', 'move_updated_at', 'job_id', 'attempt_id', 'job_state', 'job_updated_at', 'candidate_id', 'draft'], 'properties': {'draft': {'type': 'string', 'maxLength': 20000}, 'job_id': {'type': ['string', 'null'], 'format': 'uuid'}, 'move_id': {'type': 'string', 'format': 'uuid'}, 'job_state': {'type': ['string', 'null']}, 'attempt_id': {'type': ['string', 'null'], 'format': 'uuid'}, 'move_state': {'type': 'string'}, 'candidate_id': {'type': 'string', 'format': 'uuid'}, 'job_updated_at': {'type': ['string', 'null'], 'format': 'date-time'}, 'move_updated_at': {'type': 'string', 'format': 'date-time'}}, 'description': 'For a content pilot edit, return draft_fence unchanged from get_move or get_output. Refresh after a conflict.', 'additionalProperties': False}, 'draft_content': {'type': 'string', 'description': 'The replacement draft body, 1 to 20000 characters.'}}, 'additionalProperties': False}
Input schema
{'type': 'object', 'properties': {}, 'additionalProperties': False}
Recent tool changes
Similar MCP servers
Heista
Analyzes video advertising, builds brand intelligence profiles, researches markets, and generates advertising scripts and creativ…
VarynForge
Supports SEO research and content planning through niche analysis, competitor and keyword research, opportunity discovery, and wr…
Jargon Translator
Provides corporate-jargon translation, AI brand visibility checks, AI crawler indexing files, and routed research across structur…
particle-pro
Searches and analyzes podcast episodes, transcripts, speakers, companies, topics, clips, rankings, sponsorships, and entity menti…
Niche — Editorial Intelligence
Discovers and ranks emerging stories, proposes editorial angles, generates platform-specific content, renders media, and supports…
BetterPost
Gathers timely stories from news, web, and social sources and generates, transforms, and manages publishable content.
agents
Offers paid agents for brand visibility checks, web data extraction, webpage reading, marketing video production, and deliverable…
Social Fetch
Retrieves public content and metadata from social networks, music services, Facebook Marketplace, events, profiles, posts, commen…