{"version":3,"file":"mcp.mjs","names":["Type.String","Type.Object","Type.Array","Type.Optional","Type.Integer"],"sources":["../src/mcp.ts"],"sourcesContent":["import { Server } from \"@modelcontextprotocol/sdk/server/index.js\";\nimport {\n  CallToolRequestSchema,\n  ListToolsRequestSchema,\n  type CallToolResult,\n  type Tool,\n  type ToolAnnotations,\n} from \"@modelcontextprotocol/sdk/types.js\";\nimport { Type, type Static, type TSchema } from \"typebox\";\nimport {\n  bulkPackagesOperation,\n  dependenciesOperation,\n  ecosystemsOperation,\n  maintainersOperation,\n  MAX_BULK_CONCURRENCY,\n  MAX_BULK_PACKAGES,\n  MAX_PURL_LENGTH,\n  packageOperation,\n  type ToolResult,\n  versionsOperation,\n} from \"./tool-operations.ts\";\nimport { version } from \"./version.ts\";\n\nconst PURL = Type.String({\n  minLength: 1,\n  maxLength: MAX_PURL_LENGTH,\n  description: \"Package URL, for example pkg:npm/lodash or pkg:pypi/requests@2.32.3\",\n});\n\nconst PURLParams = Type.Object({ purl: PURL }, { additionalProperties: false });\nconst BulkPackagesParams = Type.Object(\n  {\n    purls: Type.Array(PURL, { minItems: 1, maxItems: MAX_BULK_PACKAGES }),\n    concurrency: Type.Optional(Type.Integer({ minimum: 1, maximum: MAX_BULK_CONCURRENCY })),\n  },\n  { additionalProperties: false },\n);\nconst EmptyParams = Type.Object({}, { additionalProperties: false });\n\nconst REMOTE_READ: ToolAnnotations = {\n  readOnlyHint: true,\n  destructiveHint: false,\n  idempotentHint: false,\n  openWorldHint: true,\n};\nconst LOCAL_READ: ToolAnnotations = {\n  readOnlyHint: true,\n  destructiveHint: false,\n  idempotentHint: true,\n  openWorldHint: false,\n};\n\ninterface RegistryTool<S extends TSchema> {\n  readonly name: string;\n  readonly title: string;\n  readonly description: string;\n  readonly inputSchema: S;\n  readonly annotations: ToolAnnotations;\n  execute(params: Readonly<Static<S>>, signal?: AbortSignal): Promise<ToolResult<unknown>>;\n}\n\nfunction defineTool<S extends TSchema>(tool: Readonly<RegistryTool<S>>): RegistryTool<S> {\n  return tool;\n}\n\nconst tools = [\n  defineTool({\n    name: \"registries_package\",\n    title: \"Get package metadata\",\n    description: \"Fetch normalized metadata for one package URL.\",\n    inputSchema: PURLParams,\n    annotations: REMOTE_READ,\n    execute: packageOperation,\n  }),\n  defineTool({\n    name: \"registries_versions\",\n    title: \"List package versions\",\n    description: \"List normalized versions for one package URL.\",\n    inputSchema: PURLParams,\n    annotations: REMOTE_READ,\n    execute: versionsOperation,\n  }),\n  defineTool({\n    name: \"registries_dependencies\",\n    title: \"List package dependencies\",\n    description: \"List dependencies for a versioned package URL.\",\n    inputSchema: PURLParams,\n    annotations: REMOTE_READ,\n    execute: dependenciesOperation,\n  }),\n  defineTool({\n    name: \"registries_maintainers\",\n    title: \"List package maintainers\",\n    description: \"List normalized maintainers for one package URL.\",\n    inputSchema: PURLParams,\n    annotations: REMOTE_READ,\n    execute: maintainersOperation,\n  }),\n  defineTool({\n    name: \"registries_bulk_packages\",\n    title: \"Get package metadata in bulk\",\n    description: \"Fetch normalized package metadata for up to 50 package URLs.\",\n    inputSchema: BulkPackagesParams,\n    annotations: REMOTE_READ,\n    execute: bulkPackagesOperation,\n  }),\n  defineTool({\n    name: \"registries_ecosystems\",\n    title: \"List registry ecosystems\",\n    description: \"List package ecosystems registered by this package.\",\n    inputSchema: EmptyParams,\n    annotations: LOCAL_READ,\n    execute: ecosystemsOperation,\n  }),\n] as const;\n\ntype AnyRegistryTool = (typeof tools)[number];\n\nfunction errorMessage(error: unknown): string {\n  return error instanceof Error ? error.message : String(error);\n}\n\nfunction sanitizeField(value: string): string {\n  return Array.from(value)\n    .map((character) => {\n      const code = character.codePointAt(0) ?? 0;\n      return code <= 31 || (code >= 127 && code <= 159) ? \" \" : character;\n    })\n    .join(\"\");\n}\n\nfunction errorResult(text: string): CallToolResult {\n  return { content: [{ type: \"text\", text: sanitizeField(text) }], isError: true };\n}\n\nfunction toCallToolResult(result: ToolResult<unknown>): CallToolResult {\n  return { content: result.content, ...(result.isError ? { isError: true } : {}) };\n}\n\n/**\n * SAFETY: TypeBox schemas conform to the JSON Schema object accepted by MCP.\n *\n * @param schema - TypeBox schema to expose through MCP.\n * @returns {Tool[\"inputSchema\"]} The same schema under the MCP SDK type.\n */\nfunction toMcpSchema(schema: TSchema): Tool[\"inputSchema\"] {\n  return schema as unknown as Tool[\"inputSchema\"];\n}\n\nexport function createMcpServer(): Server {\n  const toolsByName = new Map<string, AnyRegistryTool>(tools.map((tool) => [tool.name, tool]));\n  const server = new Server({ name: \"registries\", version }, { capabilities: { tools: {} } });\n\n  server.setRequestHandler(ListToolsRequestSchema, () => ({\n    tools: tools.map((tool): Tool => ({\n      name: tool.name,\n      title: tool.title,\n      description: tool.description,\n      inputSchema: toMcpSchema(tool.inputSchema),\n      annotations: tool.annotations,\n    })),\n  }));\n\n  server.setRequestHandler(CallToolRequestSchema, async (request, extra) => {\n    const tool = toolsByName.get(request.params.name);\n    if (!tool) return errorResult(`Unknown registries tool: ${request.params.name}`);\n\n    const args = request.params.arguments ?? {};\n    const { Value } = await import(\"typebox/value\");\n    if (!Value.Check(tool.inputSchema, args)) {\n      return errorResult(`Invalid arguments for ${tool.name}`);\n    }\n\n    try {\n      /** SAFETY: Value.Check validated args against the selected tool's schema. */\n      const validatedArgs = args as never;\n      return toCallToolResult(await tool.execute(validatedArgs, extra.signal));\n    } catch (error) {\n      return errorResult(`${tool.name} failed: ${errorMessage(error)}`);\n    }\n  });\n\n  return server;\n}\n"],"mappings":"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"}