Build with an agent
Give a coding agent what it needs to build and sell an extension on the Wall.
A coding agent, such as Claude Code, Codex, Cursor or Copilot, can build an extension that sells on the Wall. Three things give it what it needs: the files toolaby create and upgrade write for it, the Toolaby MCP server, and toolaby check.
This page covers each, then a first session from an empty folder.
Before you begin
- A workspace on the Wall, and Node.js 18 or later.
- The command line signed in once:
npx -y toolaby@latest login. The MCP server acts with that session.
The files agents read
toolaby create and toolaby upgrade write these beside the extension:
| File | For | Written |
|---|---|---|
TOOLABY.md | Every agent. The files the Wall owns, gate() and the paywall, this tool's features and plans, testing, shipping, and the rules. | Every time. upgrade rewrites it with the tool as the Wall has it then. |
.claude/skills/toolaby/SKILL.md | Claude Code's skill for the Wall: adding a paid feature, checking, shipping. | Every time. |
AGENTS.md | Every agent reads it first. It points at TOOLABY.md. | Only when the project has none. |
CLAUDE.md | Claude Code. It reads AGENTS.md. | Only when the project has none. |
A project with its own AGENTS.md keeps it. wire then prints the line to add to it.
The MCP server
toolaby mcp is an MCP server on stdio. It acts on your tools with the stored session, on Test unless started with --live.
For Claude Code:
claude mcp add toolaby -- npx -y toolaby@latest mcpFor other clients, the server is the command npx -y toolaby@latest mcp.
| Tool | Does |
|---|---|
toolaby_whoami | The signed-in developer and their workspaces. |
toolaby_list_tools | Your tools, with the ids the other tools take. |
toolaby_get_tool | One tool: what the Free plan holds, features, plans and what each unlocks, the tool key, the extension's id, whether a copy has checked in, the builds in use. |
toolaby_create_tool | A new tool. |
toolaby_set_access | What the Free plan holds: open, free_uses with a number, or paid; and whether an account comes first. A feature a plan sells is refused on any of them. |
toolaby_add_plan | A plan: a lifetime price or a subscription, as a Price on your Stripe account. It answers with the plan's id (the first plan's is default) and its name as buyers see it, like Pro · Lifetime. |
toolaby_set_features | The tool's whole list of features, and which plans unlock each. Add the plans first. |
toolaby_grant | Access without paying. An address with no account gets one; the grant applies when that person signs in to the extension. |
toolaby_docs | These docs as Markdown: the index, or one page. |
Every change goes through the same checks as the dashboard. A member whose role cannot change a tool is refused. The tools say which only read and which change your workspace, in MCP's annotations, and each tool that changes something says so in its description: a client that asks before a change can ask before these.
The tool key carries what the Free plan holds and the kind of plan sold. When toolaby_set_access or toolaby_add_plan changes it, the answer says keyChanged and names the command that writes the new one: npx -y toolaby@latest upgrade <tool-id>.
toolaby check
npx -y toolaby@latest check in the extension's folder, or npx -y toolaby@latest check <folder>:
| Checks | Fails when |
|---|---|
| The Wall's files | toolaby.js or toolaby.config.js is missing. |
| The tool key | It is missing, or the Wall does not sell the tool it names. A key whose Wall is not an https address, or one on this machine, is refused before anything is asked of it. |
| The manifest | It lacks a permission or host permission the Wall needs. A manifest without the key is reported. |
| The client | Never: an older toolaby.js is reported, with upgrade to replace it. |
| Feature keys | The code calls gate({ feature }) or has() with a key the tool does not have. Every buyer would be refused. Comments are skipped. |
| The paywall's page | Never: code that calls showPaywall() in an extension without the Wall's page for its popup or side panel is reported. |
| Plans | Never: a feature no plan unlocks, or nothing to buy, is reported. |
| Checked in | Never: a tool no copy has checked in to is reported. |
| The key is current | Never: a key older than the Wall's, after a change to the Free plan, the plans or the signing key, is reported. |
--browser also loads the extension in Chromium, asks its background a question, and opens its popup and side panel in a tab. A background whose code threw while loading does not answer; a page whose script throws fails. It needs Playwright in the project: npm i -D playwright && npx playwright install chromium, after npm init -y in a folder with no package.json.
It exits with 1 when something fails, so an agent, or CI, can stop on it.
The docs for agents
/llms.txt: every page, with its Markdown address and what it covers./llms-full.txt: every page in one file.- Any page as Markdown: its address with
.md, like/docs/gating.md.
By address, over MCP
For a client that connects to an MCP server by its address, such as a Claude or ChatGPT connector, the docs are also an MCP server at https://toolaby.app/api/mcp (Streamable HTTP). It has one tool, toolaby_docs, which answers the index or one page. It reads nothing but these docs, so it asks for no sign-in and holds no key. Where a client asks how to authenticate, choose none; if it insists on a token, any text will do, since nothing checks it.
The tools that read and change your tools stay with toolaby mcp on your machine, under your own sign-in.
A first session
- In the dashboard, or with
toolaby_create_tool, make the tool. npx -y toolaby@latest create <tool-id>makes the extension, with the files above.- Ask the agent for the extension, in one sentence: "Count the words on the page in the popup; exporting the counts as CSV is Pro."
- The agent adds a plan and the
exportfeature with the MCP server, writes the code behindgate({ feature: 'export' }), and runsnpx -y toolaby@latest check. - Load it unpacked at
chrome://extensionsand try it. On Test, Buy takes the card4242 4242 4242 4242, and the extension unlocks when the success page opens. An agent cannot pay or sign in by itself: this step is yours. - To ship: Ship to the Chrome Web Store.