WebMCP · Developer reference · Updated September 9, 2026
WebMCP documentation
Everything an agent builder or a curious maker needs: how to turn WebMCP on, how to check the tools are there, what each tool takes and returns, and what goes wrong. Generated from the same registry the browser uses.
When you are signed in on a plan that includes WebMCP, every page on launchto.win registers 3 tools with document.modelContext. An AI agent running in your browser can discover and call them. The calls run in the page with your own session, so the agent can only do what you could do, and only here.
What is WebMCP?
WebMCP is a proposed web standard, developed in the W3C Web Machine Learning community group, that lets a web page register tools for AI agents. A tool is a named JavaScript function with a description and a JSON schema for its input. The page registers it with document.modelContext; an agent running in the browser lists the tools, reads the schemas, and calls the ones it needs. It is the web-page side of the Model Context Protocol: the same tool shape MCP uses between a model and a server, but living in the page and running with the signed-in user's own session.
That last part is the point. An agent using WebMCP does not need an API key, a separate server or a scraped DOM. It uses the site the way you would, with your permissions, and the site decides exactly what it exposes. On launchto.win the tools expose your launch packages, so an agent can read a product's name, descriptions at every length, logo, screenshots and pricing, and fill a directory's submission form from them.
Enable it
WebMCP is a W3C community group proposal and support is early. launchto.win has joined the Chrome and Edge origin trial, so a current Chrome or Edge exposes the API on this site without any flags. For a local build, or a browser outside the trial, enable the testing flag.
| Browser | Status | Notes |
|---|---|---|
| Chrome 149+ | Origin trial | Origin trial on launchto.win. For local builds, enable the testing flag and restart. |
| Edge 150+ | Origin trial | Same engine and same origin trial as Chrome. |
| Brave | Experimental | Experimental support inside Leo, Brave's built-in assistant. |
| ChatGPT desktop | Experimental | Reported as supporting WebMCP tools when browsing a page. |
| Firefox | Under review | Standards position under review, no implementation. |
| Safari | Under review | Standards position under review, no implementation. |
To enable the testing flag in Chrome or Edge, open chrome://flags/#enable-webmcp-testing, set it to Enabled and restart the browser. Then sign in here on Maker or Shipaholic. The tools register on the next page load.
Verify it
This browser, right now
Checking for WebMCP…
Sign in on Maker or Shipaholic to see the tools register on this page.
To check from the console on any launchto.win page, list the registered tools. You should see list-packages, get-package, create-package.
(await (document.modelContext ?? navigator.modelContext).getTools()).map(t => t.name)
Older previews without getTools still register through provideContext; in that case window.__l2wWebmcp.tools lists what launchto.win registered.
Tool reference
Each tool is a named function with a description and a JSON Schema for its input, the same shape as a tool in the Model Context Protocol. The result is an MCP tool result: one text content item holding the JSON body, with isError set when the request did not succeed.
list-packages
GET /webmcp/packagesList the signed-in user's launch packages on Launch to Win, with slug, tagline, completeness percentage, and whether another package can be created on the current plan.
Input
No input. Pass an empty object.
Example call
{}
Returns
A JSON object with the packages (name, slug, url, tagline, completeness, created_at), the count, the plan's package limit and a can_create_package flag.
{
"packages": [
{
"name": "Acme Analytics",
"slug": "acme-analytics",
"url": "https://acme.example",
"tagline": "Product analytics for indie SaaS",
"completeness": 92,
"created_at": "2026-08-14T09:12:00Z"
},
{
"name": "Draftly",
"slug": "draftly",
"url": "https://draftly.example",
"tagline": "Write release notes from your commits",
"completeness": 64,
"created_at": "2026-09-01T16:40:00Z"
}
],
"count": 2,
"package_limit": 5,
"can_create_package": true
}
get-package
GET /webmcp/packages/{slug}Fetch the full launch package document for one of the user's packages: name, descriptions in three lengths, pricing, categories, keywords, platforms, maker info, social links, logo and screenshot URLs.
Input
| Field | Type | Description |
|---|---|---|
slug required |
string | The package slug, as returned by list-packages. |
Example call
{
"slug": "acme-analytics"
}
Returns
The package document (schema_version 1.0), the same JSON the Chrome extension consumes. See the package document section for every field.
See the package document below for the full shape.
create-package
POST /webmcp/packagesCreate a new launch package for the signed-in user. Only name is required — when a url is given, Launch to Win enriches the package (metadata, logo, socials) in the background. Returns the created package document.
Input
| Field | Type | Description |
|---|---|---|
name required |
string | Product name (2–100 characters). |
url |
string | Product website URL; triggers background enrichment. |
tagline |
string | One-line pitch. |
description |
string | Long description (up to 1000 characters). |
description_short |
string | Short pitch (up to 200 characters). |
description_medium |
string | Medium pitch (up to 600 characters). |
keywords |
string | Comma-separated keywords. |
contact_email |
string | Contact email shown to directories that ask for one. |
alternative_to |
string | Established product this is an alternative to. |
maker_name |
string | Name of the maker or team. |
maker_bio |
string | One or two sentences about the maker. |
launch_date |
string | ISO 8601 date (YYYY-MM-DD). |
pricing_model |
string (free, freemium, subscription, one_time, lifetime, paid, contact) | Pricing model. |
price_amount |
number | Price in the given currency, e.g. 19. |
price_currency |
string | Currency code, e.g. USD. |
price_period |
string | Billing period, e.g. month or year. |
platforms |
array of string (web, ios, android, mac, windows, linux, cli, api, chrome, browser-extension) | Platform slugs: web, ios, android, mac, windows, linux, cli, api, chrome, browser-extension. |
twitter_url |
string | X / Twitter profile URL. |
github_url |
string | GitHub repository or organisation URL. |
linkedin_url |
string | LinkedIn page URL. |
facebook_url |
string | Facebook page URL. |
instagram_url |
string | Instagram profile URL. |
youtube_url |
string | YouTube channel URL. |
Example call
{
"name": "Acme Analytics",
"url": "https://acme.example",
"tagline": "Product analytics for indie SaaS",
"pricing_model": "freemium",
"platforms": [
"web",
"api"
]
}
Returns
The created package document with HTTP 201. Enrichment from the URL runs in the background, so descriptions, logo and screenshots fill in over the following minute.
See the package document below for the full shape.
Package document
get-package and create-package return the package document, schema version 1.0. It is the same JSON the Chrome extension consumes, so an agent and the extension always see identical data. The example below is generated through the real serializer.
{
"schema_version": "1.0",
"name": "Acme Analytics",
"slug": "acme-analytics",
"url": "https://acme.example",
"tagline": "Product analytics for indie SaaS",
"descriptions": {
"short": "Privacy-friendly product analytics you can set up in an afternoon.",
"medium": "Acme Analytics shows indie SaaS teams which features get used and where people drop off, without cookies or a data team. One script tag, dashboards on day one.",
"long": "Acme Analytics is product analytics for small SaaS teams. Add one script tag and you get funnels, retention and feature usage for every plan, with no cookie banner because no personal data is stored. It replaces a spreadsheet of Mixpanel exports for teams of one to ten."
},
"screenshots": [
"https://launchto.win/rails/active_storage/blobs/proxy/…/dashboard.png"
],
"categories": [
"Analytics",
"Developer tools"
],
"keywords": [
"analytics",
"product analytics",
"privacy",
"saas"
],
"pricing": {
"model": "freemium",
"amount": 19.0,
"currency": "USD",
"period": "month",
"display": "Freemium — from $19 / month"
},
"platforms": [
"web",
"api"
],
"launch_date": "2026-09-15",
"maker": {
"name": "Jamie Doe",
"bio": "Solo developer shipping small SaaS tools since 2019."
},
"alternative_to": "Mixpanel",
"links": {
"twitter": "https://x.com/acmeanalytics",
"github": "https://github.com/acme/analytics"
},
"generated_at": "2026-09-04T10:00:00Z",
"logo": "https://launchto.win/rails/active_storage/blobs/proxy/…/logo.png"
}
| Field | Meaning |
|---|---|
schema_version | Document version, currently 1.0. Bumped only for breaking changes. |
name, slug, url | Product name, the slug used by get-package, and the product URL. |
tagline | One line, the shortest pitch. |
descriptions.short / medium / long | Copy at three lengths (about 200, 600 and 1000 characters). Each falls back to the next available length, so none is ever empty when the package has any description. |
logo, screenshots | Absolute URLs served by launchto.win. Fetch them with the user's session to attach to file inputs. |
categories, keywords | Category names and a list of keywords. |
pricing | model (one of the pricing_model values), amount, currency, period and a ready-made display string. |
platforms | Platform slugs from the same list create-package accepts. |
launch_date | ISO 8601 date or absent. |
maker | name and bio; name falls back to the account's display name. |
alternative_to | The established product this competes with. |
links | Only the social links that are set: twitter, github, linkedin, facebook, instagram, youtube. |
generated_at | When the document was built. |
Errors and limits
Errors are JSON with an error string an agent can show the user. Validation errors add details; an invalid pricing model adds the accepted values. The MCP result carries the same body with isError: true.
| Status | Tools | When | Body |
|---|---|---|---|
| 401 | list-packagesget-packagecreate-package |
The session expired since the tools were registered. | { "error": "Not signed in. Sign in to launchto.win in this browser and try again." } |
| 403 | list-packagesget-packagecreate-package |
Signed in on a plan without WebMCP. | { "error": "WebMCP access requires the Maker or Shipaholic plan. See https://launchto.win/pricing." } |
| 403 | create-package |
The plan's package limit is reached. | { "error": "You've reached the package limit on the Maker plan. Upgrade at https://launchto.win/pricing to create more packages." } |
| 404 | get-package |
No package with that slug belongs to the signed-in user. | { "error": "Package not found" } |
| 422 | create-package |
A field fails validation. | { "error": "Package could not be created", "details": ["Name is too short (minimum is 2 characters)"] } |
| 422 | create-package |
pricing_model is not one of the allowed values. | { "error": "'donationware' is not a valid pricing_model", "valid_pricing_models": ["free", "freemium", "subscription", "one_time", "lifetime", "paid", "contact"] } |
Limits are the plan's: Maker allows 5 packages, Shipaholic has no cap. list-packages reports the limit and whether another package can be created, so an agent can check before calling create-package. There is no separate rate limit beyond the site's normal request throttling.
Prompts that work
Agents differ, but these produce good results with a capable in-browser agent. Keep the launchto.win tab open in the same browser, signed in.
Submit one product to one directory
“Open https://www.saashub.com/submit and fill the form using my Acme Analytics package from Launch to Win. Use the short description where the form wants one sentence and the long description elsewhere. Do not press submit; tell me when it is ready to review.”
Every package, one directory
“For each of my packages on Launch to Win, open https://www.saashub.com/submit, fill the form from that package, then stop and let me review before moving to the next one.”
Check what is missing before launch day
“List my Launch to Win packages and tell me which ones are under 80% complete. For each, read the package and list the empty fields a directory would ask for.”
Create a package from a URL
“Create a Launch to Win package for https://draftly.example called Draftly, pricing model freemium, platforms web and api. Then read it back and show me what was filled in.”
Two habits help. Ask the agent to stop before submit; nearly every directory wants a human on that button. And go directory by directory rather than product by product, so the agent stays on one form layout. The agent guide walks through the full workflow.
Security model
- Registered only while signed in on an eligible plan. Signed-out visitors and Free plan accounts have no tools registered, so there is nothing for an agent to call.
- Session and CSRF, no API tokens. The tools call session-authenticated JSON endpoints under
/webmcpwith the page's CSRF token. There is no long-lived credential to leak. - Same origin only. Tools are registered without the spec's
exposedTooption, so they are visible only to agents on launchto.win pages, never to another site or an embedded frame. - Scoped to the account. Every endpoint reads and writes the signed-in user's own packages. A slug belonging to someone else returns 404.
- Read and create, not delete. There is no tool to edit or delete a package. Anything an agent creates is visible in your dashboard and can be edited or removed there.
- The agent is yours. WebMCP does not send data to Launch to Win's servers beyond the requests above. Which agent runs in your browser, and what it does with the results, is between you and that agent.
Changelog
WebMCP moves quickly. Every change to the tools, the endpoints or how they are registered is recorded here.
- 2026-09-09
- Documentation gained a plain-language "What is WebMCP?" section and a FAQ; no tool changes.
- 2026-09-04
- Tools are now registered on document.modelContext, following the spec's move away from navigator.modelContext; the old name is still tried as a fallback. Chrome origin trial token added. Tool definitions moved to one shared registry and this documentation published.
- 2026-09-03
- WebMCP shipped: list-packages, get-package and create-package on Maker and Shipaholic plans.
Specification: https://webmachinelearning.github.io/webmcp/. Questions or an agent that does not work as documented: contact us.
FAQ
WebMCP questions
- What is WebMCP?
- WebMCP is a proposed web standard from the W3C Web Machine Learning community group that lets a web page register tools with document.modelContext: named functions with a JSON input schema and a description. An AI agent running in the browser can discover those tools and call them, in the page, with the user's own session and permissions. It is the web-page side of the Model Context Protocol.
- Is WebMCP the same as MCP?
- No. MCP (the Model Context Protocol) connects an AI model to a server-side tool over a transport the model host controls. WebMCP puts the tools in the web page itself, so a browser agent can use a site the way a person does, without an API key or a separate server. The tool shape is the same idea; where it runs is different.
- Which browsers support WebMCP?
- Chrome 149+ and Edge 150+ through an origin trial that launchto.win has joined, so no flags are needed here. Local builds and other Chromium browsers can enable the testing flag. Brave and the ChatGPT desktop app are experimental; Firefox and Safari have not implemented it. The browser table above is kept current.
- How do I use WebMCP on launchto.win?
- Sign in on the Maker or Shipaholic plan in a supported browser and every page registers the tools. Then point any in-browser agent at a directory's submission form and tell it to fill the form from your Launch to Win package. The agent reads the package with get-package; you review and press submit.
- Can an agent submit to directories without me?
- Not through WebMCP. The tools read and create launch packages; they do not submit anything. Filling a directory's form is the agent's job and pressing submit is yours. Fully automated submission is a separate, semi-automated feature on the Shipaholic plan.
Give your agent the real package.
Build a launch package, upgrade to Maker or Shipaholic, and your agent can read it through WebMCP.
Free plan available. No credit card required.