next.js/packages/next/src/server/mcp/mcp-telemetry-tracker.ts
mcp-telemetry-tracker.ts84 lines1.8 KB
/**
 * Telemetry tracker for MCP tool call usage.
 * Tracks invocation counts for each MCP tool to be reported via telemetry.
 */

import type { McpToolName } from '../../telemetry/events/build'

export interface McpToolUsage {
  featureName: McpToolName
  invocationCount: number
}

class McpTelemetryTracker {
  private usageMap = new Map<McpToolName, number>()

  /**
   * Record a tool call invocation
   */
  recordToolCall(toolName: McpToolName): void {
    const current = this.usageMap.get(toolName) || 0
    this.usageMap.set(toolName, current + 1)
  }

  /**
   * Get all tool usages as an array
   */
  getUsages(): McpToolUsage[] {
    return Array.from(this.usageMap.entries()).map(([featureName, count]) => ({
      featureName,
      invocationCount: count,
    }))
  }

  /**
   * Reset all usage tracking
   */
  reset(): void {
    this.usageMap.clear()
  }

  /**
   * Check if any tools have been called
   */
  hasUsage(): boolean {
    return this.usageMap.size > 0
  }
}

// Singleton instance
export const mcpTelemetryTracker = new McpTelemetryTracker()

/**
 * Get MCP tool usage telemetry
 */
export function getMcpTelemetryUsage(): McpToolUsage[] {
  return mcpTelemetryTracker.getUsages()
}

/**
 * Reset MCP telemetry tracker
 */
export function resetMcpTelemetry(): void {
  mcpTelemetryTracker.reset()
}

/**
 * Record MCP telemetry usage to the telemetry instance
 */
export function recordMcpTelemetry(telemetry: {
  record: (event: any) => void
}): void {
  const mcpUsages = getMcpTelemetryUsage()
  if (mcpUsages.length === 0) {
    return
  }

  const { eventMcpToolUsage } =
    require('../../telemetry/events/build') as typeof import('../../telemetry/events/build')
  const events = eventMcpToolUsage(mcpUsages)
  for (const event of events) {
    telemetry.record(event)
  }
}
Quest for Codev2.0.0
/
SIGN IN