{"version":3,"file":"server-7a9cPIV1.mjs","names":["spanWhereClauseSchema: z.ZodType<\n  SpanWhereClauseArgs,\n  z.ZodTypeDef,\n  SpanWhereClauseRawInput\n>","input: QuerySpansArgs","SharedQuerySpansRequest","input: GetSchemaArgs","SharedGetSchemaRequest","input: ListDistinctValuesArgs","SharedListDistinctValuesRequest","input: AggregateSpansArgs","SharedAggregateSpansRequest","input: GetTraceArgs","SharedGetTraceSpansRequest","input: GetSpansByIdsArgs","SharedGetSpansByIdsRequest","sections: string[]","metrics: string[]"],"sources":["../src/types.ts","../src/server.ts"],"sourcesContent":["import { z } from \"zod\";\nimport { Timestamp } from \"@use-tusk/drift-schemas/google/protobuf/timestamp\";\nimport { Value } from \"@use-tusk/drift-schemas/google/protobuf/struct\";\nimport {\n  AggregateSpansRequest as SharedAggregateSpansRequest,\n  CastType,\n  DecodeStrategy,\n  GetSchemaRequest as SharedGetSchemaRequest,\n  GetSpansByIdsRequest as SharedGetSpansByIdsRequest,\n  GetTraceSpansRequest as SharedGetTraceSpansRequest,\n  ListDistinctValuesRequest as SharedListDistinctValuesRequest,\n  QuerySpansRequest as SharedQuerySpansRequest,\n  TimeBucket,\n  type FieldAccess as SharedFieldAccess,\n  type FieldPredicate as SharedFieldPredicate,\n  type WhereClause as SharedWhereClause,\n} from \"@use-tusk/drift-schemas/query/span_query\";\nimport {\n  aggregateGroupFieldCodec,\n  aggregateMetricCodec,\n  castTypeCodec,\n  decodeStrategyCodec,\n  selectableSpanFieldCodec,\n  sortDirectionCodec,\n  spanSortFieldCodec,\n  timeBucketCodec,\n  type EnumCodec,\n} from \"@use-tusk/drift-schemas/query/span_query_helpers\";\n\n// ============================================\n// Configuration\n// ============================================\n\nexport interface TuskDriftConfig {\n  /** Base URL for the Tusk Drift API (e.g., https://api.usetusk.ai) */\n  apiBaseUrl: string;\n  /** API key or JWT token for authentication */\n  apiToken: string;\n  /** Optional default observable service ID (can be overridden per request) */\n  observableServiceId?: string;\n}\n\ntype QueryValue = string | number | boolean | null;\n\nfunction enumNameSchema<TName extends string, TValue extends number>(codec: EnumCodec<TName, TValue>) {\n  return z.custom<TName>((value): value is TName => codec.isName(value), {\n    message: `Expected one of: ${codec.names.join(\", \")}`,\n  });\n}\n\nconst queryValueSchema = z.union([z.string(), z.number(), z.boolean(), z.null()]);\n\nconst timestampRangeSchema = z\n  .object({\n    start: z.coerce.date(),\n    end: z.coerce.date(),\n  })\n  .strict();\n\nexport const fieldAccessSchema = z\n  .object({\n    castAs: enumNameSchema(castTypeCodec).optional(),\n    decode: enumNameSchema(decodeStrategyCodec).optional(),\n    thenPath: z.string().regex(/^\\$/, \"JSONPath must start with $\").optional(),\n  })\n  .strict();\n\ntype FieldAccessInput = z.infer<typeof fieldAccessSchema>;\n\nexport const fieldPredicateSchema = z\n  .object({\n    eq: queryValueSchema.optional(),\n    neq: queryValueSchema.optional(),\n    inValues: z.array(queryValueSchema).optional(),\n    notInValues: z.array(queryValueSchema).optional(),\n    gt: queryValueSchema.optional(),\n    gte: queryValueSchema.optional(),\n    lt: queryValueSchema.optional(),\n    lte: queryValueSchema.optional(),\n    contains: z.string().optional(),\n    startsWith: z.string().optional(),\n    endsWith: z.string().optional(),\n    isNull: z.boolean().optional(),\n    betweenTimestamps: timestampRangeSchema.optional(),\n    access: fieldAccessSchema.optional(),\n  })\n  .strict()\n  .refine(\n    (value) =>\n      value.eq !== undefined ||\n      value.neq !== undefined ||\n      value.inValues !== undefined ||\n      value.notInValues !== undefined ||\n      value.gt !== undefined ||\n      value.gte !== undefined ||\n      value.lt !== undefined ||\n      value.lte !== undefined ||\n      value.contains !== undefined ||\n      value.startsWith !== undefined ||\n      value.endsWith !== undefined ||\n      value.isNull !== undefined ||\n      value.betweenTimestamps !== undefined,\n    {\n      message: \"At least one predicate operator is required\",\n    }\n  );\n\ntype FieldPredicateInput = z.infer<typeof fieldPredicateSchema>;\n\ntype SpanWhereClauseArgs = {\n  fields: Record<string, FieldPredicateInput>;\n  and: SpanWhereClauseArgs[];\n  or: SpanWhereClauseArgs[];\n  not?: SpanWhereClauseArgs;\n};\n\ntype SpanWhereClauseRawInput = {\n  fields?: Record<string, FieldPredicateInput>;\n  and?: SpanWhereClauseRawInput[];\n  or?: SpanWhereClauseRawInput[];\n  not?: SpanWhereClauseRawInput;\n};\n\nexport const spanWhereClauseSchema: z.ZodType<\n  SpanWhereClauseArgs,\n  z.ZodTypeDef,\n  SpanWhereClauseRawInput\n> = z.lazy(() =>\n  z\n    .object({\n      fields: z.record(z.string(), fieldPredicateSchema).default({}),\n      and: z.array(spanWhereClauseSchema).default([]),\n      or: z.array(spanWhereClauseSchema).default([]),\n      not: spanWhereClauseSchema.optional(),\n    })\n    .strict()\n    .refine(\n      (value) =>\n        Object.keys(value.fields).length > 0 ||\n        value.and.length > 0 ||\n        value.or.length > 0 ||\n        value.not !== undefined,\n      {\n        message: \"Where clause cannot be empty\",\n      }\n    )\n);\n\n// ============================================\n// API Response Types\n// ============================================\n\nexport interface SpanRecording {\n  id: string;\n  spanId: string;\n  traceId: string;\n  parentSpanId?: string;\n  name: string;\n  kind: number;\n  status: { code: number; message?: string };\n  timestamp: string;\n  duration: number;\n  isRootSpan: boolean;\n  packageName: string;\n  instrumentationName: string;\n  submoduleName?: string;\n  environment?: string;\n  inputValue?: unknown;\n  outputValue?: unknown;\n  inputSchema?: unknown;\n  outputSchema?: unknown;\n  metadata?: unknown;\n}\n\nexport interface TraceSpan extends SpanRecording {\n  children?: TraceSpan[];\n}\n\nexport interface SchemaResult {\n  inputSchema?: unknown;\n  outputSchema?: unknown;\n  exampleSpanRecording?: Partial<SpanRecording>;\n  commonJsonbFields: {\n    inputValue: string[];\n    outputValue: string[];\n  };\n  description?: string;\n}\n\nexport interface DistinctValue {\n  value: unknown;\n  count: number;\n}\n\nexport interface AggregationRow {\n  groupValues: Record<string, unknown>;\n  timeBucket?: string;\n  count: number;\n  errorCount?: number;\n  errorRate?: number;\n  avgDuration?: number;\n  minDuration?: number;\n  maxDuration?: number;\n  p50Duration?: number;\n  p95Duration?: number;\n  p99Duration?: number;\n}\n\n// ============================================\n// Tool Input Schemas\n// ============================================\n\nexport const querySpansInputSchema = z.object({\n  observableServiceId: z.string().optional().describe(\"Service ID to query (required if multiple services available)\"),\n  where: spanWhereClauseSchema.optional().describe(\"Recursive span filter clause\"),\n  orderBy: z\n    .array(\n      z.object({\n        field: enumNameSchema(spanSortFieldCodec),\n        direction: enumNameSchema(sortDirectionCodec),\n      })\n    )\n    .optional()\n    .describe(\"Ordering\"),\n  limit: z.number().min(1).max(100).default(20).describe(\"Max results to return\"),\n  offset: z.number().min(0).default(0).describe(\"Pagination offset\"),\n  includePayloads: z.boolean().default(false).describe(\"Include full inputValue/outputValue (verbose)\"),\n  maxPayloadLength: z.number().min(0).default(500).describe(\"Truncate payload strings to this length\"),\n});\n\nexport const getSchemaInputSchema = z.object({\n  observableServiceId: z.string().optional().describe(\"Service ID to query (required if multiple services available)\"),\n  packageName: z.string().optional().describe(\"Package name (e.g., 'http', 'pg', 'fetch')\"),\n  instrumentationName: z.string().optional().describe(\"Instrumentation name\"),\n  name: z.string().optional().describe(\"Span name to filter by\"),\n  showExample: z.boolean().default(true).describe(\"Include an example span\"),\n  maxPayloadLength: z.number().min(0).default(500).describe(\"Truncate example payload strings\"),\n});\n\nexport const listDistinctValuesInputSchema = z.object({\n  observableServiceId: z.string().optional().describe(\"Service ID to query (required if multiple services available)\"),\n  field: z.string().describe(\"Field to get distinct values for (e.g., 'name', 'packageName', 'outputValue.statusCode')\"),\n  where: spanWhereClauseSchema.optional().describe(\"Filter conditions\"),\n  limit: z.number().min(1).max(100).default(50).describe(\"Max distinct values to return\"),\n});\n\nexport const aggregateSpansInputSchema = z.object({\n  observableServiceId: z.string().optional().describe(\"Service ID to query (required if multiple services available)\"),\n  where: spanWhereClauseSchema.optional().describe(\"Filter conditions\"),\n  groupBy: z\n    .array(enumNameSchema(aggregateGroupFieldCodec))\n    .optional()\n    .describe(\"Fields to group by\"),\n  metrics: z\n    .array(enumNameSchema(aggregateMetricCodec))\n    .min(1)\n    .describe(\"Metrics to calculate\"),\n  timeBucket: enumNameSchema(timeBucketCodec).optional().describe(\"Time bucket for time-series data\"),\n  orderBy: z\n    .object({\n      metric: enumNameSchema(aggregateMetricCodec),\n      direction: enumNameSchema(sortDirectionCodec),\n    })\n    .optional()\n    .describe(\"Order by metric\"),\n  limit: z.number().min(1).max(100).default(20).describe(\"Max results\"),\n});\n\nexport const getTraceInputSchema = z.object({\n  observableServiceId: z.string().optional().describe(\"Service ID to query (required if multiple services available)\"),\n  traceId: z.string().describe(\"Trace ID to fetch\"),\n  includePayloads: z.boolean().default(false).describe(\"Include inputValue/outputValue\"),\n  maxPayloadLength: z.number().min(0).default(500).describe(\"Truncate payload strings\"),\n});\n\nexport const getSpansByIdsInputSchema = z.object({\n  observableServiceId: z.string().optional().describe(\"Service ID to query (required if multiple services available)\"),\n  ids: z.array(z.string()).min(1).max(20).describe(\"Span recording IDs to fetch\"),\n  fields: z.array(enumNameSchema(selectableSpanFieldCodec)).optional().describe(\"Specific fields to return\"),\n  includePayloads: z.boolean().default(true).describe(\"Include inputValue/outputValue\"),\n  maxPayloadLength: z.number().min(0).default(500).describe(\"Truncate payload strings\"),\n});\n\ntype QuerySpansArgs = z.infer<typeof querySpansInputSchema>;\ntype GetSchemaArgs = z.infer<typeof getSchemaInputSchema>;\ntype ListDistinctValuesArgs = z.infer<typeof listDistinctValuesInputSchema>;\ntype AggregateSpansArgs = z.infer<typeof aggregateSpansInputSchema>;\ntype GetTraceArgs = z.infer<typeof getTraceInputSchema>;\ntype GetSpansByIdsArgs = z.infer<typeof getSpansByIdsInputSchema>;\n\nexport type QuerySpansInput = SharedQuerySpansRequest;\nexport type GetSchemaInput = SharedGetSchemaRequest;\nexport type ListDistinctValuesInput = SharedListDistinctValuesRequest;\nexport type AggregateSpansInput = SharedAggregateSpansRequest;\nexport type GetTraceInput = SharedGetTraceSpansRequest;\nexport type GetSpansByIdsInput = SharedGetSpansByIdsRequest;\n\nfunction toProtoValue(value: QueryValue) {\n  return Value.fromJson(value);\n}\n\nfunction toProtoFieldAccess(access?: FieldAccessInput): SharedFieldAccess | undefined {\n  if (!access) {\n    return undefined;\n  }\n\n  return {\n    castAs: access.castAs ? castTypeCodec.byName[access.castAs] : CastType.UNSPECIFIED,\n    decode: access.decode ? decodeStrategyCodec.byName[access.decode] : DecodeStrategy.UNSPECIFIED,\n    thenPath: access.thenPath,\n  };\n}\n\nfunction toProtoFieldPredicate(predicate: FieldPredicateInput): SharedFieldPredicate {\n  return {\n    eq: predicate.eq !== undefined ? toProtoValue(predicate.eq) : undefined,\n    neq: predicate.neq !== undefined ? toProtoValue(predicate.neq) : undefined,\n    inValues: predicate.inValues?.map(toProtoValue) ?? [],\n    notInValues: predicate.notInValues?.map(toProtoValue) ?? [],\n    gt: predicate.gt !== undefined ? toProtoValue(predicate.gt) : undefined,\n    gte: predicate.gte !== undefined ? toProtoValue(predicate.gte) : undefined,\n    lt: predicate.lt !== undefined ? toProtoValue(predicate.lt) : undefined,\n    lte: predicate.lte !== undefined ? toProtoValue(predicate.lte) : undefined,\n    contains: predicate.contains,\n    startsWith: predicate.startsWith,\n    endsWith: predicate.endsWith,\n    isNull: predicate.isNull,\n    betweenTimestamps: predicate.betweenTimestamps\n      ? {\n          start: Timestamp.fromDate(predicate.betweenTimestamps.start),\n          end: Timestamp.fromDate(predicate.betweenTimestamps.end),\n        }\n      : undefined,\n    access: toProtoFieldAccess(predicate.access),\n  };\n}\n\nfunction toProtoWhereClause(where: SpanWhereClauseArgs): SharedWhereClause {\n  return {\n    fields: Object.fromEntries(\n      Object.entries(where.fields).map(([field, predicate]) => [field, toProtoFieldPredicate(predicate)])\n    ),\n    and: where.and.map(toProtoWhereClause),\n    or: where.or.map(toProtoWhereClause),\n    not: where.not ? toProtoWhereClause(where.not) : undefined,\n  };\n}\n\nexport function parseQuerySpansInput(args: Record<string, unknown>): QuerySpansInput {\n  const input: QuerySpansArgs = querySpansInputSchema.parse(args);\n  return SharedQuerySpansRequest.create({\n    observableServiceId: input.observableServiceId ?? \"\",\n    where: input.where ? toProtoWhereClause(input.where) : undefined,\n    orderBy: (input.orderBy ?? []).map((orderBy) => ({\n      field: spanSortFieldCodec.byName[orderBy.field],\n      direction: sortDirectionCodec.byName[orderBy.direction],\n    })),\n    limit: input.limit,\n    offset: input.offset,\n    includePayloads: input.includePayloads,\n    maxPayloadLength: input.maxPayloadLength,\n  });\n}\n\nexport function parseGetSchemaInput(args: Record<string, unknown>): GetSchemaInput {\n  const input: GetSchemaArgs = getSchemaInputSchema.parse(args);\n  return SharedGetSchemaRequest.create({\n    observableServiceId: input.observableServiceId ?? \"\",\n    packageName: input.packageName,\n    instrumentationName: input.instrumentationName,\n    name: input.name,\n    showExample: input.showExample,\n    maxPayloadLength: input.maxPayloadLength,\n  });\n}\n\nexport function parseListDistinctValuesInput(args: Record<string, unknown>): ListDistinctValuesInput {\n  const input: ListDistinctValuesArgs = listDistinctValuesInputSchema.parse(args);\n  return SharedListDistinctValuesRequest.create({\n    observableServiceId: input.observableServiceId ?? \"\",\n    field: input.field,\n    where: input.where ? toProtoWhereClause(input.where) : undefined,\n    limit: input.limit,\n  });\n}\n\nexport function parseAggregateSpansInput(args: Record<string, unknown>): AggregateSpansInput {\n  const input: AggregateSpansArgs = aggregateSpansInputSchema.parse(args);\n  return SharedAggregateSpansRequest.create({\n    observableServiceId: input.observableServiceId ?? \"\",\n    where: input.where ? toProtoWhereClause(input.where) : undefined,\n    groupBy: (input.groupBy ?? []).map((field) => aggregateGroupFieldCodec.byName[field]),\n    metrics: input.metrics.map((metric) => aggregateMetricCodec.byName[metric]),\n    timeBucket: input.timeBucket ? timeBucketCodec.byName[input.timeBucket] : TimeBucket.UNSPECIFIED,\n    orderBy: input.orderBy\n      ? {\n          metric: aggregateMetricCodec.byName[input.orderBy.metric],\n          direction: sortDirectionCodec.byName[input.orderBy.direction],\n        }\n      : undefined,\n    limit: input.limit,\n  });\n}\n\nexport function parseGetTraceInput(args: Record<string, unknown>): GetTraceInput {\n  const input: GetTraceArgs = getTraceInputSchema.parse(args);\n  return SharedGetTraceSpansRequest.create({\n    observableServiceId: input.observableServiceId ?? \"\",\n    traceId: input.traceId,\n    includePayloads: input.includePayloads,\n    maxPayloadLength: input.maxPayloadLength,\n  });\n}\n\nexport function parseGetSpansByIdsInput(args: Record<string, unknown>): GetSpansByIdsInput {\n  const input: GetSpansByIdsArgs = getSpansByIdsInputSchema.parse(args);\n  return SharedGetSpansByIdsRequest.create({\n    observableServiceId: input.observableServiceId ?? \"\",\n    ids: input.ids,\n    fields: (input.fields ?? []).map((field) => selectableSpanFieldCodec.byName[field]),\n    includePayloads: input.includePayloads,\n    maxPayloadLength: input.maxPayloadLength,\n  });\n}\n\n","import { createRequire } from \"node:module\";\nimport { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport type { CreateMcpServerOptions } from \"./provider.js\";\nimport type {\n  TraceSpan,\n  SchemaResult,\n} from \"./types.js\";\nimport {\n  querySpansInputSchema,\n  getSchemaInputSchema,\n  listDistinctValuesInputSchema,\n  aggregateSpansInputSchema,\n  getTraceInputSchema,\n  getSpansByIdsInputSchema,\n  parseQuerySpansInput,\n  parseGetSchemaInput,\n  parseListDistinctValuesInput,\n  parseAggregateSpansInput,\n  parseGetTraceInput,\n  parseGetSpansByIdsInput,\n} from \"./types.js\";\nimport type { QuerySpansResult } from \"./provider.js\";\n\ndeclare const __PACKAGE_VERSION__: string;\ndeclare const __PACKAGE_NAME__: string;\nconst require = createRequire(import.meta.url);\nconst packageJson = require(\"../package.json\") as { name?: string; version?: string };\n\nexport const PACKAGE_VERSION =\n  typeof __PACKAGE_VERSION__ !== \"undefined\"\n    ? __PACKAGE_VERSION__\n    : (packageJson.version ?? \"0.0.0\");\nexport const PACKAGE_NAME =\n  typeof __PACKAGE_NAME__ !== \"undefined\"\n    ? __PACKAGE_NAME__\n    : (packageJson.name ?? \"@use-tusk/drift-mcp\");\n\n// ============================================\n// Response Formatters\n// ============================================\n\nfunction formatQuerySpansResult(result: QuerySpansResult, includePayloads: boolean): string {\n  const summary = [\n    `Found ${result.total} spans (showing ${result.spans.length})`,\n    result.hasMore ? `More results available (offset: ${result.spans.length})` : \"\",\n  ]\n    .filter(Boolean)\n    .join(\"\\n\");\n\n  const spansText = result.spans\n    .map((span, i) => {\n      const lines = [\n        `[${i + 1}] ${span.name}`,\n        `    ID: ${span.id}`,\n        `    Trace: ${span.traceId}`,\n        `    Package: ${span.packageName}`,\n        `    Duration: ${span.duration?.toFixed(2) ?? \"N/A\"}ms`,\n        `    Status: ${span.status?.code === 0 ? \"OK\" : span.status?.code === 1 ? \"UNSET\" : \"ERROR\"}`,\n        `    Timestamp: ${span.timestamp}`,\n      ];\n\n      if (span.inputValue && includePayloads) {\n        lines.push(\n          `    Input: ${JSON.stringify(span.inputValue, null, 2).split(\"\\n\").join(\"\\n    \")}`\n        );\n      }\n      if (span.outputValue && includePayloads) {\n        lines.push(\n          `    Output: ${JSON.stringify(span.outputValue, null, 2).split(\"\\n\").join(\"\\n    \")}`\n        );\n      }\n\n      return lines.join(\"\\n\");\n    })\n    .join(\"\\n\\n\");\n\n  return `${summary}\\n\\n${spansText}`;\n}\n\nfunction formatSchemaResult(result: SchemaResult): string {\n  const sections: string[] = [];\n\n  if (result.description) {\n    sections.push(`## Description\\n${result.description}`);\n  }\n\n  if (result.commonJsonbFields) {\n    sections.push(`## Common Queryable Fields\n\n**inputValue fields:** ${result.commonJsonbFields.inputValue.join(\", \") || \"(none)\"}\n\n**outputValue fields:** ${result.commonJsonbFields.outputValue.join(\", \") || \"(none)\"}`);\n  }\n\n  if (result.inputSchema) {\n    sections.push(\n      `## Input Schema\\n\\`\\`\\`json\\n${JSON.stringify(result.inputSchema, null, 2)}\\n\\`\\`\\``\n    );\n  }\n\n  if (result.outputSchema) {\n    sections.push(\n      `## Output Schema\\n\\`\\`\\`json\\n${JSON.stringify(result.outputSchema, null, 2)}\\n\\`\\`\\``\n    );\n  }\n\n  if (result.exampleSpanRecording) {\n    sections.push(\n      `## Example Span\\n\\`\\`\\`json\\n${JSON.stringify(result.exampleSpanRecording, null, 2)}\\n\\`\\`\\``\n    );\n  }\n\n  return sections.join(\"\\n\\n\") || \"No schema information available.\";\n}\n\nfunction formatTraceTree(span: TraceSpan, indent: number = 0, includePayloads: boolean): string {\n  const prefix = \"  \".repeat(indent);\n  const statusIcon = span.status?.code === 0 ? \"✓\" : span.status?.code === 2 ? \"✗\" : \"○\";\n\n  let result = `${prefix}${statusIcon} ${span.name} (${span.duration?.toFixed(2) ?? \"N/A\"}ms) [${span.packageName}]\\n`;\n  result += `${prefix}   ID: ${span.spanId}\\n`;\n\n  if (includePayloads && span.inputValue) {\n    const inputStr = JSON.stringify(span.inputValue, null, 2).split(\"\\n\").join(`\\n${prefix}   `);\n    result += `${prefix}   Input: ${inputStr}\\n`;\n  }\n\n  if (includePayloads && span.outputValue) {\n    const outputStr = JSON.stringify(span.outputValue, null, 2).split(\"\\n\").join(`\\n${prefix}   `);\n    result += `${prefix}   Output: ${outputStr}\\n`;\n  }\n\n  if (span.children && span.children.length > 0) {\n    for (const child of span.children) {\n      result += formatTraceTree(child, indent + 1, includePayloads);\n    }\n  }\n\n  return result;\n}\n\n// ============================================\n// Default Instructions\n// ============================================\n\nexport const DEFAULT_INSTRUCTIONS = `Search and analyze API traffic span recordings from Tusk Drift.\n\nThis MCP server helps you query, analyze, and debug API traffic including:\n- HTTP requests/responses, database queries, gRPC calls, and more\n- Latency metrics and error rates\n- Distributed traces across services\n\nWorkflow tips:\n- Start with list_distinct_values to discover available endpoints\n- Use query_spans to find specific API calls\n- Use get_trace to debug a request's full call chain\n\nRoot cause analysis workflow:\nIf the user is investigating performance issues or errors, you can consider the following workflow:\n1. Use query_spans or aggregate_spans to identify the problematic endpoint/span\n2. Use get_trace to see the full call chain and identify which child span is the bottleneck\n3. Look at the span's metadata (inputValue/outputValue) to understand the request context\n4. Navigate to the relevant source code using the span name (usually maps to route handlers or functions)\n5. Analyze the code path to understand the root cause (if you have access to the service's source code)\n`;\n\n// ============================================\n// MCP Server Factory\n// ============================================\n\n/**\n * Create an MCP server with Tusk Drift tools.\n * \n * @param options Configuration options including the data provider\n * @returns Configured McpServer instance\n */\nexport function createMcpServer(options: CreateMcpServerOptions): McpServer {\n  const {\n    provider,\n    accessControl,\n    instructions = DEFAULT_INSTRUCTIONS,\n    name = \"tusk-drift\",\n    version = PACKAGE_VERSION,\n  } = options;\n\n  const server = new McpServer(\n    { name, version },\n    {\n      capabilities: { tools: {} },\n      instructions,\n    }\n  );\n\n  // Helper for access control\n  async function checkAccess(observableServiceId: string): Promise<boolean> {\n    if (!accessControl) return true;\n    return accessControl.canAccessService(observableServiceId);\n  }\n\n  // ============================================\n  // Tool: query_spans\n  // ============================================\n  server.registerTool(\n    \"query_spans\",\n    {\n      description: `Search and filter API traffic span recordings.\n\nUse this tool to:\n- Find specific API calls by endpoint name, HTTP method, or status code\n- Search for errors or slow requests\n- Get recent traffic for a specific endpoint\n- Debug specific API calls\n\nExamples:\n- Find failed requests: where = { fields: { \"outputValue.statusCode\": { gte: 400, access: { castAs: \"int\" } } } }\n- Find slow requests: where = { fields: { duration: { gt: 1000 } } }\n- Recent traffic for endpoint: where = { fields: { name: { eq: \"/api/orders\" } } }, limit = 10, orderBy = [{ field: \"timestamp\", direction: \"DESC\" }]`,\n      inputSchema: querySpansInputSchema.shape,\n    },\n    async (args) => {\n      const input = parseQuerySpansInput(args);\n\n      if (input.observableServiceId && !(await checkAccess(input.observableServiceId))) {\n        return {\n          content: [{ type: \"text\" as const, text: \"Error: Access denied to observable service\" }],\n          isError: true,\n        };\n      }\n\n      try {\n        const result = await provider.querySpans(input);\n        return {\n          content: [\n            {\n              type: \"text\" as const,\n              text: formatQuerySpansResult(result, input.includePayloads ?? false),\n            },\n          ],\n        };\n      } catch (error) {\n        return {\n          content: [{ type: \"text\" as const, text: `Error executing query_spans: ${error}` }],\n          isError: true,\n        };\n      }\n    }\n  );\n\n  // ============================================\n  // Tool: get_schema\n  // ============================================\n  server.registerTool(\n    \"get_schema\",\n    {\n      description: `Get schema and structure information for span recordings on Tusk Drift.\n\nUse this tool to:\n- Understand what fields are available for a specific instrumentation type\n- See example payloads for HTTP requests, database queries, etc.\n- Learn what to filter on before querying spans\n\nCommon package names:\n- http: Incoming HTTP requests (has statusCode, method, url, headers)\n- fetch: Outgoing HTTP calls\n- pg: PostgreSQL queries (has db.statement, db.name)\n- grpc: gRPC calls\n- express: Express.js middleware spans`,\n      inputSchema: getSchemaInputSchema.shape,\n    },\n    async (args) => {\n      const input = parseGetSchemaInput(args);\n\n      if (input.observableServiceId && !(await checkAccess(input.observableServiceId))) {\n        return {\n          content: [{ type: \"text\" as const, text: \"Error: Access denied to observable service\" }],\n          isError: true,\n        };\n      }\n\n      try {\n        const result = await provider.getSchema(input);\n        return {\n          content: [{ type: \"text\" as const, text: formatSchemaResult(result) }],\n        };\n      } catch (error) {\n        return {\n          content: [{ type: \"text\" as const, text: `Error executing get_schema: ${error}` }],\n          isError: true,\n        };\n      }\n    }\n  );\n\n  // ============================================\n  // Tool: list_distinct_values\n  // ============================================\n  server.registerTool(\n    \"list_distinct_values\",\n    {\n      description: `List unique values for a field, ordered by frequency.\n\nUse this tool to:\n- Discover available endpoints (field: \"name\")\n- See all instrumentation packages in use (field: \"packageName\")\n- Find unique environments (field: \"environment\")\n- Explore JSONB values like status codes (field: \"outputValue.statusCode\")\n\nThis helps you understand what values exist before building specific queries.`,\n      inputSchema: listDistinctValuesInputSchema.shape,\n    },\n    async (args) => {\n      const input = parseListDistinctValuesInput(args);\n\n      if (input.observableServiceId && !(await checkAccess(input.observableServiceId))) {\n        return {\n          content: [{ type: \"text\" as const, text: \"Error: Access denied to observable service\" }],\n          isError: true,\n        };\n      }\n\n      try {\n        const result = await provider.listDistinctValues(input);\n        const header = `Distinct values for \"${result.field}\" (${result.values.length} unique values):\\n`;\n        const valuesList = result.values\n          .map((v, i) => {\n            const valueStr = typeof v.value === \"string\" ? v.value : JSON.stringify(v.value);\n            return `${i + 1}. ${valueStr} (${v.count} occurrences)`;\n          })\n          .join(\"\\n\");\n\n        return {\n          content: [{ type: \"text\" as const, text: header + valuesList }],\n        };\n      } catch (error) {\n        return {\n          content: [\n            { type: \"text\" as const, text: `Error executing list_distinct_values: ${error}` },\n          ],\n          isError: true,\n        };\n      }\n    }\n  );\n\n  // ============================================\n  // Tool: aggregate_spans\n  // ============================================\n  server.registerTool(\n    \"aggregate_spans\",\n    {\n      description: `Calculate aggregated metrics and statistics across spans.\n\nUse this tool to:\n- Get latency percentiles for endpoints (p50, p95, p99)\n- Calculate error rates by endpoint\n- Get request counts over time\n- Compare performance across environments\n\nExamples:\n- Endpoint latency: groupBy = [\"name\"], metrics = [\"count\", \"avgDuration\", \"p95Duration\"]\n- Error rates: groupBy = [\"name\"], metrics = [\"count\", \"errorCount\", \"errorRate\"]\n- Hourly trends: timeBucket = \"hour\", metrics = [\"count\", \"errorRate\"]`,\n      inputSchema: aggregateSpansInputSchema.shape,\n    },\n    async (args) => {\n      const input = parseAggregateSpansInput(args);\n\n      if (input.observableServiceId && !(await checkAccess(input.observableServiceId))) {\n        return {\n          content: [{ type: \"text\" as const, text: \"Error: Access denied to observable service\" }],\n          isError: true,\n        };\n      }\n\n      try {\n        const result = await provider.aggregateSpans(input);\n        const header = `Aggregation Results (${result.results.length} rows):\\n`;\n\n        const rows = result.results\n          .map((row, i) => {\n            const groupStr = Object.entries(row.groupValues || {})\n              .map(([k, v]) => `${k}=${v}`)\n              .join(\", \");\n\n            const metrics: string[] = [];\n            if (row.count !== undefined) metrics.push(`count: ${row.count}`);\n            if (row.errorCount !== undefined) metrics.push(`errors: ${row.errorCount}`);\n            if (row.errorRate !== undefined)\n              metrics.push(`error rate: ${(row.errorRate * 100).toFixed(2)}%`);\n            if (row.avgDuration !== undefined) metrics.push(`avg: ${row.avgDuration.toFixed(2)}ms`);\n            if (row.minDuration !== undefined) metrics.push(`min: ${row.minDuration.toFixed(2)}ms`);\n            if (row.maxDuration !== undefined) metrics.push(`max: ${row.maxDuration.toFixed(2)}ms`);\n            if (row.p50Duration !== undefined) metrics.push(`p50: ${row.p50Duration.toFixed(2)}ms`);\n            if (row.p95Duration !== undefined) metrics.push(`p95: ${row.p95Duration.toFixed(2)}ms`);\n            if (row.p99Duration !== undefined) metrics.push(`p99: ${row.p99Duration.toFixed(2)}ms`);\n\n            const timeBucketStr = row.timeBucket ? ` [${row.timeBucket}]` : \"\";\n\n            return `${i + 1}. ${groupStr || \"(all)\"}${timeBucketStr}\\n   ${metrics.join(\" | \")}`;\n          })\n          .join(\"\\n\\n\");\n\n        return {\n          content: [{ type: \"text\" as const, text: header + rows }],\n        };\n      } catch (error) {\n        return {\n          content: [{ type: \"text\" as const, text: `Error executing aggregate_spans: ${error}` }],\n          isError: true,\n        };\n      }\n    }\n  );\n\n  // ============================================\n  // Tool: get_trace\n  // ============================================\n  server.registerTool(\n    \"get_trace\",\n    {\n      description: `Get all spans in a distributed trace as a hierarchical tree.\n\nUse this tool to:\n- Debug a specific request end-to-end\n- See the full call chain from HTTP request to database queries\n- Understand timing and dependencies between spans\n- Identify bottlenecks in a request\n\nFirst use query_spans to find spans, then use the traceId to get the full trace.`,\n      inputSchema: getTraceInputSchema.shape,\n    },\n    async (args) => {\n      const input = parseGetTraceInput(args);\n\n      if (input.observableServiceId && !(await checkAccess(input.observableServiceId))) {\n        return {\n          content: [{ type: \"text\" as const, text: \"Error: Access denied to observable service\" }],\n          isError: true,\n        };\n      }\n\n      try {\n        const result = await provider.getTrace(input);\n\n        if (!result.traceTree) {\n          return {\n            content: [{ type: \"text\" as const, text: `No trace found for ID: ${input.traceId}` }],\n          };\n        }\n\n        const header = `Trace: ${input.traceId}\\nSpan Count: ${result.spanCount}\\n\\nTrace Tree:\\n`;\n        const tree = formatTraceTree(result.traceTree, 0, input.includePayloads ?? false);\n\n        return {\n          content: [{ type: \"text\" as const, text: header + tree }],\n        };\n      } catch (error) {\n        return {\n          content: [{ type: \"text\" as const, text: `Error executing get_trace: ${error}` }],\n          isError: true,\n        };\n      }\n    }\n  );\n\n  // ============================================\n  // Tool: get_spans_by_ids\n  // ============================================\n  server.registerTool(\n    \"get_spans_by_ids\",\n    {\n      description: `Fetch specific span recordings by their IDs.\n\nUse this tool when you have span IDs from a previous query and need the full details including payloads.\n\nThis is useful for:\n- Getting full details for spans found via query_spans\n- Examining specific requests in detail\n- Comparing multiple specific spans`,\n      inputSchema: getSpansByIdsInputSchema.shape,\n    },\n    async (args) => {\n      const input = parseGetSpansByIdsInput(args);\n\n      if (input.observableServiceId && !(await checkAccess(input.observableServiceId))) {\n        return {\n          content: [{ type: \"text\" as const, text: \"Error: Access denied to observable service\" }],\n          isError: true,\n        };\n      }\n\n      try {\n        const result = await provider.getSpansByIds(input);\n\n        if (result.spans.length === 0) {\n          return {\n            content: [{ type: \"text\" as const, text: \"No spans found for the provided IDs.\" }],\n          };\n        }\n\n        const spansText = result.spans\n          .map((span, i) => {\n            const lines = [\n              `## Span ${i + 1}: ${span.name}`,\n              `- **ID:** ${span.id}`,\n              `- **Trace ID:** ${span.traceId}`,\n              `- **Span ID:** ${span.spanId}`,\n              `- **Package:** ${span.packageName}`,\n              `- **Duration:** ${span.duration?.toFixed(2) ?? \"N/A\"}ms`,\n              `- **Status:** ${span.status?.code === 0 ? \"OK\" : span.status?.code === 1 ? \"UNSET\" : \"ERROR\"}`,\n              `- **Timestamp:** ${span.timestamp}`,\n              `- **Root Span:** ${span.isRootSpan ? \"Yes\" : \"No\"}`,\n            ];\n\n            if (span.inputValue) {\n              lines.push(\n                `\\n**Input:**\\n\\`\\`\\`json\\n${JSON.stringify(span.inputValue, null, 2)}\\n\\`\\`\\``\n              );\n            }\n\n            if (span.outputValue) {\n              lines.push(\n                `\\n**Output:**\\n\\`\\`\\`json\\n${JSON.stringify(span.outputValue, null, 2)}\\n\\`\\`\\``\n              );\n            }\n\n            return lines.join(\"\\n\");\n          })\n          .join(\"\\n\\n---\\n\\n\");\n\n        return {\n          content: [\n            { type: \"text\" as const, text: `Found ${result.spans.length} spans:\\n\\n${spansText}` },\n          ],\n        };\n      } catch (error) {\n        return {\n          content: [{ type: \"text\" as const, text: `Error executing get_spans_by_ids: ${error}` }],\n          isError: true,\n        };\n      }\n    }\n  );\n\n  return server;\n}\n"],"mappings":"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"}