Skip to main content
Every command on this site runs the same two ways: with flags, for scripts and agents, and guided, when you leave the flags off. That is what makes an agent a first-class way to build an extension. This page lists what to install. All three surfaces run the CLI, so it goes on your PATH first:
On Node 20 or newer, npm i -g @tappify/cli installs the same CLI.

The Claude Code plugin

The plugin is the claude-plugin directory of the Tappify source. It is not on a published marketplace yet, so add your checkout as one by path:
Then restart Claude Code, or run /reload-plugins. To try it without installing, claude --plugin-dir /path/to/claude-plugin loads it for one session, and claude plugin validate /path/to/claude-plugin reads the manifest back to you. Both lines stay once the marketplace is published — installing reaches marketplaces you have already added, so only the argument to the first line changes:
It brings five skills, one command, and the MCP server below. /tappify:new-extension scaffolds an extension, runs it on the sandbox project, and publishes the first release.

The MCP server

The CLI serves it:
It speaks MCP over stdin and stdout, so any client that runs a command can use it. Every human line goes to stderr, and the server ends when its client closes stdin. The plugin declares it, so a Claude Code user does nothing. For a client you configure yourself:
It signs in as you: the same credentials tappify login wrote. Every result carries ok: true beside the keys above, which are the keys the matching command’s --json prints where a command matches. A failure is { "ok": false, "error": { "what": …, "why": …, "fix": … } }. cwd is optional everywhere it appears, and falls back to the directory the server started in. extension_doctor runs the whole set: the manifest and registry checks, then your build, typecheck, lint, tests and the axe pass. extension_validate runs only the four that need no build and no network beyond the cached registry, so it is the one to call in a loop while you write the manifest. extension_publish never publishes on the first call. It runs the project’s build script when there is one, then the checks without the tooling set — no typecheck, lint, tests or axe pass, which is why extension_doctor comes first. Called with confirm: false it returns what would ship — the bundle size, the entries, the scopes, the notes — and only confirm: true uploads. Describing a release registers nothing: the extension id is claimed, and Tappify’s own checks run against the bundle, only on the call you confirm. notes is required on both calls, up to 1000 characters.

The VS Code extension

It is not on the Marketplace yet. Build the vsix from the checkout and install that:
It validates tappify.extension.json against the published schema and completes every field. A manifest with a $schema line uses the hosted schema; one without falls back to the copy bundled in the extension, so the file validates with no network. Twenty-one snippets write manifest entries under the tap- prefix: tap-manifest for a whole manifest, and one for each contribution kind, from tap-widget to tap-work. Five commands run the CLI in a terminal named Tappify, reused across commands, in the first folder of the workspace: Add a contribution asks which kind in the editor and passes it on the command line. Publish asks for nothing in the editor: the CLI asks for the release notes in the terminal, where what you type goes to the CLI and not to your shell.

What a model reads

Any page also serves its Markdown source: add .md to the URL.

Rules an agent should hold

An agent building an extension is bound by the same rules a person is, and two of them are worth stating outright:
  • The registry is the source of truth for pages, slots, charts, tables, scopes, categories and events. Read it with extension_registry; a guessed slot fails the checks.
  • src/tappify.d.ts is generated. Change the manifest or a schema and rerun tappify extension types; a hand edit is overwritten by the next command.
What extensions can never do is the rest.