Documentation
Tools reference
product, and every tool works only on your own account. To connect, see setup.The usual order
A run goes through the tools in this order. Your AI app follows it on its own; the dashboard shows each step as it lands.
- 1license_status: Check the plan, the free submissions left and which apps are connected.
- 2get_product_profile: Read the product's facts and what directories ask that is still empty; fill it with save_product_profile.
- 3match_directories: See which directories take the product, which are locked and which are not a fit, with the reason.
- 4plan_submissions: Save an order and a daily pace; each directory has a reason for its place.
- 5submission_playbook: Before each directory: what its form asks, where to stop. This is the call that counts as a submission.
- 6record_submission: After each directory: what happened, with the confirmation page as proof.
- 7verify_link: Once the listing is public: is our link on it, and is it dofollow. This is what marks it live.
Not every tool is in the loop: match_directories is free to call as often as you like; list_submissions, verify_badge, report_directory_fact and suggest_directory are used when the situation calls for them.
Plan
match_directories
Every catalogued directory for this product: ready, locked, no playbook yet, or not a fit, each with the reason.
| Parameter | Type | Description |
|---|---|---|
productstring | string | The product's website or name. Leave empty for the product last worked on (list_products shows them). |
Returns: ready, already_on_record, locked, not_a_fit (each with a reason: product type, region, a badge you won't show, a fee you said you would not pay, a requirement the profile misses), the number without a playbook, a badge_answer, a paid_answer and how many more open with a Launch or Pro.
Notes: Directories already on the product's record are not offered again as ready. On a Free plan the unnamed Pro directories are only counted, never listed.
Say to your AI app: “Where does my product qualify?”
plan_submissions
Orders the directories that are ready and saves the plan to the dashboard: long review queues first, then verified dofollow, then badge listings (at most a quarter of the plan), then authority, at a pace for the domain's DR, each with why it is where it is. Directories with no free route are left out until the user has said whether they would pay one (paid_ok in the profile), and the answer then also comes back as a paid_question for the agent to ask once. Submits nothing.
| Parameter | Type | Description |
|---|---|---|
productstring | string | The product's website or name. Leave empty for the product last worked on (list_products shows them). |
countinteger 1-100 | integer 1-100 | How many directories to plan. Default 20. |
dofollow_onlyboolean | boolean | Only directories whose free link is dofollow. Default false. |
pacegentle | standard | fast | gentle | standard | fast | Only when the user asks; otherwise the domain's DR decides. |
domain_drnumber 0-100 | number 0-100 | The product domain's DR, if the user knows it. |
daysinteger 1-365 | integer 1-365 | Spread the plan over this many days (e.g. 100 directories in 30 days). Never faster than the pace allows; without it, the middle of the pace's range per day. |
Returns: The pace (name, per day, why, days), the targets in order (slug, name, DR, link, why, day), a badge question when the answer decides the plan, and the next prompt.
Notes: Replaces the previous plan's unsent directories; anything already submitted is kept. Below DR 20 or with an unknown DR the pace is gentle (3-5 a day); from DR 20 it is standard (8-12 a day); fast (15-20 a day) only on request.
Say to your AI app: “Plan my next 10 directories, dofollow first.”
Example (shortened)
{
"product": "LaunchOn.it",
"pace": { "name": "standard", "per_day": 10, "why": "…", "days": 1 },
"targets": [
{ "slug": "saashub", "name": "SaaSHub", "dr": 72, "link": "dofollow", "why": "…", "day": 1 },
{ "slug": "dofollow-tools", "name": "Dofollow Tools", "dr": 73, "link": "dofollow", "why": "…", "day": 1 }
],
"next": "Using LaunchDistro, submit LaunchOn.it to SaaSHub …",
"note": "Saved to the dashboard. Show the user the order and the reasons; nothing was submitted."
}Product profile
list_products
The user's products: name, website, whether a profile exists and how many submissions it has.
No parameters.
Returns: A list of products.
Say to your AI app: “Which products do I have in LaunchDistro?”
get_product_profile
The product's facts in product.json form. Every submission is filled from these and nothing else. Also lists the fields directories ask for that are still empty.
| Parameter | Type | Description |
|---|---|---|
productstring | string | The product's website or name. Leave empty for the product last worked on (list_products shows them). |
Returns: profile, missing (the submission pack's empty fields), ask_once (company and founder facts directories ask that no repo holds, for the agent to ask in one message) and updated_at.
Say to your AI app: “What does LaunchDistro know about my product, and what is missing?”
save_product_profile
Saves product facts to the dashboard, merged onto the stored profile for the same website: send only what changed.
| Parameter | Type | Description |
|---|---|---|
profilerequiredobject | object | product.json keys. `website` names the product. |
Returns: The saved product's name and website, and whether it was created.
Notes: Only facts the user confirmed. Free and Launch hold one product; Pro any number, and a second product on those plans is refused.
Say to your AI app: “Add my product from this repo, and ask me what you can't find.”
Submit
submission_playbook
How to submit to one directory: what its form asks, which profile field goes where, the free plan's conditions, and where to stop. Call it before every submission.
| Parameter | Type | Description |
|---|---|---|
directoryrequiredstring | string | The directory's slug (from match_directories or plan_submissions). |
productstring | string | The product's website or name. Leave empty for the product last worked on (list_products shows them). |
Returns: The playbook in Markdown, the fair-use count, and the submission flow the agent follows.
Notes: Counts as one submission attempt; a re-read of the same directory the same UTC day is free. Refused, and not counted, for a directory that is not a fit for the product (with the reason).
Say to your AI app: “Submit my product to SaaSHub. (Your app reads its playbook first.)”
record_submission
Records what happened at a directory, on the dashboard.
| Parameter | Type | Description |
|---|---|---|
directoryrequiredstring | string | The directory's slug. |
statusrequiredin_progress | draft | needs_human | submitted | rejected | skipped | in_progress | draft | needs_human | submitted | rejected | skipped | draft: saved there, not sent yet. needs_human: waiting on the user. skipped: takes it off the plan. |
confirmation_urlhttp(s) URL | http(s) URL | The directory's thanks or confirmation page: proof it was sent. Never checked for a link. |
listing_urlhttp(s) URL | http(s) URL | The public listing page, when the directory shows one. This is the page link checks open. |
notestring, 500 characters | string, 500 characters | What is left or what came back. |
routefree | paid | free | paid | paid when a fee or a paid plan was used. |
productstring | string | The product's website or name. Leave empty for the product last worked on (list_products shows them). |
Returns: A one-line confirmation and, after submitted, what to do next.
Notes: It never records live: only verify_link does, after reading the public page.
Say to your AI app: “Record that I submitted to SaaSHub, with the confirmation page.”
Check and report
verify_link
Opens a public listing page and checks that it links to the product and whether the link is dofollow (it reads rel).
| Parameter | Type | Description |
|---|---|---|
listing_urlrequiredhttp(s) URL | http(s) URL | The public page. |
directorystring | string | The directory's slug, to record the result and mark the submission live when the link is there. |
productstring | string | The product's website or name. Leave empty for the product last worked on (list_products shows them). |
Returns: found, link (dofollow or nofollow), rel, anchor, http_status, notes and what was recorded.
Notes: The page is fetched by our server, from public http(s) addresses only. A missing link leaves the status as it was.
Say to your AI app: “Check whether my SaaSHub listing is live and whether the link is dofollow.”
Example (shortened)
{
"found": true,
"link": "dofollow",
"rel": [],
"anchor": "LaunchOn.it",
"http_status": 200,
"notes": [],
"recorded": "Marked live on the dashboard."
}verify_badge
Opens the product's own page and checks that it links to the directory (the badge or link back its free plan asks for).
| Parameter | Type | Description |
|---|---|---|
directoryrequiredstring | string | The directory's slug. |
page_urlhttp(s) URL | http(s) URL | The page carrying the badge; defaults to the product's website. |
productstring | string | The product's website or name. Leave empty for the product last worked on (list_products shows them). |
Returns: found, the link type and a note.
Notes: Call it after the user deploys and before pressing the directory's own verify button.
Say to your AI app: “Check that my site shows the badge Wired Business asks for.”
list_submissions
Every directory on this product's plan and what happened there, with the next one to submit.
| Parameter | Type | Description |
|---|---|---|
productstring | string | The product's website or name. Leave empty for the product last worked on (list_products shows them). |
Returns: submissions (status, listing and confirmation URL, link type, note, why it was planned), check_if_live (submitted directories past their usual approval time, to look for the listing) and the next prompt.
Say to your AI app: “What have I sent, and what is waiting on me?”
report_directory_fact
Tells LaunchDistro what a directory's page says when its playbook did not: approval time, whether the free link is dofollow, a badge rule, a price, a changed form.
| Parameter | Type | Description |
|---|---|---|
directoryrequiredstring | string | The directory's slug. |
kindrequiredapproval_time | free_link | badge | price | form_changed | other | approval_time | free_link | badge | price | form_changed | other | What the report is about. |
valuerequiredstring, 500 characters | string, 500 characters | The fact: days for approval_time, dofollow|nofollow|badge|top3|none for free_link, required|for_dofollow|none for badge, dollars for price. |
quotestring, 1000 characters | string, 1000 characters | The page's exact words that state it, copied. |
source_urlhttp(s) URL | http(s) URL | The directory's own page those words are on. |
Returns: A thank-you saying whether it can be applied directly or a person reads it.
Notes: A report is applied to the playbook only when the words are found on the directory's own page and say what the value says; everything else waits for a person. A report that contradicts the playbook always goes to a person.
Say to your AI app: “Report that this directory's form changed, with its own words.”
suggest_directory
Sends a directory the user recommends for review. A suggestion only.
| Parameter | Type | Description |
|---|---|---|
urlrequiredhttp(s) URL | http(s) URL | The directory's site (its home or submit page). |
namestring, 120 characters | string, 120 characters | The directory's name. |
notestring, 500 characters | string, 500 characters | Why the user recommends it. |
productstring | string | The product's website or name. Leave empty for the product last worked on (list_products shows them). |
Returns: A confirmation, or the slug when the directory is already in LaunchDistro.
Notes: Agents submit only to directories LaunchDistro gives for the product; a site the user names is suggested, never submitted to.
Say to your AI app: “I know a directory you don't list; suggest it to LaunchDistro.”
Account
license_status
The user's plan, free submissions used, Launch passes and connected apps.
No parameters.
Returns: tier, plan, usage (used, limit, remaining, state), launches, devices (local, remote, max_each) and this_connection.
Say to your AI app: “What plan am I on, and how many free submissions are left?”
The submit prompt
Submit the product to one directory, the LaunchDistro way: pull the playbook, ask every decision at once, fill the form in the user's browser, record it.
| Name | submit |
|---|---|
| Argument directory | Required. Directory name or slug. |
| Argument product | Optional. The product's name or website. |
Apps that list MCP prompts show it as a command. Elsewhere, the dashboard's "prompt your agent" button gives the same request as text.
Statuses
record_submission takes these statuses and moves the submission to a dashboard column. live is not among them: it is set only by verify_link, once the public page shows the link, and it stays live unless a later check fails.
| in_progress | In progress |
|---|---|
| draft | In progress, with the note saying what is left (for example waiting for a badge to deploy) |
| needs_human | Needs action: a sign-in, a CAPTCHA, a code, a payment |
| submitted | Submitted: sent, with the confirmation page as proof |
| rejected | Needs action: the directory said no |
| skipped | Taken off the plan; a new plan does not bring it back (undo it by recording another status for that directory) |
Limits
| Free | 10 submissions in total, 1 connected app |
|---|---|
| Launch | €29 once: one product, up to 100 directories within 30 days |
| Pro | €39 a month or €349 a year: every product and directory, 3 connected apps, weekly link checks |
| Playbooks | at most 20 different directories an hour and 25 a day, on every plan; 10 read without an outcome recorded pauses new ones until you record them |
| Link checks | 60 an hour per account (verify_link and verify_badge) |
| Reports | 30 a day per account (report_directory_fact and suggest_directory together) |
A same-day re-read of a playbook is free and is always served, so a run is never cut off halfway. Details: plans and limits.
Errors
A refused call comes back as a tool error with a plain message, which your agent shows you. The ones you can meet:
- No directory with that slug, or a directory that has no playbook to serve yet. Nothing is counted.
- Not a fit. The reason is given (product type, region, a badge you will not show, a requirement your profile misses). The playbook is not served and not counted.
- Not in the free starter set, for a Pro directory on a Free plan: a Launch or Pro opens it.
- Free plan used up, Launch covers another product, or Launch used up: the message says which, and what opens more.
- Rate limits: playbooks per hour and per day, link checks per hour, reports per day. The message says when it lifts. Recording outcomes for playbooks you have read lifts the results-missing pause at once.
- Playbooks suspended after review of an account: the dashboard and your records stay, new playbooks stop.
- The product limit: Free and Launch hold one product; a second is refused.
References
- Model Context Protocol: tools, resources and prompts, and how a client lists and calls tools (
tools/list,tools/call) - MCP specification