Skip to main content
Tools are typed actions that execute operations with side effects. They’re the primary way to enable an AI model to interact with external systems—calling APIs, modifying data, performing calculations, or triggering workflows.
This feature implements the MCP Tools specification. FrontMCP handles all protocol details automatically.
Nx users: Scaffold with nx g @frontmcp/nx:tool my-tool --project my-app. See Tool Generator.

Why Tools?

In the Model Context Protocol, tools serve a distinct purpose from resources and prompts: Tools are ideal for:
  • API integrations — call external services, webhooks, third-party APIs
  • Data mutations — create, update, delete records
  • Calculations — perform computations, transformations
  • System operations — file operations, process management
  • Workflows — trigger multi-step processes, orchestration

Creating Tools

Class Style

Use class decorators for tools that need dependency injection, lifecycle hooks, or complex logic:

Function Style

For simpler tools, use the functional builder:

Registering Tools

Add tools to your app via the tools array:
Tools can also be generated dynamically by adapters (e.g., OpenAPI adapter) or plugins.

Loading from npm or Remote Servers

You can mix local tool classes with tools loaded from npm packages or proxied from remote MCP servers:
Tool.esm() loads a single named tool from an npm package at runtime. Tool.remote() proxies a single tool from a remote MCP server. For loading entire apps (all tools, resources, prompts), use App.esm() or App.remote().

Input Schemas

Tools use Zod schemas for type-safe input validation. The schema is automatically converted to JSON Schema for MCP protocol compatibility.

Basic Types

With Descriptions

Optional and Default Values

Complex Types


Output Schemas

Optionally define an output schema for response validation:

Return Values

Tools support multiple return formats. The SDK automatically converts your return value to the MCP CallToolResult format.

Simple Returns

Full MCP Format

For complete control over the response, return the full CallToolResult structure:

Multiple Content Items

Return an array to include multiple content blocks:

Tool Metadata

Field descriptions:

Tool Examples

Provide examples to improve discoverability and help LLMs understand how to use your tools effectively.

CodeCall Discovery

Examples are indexed for semantic search with 2x weight, helping users find the right tools faster.

LLM Understanding

The codecall:describe tool returns up to 5 examples per tool to help LLMs understand usage patterns.
If you don’t provide examples, FrontMCP auto-generates smart examples based on tool intent (create, list, get, update, delete, search). User-provided examples always take priority.

Tool Annotations

Annotations provide hints to clients about tool behavior:

Tool Context

Class-based tools have access to a rich execution context via this:

Using Providers

Inject services via the get() method:

Request Context

Class-based tools have access to the full request context (FrontMcpContext) including tracing, timing, and authentication:
this.context returns the active FrontMcpContext. For typed identity (roles, scopes, claims) prefer this.auth. See Request Context for complete API reference.

Progress Notifications

Send real-time updates to clients during long-running operations using MCP notifications.

Sending Messages

Use this.notify() to send log messages to the client:
Log levels: 'debug', 'info', 'warning', 'error'

Sending Progress

Use this.progress() for progress bar updates. This only works when the client includes a progressToken in the request:
Progress notifications are only sent if the client includes a progressToken in the request’s _meta field. If no token is provided, this.progress() returns false and silently succeeds.

Progress Token Access

The progressToken is automatically extracted from the request’s _meta field and made available via the ToolCallExtra type for advanced use cases:
For most use cases, simply use this.progress() which handles the token automatically.

Real-World Examples

Calculator Tool

API Integration Tool

Database Mutation Tool

File Operation Tool


MCP Protocol Integration

Tools integrate with the MCP protocol via two flows: When a client requests tools/call with a name and arguments:
  1. The SDK locates the tool by name
  2. Arguments are validated against the tool’s inputSchema
  3. The execute() method is called with the validated arguments
  4. The return value is validated against outputSchema (if provided) and converted to MCP CallToolResult format

Capabilities

FrontMCP automatically advertises tool capabilities during MCP initialization:
The SDK sets listChanged: true when you have any tools registered, enabling clients to receive real-time notifications when tools are dynamically added or removed.

Change Notifications

When tools change dynamically (e.g., via adapters or plugins), FrontMCP automatically sends notifications/tools/list_changed to connected clients. Clients that support this notification will refresh their tool list.
For the full protocol specification, see MCP Tools.

Tool UI

Tools can render visual widgets alongside their responses. This enables rich, interactive presentations of tool outputs—weather cards, order summaries, data tables, and more.

Basic UI Configuration

Add a ui property to attach a visual template:

Template Types

FrontMCP auto-detects your template type:

UI Configuration Options

Using @frontmcp/ui Components

Combine Tool UI with the @frontmcp/ui component library:

Testing Tool UI

Use @frontmcp/testing for E2E validation of rendered widgets:

Building Tool UI

Complete configuration options and examples

React SDK

Pre-built React components from @frontmcp/react

Best Practices

Do:
  • Use descriptive name and description fields to help models understand tool purpose
  • Define clear input schemas with .describe() on each field
  • Use appropriate annotations (destructiveHint, idempotentHint, etc.) to guide client behavior
  • Validate inputs thoroughly and return meaningful error messages
  • Keep tools focused on a single action or operation
Don’t:
  • Create tools for read-only data retrieval (use resources instead)
  • Skip input validation—always define a proper inputSchema
  • Ignore error handling—wrap external calls in try/catch
  • Create overly complex tools—split into multiple tools if needed
  • Expose sensitive operations without proper authentication checks