@agentskit/mcp 0.3.8 → 0.4.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/README.md +55 -39
- package/dist/bin.cjs +111 -7
- package/dist/bin.cjs.map +1 -1
- package/dist/bin.js +9 -5
- package/dist/bin.js.map +1 -1
- package/dist/{chunk-5K3ZAG4X.js → chunk-DU5RLF44.js} +111 -7
- package/dist/chunk-DU5RLF44.js.map +1 -0
- package/dist/index.cjs +109 -3
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +24 -2
- package/dist/index.d.ts +24 -2
- package/dist/index.js +1 -1
- package/package.json +14 -14
- package/LICENSE +0 -21
- package/dist/chunk-5K3ZAG4X.js.map +0 -1
package/dist/bin.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/cli.ts","../src/bin.ts"],"names":["warn"],"mappings":"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","file":"bin.js","sourcesContent":["import type { AdapterFactory, ToolDefinition } from '@agentskit/core'\nimport {\n anthropic,\n cerebras,\n cohere,\n deepseek,\n fireworks,\n gemini,\n grok,\n groq,\n huggingface,\n kimi,\n llamacpp,\n lmstudio,\n mistral,\n ollama,\n openai,\n openrouter,\n qwen,\n together,\n vllm,\n} from '@agentskit/adapters'\nimport { dispatchFromCatalog } from '@agentskit/adapters/catalog'\nimport { fetchUrl, filesystem, shell, sqliteQueryTool, webSearch } from '@agentskit/tools'\nimport type { McpServer } from '@agentskit/tools/mcp'\nimport { createAgentTool } from './agent-tool'\nimport { createAgentsKitMcpServer } from './index'\nimport { fetchAgentSkill, type FetchedAgentSkill } from './registry-fetch'\n\nconst VALUE_FLAGS = new Set([\n '--agents', '--api-key', '--base-url', '--fs-root', '--max-steps', '--model',\n '--provider', '--sqlite', '--tools',\n])\nconst BOOLEAN_FLAGS = new Set(['--allow-shell', '--help'])\nconst TOOL_IDS = new Set(['fetch', 'filesystem', 'search', 'shell', 'sqlite'])\n\nexport interface McpCliOptions {\n agents: string[]\n allowShell: boolean\n apiKey?: string\n baseUrl?: string\n fsRoot?: string\n help: boolean\n maxSteps: number\n model?: string\n provider: string\n sqlite?: string\n tools: string[]\n}\n\nexport type McpCliParseResult =\n | { message: string; status: 'rejected' }\n | { options: McpCliOptions; status: 'parsed' }\n\nconst csv = (input: string): string[] =>\n [...new Set(input.split(',').map((value) => value.trim()).filter(Boolean))]\n\nexport const parseMcpCliArgs = (argv: readonly string[]): McpCliParseResult => {\n const values = new Map<string, string>()\n const booleans = new Set<string>()\n for (let index = 0; index < argv.length; index += 1) {\n const argument = argv[index]!\n if (BOOLEAN_FLAGS.has(argument)) {\n if (booleans.has(argument)) return { message: `duplicate flag: ${argument}`, status: 'rejected' }\n booleans.add(argument)\n continue\n }\n if (!VALUE_FLAGS.has(argument)) return { message: `unknown argument: ${argument}`, status: 'rejected' }\n if (values.has(argument)) return { message: `duplicate flag: ${argument}`, status: 'rejected' }\n const value = argv[index + 1]\n if (value === undefined || value.startsWith('--')) {\n return { message: `missing value for ${argument}`, status: 'rejected' }\n }\n values.set(argument, value)\n index += 1\n }\n\n const tools = values.has('--tools') ? csv(values.get('--tools')!) : ['fetch', 'search']\n const unknownTool = tools.find((tool) => !TOOL_IDS.has(tool))\n if (unknownTool) return { message: `unknown tool: ${unknownTool}`, status: 'rejected' }\n const agents = values.has('--agents') ? csv(values.get('--agents')!) : []\n const maxStepsText = values.get('--max-steps') ?? '8'\n const maxSteps = Number(maxStepsText)\n if (!Number.isSafeInteger(maxSteps) || maxSteps < 1 || maxSteps > 100) {\n return { message: '--max-steps must be a safe integer between 1 and 100', status: 'rejected' }\n }\n\n return {\n options: {\n agents,\n allowShell: booleans.has('--allow-shell'),\n apiKey: values.get('--api-key'),\n baseUrl: values.get('--base-url'),\n fsRoot: values.get('--fs-root'),\n help: booleans.has('--help'),\n maxSteps,\n model: values.get('--model'),\n provider: (values.get('--provider') ?? 'openai').toLowerCase(),\n sqlite: values.get('--sqlite'),\n tools,\n },\n status: 'parsed',\n }\n}\n\ntype KeyedFactory = (config: { apiKey: string; baseUrl?: string; model: string }) => AdapterFactory\ntype LocalFactory = (config: { baseUrl?: string; model: string }) => AdapterFactory\n\nconst KEYED: Record<string, KeyedFactory> = {\n anthropic, cerebras, cohere, deepseek, fireworks, gemini, grok, groq,\n huggingface, kimi, llamacpp, lmstudio, mistral, openai, openrouter, qwen,\n together, vllm,\n}\nconst LOCAL: Record<string, LocalFactory> = { ollama }\nconst LOCAL_COMPAT = new Set(['llamacpp', 'lmstudio', 'vllm'])\nconst DEFAULT_MODEL: Record<string, string> = {\n anthropic: 'claude-sonnet-4-6',\n deepseek: 'deepseek-chat',\n gemini: 'gemini-2.0-flash',\n grok: 'grok-2',\n groq: 'openai/gpt-oss-120b',\n mistral: 'mistral-large-latest',\n ollama: 'llama3',\n openai: 'gpt-4o',\n}\n\nexport interface McpCliDependencies {\n createServer?: typeof createAgentsKitMcpServer\n env?: Readonly<Record<string, string | undefined>>\n fetchSkill?: (id: string) => Promise<FetchedAgentSkill | null>\n warn?: (message: string) => void\n}\n\nexport type McpCliRunResult =\n | { exitCode: 0; server: McpServer; status: 'started'; toolNames: string[] }\n | { exitCode: 0; status: 'help' }\n | { exitCode: 1; status: 'rejected' }\n\nexport const MCP_CLI_HELP = [\n 'Usage: agentskit-mcp [options]',\n '--tools <fetch,search,filesystem,shell,sqlite>',\n '--agents <registry-ids> --provider <provider> --model <model>',\n '--fs-root <dir> --sqlite <file> --allow-shell',\n].join('\\n')\n\nconst buildPrimitiveTools = (options: McpCliOptions, warn: (message: string) => void): ToolDefinition[] => {\n const tools: ToolDefinition[] = []\n if (options.tools.includes('fetch')) tools.push(fetchUrl())\n if (options.tools.includes('search')) tools.push(webSearch())\n if (options.tools.includes('filesystem')) {\n if (options.fsRoot) tools.push(...filesystem({ basePath: options.fsRoot }))\n else warn('skipping \"filesystem\": pass --fs-root <dir>')\n }\n if (options.tools.includes('sqlite')) {\n if (options.sqlite) tools.push(sqliteQueryTool({ path: options.sqlite }))\n else warn('skipping \"sqlite\": pass --sqlite <file>')\n }\n if (options.tools.includes('shell')) {\n if (options.allowShell) tools.push(shell())\n else warn('skipping \"shell\": pass --allow-shell (runs commands)')\n }\n return tools\n}\n\nconst resolveAdapter = (\n options: McpCliOptions,\n env: Readonly<Record<string, string | undefined>>,\n warn: (message: string) => void,\n): AdapterFactory | null => {\n const model = options.model ?? DEFAULT_MODEL[options.provider]\n if (!model) {\n warn(`--agents needs a model for \"${options.provider}\": pass --model`)\n return null\n }\n const local = LOCAL[options.provider]\n if (local) return local({ baseUrl: options.baseUrl, model })\n\n const envName = `${options.provider.toUpperCase().replace(/-/g, '_')}_API_KEY`\n const apiKey = options.apiKey ?? env[envName] ?? (LOCAL_COMPAT.has(options.provider) ? 'local' : undefined)\n if (!apiKey) {\n warn(`--agents needs a key for \"${options.provider}\": pass --api-key or set ${envName}`)\n return null\n }\n const keyed = KEYED[options.provider]\n if (keyed) return keyed({ apiKey, baseUrl: options.baseUrl, model })\n try {\n return dispatchFromCatalog({ apiKey, baseUrl: options.baseUrl, model, provider: options.provider })\n } catch {\n warn(`unknown or incompatible provider \"${options.provider}\"`)\n return null\n }\n}\n\nexport const runMcpCli = async (\n argv: readonly string[],\n dependencies: McpCliDependencies = {},\n): Promise<McpCliRunResult> => {\n const warn = dependencies.warn ?? (() => undefined)\n const parsed = parseMcpCliArgs(argv)\n if (parsed.status === 'rejected') {\n warn(parsed.message)\n return { exitCode: 1, status: 'rejected' }\n }\n if (parsed.options.help) {\n warn(MCP_CLI_HELP)\n return { exitCode: 0, status: 'help' }\n }\n\n const tools = buildPrimitiveTools(parsed.options, warn)\n if (parsed.options.agents.length > 0) {\n const adapter = resolveAdapter(parsed.options, dependencies.env ?? process.env, warn)\n if (adapter) {\n const fetchSkill = dependencies.fetchSkill ?? fetchAgentSkill\n for (const id of parsed.options.agents) {\n const skill = await fetchSkill(id).catch(() => null)\n if (!skill) {\n warn(`skipping agent \"${id}\": not found or not runnable`)\n continue\n }\n tools.push(createAgentTool({ ...skill, adapter, maxSteps: parsed.options.maxSteps }))\n }\n }\n }\n\n if (tools.length === 0) {\n warn('no tools or agents enabled — nothing to serve')\n return { exitCode: 1, status: 'rejected' }\n }\n const seen = new Set<string>()\n const duplicate = tools.find((tool) => {\n if (seen.has(tool.name)) return true\n seen.add(tool.name)\n return false\n })\n if (duplicate) {\n warn(`duplicate tool name: ${duplicate.name}`)\n return { exitCode: 1, status: 'rejected' }\n }\n const createServer = dependencies.createServer ?? createAgentsKitMcpServer\n let server: McpServer\n try {\n server = createServer({\n tools,\n onEvent: (event) => {\n if (event.type === 'error') warn(`tool error (${event.tool ?? 'unknown'}): ${event.error ?? 'unknown'}`)\n },\n })\n } catch {\n warn('failed to start MCP server')\n return { exitCode: 1, status: 'rejected' }\n }\n const toolNames = tools.map((tool) => tool.name)\n warn(`serving ${toolNames.length} item(s) over stdio (${toolNames.join(', ')})`)\n return { exitCode: 0, server, status: 'started', toolNames }\n}\n","#!/usr/bin/env node\nimport { runMcpCli } from './cli'\n\nconst warn = (message: string): void => {\n process.stderr.write(`agentskit-mcp: ${message}\\n`)\n}\n\nvoid runMcpCli(process.argv.slice(2), { warn }).then((result) => {\n process.exitCode = result.exitCode\n}).catch(() => {\n warn('unexpected startup failure')\n process.exitCode = 1\n})\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/cli.ts","../src/bin.ts"],"names":["warn"],"mappings":"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","file":"bin.js","sourcesContent":["import type { AdapterFactory, ToolDefinition } from '@agentskit/core'\nimport {\n anthropic,\n cerebras,\n cohere,\n deepseek,\n fireworks,\n gemini,\n grok,\n groq,\n huggingface,\n kimi,\n llamacpp,\n lmstudio,\n mistral,\n ollama,\n openai,\n openrouter,\n qwen,\n together,\n vllm,\n} from '@agentskit/adapters'\nimport { dispatchFromCatalog } from '@agentskit/adapters/catalog'\nimport { fetchUrl, filesystem, shell, sqliteQueryTool, webSearch } from '@agentskit/tools'\nimport type { McpServer } from '@agentskit/tools/mcp'\nimport { createAgentTool, createTypedAgentTool } from './agent-tool'\nimport { createAgentsKitMcpServer } from './index'\nimport { fetchAgent, type FetchedAgent } from './registry-fetch'\n\nconst VALUE_FLAGS = new Set([\n '--agents', '--api-key', '--base-url', '--fs-root', '--max-steps', '--model',\n '--provider', '--sqlite', '--tools',\n])\nconst BOOLEAN_FLAGS = new Set(['--allow-shell', '--help'])\nconst TOOL_IDS = new Set(['fetch', 'filesystem', 'search', 'shell', 'sqlite'])\n\nexport interface McpCliOptions {\n agents: string[]\n allowShell: boolean\n apiKey?: string\n baseUrl?: string\n fsRoot?: string\n help: boolean\n maxSteps: number\n model?: string\n provider: string\n sqlite?: string\n tools: string[]\n}\n\nexport type McpCliParseResult =\n | { message: string; status: 'rejected' }\n | { options: McpCliOptions; status: 'parsed' }\n\nconst csv = (input: string): string[] =>\n [...new Set(input.split(',').map((value) => value.trim()).filter(Boolean))]\n\nexport const parseMcpCliArgs = (argv: readonly string[]): McpCliParseResult => {\n const values = new Map<string, string>()\n const booleans = new Set<string>()\n for (let index = 0; index < argv.length; index += 1) {\n const argument = argv[index]!\n if (BOOLEAN_FLAGS.has(argument)) {\n if (booleans.has(argument)) return { message: `duplicate flag: ${argument}`, status: 'rejected' }\n booleans.add(argument)\n continue\n }\n if (!VALUE_FLAGS.has(argument)) return { message: `unknown argument: ${argument}`, status: 'rejected' }\n if (values.has(argument)) return { message: `duplicate flag: ${argument}`, status: 'rejected' }\n const value = argv[index + 1]\n if (value === undefined || value.startsWith('--')) {\n return { message: `missing value for ${argument}`, status: 'rejected' }\n }\n values.set(argument, value)\n index += 1\n }\n\n const tools = values.has('--tools') ? csv(values.get('--tools')!) : ['fetch', 'search']\n const unknownTool = tools.find((tool) => !TOOL_IDS.has(tool))\n if (unknownTool) return { message: `unknown tool: ${unknownTool}`, status: 'rejected' }\n const agents = values.has('--agents') ? csv(values.get('--agents')!) : []\n const maxStepsText = values.get('--max-steps') ?? '8'\n const maxSteps = Number(maxStepsText)\n if (!Number.isSafeInteger(maxSteps) || maxSteps < 1 || maxSteps > 100) {\n return { message: '--max-steps must be a safe integer between 1 and 100', status: 'rejected' }\n }\n\n return {\n options: {\n agents,\n allowShell: booleans.has('--allow-shell'),\n apiKey: values.get('--api-key'),\n baseUrl: values.get('--base-url'),\n fsRoot: values.get('--fs-root'),\n help: booleans.has('--help'),\n maxSteps,\n model: values.get('--model'),\n provider: (values.get('--provider') ?? 'openai').toLowerCase(),\n sqlite: values.get('--sqlite'),\n tools,\n },\n status: 'parsed',\n }\n}\n\ntype KeyedFactory = (config: { apiKey: string; baseUrl?: string; model: string }) => AdapterFactory\ntype LocalFactory = (config: { baseUrl?: string; model: string }) => AdapterFactory\n\nconst KEYED: Record<string, KeyedFactory> = {\n anthropic, cerebras, cohere, deepseek, fireworks, gemini, grok, groq,\n huggingface, kimi, llamacpp, lmstudio, mistral, openai, openrouter, qwen,\n together, vllm,\n}\nconst LOCAL: Record<string, LocalFactory> = { ollama }\nconst LOCAL_COMPAT = new Set(['llamacpp', 'lmstudio', 'vllm'])\nconst DEFAULT_MODEL: Record<string, string> = {\n anthropic: 'claude-sonnet-4-6',\n deepseek: 'deepseek-chat',\n gemini: 'gemini-2.0-flash',\n grok: 'grok-2',\n groq: 'openai/gpt-oss-120b',\n mistral: 'mistral-large-latest',\n ollama: 'llama3',\n openai: 'gpt-4o',\n}\n\nexport interface McpCliDependencies {\n createServer?: typeof createAgentsKitMcpServer\n env?: Readonly<Record<string, string | undefined>>\n fetchAgent?: (id: string) => Promise<FetchedAgent | null>\n /** @deprecated Use fetchAgent; retained for dependency injection compatibility. */\n fetchSkill?: (id: string) => Promise<FetchedAgent | null>\n warn?: (message: string) => void\n}\n\nexport type McpCliRunResult =\n | { exitCode: 0; server: McpServer; status: 'started'; toolNames: string[] }\n | { exitCode: 0; status: 'help' }\n | { exitCode: 1; status: 'rejected' }\n\nexport const MCP_CLI_HELP = [\n 'Usage: agentskit-mcp [options]',\n '--tools <fetch,search,filesystem,shell,sqlite>',\n '--agents <registry-ids> --provider <provider> --model <model>',\n '--fs-root <dir> --sqlite <file> --allow-shell',\n].join('\\n')\n\nconst buildPrimitiveTools = (options: McpCliOptions, warn: (message: string) => void): ToolDefinition[] => {\n const tools: ToolDefinition[] = []\n if (options.tools.includes('fetch')) tools.push(fetchUrl())\n if (options.tools.includes('search')) tools.push(webSearch())\n if (options.tools.includes('filesystem')) {\n if (options.fsRoot) tools.push(...filesystem({ basePath: options.fsRoot }))\n else warn('skipping \"filesystem\": pass --fs-root <dir>')\n }\n if (options.tools.includes('sqlite')) {\n if (options.sqlite) tools.push(sqliteQueryTool({ path: options.sqlite }))\n else warn('skipping \"sqlite\": pass --sqlite <file>')\n }\n if (options.tools.includes('shell')) {\n if (options.allowShell) tools.push(shell())\n else warn('skipping \"shell\": pass --allow-shell (runs commands)')\n }\n return tools\n}\n\nconst resolveAdapter = (\n options: McpCliOptions,\n env: Readonly<Record<string, string | undefined>>,\n warn: (message: string) => void,\n): AdapterFactory | null => {\n const model = options.model ?? DEFAULT_MODEL[options.provider]\n if (!model) {\n warn(`--agents needs a model for \"${options.provider}\": pass --model`)\n return null\n }\n const local = LOCAL[options.provider]\n if (local) return local({ baseUrl: options.baseUrl, model })\n\n const envName = `${options.provider.toUpperCase().replace(/-/g, '_')}_API_KEY`\n const apiKey = options.apiKey ?? env[envName] ?? (LOCAL_COMPAT.has(options.provider) ? 'local' : undefined)\n if (!apiKey) {\n warn(`--agents needs a key for \"${options.provider}\": pass --api-key or set ${envName}`)\n return null\n }\n const keyed = KEYED[options.provider]\n if (keyed) return keyed({ apiKey, baseUrl: options.baseUrl, model })\n try {\n return dispatchFromCatalog({ apiKey, baseUrl: options.baseUrl, model, provider: options.provider })\n } catch {\n warn(`unknown or incompatible provider \"${options.provider}\"`)\n return null\n }\n}\n\nexport const runMcpCli = async (\n argv: readonly string[],\n dependencies: McpCliDependencies = {},\n): Promise<McpCliRunResult> => {\n const warn = dependencies.warn ?? (() => undefined)\n const parsed = parseMcpCliArgs(argv)\n if (parsed.status === 'rejected') {\n warn(parsed.message)\n return { exitCode: 1, status: 'rejected' }\n }\n if (parsed.options.help) {\n warn(MCP_CLI_HELP)\n return { exitCode: 0, status: 'help' }\n }\n\n const tools = buildPrimitiveTools(parsed.options, warn)\n if (parsed.options.agents.length > 0) {\n const adapter = resolveAdapter(parsed.options, dependencies.env ?? process.env, warn)\n if (adapter) {\n const fetch = dependencies.fetchAgent ?? dependencies.fetchSkill ?? fetchAgent\n for (const id of parsed.options.agents) {\n const agent = await fetch(id).catch(() => null)\n if (!agent) {\n warn(`skipping agent \"${id}\": not found or not runnable`)\n continue\n }\n try {\n tools.push('mode' in agent && agent.mode === 'typed'\n ? createTypedAgentTool({ ...agent, adapter, maxSteps: parsed.options.maxSteps })\n : createAgentTool({ ...agent, adapter, maxSteps: parsed.options.maxSteps }))\n } catch {\n warn(`skipping agent \"${id}\": invalid projection`)\n }\n }\n }\n }\n\n if (tools.length === 0) {\n warn('no tools or agents enabled — nothing to serve')\n return { exitCode: 1, status: 'rejected' }\n }\n const seen = new Set<string>()\n const duplicate = tools.find((tool) => {\n if (seen.has(tool.name)) return true\n seen.add(tool.name)\n return false\n })\n if (duplicate) {\n warn(`duplicate tool name: ${duplicate.name}`)\n return { exitCode: 1, status: 'rejected' }\n }\n const createServer = dependencies.createServer ?? createAgentsKitMcpServer\n let server: McpServer\n try {\n server = createServer({\n tools,\n onEvent: (event) => {\n if (event.type === 'error') warn(`tool error (${event.tool ?? 'unknown'}): ${event.error ?? 'unknown'}`)\n },\n })\n } catch {\n warn('failed to start MCP server')\n return { exitCode: 1, status: 'rejected' }\n }\n const toolNames = tools.map((tool) => tool.name)\n warn(`serving ${toolNames.length} item(s) over stdio (${toolNames.join(', ')})`)\n return { exitCode: 0, server, status: 'started', toolNames }\n}\n","#!/usr/bin/env node\nimport { runMcpCli } from './cli'\n\nconst warn = (message: string): void => {\n process.stderr.write(`agentskit-mcp: ${message}\\n`)\n}\n\nvoid runMcpCli(process.argv.slice(2), { warn }).then((result) => {\n process.exitCode = result.exitCode\n}).catch(() => {\n warn('unexpected startup failure')\n process.exitCode = 1\n})\n"]}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { ConfigError, ErrorCodes, ToolError } from '@agentskit/core';
|
|
2
2
|
import { createStdioTransport, createMcpServer } from '@agentskit/tools/mcp';
|
|
3
|
-
import { createRuntime } from '@agentskit/runtime';
|
|
3
|
+
import { createRuntime, invokeStructured } from '@agentskit/runtime';
|
|
4
|
+
import { createAjvValidator } from '@agentskit/tools/validation';
|
|
4
5
|
|
|
5
6
|
// src/index.ts
|
|
6
7
|
var encoder = new TextEncoder();
|
|
@@ -83,12 +84,105 @@ function createAgentTool(config) {
|
|
|
83
84
|
};
|
|
84
85
|
return Object.freeze(tool);
|
|
85
86
|
}
|
|
87
|
+
function createTypedAgentTool(config) {
|
|
88
|
+
const id = assertToolName(config?.id, "typed agent tool id");
|
|
89
|
+
const description = assertNonEmptyString(config?.description, "typed agent tool description", 4096);
|
|
90
|
+
const systemPrompt = assertNonEmptyString(config?.systemPrompt, "typed agent tool systemPrompt", 65536);
|
|
91
|
+
const resultToolName = assertToolName(config?.resultToolName, "typed agent result tool name");
|
|
92
|
+
const maxTaskBytes = assertPositiveInteger(config.maxTaskBytes ?? 65536, "typed agent input", 1048576);
|
|
93
|
+
if (!isRecord(config?.adapter) || typeof config.adapter.createSource !== "function") {
|
|
94
|
+
throw new ConfigError({
|
|
95
|
+
code: ErrorCodes.AK_CONFIG_INVALID,
|
|
96
|
+
message: "typed agent tool adapter must implement createSource"
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
if (!isRecord(config.inputSchema) || !isRecord(config.outputSchema)) {
|
|
100
|
+
throw new ConfigError({
|
|
101
|
+
code: ErrorCodes.AK_CONFIG_INVALID,
|
|
102
|
+
message: "typed agent tool schemas must be JSON Schema objects"
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
const validate = createAjvValidator({ rejectAdditionalProperties: true });
|
|
106
|
+
try {
|
|
107
|
+
validate(config.inputSchema, {});
|
|
108
|
+
validate(config.outputSchema, {});
|
|
109
|
+
} catch {
|
|
110
|
+
throw new ConfigError({
|
|
111
|
+
code: ErrorCodes.AK_CONFIG_INVALID,
|
|
112
|
+
message: "typed agent tool schemas must be valid JSON Schema"
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
const submit = {
|
|
116
|
+
name: resultToolName,
|
|
117
|
+
description: "Return the structured agent result.",
|
|
118
|
+
schema: config.outputSchema,
|
|
119
|
+
execute: async () => "recorded"
|
|
120
|
+
};
|
|
121
|
+
const skill = { name: id, description, systemPrompt };
|
|
122
|
+
const tool = {
|
|
123
|
+
name: id,
|
|
124
|
+
description,
|
|
125
|
+
schema: config.inputSchema,
|
|
126
|
+
execute: async (args) => {
|
|
127
|
+
const task = JSON.stringify(args);
|
|
128
|
+
if (new TextEncoder().encode(task).byteLength > maxTaskBytes) {
|
|
129
|
+
throw new ToolError({
|
|
130
|
+
code: ErrorCodes.AK_TOOL_INVALID_INPUT,
|
|
131
|
+
message: `typed agent input must not exceed ${maxTaskBytes} bytes`
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
const input = validate(config.inputSchema, args);
|
|
135
|
+
if (!input.valid) {
|
|
136
|
+
throw new ToolError({
|
|
137
|
+
code: ErrorCodes.AK_TOOL_INVALID_INPUT,
|
|
138
|
+
message: input.message ?? "typed agent input does not match its schema"
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
return invokeStructured({
|
|
142
|
+
adapter: config.adapter,
|
|
143
|
+
tool: submit,
|
|
144
|
+
task: `INPUT:
|
|
145
|
+
${task}`,
|
|
146
|
+
parse: (value) => {
|
|
147
|
+
const output = validate(config.outputSchema, value);
|
|
148
|
+
if (!output.valid) {
|
|
149
|
+
throw new ToolError({
|
|
150
|
+
code: ErrorCodes.AK_TOOL_INVALID_INPUT,
|
|
151
|
+
message: output.message ?? "typed agent output does not match its schema"
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
return value;
|
|
155
|
+
},
|
|
156
|
+
skill,
|
|
157
|
+
onConfirm: config.onConfirm,
|
|
158
|
+
maxSteps: config.maxSteps ?? 4
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
};
|
|
162
|
+
return Object.freeze(tool);
|
|
163
|
+
}
|
|
86
164
|
|
|
87
165
|
// src/registry-fetch.ts
|
|
88
166
|
var HOSTED = "https://registry.agentskit.io/r";
|
|
89
167
|
var RAW = "https://raw.githubusercontent.com/AgentsKit-io/agentskit-registry/main";
|
|
90
168
|
var REGISTRY_ID = /^[a-z0-9](?:[a-z0-9-]{0,62}[a-z0-9])?$/;
|
|
169
|
+
var TOOL_NAME2 = /^[A-Za-z0-9_.-]{1,128}$/;
|
|
91
170
|
var isRecord2 = (input) => input !== null && typeof input === "object" && !Array.isArray(input);
|
|
171
|
+
var readTypedMcpProjection = (input) => {
|
|
172
|
+
const projections = input.projections;
|
|
173
|
+
if (!isRecord2(projections)) return void 0;
|
|
174
|
+
const mcp = projections.mcp;
|
|
175
|
+
if (!isRecord2(mcp) || mcp.mode === void 0) return void 0;
|
|
176
|
+
if (mcp.mode !== "typed") return void 0;
|
|
177
|
+
if (!isRecord2(mcp.inputSchema) || !isRecord2(mcp.outputSchema)) return null;
|
|
178
|
+
if (typeof mcp.resultToolName !== "string" || !TOOL_NAME2.test(mcp.resultToolName)) return null;
|
|
179
|
+
return {
|
|
180
|
+
inputSchema: mcp.inputSchema,
|
|
181
|
+
mode: "typed",
|
|
182
|
+
outputSchema: mcp.outputSchema,
|
|
183
|
+
resultToolName: mcp.resultToolName
|
|
184
|
+
};
|
|
185
|
+
};
|
|
92
186
|
var boundedString = (input, maximum) => {
|
|
93
187
|
if (typeof input !== "string" || input.trim().length === 0) return null;
|
|
94
188
|
return new TextEncoder().encode(input).byteLength <= maximum ? input.trim() : null;
|
|
@@ -153,7 +247,7 @@ var requestJson = async (url, fetchImpl, options) => {
|
|
|
153
247
|
return null;
|
|
154
248
|
}
|
|
155
249
|
};
|
|
156
|
-
async function
|
|
250
|
+
async function fetchAgent(id, fetchImpl = globalThis.fetch, options = {}) {
|
|
157
251
|
if (!REGISTRY_ID.test(id) || typeof fetchImpl !== "function") return null;
|
|
158
252
|
const timeoutMs = options.timeoutMs ?? 1e4;
|
|
159
253
|
const maxResponseBytes = options.maxResponseBytes ?? 131072;
|
|
@@ -161,17 +255,22 @@ async function fetchAgentSkill(id, fetchImpl = globalThis.fetch, options = {}) {
|
|
|
161
255
|
const bounds = { maxResponseBytes, signal: options.signal, timeoutMs };
|
|
162
256
|
const hosted = await requestJson(`${HOSTED}/${id}.json`, fetchImpl, bounds);
|
|
163
257
|
if (isRecord2(hosted)) {
|
|
258
|
+
const typed2 = readTypedMcpProjection(hosted);
|
|
259
|
+
if (typed2 === null) return null;
|
|
164
260
|
if (hosted.skill === null) return null;
|
|
165
261
|
if (isRecord2(hosted.skill)) {
|
|
166
262
|
const systemPrompt2 = boundedString(hosted.skill.systemPrompt, 65536);
|
|
167
263
|
if (systemPrompt2) {
|
|
168
264
|
const description = boundedString(hosted.description, 4096) ?? id;
|
|
265
|
+
if (typed2) return Object.freeze({ description, id, systemPrompt: systemPrompt2, ...typed2 });
|
|
169
266
|
return Object.freeze({ description, id, systemPrompt: systemPrompt2 });
|
|
170
267
|
}
|
|
171
268
|
}
|
|
172
269
|
}
|
|
173
270
|
const meta = await requestJson(`${RAW}/registry/${id}/meta.json`, fetchImpl, bounds);
|
|
174
271
|
if (!isRecord2(meta)) return null;
|
|
272
|
+
const typed = readTypedMcpProjection(meta);
|
|
273
|
+
if (typed === null) return null;
|
|
175
274
|
const source = await requestText(`${RAW}/registry/${id}/agent.ts`, fetchImpl, bounds);
|
|
176
275
|
if (!source) return null;
|
|
177
276
|
const match = source.match(/systemPrompt:\s*`((?:\\.|[^`\\])*)`/);
|
|
@@ -181,11 +280,16 @@ async function fetchAgentSkill(id, fetchImpl = globalThis.fetch, options = {}) {
|
|
|
181
280
|
65536
|
|
182
281
|
);
|
|
183
282
|
if (!systemPrompt) return null;
|
|
184
|
-
|
|
283
|
+
const skill = {
|
|
185
284
|
id,
|
|
186
285
|
description: boundedString(meta.description, 4096) ?? id,
|
|
187
286
|
systemPrompt
|
|
188
|
-
}
|
|
287
|
+
};
|
|
288
|
+
return Object.freeze(typed ? { ...skill, ...typed } : skill);
|
|
289
|
+
}
|
|
290
|
+
async function fetchAgentSkill(id, fetchImpl = globalThis.fetch, options = {}) {
|
|
291
|
+
const agent = await fetchAgent(id, fetchImpl, options);
|
|
292
|
+
return agent && "mode" in agent && agent.mode === "typed" ? null : agent;
|
|
189
293
|
}
|
|
190
294
|
|
|
191
295
|
// src/index.ts
|
|
@@ -253,6 +357,6 @@ function createAgentsKitMcpServer(options) {
|
|
|
253
357
|
});
|
|
254
358
|
}
|
|
255
359
|
|
|
256
|
-
export { createAgentTool, createAgentsKitMcpServer, fetchAgentSkill, processStdio };
|
|
257
|
-
//# sourceMappingURL=chunk-
|
|
258
|
-
//# sourceMappingURL=chunk-
|
|
360
|
+
export { createAgentTool, createAgentsKitMcpServer, createTypedAgentTool, fetchAgent, fetchAgentSkill, processStdio };
|
|
361
|
+
//# sourceMappingURL=chunk-DU5RLF44.js.map
|
|
362
|
+
//# sourceMappingURL=chunk-DU5RLF44.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/validation.ts","../src/agent-tool.ts","../src/registry-fetch.ts","../src/index.ts"],"names":["ConfigError","ErrorCodes","TOOL_NAME","isRecord","typed","systemPrompt"],"mappings":"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","file":"chunk-DU5RLF44.js","sourcesContent":["import { ConfigError, ErrorCodes } from '@agentskit/core'\n\nconst encoder = new TextEncoder()\nconst TOOL_NAME = /^[A-Za-z0-9_.-]+$/\n\nconst invalid = (message: string): ConfigError =>\n new ConfigError({ code: ErrorCodes.AK_CONFIG_INVALID, message })\n\nexport const assertNonEmptyString = (\n input: unknown,\n field: string,\n maxBytes: number,\n): string => {\n if (typeof input !== 'string' || input.trim().length === 0) {\n throw invalid(`${field} must be a non-empty string`)\n }\n if (encoder.encode(input).byteLength > maxBytes) {\n throw invalid(`${field} must not exceed ${maxBytes} bytes`)\n }\n return input.trim()\n}\n\nexport const assertToolName = (input: unknown, field = 'tool name'): string => {\n const value = assertNonEmptyString(input, field, 128)\n if (!TOOL_NAME.test(value)) {\n throw invalid(`${field} may contain only ASCII letters, digits, underscore, hyphen, and dot`)\n }\n return value\n}\n\nexport const assertPositiveInteger = (\n input: unknown,\n field: string,\n maximum: number,\n): number => {\n if (!Number.isSafeInteger(input) || (input as number) < 1 || (input as number) > maximum) {\n throw invalid(`${field} must be a safe integer between 1 and ${maximum}`)\n }\n return input as number\n}\n\nexport const isRecord = (input: unknown): input is Record<string, unknown> => {\n if (input === null || typeof input !== 'object' || Array.isArray(input)) return false\n try {\n const prototype = Object.getPrototypeOf(input) as object | null\n return prototype === Object.prototype || prototype === null\n } catch {\n return false\n }\n}\n","import {\n ConfigError,\n ErrorCodes,\n ToolError,\n type AdapterFactory,\n type SkillDefinition,\n type ToolCall,\n type ToolDefinition,\n} from '@agentskit/core'\nimport { createRuntime, invokeStructured } from '@agentskit/runtime'\nimport { createAjvValidator } from '@agentskit/tools/validation'\nimport { assertNonEmptyString, assertPositiveInteger, assertToolName, isRecord } from './validation'\n\ntype JsonSchema = NonNullable<ToolDefinition['schema']>\n\nexport interface AgentToolConfig {\n /** Tool name exposed to the MCP host (the agent id). */\n id: string\n description: string\n /** The agent's system prompt (its skill). */\n systemPrompt: string\n /** Model adapter the agent runs on (server-side). */\n adapter: AdapterFactory\n maxSteps?: number\n /** Maximum UTF-8 bytes accepted in one task. Default 65536. */\n maxTaskBytes?: number\n}\n\nexport interface TypedAgentToolConfig extends AgentToolConfig {\n inputSchema: JsonSchema\n outputSchema: JsonSchema\n resultToolName: string\n onConfirm?: (toolCall: ToolCall) => boolean | Promise<boolean>\n}\n\n/**\n * Wrap a whole agent as a single MCP tool. The MCP host calls it with a `task`\n * string; the agent runs server-side (its own skill + reasoning loop on the\n * provided adapter) and returns the result. This is \"agents as MCP tools\" — the\n * host delegates a specialized job rather than orchestrating primitives.\n */\nexport function createAgentTool(config: AgentToolConfig): ToolDefinition {\n const id = assertToolName(config?.id, 'agent tool id')\n const description = assertNonEmptyString(config?.description, 'agent tool description', 4096)\n const systemPrompt = assertNonEmptyString(config?.systemPrompt, 'agent tool systemPrompt', 65_536)\n if (!isRecord(config?.adapter) || typeof config.adapter.createSource !== 'function') {\n throw new ConfigError({\n code: ErrorCodes.AK_CONFIG_INVALID,\n message: 'agent tool adapter must implement createSource',\n })\n }\n const maxSteps = assertPositiveInteger(config.maxSteps ?? 8, 'agent tool maxSteps', 100)\n const maxTaskBytes = assertPositiveInteger(config.maxTaskBytes ?? 65_536, 'agent tool maxTaskBytes', 1_048_576)\n const skill: SkillDefinition = {\n name: id,\n description,\n systemPrompt,\n }\n const tool: ToolDefinition = {\n name: id,\n description,\n schema: {\n type: 'object',\n properties: { task: { type: 'string', description: 'The task or input for the agent.' } },\n required: ['task'],\n additionalProperties: false,\n },\n execute: async (args: Record<string, unknown>) => {\n if (typeof args.task !== 'string' || args.task.trim().length === 0) {\n throw new ToolError({\n code: ErrorCodes.AK_TOOL_INVALID_INPUT,\n message: 'agent tool task must be a non-empty string',\n })\n }\n if (new TextEncoder().encode(args.task).byteLength > maxTaskBytes) {\n throw new ToolError({\n code: ErrorCodes.AK_TOOL_INVALID_INPUT,\n message: `agent tool task must not exceed ${maxTaskBytes} bytes`,\n })\n }\n const runtime = createRuntime({ adapter: config.adapter, maxSteps })\n const result = await runtime.run(args.task, { skill })\n return { content: result.content, steps: result.steps }\n },\n }\n return Object.freeze(tool)\n}\n\n/**\n * Expose a Registry agent without discarding its structured output contract.\n * The result tool stays internal to the runtime; only the typed outer tool is\n * visible to the MCP host.\n */\nexport function createTypedAgentTool(config: TypedAgentToolConfig): ToolDefinition {\n const id = assertToolName(config?.id, 'typed agent tool id')\n const description = assertNonEmptyString(config?.description, 'typed agent tool description', 4096)\n const systemPrompt = assertNonEmptyString(config?.systemPrompt, 'typed agent tool systemPrompt', 65_536)\n const resultToolName = assertToolName(config?.resultToolName, 'typed agent result tool name')\n const maxTaskBytes = assertPositiveInteger(config.maxTaskBytes ?? 65_536, 'typed agent input', 1_048_576)\n if (!isRecord(config?.adapter) || typeof config.adapter.createSource !== 'function') {\n throw new ConfigError({\n code: ErrorCodes.AK_CONFIG_INVALID,\n message: 'typed agent tool adapter must implement createSource',\n })\n }\n if (!isRecord(config.inputSchema) || !isRecord(config.outputSchema)) {\n throw new ConfigError({\n code: ErrorCodes.AK_CONFIG_INVALID,\n message: 'typed agent tool schemas must be JSON Schema objects',\n })\n }\n\n const validate = createAjvValidator({ rejectAdditionalProperties: true })\n try {\n validate(config.inputSchema, {})\n validate(config.outputSchema, {})\n } catch {\n throw new ConfigError({\n code: ErrorCodes.AK_CONFIG_INVALID,\n message: 'typed agent tool schemas must be valid JSON Schema',\n })\n }\n\n const submit: ToolDefinition = {\n name: resultToolName,\n description: 'Return the structured agent result.',\n schema: config.outputSchema,\n execute: async () => 'recorded',\n }\n const skill: SkillDefinition = { name: id, description, systemPrompt }\n const tool: ToolDefinition = {\n name: id,\n description,\n schema: config.inputSchema,\n execute: async (args: Record<string, unknown>) => {\n const task = JSON.stringify(args)\n if (new TextEncoder().encode(task).byteLength > maxTaskBytes) {\n throw new ToolError({\n code: ErrorCodes.AK_TOOL_INVALID_INPUT,\n message: `typed agent input must not exceed ${maxTaskBytes} bytes`,\n })\n }\n const input = validate(config.inputSchema, args)\n if (!input.valid) {\n throw new ToolError({\n code: ErrorCodes.AK_TOOL_INVALID_INPUT,\n message: input.message ?? 'typed agent input does not match its schema',\n })\n }\n return invokeStructured({\n adapter: config.adapter,\n tool: submit,\n task: `INPUT:\\n${task}`,\n parse: (value) => {\n const output = validate(config.outputSchema, value)\n if (!output.valid) {\n throw new ToolError({\n code: ErrorCodes.AK_TOOL_INVALID_INPUT,\n message: output.message ?? 'typed agent output does not match its schema',\n })\n }\n return value\n },\n skill,\n onConfirm: config.onConfirm,\n maxSteps: config.maxSteps ?? 4,\n })\n },\n }\n return Object.freeze(tool)\n}\n","import type { ToolDefinition } from '@agentskit/core'\n\nconst HOSTED = 'https://registry.agentskit.io/r'\nconst RAW = 'https://raw.githubusercontent.com/AgentsKit-io/agentskit-registry/main'\nconst REGISTRY_ID = /^[a-z0-9](?:[a-z0-9-]{0,62}[a-z0-9])?$/\nconst TOOL_NAME = /^[A-Za-z0-9_.-]{1,128}$/\n\ntype JsonSchema = NonNullable<ToolDefinition['schema']>\n\nexport interface FetchedAgentSkill {\n id: string\n description: string\n systemPrompt: string\n}\n\nexport interface FetchedTypedAgent extends FetchedAgentSkill {\n mode: 'typed'\n inputSchema: JsonSchema\n outputSchema: JsonSchema\n resultToolName: string\n}\n\nexport type FetchedAgent = FetchedAgentSkill | FetchedTypedAgent\n\nexport interface FetchAgentSkillOptions {\n /** Per-request timeout. Default 10000 ms. */\n timeoutMs?: number\n /** Maximum UTF-8 response bytes. Default 131072. */\n maxResponseBytes?: number\n signal?: AbortSignal\n}\n\nconst isRecord = (input: unknown): input is Record<string, unknown> =>\n input !== null && typeof input === 'object' && !Array.isArray(input)\n\nconst readTypedMcpProjection = (input: Record<string, unknown>): Omit<FetchedTypedAgent, 'id' | 'description' | 'systemPrompt'> | null | undefined => {\n const projections = input.projections\n if (!isRecord(projections)) return undefined\n const mcp = projections.mcp\n if (!isRecord(mcp) || mcp.mode === undefined) return undefined\n if (mcp.mode !== 'typed') return undefined\n if (!isRecord(mcp.inputSchema) || !isRecord(mcp.outputSchema)) return null\n if (typeof mcp.resultToolName !== 'string' || !TOOL_NAME.test(mcp.resultToolName)) return null\n return {\n inputSchema: mcp.inputSchema as JsonSchema,\n mode: 'typed',\n outputSchema: mcp.outputSchema as JsonSchema,\n resultToolName: mcp.resultToolName,\n }\n}\n\nconst boundedString = (input: unknown, maximum: number): string | null => {\n if (typeof input !== 'string' || input.trim().length === 0) return null\n return new TextEncoder().encode(input).byteLength <= maximum ? input.trim() : null\n}\n\nconst readBounded = async (response: Response, maximum: number): Promise<string | null> => {\n const declared = Number(response.headers.get('content-length'))\n if (Number.isFinite(declared) && declared > maximum) return null\n if (!response.body) return ''\n\n const reader = response.body.getReader()\n const decoder = new TextDecoder()\n let bytes = 0\n let text = ''\n while (true) {\n const chunk = await reader.read()\n if (chunk.done) break\n bytes += chunk.value.byteLength\n if (bytes > maximum) {\n await reader.cancel().catch(() => undefined)\n return null\n }\n text += decoder.decode(chunk.value, { stream: true })\n }\n return text + decoder.decode()\n}\n\nconst requestText = async (\n url: string,\n fetchImpl: typeof fetch,\n options: Required<Pick<FetchAgentSkillOptions, 'maxResponseBytes' | 'timeoutMs'>> &\n Pick<FetchAgentSkillOptions, 'signal'>,\n): Promise<string | null> => {\n if (options.signal?.aborted) return null\n const controller = new AbortController()\n let resolveAbort: ((value: null) => void) | undefined\n const aborted = new Promise<null>((resolve) => {\n resolveAbort = resolve\n })\n const abort = (): void => {\n controller.abort()\n resolveAbort?.(null)\n }\n options.signal?.addEventListener('abort', abort, { once: true })\n let timer: ReturnType<typeof setTimeout> | undefined\n try {\n const request = (async (): Promise<string | null> => {\n const response = await fetchImpl(url, { signal: controller.signal })\n if (!response.ok) return null\n return readBounded(response, options.maxResponseBytes)\n })().catch(() => null)\n const timeout = new Promise<null>((resolve) => {\n timer = setTimeout(() => {\n controller.abort()\n resolve(null)\n }, options.timeoutMs)\n })\n return await Promise.race([request, timeout, aborted])\n } finally {\n if (timer !== undefined) clearTimeout(timer)\n options.signal?.removeEventListener('abort', abort)\n }\n}\n\nconst requestJson = async (\n url: string,\n fetchImpl: typeof fetch,\n options: Required<Pick<FetchAgentSkillOptions, 'maxResponseBytes' | 'timeoutMs'>> &\n Pick<FetchAgentSkillOptions, 'signal'>,\n): Promise<unknown | null> => {\n const text = await requestText(url, fetchImpl, options)\n if (text === null) return null\n try {\n return JSON.parse(text) as unknown\n } catch {\n return null\n }\n}\n\nexport async function fetchAgent(\n id: string,\n fetchImpl: typeof fetch = globalThis.fetch,\n options: FetchAgentSkillOptions = {},\n): Promise<FetchedAgent | null> {\n if (!REGISTRY_ID.test(id) || typeof fetchImpl !== 'function') return null\n const timeoutMs = options.timeoutMs ?? 10_000\n const maxResponseBytes = options.maxResponseBytes ?? 131_072\n if (\n !Number.isSafeInteger(timeoutMs) || timeoutMs < 1 || timeoutMs > 120_000 ||\n !Number.isSafeInteger(maxResponseBytes) || maxResponseBytes < 1 || maxResponseBytes > 1_048_576\n ) return null\n const bounds = { maxResponseBytes, signal: options.signal, timeoutMs }\n\n const hosted = await requestJson(`${HOSTED}/${id}.json`, fetchImpl, bounds)\n if (isRecord(hosted)) {\n const typed = readTypedMcpProjection(hosted)\n if (typed === null) return null\n if (hosted.skill === null) return null\n if (isRecord(hosted.skill)) {\n const systemPrompt = boundedString(hosted.skill.systemPrompt, 65_536)\n if (systemPrompt) {\n const description = boundedString(hosted.description, 4096) ?? id\n if (typed) return Object.freeze({ description, id, systemPrompt, ...typed })\n return Object.freeze({ description, id, systemPrompt })\n }\n }\n }\n\n const meta = await requestJson(`${RAW}/registry/${id}/meta.json`, fetchImpl, bounds)\n if (!isRecord(meta)) return null\n const typed = readTypedMcpProjection(meta)\n if (typed === null) return null\n const source = await requestText(`${RAW}/registry/${id}/agent.ts`, fetchImpl, bounds)\n if (!source) return null\n const match = source.match(/systemPrompt:\\s*`((?:\\\\.|[^`\\\\])*)`/)\n if (!match) return null\n const systemPrompt = boundedString(\n match[1].replace(/\\\\`/g, '`').replace(/\\\\\\$\\{/g, '${'),\n 65_536,\n )\n if (!systemPrompt) return null\n const skill = {\n id,\n description: boundedString(meta.description, 4096) ?? id,\n systemPrompt,\n }\n return Object.freeze(typed ? { ...skill, ...typed } : skill)\n}\n\nexport async function fetchAgentSkill(\n id: string,\n fetchImpl: typeof fetch = globalThis.fetch,\n options: FetchAgentSkillOptions = {},\n): Promise<FetchedAgentSkill | null> {\n const agent = await fetchAgent(id, fetchImpl, options)\n return agent && 'mode' in agent && agent.mode === 'typed' ? null : agent\n}\n","import { ConfigError, ErrorCodes, type ToolDefinition } from '@agentskit/core'\nimport {\n createMcpServer,\n createStdioTransport,\n type McpServer,\n type McpTransport,\n type StdioLikeProcess,\n} from '@agentskit/tools/mcp'\nimport { assertNonEmptyString, assertToolName, isRecord } from './validation'\n\nexport interface AgentsKitMcpServerOptions {\n /** AgentsKit tools to expose to the MCP host. */\n tools: ToolDefinition[]\n serverInfo?: { name: string; version: string }\n /** Observability hook (call / error / list). Logs must NOT go to stdout — it is the MCP channel. */\n onEvent?: (event: { type: 'call' | 'error' | 'list'; tool?: string; error?: string }) => void\n /**\n * Transport override. Defaults to stdio over the current process (the form\n * Codex / Claude Code / Cursor launch). Inject a custom transport for tests.\n */\n transport?: McpTransport\n}\n\n/**\n * Adapt the current Node process to the `StdioLikeProcess` the transport expects:\n * the server RECEIVES JSON-RPC on stdin and SENDS on stdout.\n */\nexport function processStdio(): StdioLikeProcess {\n return {\n stdin: { write: (chunk: string) => void process.stdout.write(chunk) },\n stdout: {\n on: (_event: 'data', cb: (chunk: Buffer | string) => void) => void process.stdin.on('data', cb),\n off: (_event: 'data', cb: (chunk: Buffer | string) => void) => void process.stdin.off('data', cb),\n },\n on: (event: 'exit' | 'close', cb: () => void) =>\n void process.on(event === 'close' ? 'beforeExit' : 'exit', cb),\n }\n}\n\n/**\n * Expose a set of AgentsKit tools as an MCP server (over stdio by default), so\n * any MCP host — Codex, Claude Code, Cursor — can call them.\n */\nexport function createAgentsKitMcpServer(options: AgentsKitMcpServerOptions): McpServer {\n if (!isRecord(options) || !Array.isArray(options.tools)) {\n throw new ConfigError({\n code: ErrorCodes.AK_CONFIG_INVALID,\n message: 'MCP server options must include a tools array',\n })\n }\n\n const names = new Set<string>()\n const tools = options.tools.map((tool, index) => {\n if (!isRecord(tool)) {\n throw new ConfigError({\n code: ErrorCodes.AK_CONFIG_INVALID,\n message: `tools[${index}] must be a tool definition`,\n })\n }\n const name = assertToolName(tool.name, `tools[${index}].name`)\n if (names.has(name)) {\n throw new ConfigError({\n code: ErrorCodes.AK_CONFIG_INVALID,\n message: `tool names must be unique; duplicate \"${name}\"`,\n })\n }\n names.add(name)\n return Object.freeze({ ...tool, name }) as ToolDefinition\n })\n\n const serverInfo = options.serverInfo === undefined\n ? { name: 'agentskit-mcp', version: '1.0.0' }\n : {\n name: assertNonEmptyString(options.serverInfo?.name, 'serverInfo.name', 128),\n version: assertNonEmptyString(options.serverInfo?.version, 'serverInfo.version', 64),\n }\n\n if (\n options.transport !== undefined &&\n (!isRecord(options.transport) ||\n typeof options.transport.send !== 'function' ||\n typeof options.transport.onMessage !== 'function')\n ) {\n throw new ConfigError({\n code: ErrorCodes.AK_CONFIG_INVALID,\n message: 'transport must implement send and onMessage',\n })\n }\n\n const onEvent = options.onEvent === undefined\n ? undefined\n : (event: Parameters<NonNullable<AgentsKitMcpServerOptions['onEvent']>>[0]): void => {\n try {\n const delivered = (options.onEvent as (value: typeof event) => unknown)(Object.freeze({ ...event }))\n if (delivered !== null && (typeof delivered === 'object' || typeof delivered === 'function')) {\n const then = (delivered as { then?: unknown }).then\n if (typeof then === 'function') void Promise.resolve(delivered).catch(() => undefined)\n }\n } catch {\n // Observation must not alter protocol behavior.\n }\n }\n\n const transport = options.transport ?? createStdioTransport(processStdio())\n return createMcpServer({\n transport,\n tools,\n serverInfo,\n onEvent,\n })\n}\n\nexport { createAgentTool, createTypedAgentTool, type AgentToolConfig, type TypedAgentToolConfig } from './agent-tool'\nexport {\n fetchAgent,\n fetchAgentSkill,\n type FetchedAgent,\n type FetchedAgentSkill,\n type FetchedTypedAgent,\n type FetchAgentSkillOptions,\n} from './registry-fetch'\nexport type { McpServer, McpTransport } from '@agentskit/tools/mcp'\n"]}
|
package/dist/index.cjs
CHANGED
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
var core = require('@agentskit/core');
|
|
4
4
|
var mcp = require('@agentskit/tools/mcp');
|
|
5
5
|
var runtime = require('@agentskit/runtime');
|
|
6
|
+
var validation = require('@agentskit/tools/validation');
|
|
6
7
|
|
|
7
8
|
// src/index.ts
|
|
8
9
|
var encoder = new TextEncoder();
|
|
@@ -85,12 +86,105 @@ function createAgentTool(config) {
|
|
|
85
86
|
};
|
|
86
87
|
return Object.freeze(tool);
|
|
87
88
|
}
|
|
89
|
+
function createTypedAgentTool(config) {
|
|
90
|
+
const id = assertToolName(config?.id, "typed agent tool id");
|
|
91
|
+
const description = assertNonEmptyString(config?.description, "typed agent tool description", 4096);
|
|
92
|
+
const systemPrompt = assertNonEmptyString(config?.systemPrompt, "typed agent tool systemPrompt", 65536);
|
|
93
|
+
const resultToolName = assertToolName(config?.resultToolName, "typed agent result tool name");
|
|
94
|
+
const maxTaskBytes = assertPositiveInteger(config.maxTaskBytes ?? 65536, "typed agent input", 1048576);
|
|
95
|
+
if (!isRecord(config?.adapter) || typeof config.adapter.createSource !== "function") {
|
|
96
|
+
throw new core.ConfigError({
|
|
97
|
+
code: core.ErrorCodes.AK_CONFIG_INVALID,
|
|
98
|
+
message: "typed agent tool adapter must implement createSource"
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
if (!isRecord(config.inputSchema) || !isRecord(config.outputSchema)) {
|
|
102
|
+
throw new core.ConfigError({
|
|
103
|
+
code: core.ErrorCodes.AK_CONFIG_INVALID,
|
|
104
|
+
message: "typed agent tool schemas must be JSON Schema objects"
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
const validate = validation.createAjvValidator({ rejectAdditionalProperties: true });
|
|
108
|
+
try {
|
|
109
|
+
validate(config.inputSchema, {});
|
|
110
|
+
validate(config.outputSchema, {});
|
|
111
|
+
} catch {
|
|
112
|
+
throw new core.ConfigError({
|
|
113
|
+
code: core.ErrorCodes.AK_CONFIG_INVALID,
|
|
114
|
+
message: "typed agent tool schemas must be valid JSON Schema"
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
const submit = {
|
|
118
|
+
name: resultToolName,
|
|
119
|
+
description: "Return the structured agent result.",
|
|
120
|
+
schema: config.outputSchema,
|
|
121
|
+
execute: async () => "recorded"
|
|
122
|
+
};
|
|
123
|
+
const skill = { name: id, description, systemPrompt };
|
|
124
|
+
const tool = {
|
|
125
|
+
name: id,
|
|
126
|
+
description,
|
|
127
|
+
schema: config.inputSchema,
|
|
128
|
+
execute: async (args) => {
|
|
129
|
+
const task = JSON.stringify(args);
|
|
130
|
+
if (new TextEncoder().encode(task).byteLength > maxTaskBytes) {
|
|
131
|
+
throw new core.ToolError({
|
|
132
|
+
code: core.ErrorCodes.AK_TOOL_INVALID_INPUT,
|
|
133
|
+
message: `typed agent input must not exceed ${maxTaskBytes} bytes`
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
const input = validate(config.inputSchema, args);
|
|
137
|
+
if (!input.valid) {
|
|
138
|
+
throw new core.ToolError({
|
|
139
|
+
code: core.ErrorCodes.AK_TOOL_INVALID_INPUT,
|
|
140
|
+
message: input.message ?? "typed agent input does not match its schema"
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
return runtime.invokeStructured({
|
|
144
|
+
adapter: config.adapter,
|
|
145
|
+
tool: submit,
|
|
146
|
+
task: `INPUT:
|
|
147
|
+
${task}`,
|
|
148
|
+
parse: (value) => {
|
|
149
|
+
const output = validate(config.outputSchema, value);
|
|
150
|
+
if (!output.valid) {
|
|
151
|
+
throw new core.ToolError({
|
|
152
|
+
code: core.ErrorCodes.AK_TOOL_INVALID_INPUT,
|
|
153
|
+
message: output.message ?? "typed agent output does not match its schema"
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
return value;
|
|
157
|
+
},
|
|
158
|
+
skill,
|
|
159
|
+
onConfirm: config.onConfirm,
|
|
160
|
+
maxSteps: config.maxSteps ?? 4
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
};
|
|
164
|
+
return Object.freeze(tool);
|
|
165
|
+
}
|
|
88
166
|
|
|
89
167
|
// src/registry-fetch.ts
|
|
90
168
|
var HOSTED = "https://registry.agentskit.io/r";
|
|
91
169
|
var RAW = "https://raw.githubusercontent.com/AgentsKit-io/agentskit-registry/main";
|
|
92
170
|
var REGISTRY_ID = /^[a-z0-9](?:[a-z0-9-]{0,62}[a-z0-9])?$/;
|
|
171
|
+
var TOOL_NAME2 = /^[A-Za-z0-9_.-]{1,128}$/;
|
|
93
172
|
var isRecord2 = (input) => input !== null && typeof input === "object" && !Array.isArray(input);
|
|
173
|
+
var readTypedMcpProjection = (input) => {
|
|
174
|
+
const projections = input.projections;
|
|
175
|
+
if (!isRecord2(projections)) return void 0;
|
|
176
|
+
const mcp = projections.mcp;
|
|
177
|
+
if (!isRecord2(mcp) || mcp.mode === void 0) return void 0;
|
|
178
|
+
if (mcp.mode !== "typed") return void 0;
|
|
179
|
+
if (!isRecord2(mcp.inputSchema) || !isRecord2(mcp.outputSchema)) return null;
|
|
180
|
+
if (typeof mcp.resultToolName !== "string" || !TOOL_NAME2.test(mcp.resultToolName)) return null;
|
|
181
|
+
return {
|
|
182
|
+
inputSchema: mcp.inputSchema,
|
|
183
|
+
mode: "typed",
|
|
184
|
+
outputSchema: mcp.outputSchema,
|
|
185
|
+
resultToolName: mcp.resultToolName
|
|
186
|
+
};
|
|
187
|
+
};
|
|
94
188
|
var boundedString = (input, maximum) => {
|
|
95
189
|
if (typeof input !== "string" || input.trim().length === 0) return null;
|
|
96
190
|
return new TextEncoder().encode(input).byteLength <= maximum ? input.trim() : null;
|
|
@@ -155,7 +249,7 @@ var requestJson = async (url, fetchImpl, options) => {
|
|
|
155
249
|
return null;
|
|
156
250
|
}
|
|
157
251
|
};
|
|
158
|
-
async function
|
|
252
|
+
async function fetchAgent(id, fetchImpl = globalThis.fetch, options = {}) {
|
|
159
253
|
if (!REGISTRY_ID.test(id) || typeof fetchImpl !== "function") return null;
|
|
160
254
|
const timeoutMs = options.timeoutMs ?? 1e4;
|
|
161
255
|
const maxResponseBytes = options.maxResponseBytes ?? 131072;
|
|
@@ -163,17 +257,22 @@ async function fetchAgentSkill(id, fetchImpl = globalThis.fetch, options = {}) {
|
|
|
163
257
|
const bounds = { maxResponseBytes, signal: options.signal, timeoutMs };
|
|
164
258
|
const hosted = await requestJson(`${HOSTED}/${id}.json`, fetchImpl, bounds);
|
|
165
259
|
if (isRecord2(hosted)) {
|
|
260
|
+
const typed2 = readTypedMcpProjection(hosted);
|
|
261
|
+
if (typed2 === null) return null;
|
|
166
262
|
if (hosted.skill === null) return null;
|
|
167
263
|
if (isRecord2(hosted.skill)) {
|
|
168
264
|
const systemPrompt2 = boundedString(hosted.skill.systemPrompt, 65536);
|
|
169
265
|
if (systemPrompt2) {
|
|
170
266
|
const description = boundedString(hosted.description, 4096) ?? id;
|
|
267
|
+
if (typed2) return Object.freeze({ description, id, systemPrompt: systemPrompt2, ...typed2 });
|
|
171
268
|
return Object.freeze({ description, id, systemPrompt: systemPrompt2 });
|
|
172
269
|
}
|
|
173
270
|
}
|
|
174
271
|
}
|
|
175
272
|
const meta = await requestJson(`${RAW}/registry/${id}/meta.json`, fetchImpl, bounds);
|
|
176
273
|
if (!isRecord2(meta)) return null;
|
|
274
|
+
const typed = readTypedMcpProjection(meta);
|
|
275
|
+
if (typed === null) return null;
|
|
177
276
|
const source = await requestText(`${RAW}/registry/${id}/agent.ts`, fetchImpl, bounds);
|
|
178
277
|
if (!source) return null;
|
|
179
278
|
const match = source.match(/systemPrompt:\s*`((?:\\.|[^`\\])*)`/);
|
|
@@ -183,11 +282,16 @@ async function fetchAgentSkill(id, fetchImpl = globalThis.fetch, options = {}) {
|
|
|
183
282
|
65536
|
|
184
283
|
);
|
|
185
284
|
if (!systemPrompt) return null;
|
|
186
|
-
|
|
285
|
+
const skill = {
|
|
187
286
|
id,
|
|
188
287
|
description: boundedString(meta.description, 4096) ?? id,
|
|
189
288
|
systemPrompt
|
|
190
|
-
}
|
|
289
|
+
};
|
|
290
|
+
return Object.freeze(typed ? { ...skill, ...typed } : skill);
|
|
291
|
+
}
|
|
292
|
+
async function fetchAgentSkill(id, fetchImpl = globalThis.fetch, options = {}) {
|
|
293
|
+
const agent = await fetchAgent(id, fetchImpl, options);
|
|
294
|
+
return agent && "mode" in agent && agent.mode === "typed" ? null : agent;
|
|
191
295
|
}
|
|
192
296
|
|
|
193
297
|
// src/index.ts
|
|
@@ -257,6 +361,8 @@ function createAgentsKitMcpServer(options) {
|
|
|
257
361
|
|
|
258
362
|
exports.createAgentTool = createAgentTool;
|
|
259
363
|
exports.createAgentsKitMcpServer = createAgentsKitMcpServer;
|
|
364
|
+
exports.createTypedAgentTool = createTypedAgentTool;
|
|
365
|
+
exports.fetchAgent = fetchAgent;
|
|
260
366
|
exports.fetchAgentSkill = fetchAgentSkill;
|
|
261
367
|
exports.processStdio = processStdio;
|
|
262
368
|
//# sourceMappingURL=index.cjs.map
|