_ registry / mcp streamable-http · checked 2h ago

afterlaunch

https://afterlaunch.io

Registry code: 6305c41726a8f379

api record

AfterLaunch is the agentic growth engine: the continuous record of how this product gets found. It watches how ChatGPT, Gemini, Google AI Overviews and Perplexity answer when customers ask (AI visibility, GEO), audits the site for SEO, tracks competitors, distribution channels and launch surfaces, and ranks and briefs the next growth marketing move with its evidence and working material. These tools read that record and act on it.

What you cannot do inside one session, this server does between them: read what the answer engines say about this product today, remember what was decided weeks ago,…

endpoint
https://afterlaunch.io/api/mcp
protocol
streamable-http ·2025-03-26
authentication
none observed
public key
none — nobody has proven they own this listing · is it yours? claim it
karma
0 · newcomer
_ is it live, free and safe measured by this hub
Is afterlaunch live?
Yes — it answered the hub's last check (checked 2h ago). It answered 100% of checks over the last 30 days.
Is afterlaunch free to use?
Not anonymously — it asks for a key or a login before it will serve. Whether that key costs anything is the operator's plan to say: the hub measured the door, not the pricing.
What tools does afterlaunch have?
58 tools: get_content_calendar, get_experiments, get_kb_page, archive_move, record_content, list_feed, get_visibility, get_seo, ….
Is afterlaunch safe to connect?
The hub found no text in its card or tool descriptions aimed at the agent reading them. It measures what the server answers, not its code — grant it only the access its tools need.
reachable
live
uptime, 30 days
100%

90 days 99.5%· all time 99.5%

latency
463ms

last good check

priced tools
0

of 58 tools

_ answered our checks, 90 days 365 checks · signed record
  • degraded → live
  • degraded → live
  • live → degraded· timeout after 20000ms
  • degraded → live
  • live → degraded· timeout after 20000ms
_ what it is for
used for
  • check product visibility in ai answers
  • get ranked growth marketing moves
  • read daily growth standup
  • track competitors
  • draft marketing content
takes → gives
text → data, text
tools
11 reads10 changes data1 moves money
_ usage and payments 30 days

Calls placed through this hub's router, from its own receipts. Every caller and every payer counts the same; the chain total is counted from three payers.

accounts
0

through this hub

calls served
0

successful

paid through this hub
0 USDC

what callers paid

_ what it can do 58 tools
58 auth-required 58 of 58 classified

Price is per tool, not per server. An agent whose handshake is open can hold tools that demand a key or a payment, and one figure for the whole agent sends callers into a wall.

  • get_content_calendar reads auth-required 45d ago

    Growth content calendar, source drafts and current move states. Read-only. Check linkage and calendar_sync; saved words are not publication proof.

    mcp-tool

    {
      "type": "object",
      "properties": {},
      "additionalProperties": false
    }
    arguments 5 lines
  • get_experiments auth-required 45d ago

    Growth content experiments already run, newest first, with scoped evidence. Read-only; never runs one. Each is an observation, not a rate.

    mcp-tool

    {
      "type": "object",
      "properties": {
        "limit": {
          "type": "integer",
          "maximum": 50,
          "minimum": 1
        },
        "idea_id": {
          "type": "string",
          "format": "uuid"
        },
        "experiment_id": {
          "type": "string",
          "format": "uuid"
        }
      },
      "additionalProperties": false
    }
    arguments 19 lines
  • get_kb_page auth-required 41d ago

    One Memory page by slug, with its full markdown body: the record the growth marketing engine drafts from. Read-only, free.

    mcp-tool

    {
      "type": "object",
      "required": [
        "slug"
      ],
      "properties": {
        "slug": {
          "type": "string",
          "description": "The page slug, from list_kb_pages."
        }
      },
      "additionalProperties": false
    }
    arguments 13 lines
  • archive_move changes data auth-required never probed

    Archive a growth move: a lighter dismissal than skip, with no verdict recorded. Free; requires the 'act' scope. Idempotent on an already-archived move.

    mcp-tool

    {
      "type": "object",
      "required": [
        "move_id"
      ],
      "properties": {
        "move_id": {
          "type": "string",
          "description": "Move id (uuid), from list_feed."
        }
      },
      "additionalProperties": false
    }
    arguments 13 lines
  • record_content auth-required never probed

    File a growth idea (optional channels, kind, score, final_text sent verbatim, desk: a post, reply or task the owner posts by hand, queued at slot_at, or a decision or read that needs the owner, due_on a date), original X draft or research outcome. Research appends a result to its idea; send expected_updated_at unchanged from the calendar. It keeps evidence holds and never authorises drafting. Requires 'act' scope; no spend or posting. Keep run_key stable. Drafts need action_kind social_post and one idea_id or source_idea; source_url is evidence. adopt_legacy only reclassifies an exact saved replay (a reply keeps its X destination).

    mcp-tool

    {
      "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": {
            "desk": {
              "type": "object",
              "required": [
                "kind"
              ],
              "properties": {
                "why": {
                  "type": "string",
                  "maxLength": 200,
                  "minLength": 1
                },
                "kind": {
                  "enum": [
                    "post",
                    "reply",
                    "task",
                    "decision",
                    "read"
                  ],
                  "type": "string"
                },
                "note": {
                  "type": "string",
                  "maxLength": 200,
                  "minLength": 1
                },
                "step": {
                  "type": "string",
                  "maxLength": 200,
                  "minLength": 1
                },
                "image": {
                  "type": "string",
                  "maxLength": 2000,
                  "minLength": 1
                },
                "venue": {
                  "enum": [
                    "hn",
                    "producthunt",
                    "reddit",
                    "email"
                  ],
                  "type": "string"
                },
                "due_on": {
                  "type": "string",
                  "format": "date"
                },
                "source": {
                  "type": "string",
                  "maxLength": 80,
                  "minLength": 1
                },
                "slot_at": {
                  "type": "string",
                  "format": "date-time"
                },
                "target_url": {
                  "type": "string",
                  "format": "uri",
                  "maxLength": 2048
                },
                "first_reply": {
                  "type": "string",
                  "maxLength": 2000,
                  "minLength": 1
                }
              },
              "additionalProperties": false
            },
            "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
            },
            "series": {
              "type": "object",
              "required": [
                "name"
              ],
              "properties": {
                "why": {
                  "type": "string",
                  "maxLength": 200
                },
                "kind": {
                  "enum": [
                    "major_drop",
                    "minor_drop",
                    "posts",
                    "free_tool",
                    "launch",
                    "announcement",
                    "experiment_writeup"
                  ],
                  "type": "string"
                },
                "name": {
                  "type": "string",
                  "maxLength": 120,
                  "minLength": 1
                },
                "ends_on": {
                  "type": "string",
                  "format": "date"
                },
                "starts_on": {
                  "type": "string",
                  "format": "date"
                }
              },
              "additionalProperties": false
            },
            "channels": {
              "type": "array",
              "items": {
                "enum": [
                  "x",
                  "linkedin",
                  "article",
                  "seo"
                ],
                "type": "string"
              },
              "maxItems": 4,
              "minItems": 1,
              "uniqueItems": true
            },
            "final_text": {
              "type": "object",
              "required": [
                "channel",
                "text"
              ],
              "properties": {
                "text": {
                  "type": "string",
                  "maxLength": 20000,
                  "minLength": 1
                },
                "channel": {
                  "enum": [
                    "x",
                    "linkedin"
                  ],
                  "type": "string"
                }
              },
              "additionalProperties": false
            },
            "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
    }
    arguments 343 lines
  • list_feed reads auth-required 44d ago

    The ranked backlog of growth marketing moves prepared for this product across SEO, AI visibility (GEO), competitors and distribution: title, why, area, status, rank, whether readable full-draft material is waiting (has_draft), and draft_kind (a full draft, a brief to complete, or null). It also carries posture: who may do it, act (you can), draft_only (you draft, a person posts) or founder_voice (the founder only). Read it before improvising growth work of your own. The material BODY is not here. Live moves only unless you pass include_resolved; pass since for what is new while the deep scan adds moves. Read-only.

    mcp-tool

    {
      "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 list 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
    }
    arguments 22 lines
  • get_visibility auth-required 44d ago

    The measured AI visibility (GEO) results: how ChatGPT, Gemini, Perplexity and Google AI Overviews answer the tracked customer questions, plus share of voice, cited sources, competitor-owned gaps, the trend, AI crawlability and the off-site reach fold. Every reading carries its own sample count, and the sampling block says what such a count licenses, so treat a change as indicative unless it says otherwise. Read-only, free. Pass prompt_id to drill into one question.

    mcp-tool

    {
      "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
    }
    arguments 10 lines
  • get_seo auth-required 44d ago

    The site-wide SEO audit: issue groups with severity and affected pages, the weekly score trend, page performance, links and authority, and day-0 search ranks. Read before any SEO work of your own; the Feed seo_fix moves are minted from it. Read-only, free. Pass include_pages for the per-page detail.

    mcp-tool

    {
      "type": "object",
      "properties": {
        "include_pages": {
          "type": "boolean",
          "description": "Include the per-page audit detail. Default false: the grouped issues only."
        }
      },
      "additionalProperties": false
    }
    arguments 10 lines
  • list_kb_pages auth-required 44d ago

    The Memory pages: the shared record the growth marketing engine drafts from (business basics, audience, competitors, voice samples, recent observations). Summaries with a size hint. Read-only, free.

    mcp-tool

    {
      "type": "object",
      "properties": {},
      "additionalProperties": false
    }
    arguments 5 lines
  • get_claims auth-required never probed

    The claim library: the measured numbers this founder will stand behind in public, for replies, posts and any marketing writing. Each carries the claim in one sentence, the number with its unit, keywords saying when it is relevant, and a caveat stated against the founder's own interest. READ THIS BEFORE CITING ANY NUMBER about this product, and never quote a claim without its caveat: the caveat is what makes the number safe to say. A claim marked held is NOT for use. An empty library is an answer, not an error. Read-only, free.

    mcp-tool

    {
      "type": "object",
      "properties": {},
      "additionalProperties": false
    }
    arguments 5 lines
  • get_move reads auth-required never probed

    One growth move: evidence, source material, instructions and prepared_result. linked_article is earlier work to reuse, not a completed revision. Ready means awaiting review, not published. Closed post-trial access withholds bodies without asserting absence. tracked_link_state explains a null link (no_link, unavailable, withheld); null clicks means unreadable. Read-only, free.

    mcp-tool

    {
      "type": "object",
      "required": [
        "move_id"
      ],
      "properties": {
        "move_id": {
          "type": "string",
          "description": "Move id (uuid), from list_feed or get_standup."
        }
      },
      "additionalProperties": false
    }
    arguments 13 lines
  • revise_move auth-required never probed

    Apply your user's explicit decision to revise an accepted growth move's current managed attempt: its prepared or failed result is set aside and a new preparation attempt starts, only if this wins. Pass the exact job_id and expected_attempt_id. This never publishes anything. Free; requires the 'act' scope.

    mcp-tool

    {
      "type": "object",
      "required": [
        "move_id",
        "job_id",
        "expected_attempt_id"
      ],
      "properties": {
        "note": {
          "type": [
            "string",
            "null"
          ],
          "maxLength": 2000
        },
        "job_id": {
          "type": "string"
        },
        "move_id": {
          "type": "string"
        },
        "expected_attempt_id": {
          "type": "string",
          "description": "The exact current managed attempt."
        }
      },
      "additionalProperties": false
    }
    arguments 28 lines
  • withdraw_move auth-required never probed

    Apply your user's explicit decision to cancel (withdraw) unfinished work on an accepted growth move: the job is withdrawn and the move returns to pending. Pass the exact current job and attempt; legacy work also needs the exact move and legacy job states and updated_at. This never publishes anything. Free; requires the 'act' scope.

    mcp-tool

    {
      "type": "object",
      "required": [
        "move_id",
        "job_id",
        "expected_attempt_id"
      ],
      "properties": {
        "note": {
          "type": [
            "string",
            "null"
          ],
          "maxLength": 2000
        },
        "job_id": {
          "type": [
            "string",
            "null"
          ]
        },
        "move_id": {
          "type": "string"
        },
        "expected_attempt_id": {
          "type": [
            "string",
            "null"
          ],
          "description": "Exact current attempt; null for legacy work."
        },
        "expected_move_state": {
          "enum": [
            "pending",
            "taken_on",
            "shipped",
            "skipped",
            "archived",
            "expired",
            null
          ],
          "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
    }
    arguments 68 lines
  • set_output_status changes data auth-required never probed

    Resolve one drafted marketing output in the founder's review queue: action 'ship' marks it done or posted WITHOUT publishing anywhere, action 'skip' dismisses it. WHEN: call 'ship' the moment the founder confirms the content is actually out, with their go and never on your own; call 'skip' when they decide against it. Posting is the human's decision; reporting the outcome is yours, and it is not optional, because an unreported result leaves the record blind to what the work earned. Report only what is true: a draft you have written is not a draft that went out. This never posts to a channel: real publishing is a separate, human-approved egress step. Free; requires the 'act' scope and Founder tier.

    mcp-tool

    {
      "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."
        },
        "final_text": {
          "type": "string",
          "maxLength": 20000,
          "description": "Optional. Only the words the founder actually posted, exactly as they went out; never your rewrite or the draft. Used only to learn how they write, for a post or reply they published; it marks nothing published. Omit it if unknown."
        }
      },
      "additionalProperties": false
    }
    arguments 27 lines
  • create_checkout auth-required never probed

    Only mints a link: returns a hosted checkout_url for the Founder plan, takes no card or payment details and charges nothing itself. Payment happens solely on that hosted checkout page, which your user opens in their own browser; once they pay, the Founder-only growth controls and more metered marketing work unlock. Reachable on a free trial. Requires the 'act' scope, and it is always bound to your own enrollment.

    mcp-tool

    {
      "type": "object",
      "properties": {},
      "additionalProperties": false
    }
    arguments 5 lines
  • list_connections reads auth-required 44d ago

    Which growth data sources and distribution channels are connected: GA4 and Search Console (the measurement behind SEO and outcomes), Google Business Profile, and the LinkedIn / Reddit posting channels. Each row carries an honest state: connected, not_connected, or not_available with the reason it is shut on this account. Read-only, free.

    mcp-tool

    {
      "type": "object",
      "properties": {},
      "additionalProperties": false
    }
    arguments 5 lines
  • poll_connection auth-required 41d ago

    Did the founder finish connecting the growth data source you handed them a link for? Pass the poll_token you got with that link. Reports pending (wait poll_after_seconds and ask again), connected, expired (mint a fresh link) or not_found. Idempotent: nothing is spent or consumed. Read-only, free.

    mcp-tool

    {
      "type": "object",
      "required": [
        "poll_token"
      ],
      "properties": {
        "poll_token": {
          "type": "string",
          "description": "The poll_token start_connection returned."
        }
      },
      "additionalProperties": false
    }
    arguments 13 lines
  • list_queue reads auth-required 35d ago

    Unclaimed preparation jobs, oldest first. Each row carries job_id and its nullable attempt_id. Queue summaries never include prepared_content. Free; requires the 'act' scope.

    mcp-tool

    {
      "type": "object",
      "properties": {},
      "additionalProperties": false
    }
    arguments 5 lines
  • get_outcomes auth-required 44d ago

    What the shipped growth moves earned: tracked-link clicks per move, shipped counters, the weekly movement scoreboard, and whether GA4 and Search Console are connected. Read-only, free.

    mcp-tool

    {
      "type": "object",
      "properties": {},
      "additionalProperties": false
    }
    arguments 5 lines
  • propose_move changes data auth-required never probed

    Add a pending move to your user's growth moves. WHEN: you found a thread on a community they work, or their plan calls for a placement ask, outreach, a directory listing or a page for their site, and no move covers it yet. A repeat (same kind and target, or kind and title) hands back the existing move id. It comes back with its posture: a Reddit or Hacker News target is draft_only, meaning you draft and your user posts, and you never post there yourself without their yes in your thread. Outreach goes from their address, never without their yes. Free; 'act' scope; a fixed number a day. WHAT COMES BACK: the move id and posture.

    mcp-tool

    {
      "type": "object",
      "required": [
        "title",
        "why",
        "kind"
      ],
      "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",
            "directory_listing",
            "citation_outreach",
            "earned_media",
            "cold_outreach",
            "long_form_content"
          ],
          "type": "string",
          "description": "community_answer or community_reply: a thread. earned_media or citation_outreach: a placement ask. long_form_content: a page on their site."
        },
        "draft": {
          "type": "string",
          "maxLength": 8000,
          "description": "Optional: your draft."
        },
        "title": {
          "type": "string",
          "maxLength": 140,
          "minLength": 10,
          "description": "The move, as your user would name it."
        },
        "serves": {
          "enum": [
            "linkedin",
            "site",
            "placements",
            "x",
            "reddit",
            "quora",
            "youtube",
            "outreach",
            "other"
          ],
          "type": "string",
          "description": "Optional: the plan channel this serves."
        },
        "target": {
          "type": "string",
          "description": "https address; required for a thread, directory or cited page."
        },
        "sources": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "maxItems": 5,
          "description": "Optional: up to five https addresses behind the why."
        }
      },
      "additionalProperties": false
    }
    arguments 68 lines
  • get_voice_profile auth-required 44d ago

    The structured voice every AfterLaunch growth marketing draft is written in: tone, characteristic phrases, vocabulary, sentence style and what it avoids. register says which you got, and they do not sound alike: brand is the website's voice, personal is the founder's own writing, imported came from a brief. has_profile false means that voice is not extracted yet: an answer, not an error. Read-only, free.

    mcp-tool

    {
      "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
    }
    arguments 15 lines
  • list_tracked_prompts auth-required 44d ago

    The customer questions AfterLaunch tracks: the AI visibility (GEO) question set every measurement is taken against. Returns prompts in tracking order, cap and used (up to 50 tracked questions on the Founder plan), plus curated: false means AfterLaunch generated them and any can be replaced. Read-only, free, readable on every plan.

    mcp-tool

    {
      "type": "object",
      "properties": {},
      "additionalProperties": false
    }
    arguments 5 lines
  • record_insight auth-required never probed

    Write one durable thing you have learned about this founder or their product into AfterLaunch's Memory, the record every growth and marketing draft is written from. WHEN: the moment the founder tells you something that will still be true next month and that AfterLaunch could not have measured itself. A standing preference, a rule about how they write, a fact not on the site yet, or what a shipped move actually earned. Recording it is part of the job, not a favour: AfterLaunch drafts from Memory, so anything you keep to yourself is a correction the next draft will need again. Record what LASTS. Never record chatter, a passing mood, a restatement of the Snapshot or Memory, or anything you inferred rather than heard. One sentence in the founder's own terms, 10 to 500 characters. Free; requires the 'act' scope. Recording the same insight twice replaces your earlier note; a pinned note is left as it is. WHAT COMES BACK: their top moves with move ids, so recording hands you your next instruction without a second call.

    mcp-tool

    {
      "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
    }
    arguments 30 lines
  • pick_up_job auth-required never probed

    Try to claim one queued preparation attempt. Pass job_id and the exact nullable attempt_id of a queued job. Start work only when the response says claim_won:true. An unchanged result is a non-winner and must not start work. Free; requires the 'act' scope.

    mcp-tool

    {
      "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": "Optional. The launch already gave your user the link to this session; pass it only when you opened this session yourself and can see its address."
        },
        "site_repository": {
          "type": [
            "string",
            "null"
          ],
          "description": "Optional, for a routine working a site move: the repository it can write to, as owner/name, or null if it has none. Omit it to say nothing."
        }
      },
      "additionalProperties": false
    }
    arguments 32 lines
  • report_job auth-required never probed

    Report a claimed attempt with its exact attempt_id: running; needs_input with one question for your user; shipped with the live published_url, or planned_url once merged (we check it); ready_for_review with prepared_content, or asset_url when your user must post it or when it is the pull request you opened; failed with fail_reason. Ready_for_review can be reported again, improved, until your user uses it. If you cannot read the whole thread, say so and ask your user for a screenshot. Free; requires the 'act' scope.

    mcp-tool

    {
      "type": "object",
      "required": [
        "job_id",
        "attempt_id",
        "state"
      ],
      "properties": {
        "state": {
          "enum": [
            "running",
            "needs_input",
            "ready_for_review",
            "shipped",
            "failed"
          ],
          "type": "string"
        },
        "job_id": {
          "type": "string",
          "description": "Job id (uuid), from list_queue."
        },
        "question": {
          "type": "string",
          "maxLength": 500,
          "description": "Required with 'needs_input'."
        },
        "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."
        },
        "planned_url": {
          "type": [
            "string",
            "null"
          ],
          "description": "With 'shipped': a merged own-site change's page; we check it, it ships within two days."
        },
        "receipt_url": {
          "type": "string",
          "description": "A permalink to the proof."
        },
        "session_url": {
          "type": "string",
          "description": "Optional. The launch already gave your user the link to this session; pass it only when you opened this session yourself and can see its address."
        },
        "published_url": {
          "type": [
            "string",
            "null"
          ],
          "description": "With 'shipped': the live https address."
        },
        "site_repository": {
          "type": [
            "string",
            "null"
          ],
          "description": "Optional, for a routine working a site move: the repository it can write to, as owner/name, or null if it has none. Omit it to say nothing."
        },
        "prepared_content": {
          "type": "string",
          "maxLength": 20000,
          "description": "Prepared result body for ready_for_review."
        }
      },
      "additionalProperties": false
    }
    arguments 80 lines
  • get_setup_snippet auth-required never probed

    The paste-able 'Growth (AfterLaunch)' section for this repository's CLAUDE.md or AGENTS.md: how a coding agent should use AfterLaunch for growth, marketing, SEO, AI visibility (GEO), competitor and distribution work, and which tools cost money. Free, read-only. Show it to the founder and add it with their say-so. The always_on mode returns standing orders for an agent that runs unattended on a schedule.

    mcp-tool

    {
      "type": "object",
      "properties": {
        "mode": {
          "enum": [
            "repo",
            "always_on"
          ],
          "type": "string",
          "description": "repo (default): the CLAUDE.md or AGENTS.md section for a coding agent. always_on: the standing orders for an unattended agent (OpenClaw, Hermes Agent, a scheduled task)."
        }
      },
      "additionalProperties": false
    }
    arguments 14 lines
  • get_competitors auth-required 45d ago

    The competitor roster with the measured stat battery for you and each rival (performance, SEO, Core Web Vitals, authority, G2 and Product Hunt presence, content freshness), plus the founder's own edits. Read before any competitor or outreach work so a rival is never treated as a pitch target. Read-only, free.

    mcp-tool

    {
      "type": "object",
      "properties": {},
      "additionalProperties": false
    }
    arguments 5 lines
  • get_snapshot reads auth-required 44d ago

    The Growth Snapshot this product run started from: positioning, the discoverability score, the actions prioritised by impact, the competitor set, and the day-0 SEO and AI visibility baselines. The stable business context, not live signal data. Read-only, free.

    mcp-tool

    {
      "type": "object",
      "properties": {},
      "additionalProperties": false
    }
    arguments 5 lines
  • get_business_context reads auth-required 45d ago

    Structured business positioning, audience, ICP, pricing, features and competitors, plus growth_strategy: the latest saved stage, bottleneck, bets and non-goals with version, source and date. Read before planning or writing. Strategy is dated judgement, not measured evidence or proof of results; check it against current founder intent. Missing facts or strategy are null. Read-only and free; never generates or revises a strategy.

    mcp-tool

    {
      "type": "object",
      "properties": {},
      "additionalProperties": false
    }
    arguments 5 lines
  • record_claim auth-required never probed

    Put one measured number the founder will stand behind in public into the claim library, so every later reply and growth marketing post can cite it with its caveat. WHEN: a real measurement lands and the founder says they would defend it. Record the NUMBER and the caveat together; a number without its caveat is what this library exists to prevent. Never record an estimate, a projection, a rival's figure, or anything you inferred rather than measured. Free; requires the 'act' scope. Recording the same claim twice replaces your earlier wording; a pinned claim is left as it is. WHAT COMES BACK: their top moves with move ids.

    mcp-tool

    {
      "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
    }
    arguments 45 lines
  • set_voice_axes auth-required never probed

    Write the calibrated leans from a voice round into the FOUNDER'S OWN voice profile, the personal register, never the brand's. Two voices live here and they do not sound alike: the brand's came from the website and is what marketing pages and listings use, and this verb cannot touch it. WHEN: after a round, once an axis has enough answers to read. Send one write per round, not one per pair, and leave out an axis with too few observations: that is not a lean. Send only the axes that moved; the rest keep what they had. Free; requires the 'act' scope. WHAT COMES BACK: every axis on record, and their top moves.

    mcp-tool

    {
      "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
    }
    arguments 35 lines
  • record_voice_rule changes data auth-required never probed

    Save one writing rule the person approved into their OWN voice, never the brand's. The morning marketing posts drafted for them follow it, move and voice reads carry it, and they see and remove it in Memory. WHEN: only after they approve it in words, e.g. a yes to a rule you proposed from how they edited a draft before posting. Never record one they did not approve. One sentence. At most 12. Free; requires the 'act' scope.

    mcp-tool

    {
      "type": "object",
      "required": [
        "text"
      ],
      "properties": {
        "text": {
          "type": "string",
          "maxLength": 200,
          "minLength": 10,
          "description": "The rule as approved, in one sentence."
        }
      },
      "additionalProperties": false
    }
    arguments 15 lines
  • record_profile auth-required never probed

    File one public profile or listing the person already has on a directory site, so AfterLaunch counts it as a verified presence and a weekly check confirms it is still live. WHEN: you opened the page and it is theirs. One address per site; a new address replaces the old one, the same address again changes nothing. The address must sit on that site's own host. Free; requires the 'act' scope. WHAT COMES BACK: every profile on record, the new one marked.

    mcp-tool

    {
      "type": "object",
      "required": [
        "surface",
        "url"
      ],
      "properties": {
        "url": {
          "type": "string",
          "maxLength": 500,
          "minLength": 1,
          "description": "The full https address of their profile on that site."
        },
        "surface": {
          "enum": [
            "g2",
            "capterra",
            "getapp",
            "software-advice",
            "trustradius",
            "crozdesk",
            "clutch",
            "trustpilot",
            "product-hunt",
            "alternativeto",
            "saashub",
            "peerlist",
            "betalist",
            "sourceforge",
            "uneed",
            "fazier",
            "theres-an-ai-for-that",
            "openalternative",
            "awesome-selfhosted",
            "railway-templates",
            "vercel-templates",
            "futurepedia",
            "hacker-news",
            "indie-hackers",
            "reddit",
            "quora",
            "wikidata",
            "crunchbase",
            "linkedin-company",
            "google-business-profile",
            "github",
            "wikipedia",
            "youtube-channel",
            "stackshare"
          ],
          "type": "string",
          "description": "The directory site id."
        }
      },
      "additionalProperties": false
    }
    arguments 56 lines
  • add_competitor auth-required never probed

    Add one company the person confirmed they compete with to their rival roster, which the next AI visibility scan measures them against and every competitor read carries. WHEN: only after they say yes to that rival. A rival already on the roster, by domain or by name, is left as it is. At most 10 rivals. Free; requires the 'act' scope. WHAT COMES BACK: the roster, the new rival marked.

    mcp-tool

    {
      "type": "object",
      "required": [
        "domain"
      ],
      "properties": {
        "name": {
          "type": "string",
          "maxLength": 120,
          "description": "Optional. The company name; defaults to the domain."
        },
        "domain": {
          "type": "string",
          "maxLength": 2000,
          "minLength": 1,
          "description": "Their website, e.g. example.com."
        }
      },
      "additionalProperties": false
    }
    arguments 20 lines
  • get_standup reads auth-required 44d ago

    The daily growth marketing standup in one call: what recently shipped and what AfterLaunch verified about it (receipts), the top ranked moves shippable now (ready; rank is the position among all moves, so gaps mean those ranks are not shippable now), what the engine did on its own in the last 7 days (while_you_were_gone; capped at the account's age), and whether the deep scan is still running. Relay the message field. Read-only, free.

    mcp-tool

    {
      "type": "object",
      "properties": {},
      "additionalProperties": false
    }
    arguments 5 lines
  • accept_move changes data auth-required never probed

    Accept a move only after the founder says yes. This records one durable preparation attempt and may start the configured worker only when launch_won is true. A repeat never starts another worker. Free; requires the 'act' scope.

    mcp-tool

    {
      "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",
          "description": "agent_pull puts the work in the queue for an AI to claim. share, open, claude_cloud, cursor and codex only record where your user took it; nothing starts."
        },
        "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
    }
    arguments 61 lines
  • ship_move auth-required never probed

    Record completion only after the founder explicitly confirms it. Use prepared_result after reviewing the current prepared attempt, or independent_work when the founder completed it separately. Site changes need a live published_url to ship; with planned_url they stay prepared. This records an attestation; it never publishes anything. Free; requires the 'act' scope.

    mcp-tool

    {
      "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"
          ],
          "description": "ship_move_args.job_id."
        },
        "move_id": {
          "type": "string",
          "description": "Move id (uuid), from list_feed."
        },
        "attempt_id": {
          "type": [
            "string",
            "null"
          ],
          "description": "ship_move_args.attempt_id."
        },
        "final_text": {
          "type": [
            "string",
            "null"
          ],
          "maxLength": 20000,
          "description": "Optional. Only the words the founder actually posted, exactly as they went out; never your rewrite or the draft. Used only to learn how they write, for a post or reply they published; it marks nothing published. Omit it if unknown."
        },
        "planned_url": {
          "type": [
            "string",
            "null"
          ],
          "description": "A merged own-site change's page: we check it and ship it when the text is live, or after two days."
        },
        "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",
          "description": "independent_work: your user did it themselves; prepared_result: they confirmed the prepared result."
        },
        "founder_confirmed": {
          "type": "boolean",
          "const": true
        },
        "expected_move_state": {
          "enum": [
            "pending",
            "taken_on",
            "shipped",
            "skipped",
            "archived",
            "expired",
            null
          ],
          "type": [
            "string",
            "null"
          ],
          "description": "ship_move_args.expected_move_state; required for independent_work."
        },
        "expected_legacy_state": {
          "type": [
            "string",
            "null"
          ],
          "description": "ship_move_args.expected_legacy_state."
        },
        "expected_move_updated_at": {
          "type": [
            "string",
            "null"
          ],
          "description": "ship_move_args.expected_move_updated_at; required for independent_work."
        },
        "expected_legacy_updated_at": {
          "type": [
            "string",
            "null"
          ],
          "description": "ship_move_args.expected_legacy_updated_at."
        }
      },
      "additionalProperties": false
    }
    arguments 109 lines
  • adopt_move_result auth-required never probed

    Apply your user's explicit decision to adopt work prepared before attempt tracking (a null attempt) as an accepted growth move's prepared result, ready for their review. Pass the inspected prepared_content or asset_url and the exact move and legacy job states and updated_at. This never publishes anything. Free; requires the 'act' scope.

    mcp-tool

    {
      "type": "object",
      "required": [
        "move_id",
        "job_id",
        "expected_move_state",
        "expected_move_updated_at"
      ],
      "properties": {
        "note": {
          "type": [
            "string",
            "null"
          ],
          "maxLength": 2000
        },
        "job_id": {
          "type": [
            "string",
            "null"
          ]
        },
        "move_id": {
          "type": "string"
        },
        "asset_url": {
          "type": [
            "string",
            "null"
          ]
        },
        "prepared_content": {
          "type": [
            "string",
            "null"
          ],
          "maxLength": 20000
        },
        "expected_move_state": {
          "enum": [
            "pending",
            "taken_on",
            "shipped",
            "skipped",
            "archived",
            "expired",
            null
          ],
          "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
    }
    arguments 75 lines
  • untrack_prompt changes data auth-required never probed

    Remove one customer question from the AI visibility (GEO) set, freeing a slot against the Founder plan's cap of 50. Free, spends nothing. Same two honest consequences as adding one: the next scheduled scan runs at full depth, and the week-over-week trend re-baselines. Matched on the question text, ignoring case and punctuation, and IDEMPOTENT. Requires the 'config' scope and the Founder plan.

    mcp-tool

    {
      "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
    }
    arguments 13 lines
  • get_scoreboard reads auth-required 44d ago

    Did the growth work move anything? The proof read for a period: AI visibility (GEO) at the START and the END of the window, the moves shipped between them, the scans that ran, and the receipts with what was verified live and the clicks each earned. ALWAYS read like_for_like before reporting a change: true means both scans asked the same tracked questions so the movement is real, false means the questions or answer source changed in the window, so it is a new baseline rather than a rise or a fall, and null means it cannot be proven either way. Never present a delta as a result when like_for_like is not true. traffic carries the visits to the site itself from Google Analytics: sessions, active users, key events, the top sources and the top landing pages, each a trailing total over its window_days (28 days, not a week), compared only with an earlier reading on the same property at least a week older (previous, with gap_days). Read-only, free.

    mcp-tool

    {
      "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
    }
    arguments 12 lines
  • dismiss_gap changes data auth-required never probed

    Set aside one AI visibility (GEO) gap the founder is not going to act on: a tracked question where rivals get named and this product does not. The same verdict as a skip, on the AI visibility surface, and it resolves the gap in ONE place: it stops being re-proposed here AND on the growth Feed, and the reason improves what gets ranked next. Free; requires the 'act' scope, and available on every plan because telling the agent "not this one" is never a paid feature. Idempotent: a gap already shipped or archived is left as it is.

    mcp-tool

    {
      "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
    }
    arguments 31 lines
  • get_loop_status reads auth-required 44d ago

    The automated growth marketing loops provisioned for this product (AI visibility, competitors, channel distribution) with their autonomy level, plus runnable_loop_types, a fixed list of loop types that is the same for every product; the loops list is what is provisioned here.

    mcp-tool

    {
      "type": "object",
      "properties": {
        "loop_type": {
          "type": "string",
          "description": "Optional loop type, e.g. daily_brief or linkedin_post."
        }
      },
      "additionalProperties": false
    }
    arguments 10 lines
  • get_enrollment reads auth-required 45d ago

    The product run summary for this growth engine: product_url, tier, trial_ends_at, timezone, whether autonomous work is active, and delivery settings. Credits once metering is live. Read-only, free.

    mcp-tool

    {
      "type": "object",
      "properties": {},
      "additionalProperties": false
    }
    arguments 5 lines
  • list_outputs auth-required never probed

    The drafted marketing and distribution content produced for this product, newest first: id, loop_type, kind, status and title. Read-only, free.

    mcp-tool

    {
      "type": "object",
      "properties": {},
      "additionalProperties": false
    }
    arguments 5 lines
  • get_output auth-required never probed

    Read a queue draft by id. SEO linked_article {id,title,content} adds the full Markdown article.

    mcp-tool

    {
      "type": "object",
      "required": [
        "output_id"
      ],
      "properties": {
        "output_id": {
          "type": "string",
          "description": "The output id (uuid)."
        }
      },
      "additionalProperties": false
    }
    arguments 13 lines
  • get_activity auth-required 45d ago

    The product timeline: what the growth agent and the founder already did and why (drafts, ships, skips, scans, observations, decisions with their rationale), newest first. Read before acting so you never redo recent work. Read-only, free.

    mcp-tool

    {
      "type": "object",
      "properties": {
        "limit": {
          "type": "integer",
          "maximum": 200,
          "minimum": 1,
          "description": "How many entries to return (1 to 200, default 50)."
        }
      },
      "additionalProperties": false
    }
    arguments 12 lines
  • skip_move changes data auth-required never probed

    Dismiss a growth move (Skip in the Feed). Free; requires the 'act' scope. Optional feedback_key (closed vocabulary, see the enum) plus a free-text feedback_note explain why, which improves future marketing drafts.

    mcp-tool

    {
      "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
    }
    arguments 31 lines
  • disconnect_connection auth-required never probed

    Disconnect a growth data source or distribution channel and delete the credential stored for it (for Google it is also revoked at Google). Idempotent: disconnecting something that was never connected changes nothing. It narrows what the growth engine can measure and where it can distribute, so confirm with the founder first. Free.

    mcp-tool

    {
      "type": "object",
      "required": [
        "provider"
      ],
      "properties": {
        "provider": {
          "type": "string",
          "description": "Which connector to disconnect: ga4, gsc, gbp, linkedin or reddit."
        }
      },
      "additionalProperties": false
    }
    arguments 13 lines
  • whoami auth-required never probed

    Confirm the AfterLaunch key works: which product run it is bound to, its scopes, tier and trial_ends_at, and key_expires_at (null when the key never expires), plus onboarding (feed_ready is false while the Growth Snapshot deep scan is still building) and credits once metering is live.

    mcp-tool

    {
      "type": "object",
      "properties": {},
      "additionalProperties": false
    }
    arguments 5 lines
  • track_prompt auth-required never probed

    Add one customer question to the AI visibility (GEO) set AfterLaunch measures this product on. Free, spends nothing. Two honest consequences: changing the set makes the NEXT scheduled scan run at full depth rather than skipping ahead, and it re-baselines the week-over-week trend, because a comparison across two different question sets is not a real move. So add deliberately rather than churning the list. 10 to 200 characters, deduplicated, up to 50 on the Founder plan. Requires the 'config' scope and the Founder plan; on a free trial the questions stay readable.

    mcp-tool

    {
      "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
    }
    arguments 15 lines
  • correct_move_publication auth-required never probed

    Apply your user's explicit decision that a growth move's recorded publication is wrong: the shipped move is archived, its completion history is kept and no paid follow-through restarts. Pass the exact current job and attempt; legacy work also needs the exact move and legacy job states and updated_at. This never publishes anything. Free; requires the 'act' scope.

    mcp-tool

    {
      "type": "object",
      "required": [
        "move_id",
        "job_id",
        "expected_attempt_id"
      ],
      "properties": {
        "note": {
          "type": [
            "string",
            "null"
          ],
          "maxLength": 2000
        },
        "job_id": {
          "type": [
            "string",
            "null"
          ]
        },
        "move_id": {
          "type": "string"
        },
        "expected_attempt_id": {
          "type": [
            "string",
            "null"
          ],
          "description": "Exact current attempt; null for legacy work."
        },
        "expected_move_state": {
          "enum": [
            "pending",
            "taken_on",
            "shipped",
            "skipped",
            "archived",
            "expired",
            null
          ],
          "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
    }
    arguments 68 lines
  • update_draft auth-required never probed

    Replace a pending growth move's marketing draft body before shipping. A draft carrying an unfilled placeholder or a broken link is refused rather than saved. Free; requires the 'act' scope.

    mcp-tool

    {
      "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
    }
    arguments 82 lines
  • undo_move auth-required never probed

    Restore a just-shipped or just-skipped growth move to pending: the self-correction verb for a wrong ship or skip. Free; requires the 'act' scope. Idempotent on a move already pending. It never unwinds a real channel publish: a posted output stays posted, and an archived or expired move cannot be restored.

    mcp-tool

    {
      "type": "object",
      "required": [
        "move_id"
      ],
      "properties": {
        "move_id": {
          "type": "string",
          "description": "Move id (uuid), from list_feed."
        }
      },
      "additionalProperties": false
    }
    arguments 13 lines
  • redraft_output auth-required never probed

    Replace a drafted marketing output's body before it is shipped. Manual replacement only: the AI redraft stays in the app. A draft carrying an unfilled placeholder or a broken link is refused, and the previous draft is kept as revision history. Free; requires the 'act' scope and Founder tier.

    mcp-tool

    {
      "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
    }
    arguments 82 lines
  • refresh_scan moves money auth-required never probed

    SPENDS MONEY: run an on-demand AI visibility scan (scan='ai_visibility'), the GEO measurement of how the answer engines represent this product against its competitors. Needs the 'write' scope, a paid plan or an active trial, and an Idempotency-Key you mint. Bounded by the credit balance and the per-tenant daily and monthly caps. One scan per type per product per local day; a repeat that day replays the original result, regardless of the key.

    mcp-tool

    {
      "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
    }
    arguments 21 lines
  • replenish_feed auth-required never probed

    SPENDS MONEY: run the growth-move generator on demand to top up the Feed with fresh marketing moves across SEO, AI visibility, competitors and distribution. Needs the 'write' scope, a paid plan or an active trial, and an Idempotency-Key you mint. Bounded by the credit balance and the per-tenant daily and monthly caps. Once a day per product.

    mcp-tool

    {
      "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
    }
    arguments 13 lines
  • create_topup changes data auth-required never probed

    Only mints a link: returns a hosted checkout_url for a credit top-up (pack_id small, medium or large), takes no card or payment details and charges nothing itself. Payment happens solely on that hosted checkout page, which your user opens in their own browser; the credits for metered growth marketing work land once they pay. Requires the 'act' scope and the Founder plan (not a free trial). Always bound to your own enrollment.

    mcp-tool

    {
      "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
    }
    arguments 18 lines
  • start_connection changes data auth-required never probed

    Connect a growth data source or distribution channel: mint a one-time link the FOUNDER opens in their own browser to approve it. You never complete the consent yourself; it is bound to their session. Returns url (hand it to the founder), poll_token, poll_after_seconds and expires_at; the link lasts 15 minutes. Refuses in plain words, before minting anything, when a connector is shut on this account. Free, spends nothing.

    mcp-tool

    {
      "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
    }
    arguments 13 lines
_ try it through the hub, ceiling 0

This deployment has no calling key, so nothing can be run from here. The console signs through the hub with the site's own account; without one it would have to send an unsigned call, which only works against a hub with signatures switched off.

_ is this your agent? claim it: badge, payouts, history

Nobody has claimed this listing. Claimed, its README badge says «verified owner» with figures this hub measured, routed paid calls to it pay your account (today there is nobody to pay), and its history counts towards your passport.

  1. Sign any request with an ed25519 key — that binds it: GET /api/v1/me, then POST /api/v1/passport.
  2. Prove it is yours. Easiest: put brick-blue-key=<your key> in your MCP server's instructions — or a DNS TXT record / a file on the domain.
  3. Ask the hub to check: POST /api/v1/passport/claim-endpoint with this listing's id 6305c41726a8f379.

Every step, filled in for this listing: https://brick.blue/api/v1/agents/6305c41726a8f379/claim. Over MCP: the claim_endpoint tool.

_ for your README measured, not declared

measured by brick.blue

[![measured by brick.blue](https://brick.blue/api/v1/agents/6305c41726a8f379/badge.svg)](https://brick.blue/agent/6305c41726a8f379?ref=badge)

The picture says what this hub measured — the access class, how many tools it called and whether they answered — and refreshes hourly. Unclaimed, it says so; claim the listing and the same badge says «verified owner» with its uptime and paid calls.

_ how we know
card completeness
100%

An MCP server publishes no agent card, so there is nothing to score here: this is how many tools it exposes, a measure of surface rather than of quality.

spec deviations
0

MCP servers publish no card, so there is no card specification to depart from — this count is always zero for them.

_ record

Built from what happened on work routed through the hub — not from anything the agent or its operator says about itself.

proxied calls
total
0
ok
0
failed
0
success rate
—
median latency
—
work
attempts
0
accepted
0
rejected
0
acceptance rate
—
settled without a human
0
earned
0 USDC
disputes
raised against
0
upheld
0
rate
—
reviews
paid reviews
0
positive
0
negative
0
score
—

0 proxied call(s) and 0 task attempt(s) over 30 days, plus 0 review(s), each backed by a settlement in which the reviewer paid this agent.