Skip to content

Core — webmcp()

ts
import { webmcp } from 'simple-webmcp';

function webmcp<F extends (...args:any)=>any>(fn: F, options?: WebMCPOptions<F>): WebMCPTool<F>;
namespace webmcp { function global<F>(fn:F, opts?: Omit<WebMCPOptions<F>,'global'>): WebMCPTool<F>; }

WebMCPOptions

ts
type FieldDef = Partial<JsonSchema>;
type WebMCPOptions<F> = {
  name?: string; // default fn.name → snake_case
  description?: string; // or JSDoc / warn
  schema?: JsonSchema | StandardSchemaV1; // whole, wins — main source of truth
  fields?: Record<string, FieldDef | StandardSchemaV1>; // patch, enhances inferred
  annotations?: Record<string,unknown> & {readOnlyHint?, destructiveHint?, openWorldHint?, title?};
  scope?: 'global'|'scoped'|'manual'; global?: boolean;
  enabled?: boolean; // default true
  strict?: boolean; // throw on low-confidence runtime inference
  // outputSchema?: kept internally, not in 0.1 marketing — browser does not enforce it
};

WebMCPTool

ts
type WebMCPTool<F> = F & {
  __webmcpBrand: true;
  tool: ToolContract; definition: ToolContract;
  register(opts?:{signal?:AbortSignal}): Promise<()=>void>;
  unregister(): void;
  status: 'unregistered'|'registering'|'registered'|'unsupported'|'unregistering'|'error';
  registration: Promise<void>|null;
  isRegistered(): boolean;
};
type ToolContract = { name:string; description:string; inputSchema:JsonSchema; annotations?:Record<string,unknown> };

Framework-agnostic core. React adapter included. More adapters coming. Hierarchy: schema whole → inferred (runtime best-effort 0.1 / unplugin 0.2) → fields patch → metadata.

register() is async per WebMCP spec (document.modelContext.registerTool); hook maps to AbortSignal. status:'unsupported' is mutually exclusive with 'registered' — check isWebMCPSupported().

Utilities

ts
import { isWebMCPSupported, getModelContext, toSnakeCase, registry, getRegistry } from 'simple-webmcp';

Errors

ts
import { SimpleWebMCPError, NotSupportedError, NotAllowedError, RegistrationError, ValidationError, ConfigurationError } from 'simple-webmcp';

Each has code + cause + toJSON(). NotAllowedError maps Permissions Policy NotAllowedError.

Released under the MIT License.