{"version":3,"sources":["../../src/util/resource.ts"],"sourcesContent":["/**\n * Copyright 2024 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Client } from '@modelcontextprotocol/sdk/client/index.js';\nimport {\n  ReadResourceResult,\n  Resource,\n  ResourceTemplate,\n} from '@modelcontextprotocol/sdk/types.js';\nimport {\n  GenkitError,\n  dynamicResource,\n  type DynamicResourceAction,\n  type Genkit,\n  type Part,\n} from 'genkit';\nimport { logger } from 'genkit/logging';\n\nfunction createDynamicResource(\n  client: Client,\n  resource: Resource,\n  params: { serverName: string; name: string }\n): DynamicResourceAction {\n  return dynamicResource(\n    {\n      name: `${params.serverName}/${resource.name}`,\n      description: resource.description || undefined,\n      metadata: { mcp: { _meta: resource._meta || {} } },\n      uri: resource.uri,\n    },\n    async (args, { context }) => {\n      logger.debug(\n        `[MCP] calling resource '${params.serverName}/${resource.name}' in host '${params.name}'`\n      );\n      const result = await client.readResource({\n        uri: args.uri,\n        _meta: context?.mcp?._meta,\n      });\n      return {\n        content: result.contents.map((p) => fromMcpResourcePart(p)),\n      };\n    }\n  );\n}\n\nfunction createDynamicResourceTemplate(\n  client: Client,\n  template: ResourceTemplate,\n  params: { serverName: string; name: string }\n): DynamicResourceAction {\n  return dynamicResource(\n    {\n      name: `${params.serverName}/${template.name}`,\n      description: template.description || undefined,\n      metadata: { mcp: { _meta: template._meta || {} } },\n      template: template.uriTemplate,\n    },\n    async (args, { context }) => {\n      logger.debug(\n        `[MCP] calling resource template '${params.serverName}/${template.name}' in host '${params.name}'`\n      );\n      const result = await client.readResource({\n        uri: args.uri,\n        _meta: context?.mcp?._meta,\n      });\n      return {\n        content: result.contents.map((p) => fromMcpResourcePart(p)),\n        metadata: result._meta,\n      };\n    }\n  );\n}\n\ntype ArrayElement<ArrayType extends readonly unknown[]> =\n  ArrayType extends readonly (infer ElementType)[] ? ElementType : never;\n\nfunction fromMcpResourcePart(\n  part: ArrayElement<ReadResourceResult['contents']>\n): Part {\n  if ('text' in part && part.text) {\n    return { text: part.text as string, metadata: part._meta };\n  }\n  if ('blob' in part && part.blob) {\n    return {\n      media: {\n        contentType: part.mimeType,\n        url: `data:${part.mimeType};base64,${part.blob}`,\n      },\n      metadata: part._meta,\n    };\n  }\n  throw new GenkitError({\n    status: 'UNIMPLEMENTED',\n    message: `Part type ${'type' in part ? part.type : 'unknown'} is not currently supported.`,\n  });\n}\n\n/**\n * Lookup all resources available in the server and fetches as a Genkit dynamic resource.\n */\nexport async function fetchDynamicResources(\n  ai: Genkit,\n  client: Client,\n  params: { name: string; serverName: string }\n): Promise<DynamicResourceAction[]> {\n  let cursor: string | undefined;\n  let allResources: DynamicResourceAction[] = [];\n  while (true) {\n    const { nextCursor, resources } = await client.listResources({ cursor });\n    allResources.push(\n      ...resources.map((r) => createDynamicResource(client, r, params))\n    );\n    cursor = nextCursor;\n    if (!cursor) break;\n  }\n  while (true) {\n    const { nextCursor, resourceTemplates } =\n      await client.listResourceTemplates({ cursor });\n    allResources.push(\n      ...resourceTemplates.map((r) =>\n        createDynamicResourceTemplate(client, r, params)\n      )\n    );\n    cursor = nextCursor;\n    if (!cursor) break;\n  }\n  return allResources;\n}\n"],"mappings":"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","names":[]}