Skip to content

Getting started ​

Signett makes a function in your website discoverable and callable by browser agents through native WebMCP. A tool can be as small as a function that returns a greeting.

If you are deciding what your application should expose, start with the User Jobs to Be Done workflow. It takes one existing product outcome from a small capability sketch to deterministic proof, real-agent Evidence, and a regression baseline.

Before you start ​

Signett runs in browser code. Add it to a client-side module that loads with the page where the capability should be available. It does not create a server, host your tools, or replace your application's API.

WebMCP is still experimental. In a browser without WebMCP, Signett leaves the human website unchanged and reports the tool as unsupported.

Install Signett ​

sh
npm install signett

That is the only runtime package required to expose tools. Install webmcp-types separately only when application code accesses the native document.modelContext API directly.

To test those tools from a terminal, add the evaluation package as a development dependency. Its scoped package installs the signett executable:

sh
npm install --save-dev @signett/eval
npx signett agent --help

signett alone does not install the CLI, and the interactive Chrome extension is distributed separately. See test a WebMCP job from the terminal for the complete workflow.

Expose one tool ​

Add this to a client-side module:

ts
import { createSignett } from "signett";

const signett = createSignett();

const registration = await signett.expose({
  name: "get_greeting",
  description: "Return a greeting from this website.",
  inputSchema: {
    type: "object",
    properties: {},
    additionalProperties: false,
  },
  annotations: { readOnlyHint: true },
  execute: () => ({ message: "Hello, world!" }),
});

A compatible browser agent can now discover get_greeting, call it with {}, and receive:

json
{ "message": "Hello, world!" }

Every tool has four required fields:

  • name: a stable verb_noun identifier an agent can select;
  • description: what the tool does and any important constraint;
  • inputSchema: the JSON Schema Signett validates before execution;
  • execute: the application function that returns the result.

The optional readOnlyHint tells agents that calling this tool does not change state.

Check registration ​

After expose() resolves, the registration status is either registered or unsupported:

ts
console.log(registration.status);

Use unsupported: "warn" while integrating if you want a console warning when the native browser API is missing:

ts
const signett = createSignett({ unsupported: "warn" });

Signett does not poll for a bridge that may appear later. If an extension or test environment provides a modelContext, wait for it and pass it explicitly to createSignett({ modelContext }).

Test it without a browser agent ​

The test harness supplies the same registration boundary and lets a test invoke the real tool callback:

ts
import { createSignett } from "signett";
import { createWebMcpTestHarness } from "signett/testing";

const harness = createWebMcpTestHarness();
const signett = createSignett({ modelContext: harness.modelContext });

await signett.expose({
  name: "get_greeting",
  description: "Return a greeting from this website.",
  inputSchema: {
    type: "object",
    properties: {},
    additionalProperties: false,
  },
  annotations: { readOnlyHint: true },
  execute: () => ({ message: "Hello, world!" }),
});

expect(await harness.invoke("get_greeting", {})).toEqual({
  message: "Hello, world!",
});

The harness is deterministic and does not need a model, browser, or API key.

Remove the tool when its page state disappears ​

A tool should exist only while its capability is available. Dispose the registration on logout, navigation, or teardown:

ts
registration.dispose();

React applications can bind the same lifecycle to a component:

ts
import { useSignettTool } from "signett/react";

const state = useSignettTool(signett, greetingTool, [greetingTool]);

Next, learn the core Signett abstractions and how each one maps to application code. To run this example as a website and let an agent invoke it, follow the first agent call codelab. To turn prompts into a repeatable regression suite, continue to headless agent testing.

Your product capabilities, directly usable by agents.