next.js/packages/next/src/server/mcp/mcp-telemetry-tracker.test.ts
mcp-telemetry-tracker.test.ts132 lines4.3 KB
/**
 * @jest-environment node
 */

import { mcpTelemetryTracker } from './mcp-telemetry-tracker'

describe('MCP Telemetry Tracker', () => {
  beforeEach(() => {
    // Reset tracker state before each test
    mcpTelemetryTracker.reset()
  })

  afterAll(() => {
    // Clean up after all tests
    mcpTelemetryTracker.reset()
  })

  it('should start with no usage', () => {
    expect(mcpTelemetryTracker.hasUsage()).toBe(false)
    expect(mcpTelemetryTracker.getUsages()).toEqual([])
  })

  it('should track single tool call', () => {
    mcpTelemetryTracker.recordToolCall('mcp/get_errors')

    expect(mcpTelemetryTracker.hasUsage()).toBe(true)
    expect(mcpTelemetryTracker.getUsages()).toEqual([
      {
        featureName: 'mcp/get_errors',
        invocationCount: 1,
      },
    ])
  })

  it('should increment invocation count for repeated calls', () => {
    mcpTelemetryTracker.recordToolCall('mcp/get_errors')
    mcpTelemetryTracker.recordToolCall('mcp/get_errors')
    mcpTelemetryTracker.recordToolCall('mcp/get_errors')

    const usages = mcpTelemetryTracker.getUsages()
    expect(usages).toHaveLength(1)
    expect(usages[0]).toEqual({
      featureName: 'mcp/get_errors',
      invocationCount: 3,
    })
  })

  it('should track multiple different tools', () => {
    mcpTelemetryTracker.recordToolCall('mcp/get_errors')
    mcpTelemetryTracker.recordToolCall('mcp/get_logs')
    mcpTelemetryTracker.recordToolCall('mcp/get_page_metadata')
    mcpTelemetryTracker.recordToolCall('mcp/get_errors') // Duplicate

    const usages = mcpTelemetryTracker.getUsages()
    expect(usages).toHaveLength(3)

    // Find each tool in the results
    const errorsUsage = usages.find((u) => u.featureName === 'mcp/get_errors')
    const logsUsage = usages.find((u) => u.featureName === 'mcp/get_logs')
    const pageMetadataUsage = usages.find(
      (u) => u.featureName === 'mcp/get_page_metadata'
    )

    expect(errorsUsage).toEqual({
      featureName: 'mcp/get_errors',
      invocationCount: 2,
    })
    expect(logsUsage).toEqual({
      featureName: 'mcp/get_logs',
      invocationCount: 1,
    })
    expect(pageMetadataUsage).toEqual({
      featureName: 'mcp/get_page_metadata',
      invocationCount: 1,
    })
  })

  it('should track all 5 MCP tools', () => {
    mcpTelemetryTracker.recordToolCall('mcp/get_errors')
    mcpTelemetryTracker.recordToolCall('mcp/get_logs')
    mcpTelemetryTracker.recordToolCall('mcp/get_page_metadata')
    mcpTelemetryTracker.recordToolCall('mcp/get_project_metadata')
    mcpTelemetryTracker.recordToolCall('mcp/get_server_action_by_id')

    const usages = mcpTelemetryTracker.getUsages()
    expect(usages).toHaveLength(5)

    const toolNames = usages.map((u) => u.featureName)
    expect(toolNames).toContain('mcp/get_errors')
    expect(toolNames).toContain('mcp/get_logs')
    expect(toolNames).toContain('mcp/get_page_metadata')
    expect(toolNames).toContain('mcp/get_project_metadata')
    expect(toolNames).toContain('mcp/get_server_action_by_id')
  })

  it('should reset tracking', () => {
    mcpTelemetryTracker.recordToolCall('mcp/get_errors')
    mcpTelemetryTracker.recordToolCall('mcp/get_logs')

    expect(mcpTelemetryTracker.hasUsage()).toBe(true)
    expect(mcpTelemetryTracker.getUsages()).toHaveLength(2)

    mcpTelemetryTracker.reset()

    expect(mcpTelemetryTracker.hasUsage()).toBe(false)
    expect(mcpTelemetryTracker.getUsages()).toEqual([])
  })

  it('should maintain accurate counts across multiple operations', () => {
    // Simulate realistic usage pattern
    mcpTelemetryTracker.recordToolCall('mcp/get_project_metadata') // 1
    mcpTelemetryTracker.recordToolCall('mcp/get_page_metadata') // 1
    mcpTelemetryTracker.recordToolCall('mcp/get_errors') // 1
    mcpTelemetryTracker.recordToolCall('mcp/get_errors') // 2
    mcpTelemetryTracker.recordToolCall('mcp/get_page_metadata') // 2
    mcpTelemetryTracker.recordToolCall('mcp/get_errors') // 3
    mcpTelemetryTracker.recordToolCall('mcp/get_logs') // 1

    const usages = mcpTelemetryTracker.getUsages()
    expect(usages).toHaveLength(4)

    const counts = new Map(
      usages.map((u) => [u.featureName, u.invocationCount])
    )

    expect(counts.get('mcp/get_errors')).toBe(3)
    expect(counts.get('mcp/get_page_metadata')).toBe(2)
    expect(counts.get('mcp/get_project_metadata')).toBe(1)
    expect(counts.get('mcp/get_logs')).toBe(1)
  })
})
Quest for Codev2.0.0
/
SIGN IN