@zigrivers/surface-mcp 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +22 -0
- package/README.md +15 -0
- package/dist/index.d.ts +136 -0
- package/dist/index.js +1030 -0
- package/dist/index.js.map +1 -0
- package/package.json +59 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["import { pathToFileURL } from \"node:url\";\n\nimport {\n DEFAULT_COMPOSITION_STAGE_IDS,\n DEFAULT_SURFACE_CONFIG,\n createBoundedAlternatives,\n createTrackedFinding,\n createSurfaceComposition,\n createSurfaceError,\n diffTrackedFindings,\n err,\n instantiateLensExecutionPlan,\n isOk,\n ok,\n scoreFinding,\n selectLensExecutionPlan,\n synthesizeBacklog,\n toMcpError,\n transitionTrackedFinding,\n type AlternativesReportData,\n type Evidence,\n type Finding,\n type TrackedFinding,\n type ValidationCheck,\n type Result,\n type SurfaceConfig,\n type SurfaceComposition,\n type SurfaceCompositionOptions,\n type SurfaceError,\n} from \"@zigrivers/surface-core\";\nimport type {\n Backlog,\n Baseline,\n Capture,\n GateResult,\n IssueExport,\n ProjectRunRecord,\n ProjectStateSnapshot,\n Target,\n} from \"@zigrivers/surface-core/interfaces\";\nimport { z } from \"zod\";\n\nexport const SURFACE_MCP_SERVER_NAME = \"surface\";\nexport const SURFACE_MCP_SERVER_VERSION = \"1.0.0\";\nexport const SURFACE_MCP_TOOL_SCHEMA_VERSION = \"1.0.0\";\n\nconst TOOL_ORDER = [\n \"surface_capture\",\n \"surface_audit\",\n \"surface_explain\",\n \"surface_backlog\",\n \"surface_gate\",\n \"surface_validate\",\n \"surface_baseline\",\n \"surface_verdict\",\n \"surface_diff\",\n \"surface_alternatives\",\n \"surface_trace\",\n \"surface_run\",\n \"surface_next\",\n \"surface_status\",\n] as const;\n\nexport type SurfaceMcpToolName = (typeof TOOL_ORDER)[number];\nexport type JsonSchema = Record<string, unknown>;\n\nexport type SurfaceMcpToolDefinition = {\n readonly name: SurfaceMcpToolName;\n readonly title: string;\n readonly description: string;\n readonly schemaVersion: string;\n readonly inputSchema: JsonSchema;\n};\n\ntype InternalSurfaceMcpToolDefinition = SurfaceMcpToolDefinition & {\n readonly inputZodSchema: z.ZodType;\n};\n\nexport type SurfaceMcpToolRegistry = {\n readonly serverInfo: {\n readonly name: typeof SURFACE_MCP_SERVER_NAME;\n readonly version: typeof SURFACE_MCP_SERVER_VERSION;\n };\n listTools(): readonly SurfaceMcpToolDefinition[];\n getTool(name: SurfaceMcpToolName): SurfaceMcpToolDefinition | undefined;\n};\n\nexport type SurfaceMcpServer = {\n readonly composition: SurfaceComposition;\n readonly registry: SurfaceMcpToolRegistry;\n callTool<TName extends SurfaceMcpToolName>(\n name: TName,\n input: unknown,\n ): Promise<Result<SurfaceMcpToolOutputMap[TName]>>;\n listTools(): readonly SurfaceMcpToolDefinition[];\n};\n\nexport type SurfaceMcpServerOptions = SurfaceCompositionOptions & {\n readonly composition?: SurfaceComposition;\n};\n\nexport type McpToolSchemaCompatibilityInput = {\n readonly current: Pick<SurfaceMcpToolDefinition, \"inputSchema\" | \"name\" | \"schemaVersion\">;\n readonly next: Pick<SurfaceMcpToolDefinition, \"inputSchema\" | \"name\" | \"schemaVersion\">;\n};\n\nexport type SurfaceMcpAuditOutput = {\n readonly runId: string;\n readonly backlog: Backlog;\n readonly capture: Capture;\n readonly findings: readonly Finding[];\n readonly skippedLenses: readonly {\n readonly lensId: string;\n readonly message: string;\n readonly reason: string;\n }[];\n};\n\nexport type SurfaceMcpExplainOutput = {\n readonly finding: Finding;\n readonly rationale: string;\n readonly evidence: readonly Evidence[];\n};\n\nexport type SurfaceMcpStatusOutput = {\n readonly currentStage: string;\n readonly progress: {\n readonly completedRuns: number;\n readonly failedRuns: number;\n readonly findings: number;\n };\n readonly runHistory: readonly {\n readonly runId: string;\n readonly status: \"completed\" | \"failed\";\n readonly target?: Target;\n readonly findings: number;\n }[];\n};\n\nexport type SurfaceMcpValidationOutput = {\n readonly checks: readonly {\n readonly id: string;\n readonly findingId?: string;\n readonly passed: boolean;\n readonly validation: ValidationCheck;\n }[];\n};\n\nexport type SurfaceMcpBaselineOutput = {\n readonly baselineId: string;\n readonly count: number;\n readonly reason?: string;\n};\n\nexport type SurfaceMcpVerdictOutput = {\n readonly findingId: string;\n readonly decision: \"accept\" | \"reject\" | \"correct\" | \"defer\";\n readonly rationale: string;\n};\n\nexport type SurfaceMcpDiffOutput = {\n readonly resolved: readonly SurfaceMcpDiffEntry[];\n readonly regressed: readonly SurfaceMcpDiffEntry[];\n readonly introduced: readonly SurfaceMcpDiffEntry[];\n readonly stillFailing: readonly SurfaceMcpDiffEntry[];\n readonly identityBroken: readonly SurfaceMcpDiffEntry[];\n};\n\nexport type SurfaceMcpDiffEntry = {\n readonly findingId?: string;\n readonly identityKey: string;\n readonly status: TrackedFinding[\"status\"];\n};\n\nexport type SurfaceMcpTraceOutput = {\n readonly trackedFinding: TrackedFinding;\n};\n\nexport type SurfaceMcpAlternativesOutput = {\n readonly alternatives: AlternativesReportData;\n};\n\nexport type SurfaceMcpRunOutput = {\n readonly runId: string;\n readonly stage: string;\n readonly status: \"completed\";\n};\n\nexport type SurfaceMcpNextOutput = {\n readonly eligible: readonly string[];\n};\n\nexport type SurfaceMcpToolOutputMap = {\n readonly surface_capture: Capture;\n readonly surface_audit: SurfaceMcpAuditOutput;\n readonly surface_explain: SurfaceMcpExplainOutput;\n readonly surface_backlog: Backlog | IssueExport;\n readonly surface_status: SurfaceMcpStatusOutput;\n readonly surface_gate: GateResult;\n readonly surface_validate: SurfaceMcpValidationOutput;\n readonly surface_baseline: SurfaceMcpBaselineOutput;\n readonly surface_verdict: SurfaceMcpVerdictOutput;\n readonly surface_diff: SurfaceMcpDiffOutput;\n readonly surface_alternatives: SurfaceMcpAlternativesOutput;\n readonly surface_trace: SurfaceMcpTraceOutput;\n readonly surface_run: SurfaceMcpRunOutput;\n readonly surface_next: SurfaceMcpNextOutput;\n};\n\nexport type SurfaceMcpToolOutput = SurfaceMcpToolOutputMap[SurfaceMcpToolName];\n\nconst TargetSchema = z\n .object({\n kind: z.enum([\"url\", \"localhost\", \"route\", \"screenshot\", \"component\", \"dom\"]),\n ref: z.string().min(1),\n theme: z.enum([\"light\", \"dark\"]).optional(),\n viewport: z\n .object({\n height: z.number().int().positive(),\n label: z.enum([\"mobile\", \"tablet\", \"desktop\"]),\n width: z.number().int().positive(),\n })\n .strict()\n .optional(),\n })\n .strict();\nconst AuthStateRefSchema = z.string().min(1);\nconst RunRefSchema = z.object({ runId: z.string().min(1) }).strict();\nconst GatePolicyInputSchema = z.record(z.string(), z.unknown());\ntype ExecutablePipelineStageId = (typeof DEFAULT_COMPOSITION_STAGE_IDS)[number];\n\nconst TOOL_INPUT_SCHEMAS = {\n surface_capture: z\n .object({\n authState: AuthStateRefSchema.optional(),\n target: TargetSchema,\n })\n .strict(),\n surface_audit: z\n .object({\n authState: AuthStateRefSchema.optional(),\n depth: z\n .union([z.literal(1), z.literal(2), z.literal(3), z.literal(4), z.literal(5)])\n .optional(),\n persona: z.string().min(1).optional(),\n preset: z.string().min(1).optional(),\n target: TargetSchema,\n task: z.string().min(1).optional(),\n })\n .strict(),\n surface_explain: z.object({ findingId: z.string().min(1) }).strict(),\n surface_backlog: z\n .object({\n exportTarget: z.string().min(1).optional(),\n runId: z.string().min(1).optional(),\n })\n .strict(),\n surface_gate: z\n .object({\n policy: GatePolicyInputSchema.optional(),\n runId: z.string().min(1).optional(),\n })\n .strict(),\n surface_validate: z.object({ runId: z.string().min(1) }).strict(),\n surface_baseline: z.object({ reason: z.string().min(1).optional() }).strict(),\n surface_verdict: z\n .object({\n decision: z.enum([\"accept\", \"reject\", \"correct\", \"defer\"]),\n findingId: z.string().min(1),\n rationale: z.string().min(1),\n })\n .strict(),\n surface_diff: z.object({ after: RunRefSchema, before: RunRefSchema }).strict(),\n surface_alternatives: z\n .object({\n authState: AuthStateRefSchema.optional(),\n target: TargetSchema,\n })\n .strict(),\n surface_trace: z.object({ findingId: z.string().min(1) }).strict(),\n surface_run: z\n .object({\n step: z.string().min(1),\n target: TargetSchema.optional(),\n })\n .strict(),\n surface_next: z.object({}).strict(),\n surface_status: z.object({}).strict(),\n} as const satisfies Record<SurfaceMcpToolName, z.ZodType>;\n\nconst TOOL_METADATA = {\n surface_capture: {\n title: \"Capture Target\",\n description: \"Capture a target into Surface artifacts.\",\n },\n surface_audit: {\n title: \"Audit Target\",\n description: \"Run a Surface audit over a target.\",\n },\n surface_explain: {\n title: \"Explain Finding\",\n description: \"Explain one Surface finding with evidence.\",\n },\n surface_backlog: {\n title: \"Read Backlog\",\n description: \"Return or export the implementation backlog.\",\n },\n surface_gate: {\n title: \"Evaluate Gate\",\n description: \"Evaluate the configured Surface quality gate.\",\n },\n surface_validate: {\n title: \"Validate Run\",\n description: \"Run validation checks for an audit run.\",\n },\n surface_baseline: {\n title: \"Create Baseline\",\n description: \"Baseline current findings for future gate comparisons.\",\n },\n surface_verdict: {\n title: \"Record Verdict\",\n description: \"Record a human verdict for a finding.\",\n },\n surface_diff: {\n title: \"Diff Runs\",\n description: \"Compare findings across two audit runs.\",\n },\n surface_alternatives: {\n title: \"Suggest Alternatives\",\n description: \"Suggest bounded alternatives for a target.\",\n },\n surface_trace: {\n title: \"Trace Finding\",\n description: \"Trace a finding through closed-loop state.\",\n },\n surface_run: {\n title: \"Run Pipeline Step\",\n description: \"Run a Surface pipeline step.\",\n },\n surface_next: {\n title: \"List Next Steps\",\n description: \"List eligible Surface pipeline steps.\",\n },\n surface_status: {\n title: \"Read Status\",\n description: \"Read Surface project status.\",\n },\n} as const satisfies Record<\n SurfaceMcpToolName,\n { readonly title: string; readonly description: string }\n>;\n\nconst INTERNAL_TOOLS = TOOL_ORDER.map((name) => {\n const metadata = TOOL_METADATA[name];\n const inputZodSchema = TOOL_INPUT_SCHEMAS[name];\n\n return {\n name,\n ...metadata,\n inputZodSchema,\n inputSchema: z.toJSONSchema(inputZodSchema),\n schemaVersion: SURFACE_MCP_TOOL_SCHEMA_VERSION,\n };\n}) satisfies readonly InternalSurfaceMcpToolDefinition[];\n\nexport function createSurfaceMcpToolRegistry(): SurfaceMcpToolRegistry {\n const toolsByName = new Map<SurfaceMcpToolName, InternalSurfaceMcpToolDefinition>(\n INTERNAL_TOOLS.map((tool) => [tool.name, tool]),\n );\n\n return {\n serverInfo: {\n name: SURFACE_MCP_SERVER_NAME,\n version: SURFACE_MCP_SERVER_VERSION,\n },\n getTool: (name) => {\n const tool = toolsByName.get(name);\n\n return tool === undefined ? undefined : publicToolDefinition(tool);\n },\n listTools: () => INTERNAL_TOOLS.map(publicToolDefinition),\n };\n}\n\nexport function createSurfaceMcpServer(options: SurfaceMcpServerOptions = {}): SurfaceMcpServer {\n const registry = createSurfaceMcpToolRegistry();\n const composition = options.composition ?? createSurfaceComposition(options);\n const session = createSurfaceMcpSessionState();\n\n return {\n composition,\n callTool: async (name, input) => {\n const hydrated = await hydrateSurfaceMcpSession(composition, session);\n\n if (!hydrated.ok) {\n return hydrated;\n }\n\n return (await callSurfaceMcpTool({\n composition,\n input,\n name,\n session,\n })) as Result<SurfaceMcpToolOutputMap[typeof name]>;\n },\n registry,\n listTools: () => registry.listTools(),\n };\n}\n\nexport function createMcpToolSchemaSnapshot(\n registry: SurfaceMcpToolRegistry = createSurfaceMcpToolRegistry(),\n): readonly Pick<SurfaceMcpToolDefinition, \"inputSchema\" | \"name\" | \"schemaVersion\">[] {\n return registry.listTools().map((tool) => ({\n inputSchema: tool.inputSchema,\n name: tool.name,\n schemaVersion: tool.schemaVersion,\n }));\n}\n\nexport function assertMcpToolSchemaCompatibility(\n input: McpToolSchemaCompatibilityInput,\n): Result<true, SurfaceError> {\n if (input.current.name !== input.next.name) {\n return mcpSchemaIncompatible(\n \"MCP tool names cannot change without a major version bump.\",\n input,\n );\n }\n\n if (!hasMajorVersionIncrement(input.current.schemaVersion, input.next.schemaVersion)) {\n const currentRequired = requiredFields(input.current.inputSchema);\n const nextRequired = requiredFields(input.next.inputSchema);\n const addedRequired = [...nextRequired].filter((field) => !currentRequired.has(field));\n\n if (addedRequired.length > 0) {\n return mcpSchemaIncompatible(\n \"MCP tool schema added required fields without a major version bump.\",\n input,\n { addedRequired },\n );\n }\n }\n\n return ok(true);\n}\n\ntype SurfaceMcpSessionState = {\n readonly baselines: Map<string, SurfaceMcpBaselineRecord>;\n readonly baselineOrder: string[];\n readonly runs: Map<string, SurfaceMcpRunRecord>;\n readonly runOrder: string[];\n readonly trackedByIdentity: Map<string, TrackedFinding>;\n readonly verdicts: Map<string, SurfaceMcpVerdictOutput>;\n nextBaselineSequence: number;\n nextRunSequence: number;\n};\n\ntype SurfaceMcpRunRecord = {\n readonly runId: string;\n readonly status: \"completed\" | \"failed\";\n readonly backlog: Backlog;\n readonly capture: Capture;\n readonly findings: readonly Finding[];\n readonly skippedLenses: SurfaceMcpAuditOutput[\"skippedLenses\"];\n readonly trackedFindings: readonly TrackedFinding[];\n};\n\ntype SurfaceMcpBaselineRecord = {\n readonly baselineId: string;\n readonly identityKeys: ReadonlySet<string>;\n readonly reason?: string;\n};\n\ntype CallSurfaceMcpToolInput = {\n readonly composition: SurfaceComposition;\n readonly input: unknown;\n readonly name: SurfaceMcpToolName;\n readonly session: SurfaceMcpSessionState;\n};\n\nfunction createSurfaceMcpSessionState(): SurfaceMcpSessionState {\n return {\n baselines: new Map(),\n baselineOrder: [],\n runs: new Map(),\n runOrder: [],\n trackedByIdentity: new Map(),\n verdicts: new Map(),\n nextBaselineSequence: 1,\n nextRunSequence: 1,\n };\n}\n\nasync function hydrateSurfaceMcpSession(\n composition: SurfaceComposition,\n session: SurfaceMcpSessionState,\n): Promise<Result<void>> {\n const state = await composition.stateStore.readState();\n\n if (!state.ok) {\n return state;\n }\n\n resetSurfaceMcpSessionFromState(session, state.value);\n\n return ok(undefined);\n}\n\nfunction resetSurfaceMcpSessionFromState(\n session: SurfaceMcpSessionState,\n state: ProjectStateSnapshot,\n): void {\n session.baselines.clear();\n session.baselineOrder.length = 0;\n session.runs.clear();\n session.runOrder.length = 0;\n session.trackedByIdentity.clear();\n session.verdicts.clear();\n\n for (const trackedFinding of state.trackedFindings ?? []) {\n session.trackedByIdentity.set(trackedFinding.identityKey, trackedFinding);\n }\n\n for (const record of state.runRecords ?? []) {\n const mcpRecord = surfaceMcpRunRecordFromProjectRecord(record);\n\n if (mcpRecord === undefined) {\n continue;\n }\n\n session.runs.set(mcpRecord.runId, mcpRecord);\n session.runOrder.push(mcpRecord.runId);\n\n for (const trackedFinding of mcpRecord.trackedFindings) {\n session.trackedByIdentity.set(trackedFinding.identityKey, trackedFinding);\n }\n }\n\n for (const baseline of state.baselines ?? []) {\n const mcpBaseline = surfaceMcpBaselineFromProjectBaseline(baseline);\n session.baselines.set(mcpBaseline.baselineId, mcpBaseline);\n session.baselineOrder.push(mcpBaseline.baselineId);\n }\n\n for (const verdict of state.verdicts ?? []) {\n if (isSurfaceMcpVerdict(verdict)) {\n session.verdicts.set(verdict.findingId, verdict);\n }\n }\n\n session.nextRunSequence = nextSequenceFromIds(session.runOrder, \"run_mcp_\");\n session.nextBaselineSequence = nextSequenceFromIds(session.baselineOrder, \"baseline_mcp_\");\n}\n\nfunction surfaceMcpRunRecordFromProjectRecord(\n record: ProjectRunRecord,\n): SurfaceMcpRunRecord | undefined {\n if (\n record.backlog === undefined ||\n record.capture === undefined ||\n record.findings === undefined ||\n record.status === undefined ||\n record.skippedLenses === undefined\n ) {\n return undefined;\n }\n\n return {\n backlog: record.backlog,\n capture: record.capture,\n findings: record.findings,\n runId: record.runId,\n skippedLenses: record.skippedLenses,\n status: record.status,\n trackedFindings: record.trackedFindings,\n };\n}\n\nfunction surfaceMcpBaselineFromProjectBaseline(baseline: Baseline): SurfaceMcpBaselineRecord {\n return {\n baselineId: baseline.baselineId,\n identityKeys: new Set(baseline.identityKeys),\n ...(baseline.reason === undefined ? {} : { reason: baseline.reason }),\n };\n}\n\nfunction isSurfaceMcpVerdict(verdict: {\n readonly decision: string;\n readonly findingId: string;\n readonly rationale: string;\n}): verdict is SurfaceMcpVerdictOutput {\n return (\n verdict.decision === \"accept\" ||\n verdict.decision === \"reject\" ||\n verdict.decision === \"correct\" ||\n verdict.decision === \"defer\"\n );\n}\n\nasync function persistSurfaceMcpSession(\n composition: SurfaceComposition,\n session: SurfaceMcpSessionState,\n): Promise<Result<void>> {\n const updateState = stateSnapshotForMcpSession(session);\n\n if (composition.stateStore.updateState !== undefined) {\n const updated = await composition.stateStore.updateState(updateState);\n\n return updated.ok ? ok(undefined) : updated;\n }\n\n const current = await composition.stateStore.readState();\n\n if (!current.ok) {\n return current;\n }\n\n const written = await composition.stateStore.writeState(updateState(current.value));\n\n return written.ok ? ok(undefined) : written;\n}\n\nfunction stateSnapshotForMcpSession(\n session: SurfaceMcpSessionState,\n): (state: ProjectStateSnapshot) => ProjectStateSnapshot {\n return (state) => {\n const runRecords = session.runOrder\n .map((runId) => session.runs.get(runId))\n .filter((record): record is SurfaceMcpRunRecord => record !== undefined)\n .map(projectRunRecordFromSurfaceMcpRecord);\n const latestRun = runRecords.at(-1);\n const baselines = session.baselineOrder\n .map((baselineId) => session.baselines.get(baselineId))\n .filter((baseline): baseline is SurfaceMcpBaselineRecord => baseline !== undefined)\n .map(projectBaselineFromSurfaceMcpBaseline);\n const trackedFindings = [...session.trackedByIdentity.values()];\n const verdicts = [...session.verdicts.values()];\n const currentStage = latestRun?.status ?? state.currentStage;\n\n return {\n ...state,\n ...(latestRun?.backlog === undefined ? {} : { backlog: latestRun.backlog }),\n ...(currentStage === undefined ? {} : { currentStage }),\n ...(latestRun?.findings === undefined ? {} : { findings: latestRun.findings }),\n baselines,\n runRecords,\n trackedFindings,\n verdicts,\n };\n };\n}\n\nfunction projectRunRecordFromSurfaceMcpRecord(record: SurfaceMcpRunRecord): ProjectRunRecord {\n return {\n backlog: record.backlog,\n capture: record.capture,\n findings: record.findings,\n runId: record.runId,\n skippedLenses: record.skippedLenses,\n status: record.status,\n trackedFindings: record.trackedFindings,\n };\n}\n\nfunction projectBaselineFromSurfaceMcpBaseline(baseline: SurfaceMcpBaselineRecord): Baseline {\n return {\n baselineId: baseline.baselineId,\n identityKeys: [...baseline.identityKeys],\n ...(baseline.reason === undefined ? {} : { reason: baseline.reason }),\n waivers: [],\n };\n}\n\nfunction nextSequenceFromIds(ids: readonly string[], prefix: string): number {\n let maxSequence = 0;\n\n for (const id of ids) {\n if (!id.startsWith(prefix)) {\n continue;\n }\n\n const sequence = Number.parseInt(id.slice(prefix.length), 10);\n\n if (Number.isInteger(sequence)) {\n maxSequence = Math.max(maxSequence, sequence);\n }\n }\n\n return maxSequence + 1;\n}\n\nasync function callSurfaceMcpTool(\n input: CallSurfaceMcpToolInput,\n): Promise<Result<SurfaceMcpToolOutput>> {\n switch (input.name) {\n case \"surface_capture\":\n return await callSurfaceCapture(input.composition, input.input);\n case \"surface_audit\":\n return await callSurfaceAudit(input.composition, input.session, input.input);\n case \"surface_explain\":\n return callSurfaceExplain(input.session, input.input);\n case \"surface_backlog\":\n return await callSurfaceBacklog(input.composition, input.session, input.input);\n case \"surface_gate\":\n return await callSurfaceGate(input.composition, input.session, input.input);\n case \"surface_validate\":\n return callSurfaceValidate(input.session, input.input);\n case \"surface_baseline\":\n return await callSurfaceBaseline(input.composition, input.session, input.input);\n case \"surface_verdict\":\n return await callSurfaceVerdict(input.composition, input.session, input.input);\n case \"surface_diff\":\n return callSurfaceDiff(input.session, input.input);\n case \"surface_alternatives\":\n return await callSurfaceAlternatives(input.composition, input.input);\n case \"surface_trace\":\n return callSurfaceTrace(input.session, input.input);\n case \"surface_run\":\n return await callSurfaceRun(input.composition, input.input);\n case \"surface_next\":\n return await callSurfaceNext(input.composition);\n case \"surface_status\":\n return callSurfaceStatus(input.session);\n }\n}\n\nasync function callSurfaceCapture(\n composition: SurfaceComposition,\n rawInput: unknown,\n): Promise<Result<Capture>> {\n const parsed = parseToolInput(\"surface_capture\", rawInput);\n\n if (!parsed.ok) {\n return parsed;\n }\n\n return await composition.captureService.capture(\n targetForCore(parsed.value.target),\n captureOptionsFor(DEFAULT_SURFACE_CONFIG, parsed.value.authState),\n );\n}\n\nasync function callSurfaceAudit(\n composition: SurfaceComposition,\n session: SurfaceMcpSessionState,\n rawInput: unknown,\n): Promise<Result<SurfaceMcpAuditOutput>> {\n const parsed = parseToolInput(\"surface_audit\", rawInput);\n\n if (!parsed.ok) {\n return parsed;\n }\n\n const config = configForAuditInput(parsed.value);\n const capture = await composition.captureService.capture(\n targetForCore(parsed.value.target),\n captureOptionsFor(config, parsed.value.authState),\n );\n\n if (!capture.ok) {\n return capture;\n }\n\n const evidence = await groundingEvidenceFor(composition, capture.value);\n\n if (!evidence.ok) {\n return evidence;\n }\n\n const plan = selectLensExecutionPlan({\n capture: capture.value,\n config,\n modelAvailability: {\n available: false,\n message: \"No MCP model provider is configured.\",\n reason: \"no-model-configured\",\n },\n registry: composition.lensRegistry,\n });\n const findings = await findingsForPlan(composition, config, capture.value, evidence.value, plan);\n\n if (!findings.ok) {\n return findings;\n }\n\n const runId = nextRunId(session);\n const backlog = synthesizeBacklog(runId, findings.value);\n\n if (!backlog.ok) {\n return backlog;\n }\n\n const trackedFindings = trackedFindingsForRun(session, runId, findings.value);\n\n const record: SurfaceMcpRunRecord = {\n backlog: backlog.value,\n capture: capture.value,\n findings: findings.value,\n runId,\n skippedLenses: plan.skipped,\n status: \"completed\",\n trackedFindings,\n };\n session.runs.set(runId, record);\n session.runOrder.push(runId);\n\n const persisted = await persistSurfaceMcpSession(composition, session);\n\n if (!persisted.ok) {\n return persisted;\n }\n\n return ok({\n backlog: record.backlog,\n capture: record.capture,\n findings: record.findings,\n runId: record.runId,\n skippedLenses: record.skippedLenses,\n });\n}\n\nfunction callSurfaceExplain(\n session: SurfaceMcpSessionState,\n rawInput: unknown,\n): Result<SurfaceMcpExplainOutput> {\n const parsed = parseToolInput(\"surface_explain\", rawInput);\n\n if (!parsed.ok) {\n return parsed;\n }\n\n const finding = findStoredFinding(session, parsed.value.findingId);\n\n if (finding === undefined) {\n return err(\n createSurfaceError(\"finding_not_found\", \"No stored MCP finding matched the requested id.\", {\n details: { findingId: parsed.value.findingId },\n }),\n );\n }\n\n if (finding.evidence.length === 0) {\n return err(\n createSurfaceError(\"evidence_missing\", \"Stored MCP finding has no evidence to explain.\", {\n details: { findingId: finding.id },\n }),\n );\n }\n\n return ok({\n evidence: finding.evidence,\n finding,\n rationale: finding.rationale,\n });\n}\n\nasync function callSurfaceBacklog(\n composition: SurfaceComposition,\n session: SurfaceMcpSessionState,\n rawInput: unknown,\n): Promise<Result<Backlog | IssueExport>> {\n const parsed = parseToolInput(\"surface_backlog\", rawInput);\n\n if (!parsed.ok) {\n return parsed;\n }\n\n const record = runRecordFor(session, parsed.value.runId);\n\n if (record === undefined) {\n return err(\n createSurfaceError(\"run_not_found\", \"No stored MCP run matched the requested backlog.\", {\n details: { runId: parsed.value.runId ?? null },\n }),\n );\n }\n\n if (parsed.value.exportTarget === undefined) {\n return ok(record.backlog);\n }\n\n const exporter = composition.issueExporters.find(\n (candidate) => candidate.target === parsed.value.exportTarget,\n );\n\n if (exporter === undefined) {\n return err(\n createSurfaceError(\n \"unknown_export_target\",\n \"No issue exporter matched the MCP backlog target.\",\n {\n details: { exportTarget: parsed.value.exportTarget },\n },\n ),\n );\n }\n\n const artifact = await composition.stateStore.writeArtifact({\n bytes: new TextEncoder().encode(JSON.stringify(record.backlog, null, 2)),\n kind: \"report\",\n relativePath: `reports/${record.runId}/backlog.json`,\n });\n\n if (!artifact.ok) {\n return artifact;\n }\n\n const exported = await exporter.export({\n backlogId: record.backlog.id,\n path: artifact.value.path,\n });\n\n if (!exported.ok) {\n return exported;\n }\n\n if (exported.value.status === \"partial\") {\n return err(\n createSurfaceError(\"export_partial\", \"MCP backlog export completed partially.\", {\n details: { exportId: exported.value.id, target: exported.value.target },\n }),\n );\n }\n\n return ok(exported.value);\n}\n\nasync function callSurfaceGate(\n composition: SurfaceComposition,\n session: SurfaceMcpSessionState,\n rawInput: unknown,\n): Promise<Result<GateResult>> {\n const parsed = parseToolInput(\"surface_gate\", rawInput);\n\n if (!parsed.ok) {\n return parsed;\n }\n\n const record = runRecordFor(session, parsed.value.runId);\n\n if (record === undefined) {\n return err(\n createSurfaceError(\"run_not_found\", \"No stored MCP run matched the requested gate.\", {\n details: { runId: parsed.value.runId ?? null },\n }),\n );\n }\n\n const baseline = latestBaseline(session);\n const baselineIdentityKeys = baseline?.identityKeys ?? new Set<string>();\n const findings = record.findings.filter((finding) => {\n const tracked = trackedFindingForRunFinding(record, finding.id);\n\n return tracked === undefined || !baselineIdentityKeys.has(tracked.identityKey);\n });\n const policy =\n parsed.value.policy === undefined\n ? DEFAULT_SURFACE_CONFIG.reporting.gatePolicy\n : (parsed.value.policy as SurfaceConfig[\"reporting\"][\"gatePolicy\"]);\n\n return await composition.gateEvaluator.evaluate(findings, policy);\n}\n\nfunction callSurfaceValidate(\n session: SurfaceMcpSessionState,\n rawInput: unknown,\n): Result<SurfaceMcpValidationOutput> {\n const parsed = parseToolInput(\"surface_validate\", rawInput);\n\n if (!parsed.ok) {\n return parsed;\n }\n\n const record = runRecordFor(session, parsed.value.runId);\n\n if (record === undefined) {\n return err(\n createSurfaceError(\"run_not_found\", \"No stored MCP run matched the requested validation.\", {\n details: { runId: parsed.value.runId },\n }),\n );\n }\n\n return ok({\n checks: record.trackedFindings.map((trackedFinding) => ({\n id: trackedFinding.identityKey,\n passed: trackedFinding.status !== \"identity-broken\",\n validation: trackedFinding.validation,\n ...(trackedFinding.currentFindingId === undefined\n ? {}\n : { findingId: trackedFinding.currentFindingId }),\n })),\n });\n}\n\nasync function callSurfaceBaseline(\n composition: SurfaceComposition,\n session: SurfaceMcpSessionState,\n rawInput: unknown,\n): Promise<Result<SurfaceMcpBaselineOutput>> {\n const parsed = parseToolInput(\"surface_baseline\", rawInput);\n\n if (!parsed.ok) {\n return parsed;\n }\n\n const record = runRecordFor(session, undefined);\n\n if (record === undefined || record.trackedFindings.length === 0) {\n return err(\n createSurfaceError(\"no_findings_to_baseline\", \"No MCP findings are available to baseline.\"),\n );\n }\n\n const baselineId = nextBaselineId(session);\n const baseline: SurfaceMcpBaselineRecord = {\n baselineId,\n identityKeys: new Set(\n record.trackedFindings.map((trackedFinding) => trackedFinding.identityKey),\n ),\n ...(parsed.value.reason === undefined ? {} : { reason: parsed.value.reason }),\n };\n session.baselines.set(baselineId, baseline);\n session.baselineOrder.push(baselineId);\n\n const persisted = await persistSurfaceMcpSession(composition, session);\n\n if (!persisted.ok) {\n return persisted;\n }\n\n return ok({\n baselineId,\n count: baseline.identityKeys.size,\n ...(baseline.reason === undefined ? {} : { reason: baseline.reason }),\n });\n}\n\nasync function callSurfaceVerdict(\n composition: SurfaceComposition,\n session: SurfaceMcpSessionState,\n rawInput: unknown,\n): Promise<Result<SurfaceMcpVerdictOutput>> {\n const parsed = parseToolInput(\"surface_verdict\", rawInput);\n\n if (!parsed.ok) {\n return parsed;\n }\n\n const finding = findStoredFinding(session, parsed.value.findingId);\n\n if (finding === undefined) {\n return err(\n createSurfaceError(\"finding_not_found\", \"No stored MCP finding matched the verdict.\", {\n details: { findingId: parsed.value.findingId },\n }),\n );\n }\n\n const verdict = {\n decision: parsed.value.decision,\n findingId: parsed.value.findingId,\n rationale: parsed.value.rationale,\n } satisfies SurfaceMcpVerdictOutput;\n session.verdicts.set(parsed.value.findingId, verdict);\n\n const persisted = await persistSurfaceMcpSession(composition, session);\n\n if (!persisted.ok) {\n return persisted;\n }\n\n return ok(verdict);\n}\n\nfunction callSurfaceDiff(\n session: SurfaceMcpSessionState,\n rawInput: unknown,\n): Result<SurfaceMcpDiffOutput> {\n const parsed = parseToolInput(\"surface_diff\", rawInput);\n\n if (!parsed.ok) {\n return parsed;\n }\n\n const before = runRecordFor(session, parsed.value.before.runId);\n const after = runRecordFor(session, parsed.value.after.runId);\n\n if (before === undefined || after === undefined) {\n return err(\n createSurfaceError(\"run_not_found\", \"Both MCP diff runs must exist.\", {\n details: { after: parsed.value.after.runId, before: parsed.value.before.runId },\n }),\n );\n }\n\n return ok(diffTrackedFindings(before.trackedFindings, after.trackedFindings));\n}\n\nasync function callSurfaceAlternatives(\n composition: SurfaceComposition,\n rawInput: unknown,\n): Promise<Result<SurfaceMcpAlternativesOutput>> {\n const parsed = parseToolInput(\"surface_alternatives\", rawInput);\n\n if (!parsed.ok) {\n return parsed;\n }\n\n const target = targetForCore(parsed.value.target);\n const capture = await composition.captureService.capture(\n target,\n captureOptionsFor(DEFAULT_SURFACE_CONFIG, parsed.value.authState),\n );\n\n if (!capture.ok) {\n return capture;\n }\n\n return ok({\n alternatives: createBoundedAlternatives(target),\n });\n}\n\nfunction callSurfaceTrace(\n session: SurfaceMcpSessionState,\n rawInput: unknown,\n): Result<SurfaceMcpTraceOutput> {\n const parsed = parseToolInput(\"surface_trace\", rawInput);\n\n if (!parsed.ok) {\n return parsed;\n }\n\n const trackedFinding = findStoredTrackedFinding(session, parsed.value.findingId);\n\n if (trackedFinding === undefined) {\n return err(\n createSurfaceError(\"finding_not_found\", \"No tracked MCP finding matched the requested id.\", {\n details: { findingId: parsed.value.findingId },\n }),\n );\n }\n\n return ok({ trackedFinding });\n}\n\nasync function callSurfaceRun(\n composition: SurfaceComposition,\n rawInput: unknown,\n): Promise<Result<SurfaceMcpRunOutput>> {\n const parsed = parseToolInput(\"surface_run\", rawInput);\n\n if (!parsed.ok) {\n return parsed;\n }\n\n if (parsed.value.step !== \"all\" && !isExecutableStageId(parsed.value.step)) {\n return err(\n createSurfaceError(\"unknown_step\", `Unknown MCP pipeline step \"${parsed.value.step}\".`, {\n details: { step: parsed.value.step },\n }),\n );\n }\n\n const runId = nextMcpPipelineRunId();\n const run = await composition.pipelineOrchestrator.run({\n config: DEFAULT_SURFACE_CONFIG,\n runId,\n });\n\n if (!run.ok) {\n return err(\n createSurfaceError(\"step_failed\", `MCP pipeline run ${runId} failed.`, {\n cause: run.error,\n details: { runId, stage: parsed.value.step },\n }),\n );\n }\n\n return ok({\n runId: run.value.runId,\n stage: parsed.value.step,\n status: \"completed\",\n });\n}\n\nasync function callSurfaceNext(\n composition: SurfaceComposition,\n): Promise<Result<SurfaceMcpNextOutput>> {\n const state = await composition.stateStore.readState();\n\n if (!state.ok) {\n return state;\n }\n\n const lastCompletedStage = state.value.pipeline?.lastCompletedStage;\n const eligible =\n lastCompletedStage === undefined\n ? [\"run discovery\", \"run all\"]\n : eligibleStagesAfter(lastCompletedStage).map((stage) => `run ${stage}`);\n\n return ok({ eligible });\n}\n\nfunction callSurfaceStatus(session: SurfaceMcpSessionState): Result<SurfaceMcpStatusOutput> {\n const runHistory = session.runOrder\n .map((runId) => session.runs.get(runId))\n .filter((record): record is SurfaceMcpRunRecord => record !== undefined)\n .map((record) => ({\n findings: record.findings.length,\n runId: record.runId,\n status: record.status,\n target: record.capture.target,\n }));\n const completedRuns = runHistory.filter((entry) => entry.status === \"completed\").length;\n const failedRuns = runHistory.filter((entry) => entry.status === \"failed\").length;\n\n return ok({\n currentStage: runHistory.at(-1)?.status === \"completed\" ? \"completed\" : \"pending\",\n progress: {\n completedRuns,\n failedRuns,\n findings: runHistory.reduce((total, entry) => total + entry.findings, 0),\n },\n runHistory,\n });\n}\n\nasync function groundingEvidenceFor(\n composition: SurfaceComposition,\n capture: Capture,\n): Promise<Result<readonly Evidence[]>> {\n const evidence: Evidence[] = [];\n\n for (const tool of composition.groundingTools) {\n const result = await tool.run(capture);\n\n if (!result.ok) {\n return result;\n }\n\n for (const toolResult of result.value) {\n evidence.push(...toolResult.evidence);\n }\n }\n\n return ok(evidence);\n}\n\nasync function findingsForPlan(\n composition: SurfaceComposition,\n config: SurfaceConfig,\n capture: Capture,\n evidence: readonly Evidence[],\n plan: ReturnType<typeof selectLensExecutionPlan>,\n): Promise<Result<readonly Finding[]>> {\n const findings: Finding[] = [];\n const lenses = instantiateLensExecutionPlan(plan, composition.lensFactoryOptions);\n\n for (const { lens } of lenses) {\n const drafts = await lens.evaluate({\n capture,\n config,\n evidence: [...evidence],\n knowledge: composition.knowledgeSource,\n });\n\n if (!drafts.ok) {\n return drafts;\n }\n\n for (const draft of drafts.value) {\n const scored = scoreFinding(draft, config.findings);\n\n if (!scored.ok) {\n return scored;\n }\n\n findings.push(scored.value);\n }\n }\n\n return ok(findings);\n}\n\nfunction configForAuditInput(\n input: z.infer<(typeof TOOL_INPUT_SCHEMAS)[\"surface_audit\"]>,\n): SurfaceConfig {\n return {\n ...DEFAULT_SURFACE_CONFIG,\n capture: { ...DEFAULT_SURFACE_CONFIG.capture },\n evaluation: {\n ...DEFAULT_SURFACE_CONFIG.evaluation,\n ...(input.depth === undefined ? {} : { depth: input.depth }),\n ...(input.preset === undefined\n ? {}\n : { preset: input.preset as SurfaceConfig[\"evaluation\"][\"preset\"] }),\n },\n findings: { ...DEFAULT_SURFACE_CONFIG.findings },\n reporting: { ...DEFAULT_SURFACE_CONFIG.reporting },\n };\n}\n\nfunction captureOptionsFor(\n config: SurfaceConfig,\n authStateRef: string | undefined,\n): { readonly authStateRef?: string; readonly config: SurfaceConfig[\"capture\"] } {\n return {\n config: config.capture,\n ...(authStateRef === undefined ? {} : { authStateRef }),\n };\n}\n\nfunction targetForCore(input: z.infer<typeof TargetSchema>): Target {\n return {\n kind: input.kind,\n ref: input.ref,\n ...(input.theme === undefined ? {} : { theme: input.theme }),\n ...(input.viewport === undefined\n ? {}\n : {\n viewport: {\n height: input.viewport.height,\n label: input.viewport.label,\n width: input.viewport.width,\n },\n }),\n };\n}\n\nfunction parseToolInput<TName extends SurfaceMcpToolName>(\n name: TName,\n input: unknown,\n): Result<z.infer<(typeof TOOL_INPUT_SCHEMAS)[TName]>> {\n const parsed = TOOL_INPUT_SCHEMAS[name].safeParse(input);\n\n if (!parsed.success) {\n return err(\n createSurfaceError(\"config_invalid\", \"MCP tool input did not match the registered schema.\", {\n cause: parsed.error,\n details: { tool: name },\n }),\n );\n }\n\n return ok(parsed.data as z.infer<(typeof TOOL_INPUT_SCHEMAS)[TName]>);\n}\n\nfunction nextRunId(session: SurfaceMcpSessionState): string {\n const runId = `run_mcp_${session.nextRunSequence.toString().padStart(4, \"0\")}`;\n session.nextRunSequence += 1;\n\n return runId;\n}\n\nfunction nextBaselineId(session: SurfaceMcpSessionState): string {\n const baselineId = `baseline_mcp_${session.nextBaselineSequence.toString().padStart(4, \"0\")}`;\n session.nextBaselineSequence += 1;\n\n return baselineId;\n}\n\nfunction nextMcpPipelineRunId(): string {\n return `run_mcp_pipeline_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 8)}`;\n}\n\nfunction isExecutableStageId(step: string): step is ExecutablePipelineStageId {\n return DEFAULT_COMPOSITION_STAGE_IDS.includes(step as ExecutablePipelineStageId);\n}\n\nfunction eligibleStagesAfter(lastCompletedStage: string): readonly ExecutablePipelineStageId[] {\n const index = DEFAULT_COMPOSITION_STAGE_IDS.findIndex((stage) => stage === lastCompletedStage);\n\n if (index === -1) {\n return DEFAULT_COMPOSITION_STAGE_IDS;\n }\n\n return DEFAULT_COMPOSITION_STAGE_IDS.slice(index + 1);\n}\n\nfunction runRecordFor(\n session: SurfaceMcpSessionState,\n runId: string | undefined,\n): SurfaceMcpRunRecord | undefined {\n if (runId !== undefined) {\n return session.runs.get(runId);\n }\n\n const latestRunId = session.runOrder.at(-1);\n\n return latestRunId === undefined ? undefined : session.runs.get(latestRunId);\n}\n\nfunction findStoredFinding(\n session: SurfaceMcpSessionState,\n findingId: string,\n): Finding | undefined {\n for (const runId of session.runOrder) {\n const record = session.runs.get(runId);\n const finding = record?.findings.find((candidate) => candidate.id === findingId);\n\n if (finding !== undefined) {\n return finding;\n }\n }\n\n return undefined;\n}\n\nfunction trackedFindingsForRun(\n session: SurfaceMcpSessionState,\n runId: string,\n findings: readonly Finding[],\n): readonly TrackedFinding[] {\n return findings.map((finding) => {\n const initial = createTrackedFinding({\n finding,\n runId,\n validation: validationForFinding(finding),\n });\n const previous = session.trackedByIdentity.get(initial.identityKey);\n const trackedFinding =\n previous === undefined\n ? initial\n : transitionTrackedFinding(previous, { finding, kind: \"detected\", runId });\n\n session.trackedByIdentity.set(trackedFinding.identityKey, trackedFinding);\n\n return trackedFinding;\n });\n}\n\nfunction validationForFinding(finding: Finding): ValidationCheck {\n if (finding.method === \"measured\") {\n const toolEvidence = finding.evidence.find((entry) => entry.kind === \"tool-result\");\n\n return {\n expectation:\n toolEvidence === undefined\n ? `${finding.lens}/${finding.issueType} remains resolved.`\n : `${toolEvidence.tool} ${toolEvidence.rule} passes for ${locationLabelFor(finding)}.`,\n kind: \"measured-rule\",\n };\n }\n\n return {\n expectation: `${finding.lens}/${finding.issueType} should be re-evaluated at ${locationLabelFor(\n finding,\n )}.`,\n kind: \"re-evaluate-lens\",\n };\n}\n\nfunction locationLabelFor(finding: Finding): string {\n return (\n finding.location.elementRef ??\n finding.location.selector ??\n finding.location.component ??\n finding.location.file ??\n finding.id\n );\n}\n\nfunction latestBaseline(session: SurfaceMcpSessionState): SurfaceMcpBaselineRecord | undefined {\n const baselineId = session.baselineOrder.at(-1);\n\n return baselineId === undefined ? undefined : session.baselines.get(baselineId);\n}\n\nfunction trackedFindingForRunFinding(\n record: SurfaceMcpRunRecord,\n findingId: string,\n): TrackedFinding | undefined {\n return record.trackedFindings.find(\n (trackedFinding) => trackedFinding.currentFindingId === findingId,\n );\n}\n\nfunction findStoredTrackedFinding(\n session: SurfaceMcpSessionState,\n findingId: string,\n): TrackedFinding | undefined {\n for (const trackedFinding of session.trackedByIdentity.values()) {\n if (trackedFinding.currentFindingId === findingId) {\n return trackedFinding;\n }\n }\n\n return undefined;\n}\n\nexport async function createSurfaceSdkMcpServer(\n options: SurfaceMcpServerOptions = {},\n): Promise<unknown> {\n const surfaceServer = createSurfaceMcpServer(options);\n\n const [{ McpServer }] = await Promise.all([import(\"@modelcontextprotocol/sdk/server/mcp.js\")]);\n const server = new McpServer({\n name: SURFACE_MCP_SERVER_NAME,\n version: SURFACE_MCP_SERVER_VERSION,\n }) as SdkMcpServer;\n\n for (const tool of INTERNAL_TOOLS) {\n server.registerTool(\n tool.name,\n {\n description: tool.description,\n inputSchema: tool.inputZodSchema,\n title: tool.title,\n },\n async (input) => mcpToolCallResult(await surfaceServer.callTool(tool.name, input)),\n );\n }\n\n return server;\n}\n\nexport async function runSurfaceMcpStdioServer(\n options: SurfaceMcpServerOptions = {},\n): Promise<void> {\n const [{ StdioServerTransport }, server] = await Promise.all([\n import(\"@modelcontextprotocol/sdk/server/stdio.js\"),\n createSurfaceSdkMcpServer(options),\n ]);\n\n await (server as SdkMcpServer).connect(new StdioServerTransport());\n}\n\ntype SdkMcpServer = {\n connect(transport: unknown): Promise<void>;\n registerTool(\n name: string,\n config: {\n readonly description: string;\n readonly inputSchema: unknown;\n readonly title: string;\n },\n handler: (input: unknown) => unknown,\n ): void;\n};\n\nfunction mcpToolCallResult(result: Result<SurfaceMcpToolOutput>): {\n readonly content: readonly { readonly text: string; readonly type: \"text\" }[];\n readonly isError?: true;\n readonly structuredContent: unknown;\n} {\n if (isOk(result)) {\n return {\n content: [{ text: JSON.stringify(result.value, null, 2), type: \"text\" }],\n structuredContent: result.value,\n };\n }\n\n return {\n content: [{ text: result.error.message, type: \"text\" }],\n isError: true,\n structuredContent: toMcpError(result.error),\n };\n}\n\nfunction publicToolDefinition(tool: InternalSurfaceMcpToolDefinition): SurfaceMcpToolDefinition {\n return {\n description: tool.description,\n inputSchema: tool.inputSchema,\n name: tool.name,\n schemaVersion: tool.schemaVersion,\n title: tool.title,\n };\n}\n\nfunction requiredFields(schema: JsonSchema): ReadonlySet<string> {\n const required = schema.required;\n\n return Array.isArray(required)\n ? new Set(required.filter((field): field is string => typeof field === \"string\"))\n : new Set();\n}\n\nfunction hasMajorVersionIncrement(currentVersion: string, nextVersion: string): boolean {\n const currentMajor = majorVersion(currentVersion);\n const nextMajor = majorVersion(nextVersion);\n\n return currentMajor !== undefined && nextMajor !== undefined && nextMajor > currentMajor;\n}\n\nfunction majorVersion(version: string): number | undefined {\n const match = /^(\\d+)\\./u.exec(version);\n const value = match?.[1];\n\n if (value === undefined) {\n return undefined;\n }\n\n const major = Number(value);\n\n return Number.isInteger(major) ? major : undefined;\n}\n\nfunction mcpSchemaIncompatible(\n message: string,\n input: McpToolSchemaCompatibilityInput,\n details: Record<string, unknown> = {},\n): Result<never, SurfaceError> {\n return err(\n createSurfaceError(\"mcp_schema_incompatible\", message, {\n details: {\n current: {\n name: input.current.name,\n schemaVersion: input.current.schemaVersion,\n },\n next: {\n name: input.next.name,\n schemaVersion: input.next.schemaVersion,\n },\n ...details,\n },\n }),\n );\n}\n\nif (process.argv[1] !== undefined && import.meta.url === pathToFileURL(process.argv[1]).href) {\n await runSurfaceMcpStdioServer();\n}\n"],"mappings":"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","names":[]}
|
package/package.json
ADDED
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@zigrivers/surface-mcp",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"main": "./dist/index.js",
|
|
6
|
+
"types": "./dist/index.d.ts",
|
|
7
|
+
"exports": {
|
|
8
|
+
".": {
|
|
9
|
+
"types": "./dist/index.d.ts",
|
|
10
|
+
"default": "./dist/index.js"
|
|
11
|
+
}
|
|
12
|
+
},
|
|
13
|
+
"files": [
|
|
14
|
+
"dist",
|
|
15
|
+
"README.md",
|
|
16
|
+
"LICENSE"
|
|
17
|
+
],
|
|
18
|
+
"dependencies": {
|
|
19
|
+
"@modelcontextprotocol/sdk": "^1.29.0",
|
|
20
|
+
"zod": "^4.1.13",
|
|
21
|
+
"@zigrivers/surface-core": "0.1.0"
|
|
22
|
+
},
|
|
23
|
+
"devDependencies": {
|
|
24
|
+
"@types/node": "^22.13.0",
|
|
25
|
+
"eslint": "^9.39.4",
|
|
26
|
+
"tsup": "^8.5.1",
|
|
27
|
+
"typescript": "^5.9.3",
|
|
28
|
+
"vitest": "^4.0.14"
|
|
29
|
+
},
|
|
30
|
+
"description": "MCP server adapter for Surface audits",
|
|
31
|
+
"license": "MIT",
|
|
32
|
+
"homepage": "https://github.com/zigrivers/surface#readme",
|
|
33
|
+
"repository": {
|
|
34
|
+
"type": "git",
|
|
35
|
+
"url": "git+https://github.com/zigrivers/surface.git",
|
|
36
|
+
"directory": "packages/mcp"
|
|
37
|
+
},
|
|
38
|
+
"bugs": {
|
|
39
|
+
"url": "https://github.com/zigrivers/surface/issues"
|
|
40
|
+
},
|
|
41
|
+
"keywords": [
|
|
42
|
+
"surface",
|
|
43
|
+
"mcp",
|
|
44
|
+
"ui-audit"
|
|
45
|
+
],
|
|
46
|
+
"publishConfig": {
|
|
47
|
+
"access": "public",
|
|
48
|
+
"provenance": true
|
|
49
|
+
},
|
|
50
|
+
"scripts": {
|
|
51
|
+
"build": "tsup",
|
|
52
|
+
"build:smoke": "node scripts/build-smoke.mjs",
|
|
53
|
+
"clean": "node scripts/clean.mjs",
|
|
54
|
+
"lint": "eslint src",
|
|
55
|
+
"test": "vitest run",
|
|
56
|
+
"test:watch": "vitest",
|
|
57
|
+
"typecheck": "tsc --noEmit"
|
|
58
|
+
}
|
|
59
|
+
}
|