Skip to main content

Define input schemas

Every tool can have an inputSchema that describes the arguments it accepts. The runtime uses this schema to validate input from AI agents before calling your execute function.

Literal JSON Schema

Write the schema as a plain object. This works with every WebMCP runtime and requires no additional dependencies.
json-schema-tool.ts
Use this when you want zero dependencies and do not need TypeScript inference on the args parameter.

Literal JSON Schema with type inference

Add as const satisfies JsonSchemaForInference to preserve the literal schema type. TypeScript then infers args from the schema at compile time.
inferred-schema-tool.ts
Use this when you want compile-time type safety without adding a runtime schema library.
Inference works only with literal schemas. If the schema type is widened (for example, loaded from an API at runtime), args falls back to Record<string, unknown>.

Standard Schema (Zod, Valibot, ArkType)

The polyfill accepts any Standard Schema v1 object as inputSchema. This includes Zod v4, Valibot, and ArkType validators. The runtime extracts JSON Schema for agent discovery and validates input using the schema’s ~standard.validate function. With Zod v4:
zod-tool.ts
Use this when you want runtime validation (not just compile-time types) and already use a Standard Schema-compatible library.
When both a Standard Schema validator and Standard JSON Schema are present on the same object, JSON Schema conversion is preferred for validation parity. The runtime attempts conversion with draft-2020-12 first, then falls back to draft-07.

Zod with @mcp-b/react-webmcp

The React hooks in @mcp-b/react-webmcp accept Zod schemas in a shorthand form where you pass the shape directly (without wrapping in z.object):
SearchTool.tsx

Choosing a schema style

Define output schemas

An outputSchema describes the shape of the structured data your tool returns. When present, the tool response includes both a human-readable content array and a machine-readable structuredContent object.

Add an output schema

output-schema-tool.ts
When outputSchema is a literal object schema and you use @mcp-b/webmcp-types, structuredContent is type-checked against the schema at compile time.

Output schemas with usewebmcp

The usewebmcp hook infers state.lastResult from the output schema:
CounterTool.tsx
If outputSchema is defined, the tool implementation must return a JSON-serializable object. Returning a non-object value (string, null, array) causes an error response.

Keep text and structure aligned

Always return both content and structuredContent. The text in content is for display in chat UIs. The structuredContent is for programmatic consumption by the AI agent.
If you omit content and return only the structured data, the runtime wraps it in a text content block with pretty-printed JSON.

When to use output schemas

Add outputSchema when:
  • The AI agent needs to pass your tool’s result to another tool (structured data enables chaining).
  • You want compile-time type checking on the return value.
  • You need the agent to parse specific fields from the response rather than interpreting free text.
Skip outputSchema when the tool returns simple text responses where structured parsing adds no value.

Further reading