Skip to main content
This guide covers how to instrument an MCP server built with @modelcontextprotocol/sdk. You will learn how to:
  • Install and configure the instrumentation
  • Track tool calls, resources, and prompts
  • Capture inputs and outputs

Overview

For the full list of required span attributes and what powers the MCP dashboard, see the MCP feature page.

Installation

Terminal
Peer dependency: @modelcontextprotocol/sdk >= 1.0.0

With the AdonisJS agent

Install this package explicitly and use the direct import shown below. Initialize the agent before loading your MCP server module, then call instrumentMcpServer() before connecting the transport. No integrations entry is needed.
AdonisJS agent 2.x no longer bundles MCP or exports @monocle.sh/adonisjs-agent/mcp. Use @monocle.sh/instrumentation-mcp instead. See the migration guide when upgrading from 1.x.

Usage

Call instrumentMcpServer() on your server instance before connecting a transport. This wraps the server’s internal handlers to create spans for every incoming request, notification, and outgoing message.
server.ts

Configuration

Spans

The instrumentation creates spans for three categories of MCP activity.

Request spans

A SERVER span is created for every incoming JSON-RPC request (tools/call, resources/read, prompts/get, initialize, etc.). The span name includes the target when available: tools/call search, resources/read config://app, prompts/get weather.

Notification spans

A SERVER span is created for incoming notifications (e.g., notifications/initialized, resources/changed).

Outgoing notification spans

A CLIENT span is created for outgoing notifications sent by the server (e.g., resources/changed).

Error spans

Transport errors produce an INTERNAL span named mcp.transport.error with the exception recorded. JSON-RPC errors set rpc.jsonrpc.error_code and rpc.jsonrpc.error_message on the request span.

SDK-specific attributes

In addition to the standard MCP attributes, this instrumentation emits these extra attributes when recording is enabled.

Input attributes (when recordInputs: true)

Tool arguments are captured as mcp.request.argument.{key} (JSON-stringified per key).

Output attributes (when recordOutputs: true)