@genkit-ai/mcp 1.14.1-rc.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 +203 -0
- package/README.md +205 -0
- package/examples/client/index.js +36 -0
- package/examples/client/package.json +25 -0
- package/examples/server/index.js +46 -0
- package/examples/server/package.json +18 -0
- package/examples/server/prompts/port_code.prompt +13 -0
- package/lib/client/client.d.mts +177 -0
- package/lib/client/client.d.ts +177 -0
- package/lib/client/client.js +282 -0
- package/lib/client/client.js.map +1 -0
- package/lib/client/client.mjs +267 -0
- package/lib/client/client.mjs.map +1 -0
- package/lib/client/host.d.mts +202 -0
- package/lib/client/host.d.ts +202 -0
- package/lib/client/host.js +392 -0
- package/lib/client/host.js.map +1 -0
- package/lib/client/host.mjs +368 -0
- package/lib/client/host.mjs.map +1 -0
- package/lib/client/index.d.mts +9 -0
- package/lib/client/index.d.ts +9 -0
- package/lib/client/index.js +32 -0
- package/lib/client/index.js.map +1 -0
- package/lib/client/index.mjs +7 -0
- package/lib/client/index.mjs.map +1 -0
- package/lib/index.d.mts +12 -0
- package/lib/index.d.ts +12 -0
- package/lib/index.js +48 -0
- package/lib/index.js.map +1 -0
- package/lib/index.mjs +22 -0
- package/lib/index.mjs.map +1 -0
- package/lib/server.d.mts +188 -0
- package/lib/server.d.ts +188 -0
- package/lib/server.js +280 -0
- package/lib/server.js.map +1 -0
- package/lib/server.mjs +249 -0
- package/lib/server.mjs.map +1 -0
- package/lib/util/index.d.mts +11 -0
- package/lib/util/index.d.ts +11 -0
- package/lib/util/index.js +29 -0
- package/lib/util/index.js.map +1 -0
- package/lib/util/index.mjs +5 -0
- package/lib/util/index.mjs.map +1 -0
- package/lib/util/message.d.mts +43 -0
- package/lib/util/message.d.ts +43 -0
- package/lib/util/message.js +61 -0
- package/lib/util/message.js.map +1 -0
- package/lib/util/message.mjs +36 -0
- package/lib/util/message.mjs.map +1 -0
- package/lib/util/prompts.d.mts +45 -0
- package/lib/util/prompts.d.ts +45 -0
- package/lib/util/prompts.js +147 -0
- package/lib/util/prompts.js.map +1 -0
- package/lib/util/prompts.mjs +123 -0
- package/lib/util/prompts.mjs.map +1 -0
- package/lib/util/resource.d.mts +28 -0
- package/lib/util/resource.d.ts +28 -0
- package/lib/util/resource.js +116 -0
- package/lib/util/resource.js.map +1 -0
- package/lib/util/resource.mjs +95 -0
- package/lib/util/resource.mjs.map +1 -0
- package/lib/util/tools.d.mts +37 -0
- package/lib/util/tools.d.ts +37 -0
- package/lib/util/tools.js +120 -0
- package/lib/util/tools.js.map +1 -0
- package/lib/util/tools.mjs +95 -0
- package/lib/util/tools.mjs.map +1 -0
- package/lib/util/transport.d.mts +39 -0
- package/lib/util/transport.d.ts +39 -0
- package/lib/util/transport.js +63 -0
- package/lib/util/transport.js.map +1 -0
- package/lib/util/transport.mjs +29 -0
- package/lib/util/transport.mjs.map +1 -0
- package/package.json +57 -0
- package/src/client/client.ts +414 -0
- package/src/client/host.ts +485 -0
- package/src/client/index.ts +29 -0
- package/src/index.ts +114 -0
- package/src/server.ts +330 -0
- package/src/util/index.ts +20 -0
- package/src/util/message.ts +72 -0
- package/src/util/prompts.ts +223 -0
- package/src/util/resource.ts +141 -0
- package/src/util/tools.ts +164 -0
- package/src/util/transport.ts +67 -0
- package/tests/fakes.ts +221 -0
- package/tests/host_test.ts +609 -0
- package/tests/server_test.ts +165 -0
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { Client } from '@modelcontextprotocol/sdk/client/index.js';
|
|
2
|
+
import { Genkit, PromptGenerateOptions, ExecutablePrompt } from 'genkit';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Copyright 2024 Google LLC
|
|
6
|
+
*
|
|
7
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
8
|
+
* you may not use this file except in compliance with the License.
|
|
9
|
+
* You may obtain a copy of the License at
|
|
10
|
+
*
|
|
11
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
12
|
+
*
|
|
13
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
14
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
15
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
16
|
+
* See the License for the specific language governing permissions and
|
|
17
|
+
* limitations under the License.
|
|
18
|
+
*/
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Lookup all prompts available in the server and register each as a Genkit
|
|
22
|
+
* prompt.
|
|
23
|
+
*/
|
|
24
|
+
declare function registerAllPrompts(ai: Genkit, client: Client, params: {
|
|
25
|
+
name: string;
|
|
26
|
+
serverName: string;
|
|
27
|
+
}): Promise<void>;
|
|
28
|
+
/**
|
|
29
|
+
* Lookup a specified prompt from the server and return as an ExecutablePrompt.
|
|
30
|
+
*/
|
|
31
|
+
declare function getExecutablePrompt(client: Client, params: {
|
|
32
|
+
name: string;
|
|
33
|
+
serverName: string;
|
|
34
|
+
promptName: string;
|
|
35
|
+
ai: Genkit;
|
|
36
|
+
options?: PromptGenerateOptions;
|
|
37
|
+
}): Promise<ExecutablePrompt | undefined>;
|
|
38
|
+
declare function fetchAllPrompts(client: Client, params: {
|
|
39
|
+
name: string;
|
|
40
|
+
serverName: string;
|
|
41
|
+
ai: Genkit;
|
|
42
|
+
options?: PromptGenerateOptions;
|
|
43
|
+
}): Promise<ExecutablePrompt[]>;
|
|
44
|
+
|
|
45
|
+
export { fetchAllPrompts, getExecutablePrompt, registerAllPrompts };
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
var prompts_exports = {};
|
|
20
|
+
__export(prompts_exports, {
|
|
21
|
+
fetchAllPrompts: () => fetchAllPrompts,
|
|
22
|
+
getExecutablePrompt: () => getExecutablePrompt,
|
|
23
|
+
registerAllPrompts: () => registerAllPrompts
|
|
24
|
+
});
|
|
25
|
+
module.exports = __toCommonJS(prompts_exports);
|
|
26
|
+
var import_genkit = require("genkit");
|
|
27
|
+
var import_logging = require("genkit/logging");
|
|
28
|
+
var import_message = require("./message.js");
|
|
29
|
+
function toSchema(args) {
|
|
30
|
+
if (!args) return {};
|
|
31
|
+
const schema = { type: "object", properties: {}, required: [] };
|
|
32
|
+
for (const arg of args) {
|
|
33
|
+
schema.properties[arg.name] = {
|
|
34
|
+
type: "string",
|
|
35
|
+
description: arg.description
|
|
36
|
+
};
|
|
37
|
+
if (arg.required) schema.required.push(arg.name);
|
|
38
|
+
}
|
|
39
|
+
return schema;
|
|
40
|
+
}
|
|
41
|
+
function registerPrompt(ai, client, prompt, params) {
|
|
42
|
+
import_logging.logger.debug(`[MCP] Registering MCP prompt ${params.name}/${prompt.name}`);
|
|
43
|
+
ai.definePrompt({
|
|
44
|
+
name: prompt.name,
|
|
45
|
+
description: prompt.description || "",
|
|
46
|
+
input: { jsonSchema: toSchema(prompt.arguments) },
|
|
47
|
+
output: { format: "text" },
|
|
48
|
+
metadata: { mcp: { _meta: prompt._meta || {} } },
|
|
49
|
+
messages: async (args, { context }) => {
|
|
50
|
+
import_logging.logger.debug(
|
|
51
|
+
`[MCP] Calling MCP prompt ${params.name}/${prompt.name} with arguments`,
|
|
52
|
+
JSON.stringify(args)
|
|
53
|
+
);
|
|
54
|
+
const result = await client.getPrompt({
|
|
55
|
+
name: prompt.name,
|
|
56
|
+
arguments: args,
|
|
57
|
+
_meta: context?.mcp?._meta
|
|
58
|
+
});
|
|
59
|
+
return result.messages.map(import_message.fromMcpPromptMessage);
|
|
60
|
+
}
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
function createExecutablePrompt(client, prompt, params) {
|
|
64
|
+
const callPrompt = async (input, opts) => {
|
|
65
|
+
import_logging.logger.debug(`[MCP] Calling MCP prompt ${params.name}/${prompt.name}`);
|
|
66
|
+
return params.ai.generate(callPrompt.render(input, opts));
|
|
67
|
+
};
|
|
68
|
+
callPrompt.ref = {
|
|
69
|
+
name: prompt.name,
|
|
70
|
+
metadata: {
|
|
71
|
+
description: prompt.description,
|
|
72
|
+
arguments: prompt.arguments,
|
|
73
|
+
mcp: { _meta: prompt._meta || {} }
|
|
74
|
+
}
|
|
75
|
+
};
|
|
76
|
+
callPrompt.stream = (input, opts) => {
|
|
77
|
+
import_logging.logger.debug(`[MCP] Streaming MCP prompt ${params.name}/${prompt.name}`);
|
|
78
|
+
return params.ai.generateStream(callPrompt.render(input, opts));
|
|
79
|
+
};
|
|
80
|
+
callPrompt.render = async (input, opts) => {
|
|
81
|
+
import_logging.logger.debug(`[MCP] Rendering MCP prompt ${params.name}/${prompt.name}`);
|
|
82
|
+
const result = await client.getPrompt({
|
|
83
|
+
name: prompt.name,
|
|
84
|
+
arguments: input,
|
|
85
|
+
_meta: opts?.context?.mcp?._meta
|
|
86
|
+
});
|
|
87
|
+
const messages = result.messages.map(import_message.fromMcpPromptMessage);
|
|
88
|
+
return {
|
|
89
|
+
...params.options,
|
|
90
|
+
...opts,
|
|
91
|
+
messages
|
|
92
|
+
};
|
|
93
|
+
};
|
|
94
|
+
callPrompt.asTool = async () => {
|
|
95
|
+
throw new import_genkit.GenkitError({
|
|
96
|
+
status: "UNIMPLEMENTED",
|
|
97
|
+
message: `[MCP] prompt.asTool not supported with MCP`
|
|
98
|
+
});
|
|
99
|
+
};
|
|
100
|
+
return callPrompt;
|
|
101
|
+
}
|
|
102
|
+
async function registerAllPrompts(ai, client, params) {
|
|
103
|
+
let cursor;
|
|
104
|
+
while (true) {
|
|
105
|
+
const { nextCursor, prompts } = await client.listPrompts({ cursor });
|
|
106
|
+
prompts.forEach((p) => registerPrompt(ai, client, p, params));
|
|
107
|
+
cursor = nextCursor;
|
|
108
|
+
if (!cursor) break;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
async function getExecutablePrompt(client, params) {
|
|
112
|
+
let cursor;
|
|
113
|
+
while (true) {
|
|
114
|
+
const { nextCursor, prompts } = await client.listPrompts({ cursor });
|
|
115
|
+
const maybePrompt = prompts.find(
|
|
116
|
+
(p) => p.name === params.promptName
|
|
117
|
+
);
|
|
118
|
+
if (maybePrompt) {
|
|
119
|
+
return createExecutablePrompt(client, maybePrompt, params);
|
|
120
|
+
}
|
|
121
|
+
cursor = nextCursor;
|
|
122
|
+
if (!cursor) break;
|
|
123
|
+
}
|
|
124
|
+
return void 0;
|
|
125
|
+
}
|
|
126
|
+
async function fetchAllPrompts(client, params) {
|
|
127
|
+
let cursor;
|
|
128
|
+
const out = [];
|
|
129
|
+
while (true) {
|
|
130
|
+
const { nextCursor, prompts } = await client.listPrompts({ cursor });
|
|
131
|
+
for (const p of prompts) {
|
|
132
|
+
out.push(
|
|
133
|
+
createExecutablePrompt(client, p, { ...params, promptName: p.name })
|
|
134
|
+
);
|
|
135
|
+
}
|
|
136
|
+
cursor = nextCursor;
|
|
137
|
+
if (!cursor) break;
|
|
138
|
+
}
|
|
139
|
+
return out;
|
|
140
|
+
}
|
|
141
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
142
|
+
0 && (module.exports = {
|
|
143
|
+
fetchAllPrompts,
|
|
144
|
+
getExecutablePrompt,
|
|
145
|
+
registerAllPrompts
|
|
146
|
+
});
|
|
147
|
+
//# sourceMappingURL=prompts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/util/prompts.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 type { Prompt } from '@modelcontextprotocol/sdk/types.js';\nimport {\n ExecutablePrompt,\n GenerateOptions,\n GenerateResponse,\n GenerateStreamResponse,\n Genkit,\n GenkitError,\n JSONSchema,\n ToolAction,\n z,\n type PromptGenerateOptions,\n} from 'genkit';\nimport { logger } from 'genkit/logging';\nimport { fromMcpPromptMessage } from './message.js';\n\nfunction toSchema(args: Prompt['arguments']) {\n if (!args) return {};\n const schema: JSONSchema = { type: 'object', properties: {}, required: [] };\n for (const arg of args) {\n schema.properties[arg.name] = {\n type: 'string',\n description: arg.description,\n };\n if (arg.required) schema.required.push(arg.name);\n }\n return schema;\n}\n\n/**\n * Registers a single MCP prompt as a Genkit prompt.\n * It defines a new Genkit prompt action that, when called, will\n * interact with the MCP client to fetch and render the corresponding MCP prompt.\n *\n * @param ai The Genkit instance to define the prompt on.\n * @param client The MCP client instance used to interact with the MCP server.\n * @param prompt The MCP Prompt object to register.\n * @param params Contains the Genkit client name and the MCP server name for namespacing and logging.\n */\nfunction registerPrompt(\n ai: Genkit,\n client: Client,\n prompt: Prompt,\n params: { name: string; serverName: string }\n) {\n logger.debug(`[MCP] Registering MCP prompt ${params.name}/${prompt.name}`);\n ai.definePrompt({\n name: prompt.name,\n description: prompt.description || '',\n input: { jsonSchema: toSchema(prompt.arguments) },\n output: { format: 'text' },\n metadata: { mcp: { _meta: prompt._meta || {} } },\n messages: async (args, { context }) => {\n logger.debug(\n `[MCP] Calling MCP prompt ${params.name}/${prompt.name} with arguments`,\n JSON.stringify(args)\n );\n const result = await client.getPrompt({\n name: prompt.name,\n arguments: args,\n _meta: context?.mcp?._meta,\n });\n return result.messages.map(fromMcpPromptMessage);\n },\n });\n}\n\nfunction createExecutablePrompt<\n I extends z.ZodTypeAny = z.ZodTypeAny,\n O extends z.ZodTypeAny = z.ZodTypeAny,\n CustomOptions extends z.ZodTypeAny = z.ZodTypeAny,\n>(\n client: Client,\n prompt: Prompt,\n params: {\n ai: Genkit;\n name: string;\n serverName: string;\n promptName: string;\n options?: PromptGenerateOptions<any, any>;\n }\n): ExecutablePrompt<z.infer<I>, O, CustomOptions> {\n const callPrompt = (async (\n input?: z.infer<I>,\n opts?: PromptGenerateOptions<O, CustomOptions>\n ): Promise<GenerateResponse<z.infer<O>>> => {\n logger.debug(`[MCP] Calling MCP prompt ${params.name}/${prompt.name}`);\n return params.ai.generate(callPrompt.render(input, opts));\n }) as ExecutablePrompt<z.infer<I>, O, CustomOptions>;\n\n callPrompt.ref = {\n name: prompt.name,\n metadata: {\n description: prompt.description,\n arguments: prompt.arguments,\n mcp: { _meta: prompt._meta || {} },\n },\n };\n\n callPrompt.stream = (\n input?: z.infer<I>,\n opts?: PromptGenerateOptions<O, CustomOptions>\n ): GenerateStreamResponse<z.infer<O>> => {\n logger.debug(`[MCP] Streaming MCP prompt ${params.name}/${prompt.name}`);\n return params.ai.generateStream(callPrompt.render(input, opts));\n };\n\n callPrompt.render = async (\n input?: I,\n opts?: PromptGenerateOptions<O, CustomOptions>\n ): Promise<GenerateOptions<O, CustomOptions>> => {\n logger.debug(`[MCP] Rendering MCP prompt ${params.name}/${prompt.name}`);\n const result = await client.getPrompt({\n name: prompt.name,\n arguments: input as any,\n _meta: opts?.context?.mcp?._meta,\n });\n const messages = result.messages.map(fromMcpPromptMessage);\n return {\n ...params.options,\n ...opts,\n messages,\n };\n };\n\n callPrompt.asTool = async (): Promise<ToolAction> => {\n throw new GenkitError({\n status: 'UNIMPLEMENTED',\n message: `[MCP] prompt.asTool not supported with MCP`,\n });\n };\n\n return callPrompt;\n}\n\n/**\n * Lookup all prompts available in the server and register each as a Genkit\n * prompt.\n */\nexport async function registerAllPrompts(\n ai: Genkit,\n client: Client,\n params: { name: string; serverName: string }\n): Promise<void> {\n let cursor: string | undefined;\n while (true) {\n const { nextCursor, prompts } = await client.listPrompts({ cursor });\n prompts.forEach((p) => registerPrompt(ai, client, p, params));\n cursor = nextCursor;\n if (!cursor) break;\n }\n}\n\n/**\n * Lookup a specified prompt from the server and return as an ExecutablePrompt.\n */\nexport async function getExecutablePrompt(\n client: Client,\n params: {\n name: string;\n serverName: string;\n promptName: string;\n ai: Genkit;\n options?: PromptGenerateOptions;\n }\n): Promise<ExecutablePrompt | undefined> {\n let cursor: string | undefined;\n\n while (true) {\n const { nextCursor, prompts } = await client.listPrompts({ cursor });\n const maybePrompt = prompts.find(\n (p: Prompt) => p.name === params.promptName\n );\n if (maybePrompt) {\n return createExecutablePrompt(client, maybePrompt, params);\n }\n cursor = nextCursor;\n if (!cursor) break;\n }\n return undefined;\n}\n\nexport async function fetchAllPrompts(\n client: Client,\n params: {\n name: string;\n serverName: string;\n ai: Genkit;\n options?: PromptGenerateOptions;\n }\n): Promise<ExecutablePrompt[]> {\n let cursor: string | undefined;\n const out: ExecutablePrompt[] = [];\n\n while (true) {\n const { nextCursor, prompts } = await client.listPrompts({ cursor });\n for (const p of prompts) {\n out.push(\n createExecutablePrompt(client, p, { ...params, promptName: p.name })\n );\n }\n cursor = nextCursor;\n if (!cursor) break;\n }\n return out;\n}\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
import {
|
|
2
|
+
GenkitError
|
|
3
|
+
} from "genkit";
|
|
4
|
+
import { logger } from "genkit/logging";
|
|
5
|
+
import { fromMcpPromptMessage } from "./message.js";
|
|
6
|
+
function toSchema(args) {
|
|
7
|
+
if (!args) return {};
|
|
8
|
+
const schema = { type: "object", properties: {}, required: [] };
|
|
9
|
+
for (const arg of args) {
|
|
10
|
+
schema.properties[arg.name] = {
|
|
11
|
+
type: "string",
|
|
12
|
+
description: arg.description
|
|
13
|
+
};
|
|
14
|
+
if (arg.required) schema.required.push(arg.name);
|
|
15
|
+
}
|
|
16
|
+
return schema;
|
|
17
|
+
}
|
|
18
|
+
function registerPrompt(ai, client, prompt, params) {
|
|
19
|
+
logger.debug(`[MCP] Registering MCP prompt ${params.name}/${prompt.name}`);
|
|
20
|
+
ai.definePrompt({
|
|
21
|
+
name: prompt.name,
|
|
22
|
+
description: prompt.description || "",
|
|
23
|
+
input: { jsonSchema: toSchema(prompt.arguments) },
|
|
24
|
+
output: { format: "text" },
|
|
25
|
+
metadata: { mcp: { _meta: prompt._meta || {} } },
|
|
26
|
+
messages: async (args, { context }) => {
|
|
27
|
+
logger.debug(
|
|
28
|
+
`[MCP] Calling MCP prompt ${params.name}/${prompt.name} with arguments`,
|
|
29
|
+
JSON.stringify(args)
|
|
30
|
+
);
|
|
31
|
+
const result = await client.getPrompt({
|
|
32
|
+
name: prompt.name,
|
|
33
|
+
arguments: args,
|
|
34
|
+
_meta: context?.mcp?._meta
|
|
35
|
+
});
|
|
36
|
+
return result.messages.map(fromMcpPromptMessage);
|
|
37
|
+
}
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
function createExecutablePrompt(client, prompt, params) {
|
|
41
|
+
const callPrompt = async (input, opts) => {
|
|
42
|
+
logger.debug(`[MCP] Calling MCP prompt ${params.name}/${prompt.name}`);
|
|
43
|
+
return params.ai.generate(callPrompt.render(input, opts));
|
|
44
|
+
};
|
|
45
|
+
callPrompt.ref = {
|
|
46
|
+
name: prompt.name,
|
|
47
|
+
metadata: {
|
|
48
|
+
description: prompt.description,
|
|
49
|
+
arguments: prompt.arguments,
|
|
50
|
+
mcp: { _meta: prompt._meta || {} }
|
|
51
|
+
}
|
|
52
|
+
};
|
|
53
|
+
callPrompt.stream = (input, opts) => {
|
|
54
|
+
logger.debug(`[MCP] Streaming MCP prompt ${params.name}/${prompt.name}`);
|
|
55
|
+
return params.ai.generateStream(callPrompt.render(input, opts));
|
|
56
|
+
};
|
|
57
|
+
callPrompt.render = async (input, opts) => {
|
|
58
|
+
logger.debug(`[MCP] Rendering MCP prompt ${params.name}/${prompt.name}`);
|
|
59
|
+
const result = await client.getPrompt({
|
|
60
|
+
name: prompt.name,
|
|
61
|
+
arguments: input,
|
|
62
|
+
_meta: opts?.context?.mcp?._meta
|
|
63
|
+
});
|
|
64
|
+
const messages = result.messages.map(fromMcpPromptMessage);
|
|
65
|
+
return {
|
|
66
|
+
...params.options,
|
|
67
|
+
...opts,
|
|
68
|
+
messages
|
|
69
|
+
};
|
|
70
|
+
};
|
|
71
|
+
callPrompt.asTool = async () => {
|
|
72
|
+
throw new GenkitError({
|
|
73
|
+
status: "UNIMPLEMENTED",
|
|
74
|
+
message: `[MCP] prompt.asTool not supported with MCP`
|
|
75
|
+
});
|
|
76
|
+
};
|
|
77
|
+
return callPrompt;
|
|
78
|
+
}
|
|
79
|
+
async function registerAllPrompts(ai, client, params) {
|
|
80
|
+
let cursor;
|
|
81
|
+
while (true) {
|
|
82
|
+
const { nextCursor, prompts } = await client.listPrompts({ cursor });
|
|
83
|
+
prompts.forEach((p) => registerPrompt(ai, client, p, params));
|
|
84
|
+
cursor = nextCursor;
|
|
85
|
+
if (!cursor) break;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
async function getExecutablePrompt(client, params) {
|
|
89
|
+
let cursor;
|
|
90
|
+
while (true) {
|
|
91
|
+
const { nextCursor, prompts } = await client.listPrompts({ cursor });
|
|
92
|
+
const maybePrompt = prompts.find(
|
|
93
|
+
(p) => p.name === params.promptName
|
|
94
|
+
);
|
|
95
|
+
if (maybePrompt) {
|
|
96
|
+
return createExecutablePrompt(client, maybePrompt, params);
|
|
97
|
+
}
|
|
98
|
+
cursor = nextCursor;
|
|
99
|
+
if (!cursor) break;
|
|
100
|
+
}
|
|
101
|
+
return void 0;
|
|
102
|
+
}
|
|
103
|
+
async function fetchAllPrompts(client, params) {
|
|
104
|
+
let cursor;
|
|
105
|
+
const out = [];
|
|
106
|
+
while (true) {
|
|
107
|
+
const { nextCursor, prompts } = await client.listPrompts({ cursor });
|
|
108
|
+
for (const p of prompts) {
|
|
109
|
+
out.push(
|
|
110
|
+
createExecutablePrompt(client, p, { ...params, promptName: p.name })
|
|
111
|
+
);
|
|
112
|
+
}
|
|
113
|
+
cursor = nextCursor;
|
|
114
|
+
if (!cursor) break;
|
|
115
|
+
}
|
|
116
|
+
return out;
|
|
117
|
+
}
|
|
118
|
+
export {
|
|
119
|
+
fetchAllPrompts,
|
|
120
|
+
getExecutablePrompt,
|
|
121
|
+
registerAllPrompts
|
|
122
|
+
};
|
|
123
|
+
//# sourceMappingURL=prompts.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/util/prompts.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 type { Prompt } from '@modelcontextprotocol/sdk/types.js';\nimport {\n ExecutablePrompt,\n GenerateOptions,\n GenerateResponse,\n GenerateStreamResponse,\n Genkit,\n GenkitError,\n JSONSchema,\n ToolAction,\n z,\n type PromptGenerateOptions,\n} from 'genkit';\nimport { logger } from 'genkit/logging';\nimport { fromMcpPromptMessage } from './message.js';\n\nfunction toSchema(args: Prompt['arguments']) {\n if (!args) return {};\n const schema: JSONSchema = { type: 'object', properties: {}, required: [] };\n for (const arg of args) {\n schema.properties[arg.name] = {\n type: 'string',\n description: arg.description,\n };\n if (arg.required) schema.required.push(arg.name);\n }\n return schema;\n}\n\n/**\n * Registers a single MCP prompt as a Genkit prompt.\n * It defines a new Genkit prompt action that, when called, will\n * interact with the MCP client to fetch and render the corresponding MCP prompt.\n *\n * @param ai The Genkit instance to define the prompt on.\n * @param client The MCP client instance used to interact with the MCP server.\n * @param prompt The MCP Prompt object to register.\n * @param params Contains the Genkit client name and the MCP server name for namespacing and logging.\n */\nfunction registerPrompt(\n ai: Genkit,\n client: Client,\n prompt: Prompt,\n params: { name: string; serverName: string }\n) {\n logger.debug(`[MCP] Registering MCP prompt ${params.name}/${prompt.name}`);\n ai.definePrompt({\n name: prompt.name,\n description: prompt.description || '',\n input: { jsonSchema: toSchema(prompt.arguments) },\n output: { format: 'text' },\n metadata: { mcp: { _meta: prompt._meta || {} } },\n messages: async (args, { context }) => {\n logger.debug(\n `[MCP] Calling MCP prompt ${params.name}/${prompt.name} with arguments`,\n JSON.stringify(args)\n );\n const result = await client.getPrompt({\n name: prompt.name,\n arguments: args,\n _meta: context?.mcp?._meta,\n });\n return result.messages.map(fromMcpPromptMessage);\n },\n });\n}\n\nfunction createExecutablePrompt<\n I extends z.ZodTypeAny = z.ZodTypeAny,\n O extends z.ZodTypeAny = z.ZodTypeAny,\n CustomOptions extends z.ZodTypeAny = z.ZodTypeAny,\n>(\n client: Client,\n prompt: Prompt,\n params: {\n ai: Genkit;\n name: string;\n serverName: string;\n promptName: string;\n options?: PromptGenerateOptions<any, any>;\n }\n): ExecutablePrompt<z.infer<I>, O, CustomOptions> {\n const callPrompt = (async (\n input?: z.infer<I>,\n opts?: PromptGenerateOptions<O, CustomOptions>\n ): Promise<GenerateResponse<z.infer<O>>> => {\n logger.debug(`[MCP] Calling MCP prompt ${params.name}/${prompt.name}`);\n return params.ai.generate(callPrompt.render(input, opts));\n }) as ExecutablePrompt<z.infer<I>, O, CustomOptions>;\n\n callPrompt.ref = {\n name: prompt.name,\n metadata: {\n description: prompt.description,\n arguments: prompt.arguments,\n mcp: { _meta: prompt._meta || {} },\n },\n };\n\n callPrompt.stream = (\n input?: z.infer<I>,\n opts?: PromptGenerateOptions<O, CustomOptions>\n ): GenerateStreamResponse<z.infer<O>> => {\n logger.debug(`[MCP] Streaming MCP prompt ${params.name}/${prompt.name}`);\n return params.ai.generateStream(callPrompt.render(input, opts));\n };\n\n callPrompt.render = async (\n input?: I,\n opts?: PromptGenerateOptions<O, CustomOptions>\n ): Promise<GenerateOptions<O, CustomOptions>> => {\n logger.debug(`[MCP] Rendering MCP prompt ${params.name}/${prompt.name}`);\n const result = await client.getPrompt({\n name: prompt.name,\n arguments: input as any,\n _meta: opts?.context?.mcp?._meta,\n });\n const messages = result.messages.map(fromMcpPromptMessage);\n return {\n ...params.options,\n ...opts,\n messages,\n };\n };\n\n callPrompt.asTool = async (): Promise<ToolAction> => {\n throw new GenkitError({\n status: 'UNIMPLEMENTED',\n message: `[MCP] prompt.asTool not supported with MCP`,\n });\n };\n\n return callPrompt;\n}\n\n/**\n * Lookup all prompts available in the server and register each as a Genkit\n * prompt.\n */\nexport async function registerAllPrompts(\n ai: Genkit,\n client: Client,\n params: { name: string; serverName: string }\n): Promise<void> {\n let cursor: string | undefined;\n while (true) {\n const { nextCursor, prompts } = await client.listPrompts({ cursor });\n prompts.forEach((p) => registerPrompt(ai, client, p, params));\n cursor = nextCursor;\n if (!cursor) break;\n }\n}\n\n/**\n * Lookup a specified prompt from the server and return as an ExecutablePrompt.\n */\nexport async function getExecutablePrompt(\n client: Client,\n params: {\n name: string;\n serverName: string;\n promptName: string;\n ai: Genkit;\n options?: PromptGenerateOptions;\n }\n): Promise<ExecutablePrompt | undefined> {\n let cursor: string | undefined;\n\n while (true) {\n const { nextCursor, prompts } = await client.listPrompts({ cursor });\n const maybePrompt = prompts.find(\n (p: Prompt) => p.name === params.promptName\n );\n if (maybePrompt) {\n return createExecutablePrompt(client, maybePrompt, params);\n }\n cursor = nextCursor;\n if (!cursor) break;\n }\n return undefined;\n}\n\nexport async function fetchAllPrompts(\n client: Client,\n params: {\n name: string;\n serverName: string;\n ai: Genkit;\n options?: PromptGenerateOptions;\n }\n): Promise<ExecutablePrompt[]> {\n let cursor: string | undefined;\n const out: ExecutablePrompt[] = [];\n\n while (true) {\n const { nextCursor, prompts } = await client.listPrompts({ cursor });\n for (const p of prompts) {\n out.push(\n createExecutablePrompt(client, p, { ...params, promptName: p.name })\n );\n }\n cursor = nextCursor;\n if (!cursor) break;\n }\n return out;\n}\n"],"mappings":"AAkBA;AAAA,EAME;AAAA,OAKK;AACP,SAAS,cAAc;AACvB,SAAS,4BAA4B;AAErC,SAAS,SAAS,MAA2B;AAC3C,MAAI,CAAC,KAAM,QAAO,CAAC;AACnB,QAAM,SAAqB,EAAE,MAAM,UAAU,YAAY,CAAC,GAAG,UAAU,CAAC,EAAE;AAC1E,aAAW,OAAO,MAAM;AACtB,WAAO,WAAW,IAAI,IAAI,IAAI;AAAA,MAC5B,MAAM;AAAA,MACN,aAAa,IAAI;AAAA,IACnB;AACA,QAAI,IAAI,SAAU,QAAO,SAAS,KAAK,IAAI,IAAI;AAAA,EACjD;AACA,SAAO;AACT;AAYA,SAAS,eACP,IACA,QACA,QACA,QACA;AACA,SAAO,MAAM,gCAAgC,OAAO,IAAI,IAAI,OAAO,IAAI,EAAE;AACzE,KAAG,aAAa;AAAA,IACd,MAAM,OAAO;AAAA,IACb,aAAa,OAAO,eAAe;AAAA,IACnC,OAAO,EAAE,YAAY,SAAS,OAAO,SAAS,EAAE;AAAA,IAChD,QAAQ,EAAE,QAAQ,OAAO;AAAA,IACzB,UAAU,EAAE,KAAK,EAAE,OAAO,OAAO,SAAS,CAAC,EAAE,EAAE;AAAA,IAC/C,UAAU,OAAO,MAAM,EAAE,QAAQ,MAAM;AACrC,aAAO;AAAA,QACL,4BAA4B,OAAO,IAAI,IAAI,OAAO,IAAI;AAAA,QACtD,KAAK,UAAU,IAAI;AAAA,MACrB;AACA,YAAM,SAAS,MAAM,OAAO,UAAU;AAAA,QACpC,MAAM,OAAO;AAAA,QACb,WAAW;AAAA,QACX,OAAO,SAAS,KAAK;AAAA,MACvB,CAAC;AACD,aAAO,OAAO,SAAS,IAAI,oBAAoB;AAAA,IACjD;AAAA,EACF,CAAC;AACH;AAEA,SAAS,uBAKP,QACA,QACA,QAOgD;AAChD,QAAM,aAAc,OAClB,OACA,SAC0C;AAC1C,WAAO,MAAM,4BAA4B,OAAO,IAAI,IAAI,OAAO,IAAI,EAAE;AACrE,WAAO,OAAO,GAAG,SAAS,WAAW,OAAO,OAAO,IAAI,CAAC;AAAA,EAC1D;AAEA,aAAW,MAAM;AAAA,IACf,MAAM,OAAO;AAAA,IACb,UAAU;AAAA,MACR,aAAa,OAAO;AAAA,MACpB,WAAW,OAAO;AAAA,MAClB,KAAK,EAAE,OAAO,OAAO,SAAS,CAAC,EAAE;AAAA,IACnC;AAAA,EACF;AAEA,aAAW,SAAS,CAClB,OACA,SACuC;AACvC,WAAO,MAAM,8BAA8B,OAAO,IAAI,IAAI,OAAO,IAAI,EAAE;AACvE,WAAO,OAAO,GAAG,eAAe,WAAW,OAAO,OAAO,IAAI,CAAC;AAAA,EAChE;AAEA,aAAW,SAAS,OAClB,OACA,SAC+C;AAC/C,WAAO,MAAM,8BAA8B,OAAO,IAAI,IAAI,OAAO,IAAI,EAAE;AACvE,UAAM,SAAS,MAAM,OAAO,UAAU;AAAA,MACpC,MAAM,OAAO;AAAA,MACb,WAAW;AAAA,MACX,OAAO,MAAM,SAAS,KAAK;AAAA,IAC7B,CAAC;AACD,UAAM,WAAW,OAAO,SAAS,IAAI,oBAAoB;AACzD,WAAO;AAAA,MACL,GAAG,OAAO;AAAA,MACV,GAAG;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAEA,aAAW,SAAS,YAAiC;AACnD,UAAM,IAAI,YAAY;AAAA,MACpB,QAAQ;AAAA,MACR,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AAEA,SAAO;AACT;AAMA,eAAsB,mBACpB,IACA,QACA,QACe;AACf,MAAI;AACJ,SAAO,MAAM;AACX,UAAM,EAAE,YAAY,QAAQ,IAAI,MAAM,OAAO,YAAY,EAAE,OAAO,CAAC;AACnE,YAAQ,QAAQ,CAAC,MAAM,eAAe,IAAI,QAAQ,GAAG,MAAM,CAAC;AAC5D,aAAS;AACT,QAAI,CAAC,OAAQ;AAAA,EACf;AACF;AAKA,eAAsB,oBACpB,QACA,QAOuC;AACvC,MAAI;AAEJ,SAAO,MAAM;AACX,UAAM,EAAE,YAAY,QAAQ,IAAI,MAAM,OAAO,YAAY,EAAE,OAAO,CAAC;AACnE,UAAM,cAAc,QAAQ;AAAA,MAC1B,CAAC,MAAc,EAAE,SAAS,OAAO;AAAA,IACnC;AACA,QAAI,aAAa;AACf,aAAO,uBAAuB,QAAQ,aAAa,MAAM;AAAA,IAC3D;AACA,aAAS;AACT,QAAI,CAAC,OAAQ;AAAA,EACf;AACA,SAAO;AACT;AAEA,eAAsB,gBACpB,QACA,QAM6B;AAC7B,MAAI;AACJ,QAAM,MAA0B,CAAC;AAEjC,SAAO,MAAM;AACX,UAAM,EAAE,YAAY,QAAQ,IAAI,MAAM,OAAO,YAAY,EAAE,OAAO,CAAC;AACnE,eAAW,KAAK,SAAS;AACvB,UAAI;AAAA,QACF,uBAAuB,QAAQ,GAAG,EAAE,GAAG,QAAQ,YAAY,EAAE,KAAK,CAAC;AAAA,MACrE;AAAA,IACF;AACA,aAAS;AACT,QAAI,CAAC,OAAQ;AAAA,EACf;AACA,SAAO;AACT;","names":[]}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { Client } from '@modelcontextprotocol/sdk/client/index.js';
|
|
2
|
+
import { Genkit, DynamicResourceAction } from 'genkit';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Copyright 2024 Google LLC
|
|
6
|
+
*
|
|
7
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
8
|
+
* you may not use this file except in compliance with the License.
|
|
9
|
+
* You may obtain a copy of the License at
|
|
10
|
+
*
|
|
11
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
12
|
+
*
|
|
13
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
14
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
15
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
16
|
+
* See the License for the specific language governing permissions and
|
|
17
|
+
* limitations under the License.
|
|
18
|
+
*/
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Lookup all resources available in the server and fetches as a Genkit dynamic resource.
|
|
22
|
+
*/
|
|
23
|
+
declare function fetchDynamicResources(ai: Genkit, client: Client, params: {
|
|
24
|
+
name: string;
|
|
25
|
+
serverName: string;
|
|
26
|
+
}): Promise<DynamicResourceAction[]>;
|
|
27
|
+
|
|
28
|
+
export { fetchDynamicResources };
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { Client } from '@modelcontextprotocol/sdk/client/index.js';
|
|
2
|
+
import { Genkit, DynamicResourceAction } from 'genkit';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Copyright 2024 Google LLC
|
|
6
|
+
*
|
|
7
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
8
|
+
* you may not use this file except in compliance with the License.
|
|
9
|
+
* You may obtain a copy of the License at
|
|
10
|
+
*
|
|
11
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
12
|
+
*
|
|
13
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
14
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
15
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
16
|
+
* See the License for the specific language governing permissions and
|
|
17
|
+
* limitations under the License.
|
|
18
|
+
*/
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Lookup all resources available in the server and fetches as a Genkit dynamic resource.
|
|
22
|
+
*/
|
|
23
|
+
declare function fetchDynamicResources(ai: Genkit, client: Client, params: {
|
|
24
|
+
name: string;
|
|
25
|
+
serverName: string;
|
|
26
|
+
}): Promise<DynamicResourceAction[]>;
|
|
27
|
+
|
|
28
|
+
export { fetchDynamicResources };
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
var resource_exports = {};
|
|
20
|
+
__export(resource_exports, {
|
|
21
|
+
fetchDynamicResources: () => fetchDynamicResources
|
|
22
|
+
});
|
|
23
|
+
module.exports = __toCommonJS(resource_exports);
|
|
24
|
+
var import_genkit = require("genkit");
|
|
25
|
+
var import_logging = require("genkit/logging");
|
|
26
|
+
function createDynamicResource(client, resource, params) {
|
|
27
|
+
return (0, import_genkit.dynamicResource)(
|
|
28
|
+
{
|
|
29
|
+
name: `${params.serverName}/${resource.name}`,
|
|
30
|
+
description: resource.description || void 0,
|
|
31
|
+
metadata: { mcp: { _meta: resource._meta || {} } },
|
|
32
|
+
uri: resource.uri
|
|
33
|
+
},
|
|
34
|
+
async (args, { context }) => {
|
|
35
|
+
import_logging.logger.debug(
|
|
36
|
+
`[MCP] calling resource '${params.serverName}/${resource.name}' in host '${params.name}'`
|
|
37
|
+
);
|
|
38
|
+
const result = await client.readResource({
|
|
39
|
+
uri: args.uri,
|
|
40
|
+
_meta: context?.mcp?._meta
|
|
41
|
+
});
|
|
42
|
+
return {
|
|
43
|
+
content: result.contents.map((p) => fromMcpResourcePart(p))
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
);
|
|
47
|
+
}
|
|
48
|
+
function createDynamicResourceTemplate(client, template, params) {
|
|
49
|
+
return (0, import_genkit.dynamicResource)(
|
|
50
|
+
{
|
|
51
|
+
name: `${params.serverName}/${template.name}`,
|
|
52
|
+
description: template.description || void 0,
|
|
53
|
+
metadata: { mcp: { _meta: template._meta || {} } },
|
|
54
|
+
template: template.uriTemplate
|
|
55
|
+
},
|
|
56
|
+
async (args, { context }) => {
|
|
57
|
+
import_logging.logger.debug(
|
|
58
|
+
`[MCP] calling resource template '${params.serverName}/${template.name}' in host '${params.name}'`
|
|
59
|
+
);
|
|
60
|
+
const result = await client.readResource({
|
|
61
|
+
uri: args.uri,
|
|
62
|
+
_meta: context?.mcp?._meta
|
|
63
|
+
});
|
|
64
|
+
return {
|
|
65
|
+
content: result.contents.map((p) => fromMcpResourcePart(p)),
|
|
66
|
+
metadata: result._meta
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
);
|
|
70
|
+
}
|
|
71
|
+
function fromMcpResourcePart(part) {
|
|
72
|
+
if (part.text) {
|
|
73
|
+
return { text: part.text, metadata: part._meta };
|
|
74
|
+
}
|
|
75
|
+
if (part.blob) {
|
|
76
|
+
return {
|
|
77
|
+
media: {
|
|
78
|
+
contentType: part.mimeType,
|
|
79
|
+
url: `data:${part.mimeType};base64,${part.blob}`
|
|
80
|
+
},
|
|
81
|
+
metadata: part._meta
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
throw new import_genkit.GenkitError({
|
|
85
|
+
status: "UNIMPLEMENTED",
|
|
86
|
+
message: `Part type ${part.type} is not currently supported.`
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
async function fetchDynamicResources(ai, client, params) {
|
|
90
|
+
let cursor;
|
|
91
|
+
let allResources = [];
|
|
92
|
+
while (true) {
|
|
93
|
+
const { nextCursor, resources } = await client.listResources({ cursor });
|
|
94
|
+
allResources.push(
|
|
95
|
+
...resources.map((r) => createDynamicResource(client, r, params))
|
|
96
|
+
);
|
|
97
|
+
cursor = nextCursor;
|
|
98
|
+
if (!cursor) break;
|
|
99
|
+
}
|
|
100
|
+
while (true) {
|
|
101
|
+
const { nextCursor, resourceTemplates } = await client.listResourceTemplates({ cursor });
|
|
102
|
+
allResources.push(
|
|
103
|
+
...resourceTemplates.map(
|
|
104
|
+
(r) => createDynamicResourceTemplate(client, r, params)
|
|
105
|
+
)
|
|
106
|
+
);
|
|
107
|
+
cursor = nextCursor;
|
|
108
|
+
if (!cursor) break;
|
|
109
|
+
}
|
|
110
|
+
return allResources;
|
|
111
|
+
}
|
|
112
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
113
|
+
0 && (module.exports = {
|
|
114
|
+
fetchDynamicResources
|
|
115
|
+
});
|
|
116
|
+
//# sourceMappingURL=resource.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"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 DynamicResourceAction,\n Genkit,\n GenkitError,\n Part,\n dynamicResource,\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 (part.text) {\n return { text: part.text as string, metadata: part._meta };\n }\n if (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 ${part.type} 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":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAsBA,oBAMO;AACP,qBAAuB;AAEvB,SAAS,sBACP,QACA,UACA,QACuB;AACvB,aAAO;AAAA,IACL;AAAA,MACE,MAAM,GAAG,OAAO,UAAU,IAAI,SAAS,IAAI;AAAA,MAC3C,aAAa,SAAS,eAAe;AAAA,MACrC,UAAU,EAAE,KAAK,EAAE,OAAO,SAAS,SAAS,CAAC,EAAE,EAAE;AAAA,MACjD,KAAK,SAAS;AAAA,IAChB;AAAA,IACA,OAAO,MAAM,EAAE,QAAQ,MAAM;AAC3B,4BAAO;AAAA,QACL,2BAA2B,OAAO,UAAU,IAAI,SAAS,IAAI,cAAc,OAAO,IAAI;AAAA,MACxF;AACA,YAAM,SAAS,MAAM,OAAO,aAAa;AAAA,QACvC,KAAK,KAAK;AAAA,QACV,OAAO,SAAS,KAAK;AAAA,MACvB,CAAC;AACD,aAAO;AAAA,QACL,SAAS,OAAO,SAAS,IAAI,CAAC,MAAM,oBAAoB,CAAC,CAAC;AAAA,MAC5D;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,8BACP,QACA,UACA,QACuB;AACvB,aAAO;AAAA,IACL;AAAA,MACE,MAAM,GAAG,OAAO,UAAU,IAAI,SAAS,IAAI;AAAA,MAC3C,aAAa,SAAS,eAAe;AAAA,MACrC,UAAU,EAAE,KAAK,EAAE,OAAO,SAAS,SAAS,CAAC,EAAE,EAAE;AAAA,MACjD,UAAU,SAAS;AAAA,IACrB;AAAA,IACA,OAAO,MAAM,EAAE,QAAQ,MAAM;AAC3B,4BAAO;AAAA,QACL,oCAAoC,OAAO,UAAU,IAAI,SAAS,IAAI,cAAc,OAAO,IAAI;AAAA,MACjG;AACA,YAAM,SAAS,MAAM,OAAO,aAAa;AAAA,QACvC,KAAK,KAAK;AAAA,QACV,OAAO,SAAS,KAAK;AAAA,MACvB,CAAC;AACD,aAAO;AAAA,QACL,SAAS,OAAO,SAAS,IAAI,CAAC,MAAM,oBAAoB,CAAC,CAAC;AAAA,QAC1D,UAAU,OAAO;AAAA,MACnB;AAAA,IACF;AAAA,EACF;AACF;AAKA,SAAS,oBACP,MACM;AACN,MAAI,KAAK,MAAM;AACb,WAAO,EAAE,MAAM,KAAK,MAAgB,UAAU,KAAK,MAAM;AAAA,EAC3D;AACA,MAAI,KAAK,MAAM;AACb,WAAO;AAAA,MACL,OAAO;AAAA,QACL,aAAa,KAAK;AAAA,QAClB,KAAK,QAAQ,KAAK,QAAQ,WAAW,KAAK,IAAI;AAAA,MAChD;AAAA,MACA,UAAU,KAAK;AAAA,IACjB;AAAA,EACF;AACA,QAAM,IAAI,0BAAY;AAAA,IACpB,QAAQ;AAAA,IACR,SAAS,aAAa,KAAK,IAAI;AAAA,EACjC,CAAC;AACH;AAKA,eAAsB,sBACpB,IACA,QACA,QACkC;AAClC,MAAI;AACJ,MAAI,eAAwC,CAAC;AAC7C,SAAO,MAAM;AACX,UAAM,EAAE,YAAY,UAAU,IAAI,MAAM,OAAO,cAAc,EAAE,OAAO,CAAC;AACvE,iBAAa;AAAA,MACX,GAAG,UAAU,IAAI,CAAC,MAAM,sBAAsB,QAAQ,GAAG,MAAM,CAAC;AAAA,IAClE;AACA,aAAS;AACT,QAAI,CAAC,OAAQ;AAAA,EACf;AACA,SAAO,MAAM;AACX,UAAM,EAAE,YAAY,kBAAkB,IACpC,MAAM,OAAO,sBAAsB,EAAE,OAAO,CAAC;AAC/C,iBAAa;AAAA,MACX,GAAG,kBAAkB;AAAA,QAAI,CAAC,MACxB,8BAA8B,QAAQ,GAAG,MAAM;AAAA,MACjD;AAAA,IACF;AACA,aAAS;AACT,QAAI,CAAC,OAAQ;AAAA,EACf;AACA,SAAO;AACT;","names":[]}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import {
|
|
2
|
+
GenkitError,
|
|
3
|
+
dynamicResource
|
|
4
|
+
} from "genkit";
|
|
5
|
+
import { logger } from "genkit/logging";
|
|
6
|
+
function createDynamicResource(client, resource, params) {
|
|
7
|
+
return dynamicResource(
|
|
8
|
+
{
|
|
9
|
+
name: `${params.serverName}/${resource.name}`,
|
|
10
|
+
description: resource.description || void 0,
|
|
11
|
+
metadata: { mcp: { _meta: resource._meta || {} } },
|
|
12
|
+
uri: resource.uri
|
|
13
|
+
},
|
|
14
|
+
async (args, { context }) => {
|
|
15
|
+
logger.debug(
|
|
16
|
+
`[MCP] calling resource '${params.serverName}/${resource.name}' in host '${params.name}'`
|
|
17
|
+
);
|
|
18
|
+
const result = await client.readResource({
|
|
19
|
+
uri: args.uri,
|
|
20
|
+
_meta: context?.mcp?._meta
|
|
21
|
+
});
|
|
22
|
+
return {
|
|
23
|
+
content: result.contents.map((p) => fromMcpResourcePart(p))
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
);
|
|
27
|
+
}
|
|
28
|
+
function createDynamicResourceTemplate(client, template, params) {
|
|
29
|
+
return dynamicResource(
|
|
30
|
+
{
|
|
31
|
+
name: `${params.serverName}/${template.name}`,
|
|
32
|
+
description: template.description || void 0,
|
|
33
|
+
metadata: { mcp: { _meta: template._meta || {} } },
|
|
34
|
+
template: template.uriTemplate
|
|
35
|
+
},
|
|
36
|
+
async (args, { context }) => {
|
|
37
|
+
logger.debug(
|
|
38
|
+
`[MCP] calling resource template '${params.serverName}/${template.name}' in host '${params.name}'`
|
|
39
|
+
);
|
|
40
|
+
const result = await client.readResource({
|
|
41
|
+
uri: args.uri,
|
|
42
|
+
_meta: context?.mcp?._meta
|
|
43
|
+
});
|
|
44
|
+
return {
|
|
45
|
+
content: result.contents.map((p) => fromMcpResourcePart(p)),
|
|
46
|
+
metadata: result._meta
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
);
|
|
50
|
+
}
|
|
51
|
+
function fromMcpResourcePart(part) {
|
|
52
|
+
if (part.text) {
|
|
53
|
+
return { text: part.text, metadata: part._meta };
|
|
54
|
+
}
|
|
55
|
+
if (part.blob) {
|
|
56
|
+
return {
|
|
57
|
+
media: {
|
|
58
|
+
contentType: part.mimeType,
|
|
59
|
+
url: `data:${part.mimeType};base64,${part.blob}`
|
|
60
|
+
},
|
|
61
|
+
metadata: part._meta
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
throw new GenkitError({
|
|
65
|
+
status: "UNIMPLEMENTED",
|
|
66
|
+
message: `Part type ${part.type} is not currently supported.`
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
async function fetchDynamicResources(ai, client, params) {
|
|
70
|
+
let cursor;
|
|
71
|
+
let allResources = [];
|
|
72
|
+
while (true) {
|
|
73
|
+
const { nextCursor, resources } = await client.listResources({ cursor });
|
|
74
|
+
allResources.push(
|
|
75
|
+
...resources.map((r) => createDynamicResource(client, r, params))
|
|
76
|
+
);
|
|
77
|
+
cursor = nextCursor;
|
|
78
|
+
if (!cursor) break;
|
|
79
|
+
}
|
|
80
|
+
while (true) {
|
|
81
|
+
const { nextCursor, resourceTemplates } = await client.listResourceTemplates({ cursor });
|
|
82
|
+
allResources.push(
|
|
83
|
+
...resourceTemplates.map(
|
|
84
|
+
(r) => createDynamicResourceTemplate(client, r, params)
|
|
85
|
+
)
|
|
86
|
+
);
|
|
87
|
+
cursor = nextCursor;
|
|
88
|
+
if (!cursor) break;
|
|
89
|
+
}
|
|
90
|
+
return allResources;
|
|
91
|
+
}
|
|
92
|
+
export {
|
|
93
|
+
fetchDynamicResources
|
|
94
|
+
};
|
|
95
|
+
//# sourceMappingURL=resource.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"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 DynamicResourceAction,\n Genkit,\n GenkitError,\n Part,\n dynamicResource,\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 (part.text) {\n return { text: part.text as string, metadata: part._meta };\n }\n if (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 ${part.type} 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":"AAsBA;AAAA,EAGE;AAAA,EAEA;AAAA,OACK;AACP,SAAS,cAAc;AAEvB,SAAS,sBACP,QACA,UACA,QACuB;AACvB,SAAO;AAAA,IACL;AAAA,MACE,MAAM,GAAG,OAAO,UAAU,IAAI,SAAS,IAAI;AAAA,MAC3C,aAAa,SAAS,eAAe;AAAA,MACrC,UAAU,EAAE,KAAK,EAAE,OAAO,SAAS,SAAS,CAAC,EAAE,EAAE;AAAA,MACjD,KAAK,SAAS;AAAA,IAChB;AAAA,IACA,OAAO,MAAM,EAAE,QAAQ,MAAM;AAC3B,aAAO;AAAA,QACL,2BAA2B,OAAO,UAAU,IAAI,SAAS,IAAI,cAAc,OAAO,IAAI;AAAA,MACxF;AACA,YAAM,SAAS,MAAM,OAAO,aAAa;AAAA,QACvC,KAAK,KAAK;AAAA,QACV,OAAO,SAAS,KAAK;AAAA,MACvB,CAAC;AACD,aAAO;AAAA,QACL,SAAS,OAAO,SAAS,IAAI,CAAC,MAAM,oBAAoB,CAAC,CAAC;AAAA,MAC5D;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,8BACP,QACA,UACA,QACuB;AACvB,SAAO;AAAA,IACL;AAAA,MACE,MAAM,GAAG,OAAO,UAAU,IAAI,SAAS,IAAI;AAAA,MAC3C,aAAa,SAAS,eAAe;AAAA,MACrC,UAAU,EAAE,KAAK,EAAE,OAAO,SAAS,SAAS,CAAC,EAAE,EAAE;AAAA,MACjD,UAAU,SAAS;AAAA,IACrB;AAAA,IACA,OAAO,MAAM,EAAE,QAAQ,MAAM;AAC3B,aAAO;AAAA,QACL,oCAAoC,OAAO,UAAU,IAAI,SAAS,IAAI,cAAc,OAAO,IAAI;AAAA,MACjG;AACA,YAAM,SAAS,MAAM,OAAO,aAAa;AAAA,QACvC,KAAK,KAAK;AAAA,QACV,OAAO,SAAS,KAAK;AAAA,MACvB,CAAC;AACD,aAAO;AAAA,QACL,SAAS,OAAO,SAAS,IAAI,CAAC,MAAM,oBAAoB,CAAC,CAAC;AAAA,QAC1D,UAAU,OAAO;AAAA,MACnB;AAAA,IACF;AAAA,EACF;AACF;AAKA,SAAS,oBACP,MACM;AACN,MAAI,KAAK,MAAM;AACb,WAAO,EAAE,MAAM,KAAK,MAAgB,UAAU,KAAK,MAAM;AAAA,EAC3D;AACA,MAAI,KAAK,MAAM;AACb,WAAO;AAAA,MACL,OAAO;AAAA,QACL,aAAa,KAAK;AAAA,QAClB,KAAK,QAAQ,KAAK,QAAQ,WAAW,KAAK,IAAI;AAAA,MAChD;AAAA,MACA,UAAU,KAAK;AAAA,IACjB;AAAA,EACF;AACA,QAAM,IAAI,YAAY;AAAA,IACpB,QAAQ;AAAA,IACR,SAAS,aAAa,KAAK,IAAI;AAAA,EACjC,CAAC;AACH;AAKA,eAAsB,sBACpB,IACA,QACA,QACkC;AAClC,MAAI;AACJ,MAAI,eAAwC,CAAC;AAC7C,SAAO,MAAM;AACX,UAAM,EAAE,YAAY,UAAU,IAAI,MAAM,OAAO,cAAc,EAAE,OAAO,CAAC;AACvE,iBAAa;AAAA,MACX,GAAG,UAAU,IAAI,CAAC,MAAM,sBAAsB,QAAQ,GAAG,MAAM,CAAC;AAAA,IAClE;AACA,aAAS;AACT,QAAI,CAAC,OAAQ;AAAA,EACf;AACA,SAAO,MAAM;AACX,UAAM,EAAE,YAAY,kBAAkB,IACpC,MAAM,OAAO,sBAAsB,EAAE,OAAO,CAAC;AAC/C,iBAAa;AAAA,MACX,GAAG,kBAAkB;AAAA,QAAI,CAAC,MACxB,8BAA8B,QAAQ,GAAG,MAAM;AAAA,MACjD;AAAA,IACF;AACA,aAAS;AACT,QAAI,CAAC,OAAQ;AAAA,EACf;AACA,SAAO;AACT;","names":[]}
|