@agentskit/mcp 0.2.17 → 0.3.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/dist/bin.cjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/agent-tool.ts","../src/registry-fetch.ts","../src/index.ts","../src/bin.ts"],"names":["runtime","createRuntime","createStdioTransport","createMcpServer","fetchUrl","webSearch","tools","filesystem","sqliteQueryTool","shell","openai","anthropic","gemini","deepseek","grok","groq","mistral","cohere","together","fireworks","openrouter","cerebras","kimi","huggingface","qwen","lmstudio","vllm","llamacpp","ollama","dispatchFromCatalog"],"mappings":"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","file":"bin.cjs","sourcesContent":["import type { AdapterFactory, SkillDefinition, ToolDefinition } from '@agentskit/core'\nimport { createRuntime } from '@agentskit/runtime'\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}\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 skill: SkillDefinition = {\n name: config.id,\n description: config.description,\n systemPrompt: config.systemPrompt,\n }\n return {\n name: config.id,\n description: config.description,\n schema: {\n type: 'object',\n properties: { task: { type: 'string', description: 'The task or input for the agent.' } },\n required: ['task'],\n },\n execute: async (args: Record<string, unknown>) => {\n const runtime = createRuntime({ adapter: config.adapter, maxSteps: config.maxSteps ?? 8 })\n const result = await runtime.run(String(args.task ?? ''), { skill })\n return { content: result.content, steps: result.steps }\n },\n }\n}\n","const HOSTED = 'https://registry.agentskit.io/r'\nconst RAW = 'https://raw.githubusercontent.com/AgentsKit-io/agentskit-registry/main'\n\nexport interface FetchedAgentSkill {\n id: string\n description: string\n systemPrompt: string\n}\n\n/**\n * Fetch a registry agent's runnable skill (id, description, systemPrompt) so it\n * can be exposed as an MCP tool. Hosted index first, raw-GitHub fallback. Returns\n * null for tool-composing agents (no inline prompt) or unknown ids.\n */\nexport async function fetchAgentSkill(\n id: string,\n fetchImpl: typeof fetch = globalThis.fetch,\n): Promise<FetchedAgentSkill | null> {\n const tryUrl = async (url: string): Promise<unknown | null> => {\n try {\n const res = await fetchImpl(url)\n return res.ok ? await res.json() : null\n } catch {\n return null\n }\n }\n\n const hosted = (await tryUrl(`${HOSTED}/${id}.json`)) as\n | { description?: string; skill?: { systemPrompt?: string } | null }\n | null\n if (hosted?.skill?.systemPrompt) {\n return { id, description: hosted.description ?? id, systemPrompt: hosted.skill.systemPrompt }\n }\n\n // Fallback: extract the inline skill from the raw agent.ts source.\n const meta = (await tryUrl(`${RAW}/registry/${id}/meta.json`)) as { description?: string } | null\n if (!meta) return null\n let src: string | null = null\n try {\n const res = await fetchImpl(`${RAW}/registry/${id}/agent.ts`)\n src = res.ok ? await res.text() : null\n } catch {\n src = null\n }\n if (!src) return null\n const m = src.match(/systemPrompt:\\s*`((?:\\\\.|[^`\\\\])*)`/)\n if (!m) return null\n return {\n id,\n description: meta.description ?? id,\n systemPrompt: m[1].replace(/\\\\`/g, '`').replace(/\\\\\\$\\{/g, '${'),\n }\n}\n","import type { ToolDefinition } from '@agentskit/core'\nimport {\n createMcpServer,\n createStdioTransport,\n type McpServer,\n type McpTransport,\n type StdioLikeProcess,\n} from '@agentskit/tools/mcp'\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 * Claude Desktop / Cursor / Windsurf 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 — Claude Desktop, Cursor, Windsurf — can call them.\n */\nexport function createAgentsKitMcpServer(options: AgentsKitMcpServerOptions): McpServer {\n const transport = options.transport ?? createStdioTransport(processStdio())\n return createMcpServer({\n transport,\n tools: options.tools,\n serverInfo: options.serverInfo ?? { name: 'agentskit-mcp', version: '0.1.0' },\n onEvent: options.onEvent,\n })\n}\n\nexport { createAgentTool, type AgentToolConfig } from './agent-tool'\nexport { fetchAgentSkill, type FetchedAgentSkill } from './registry-fetch'\nexport type { McpServer, McpTransport } from '@agentskit/tools/mcp'\n","#!/usr/bin/env node\nimport type { AdapterFactory, ToolDefinition } from '@agentskit/core'\nimport { fetchUrl, webSearch, filesystem, shell, sqliteQueryTool } from '@agentskit/tools'\nimport {\n anthropic, gemini, openai, deepseek, grok, groq, mistral, cohere, together,\n fireworks, openrouter, cerebras, kimi, huggingface, qwen,\n ollama, lmstudio, vllm, llamacpp,\n} from '@agentskit/adapters'\nimport { dispatchFromCatalog } from '@agentskit/adapters/catalog'\nimport { createAgentsKitMcpServer } from './index'\nimport { createAgentTool } from './agent-tool'\nimport { fetchAgentSkill } from './registry-fetch'\n\n/**\n * `agentskit-mcp` — start an MCP server exposing AgentsKit tools and/or agents.\n *\n * --tools <a,b> primitive tools (default: fetch,search; also filesystem/shell/sqlite)\n * --fs-root <dir> root for the filesystem tool\n * --sqlite <file> database file for the sqlite tool\n * --allow-shell enable the shell tool\n * --agents <a,b> expose registry agents as tools (each runs server-side)\n * --provider <p> model for --agents: openai | anthropic | gemini | ollama (default openai)\n * --model <m> model name for --agents\n * --api-key <k> key for --agents (else the provider's env var)\n *\n * stdout is the MCP JSON-RPC channel; all human output goes to stderr.\n */\nconst warn = (msg: string) => process.stderr.write(`agentskit-mcp: ${msg}\\n`)\nconst flag = (name: string): string | undefined => {\n const i = process.argv.indexOf(name)\n return i >= 0 ? process.argv[i + 1] : undefined\n}\nconst has = (name: string): boolean => process.argv.includes(name)\n\nfunction buildTools(): ToolDefinition[] {\n if (!has('--tools')) return [fetchUrl(), webSearch()]\n const requested = (flag('--tools') ?? '').split(',').map((s) => s.trim())\n const tools: ToolDefinition[] = []\n if (requested.includes('fetch')) tools.push(fetchUrl())\n if (requested.includes('search')) tools.push(webSearch())\n if (requested.includes('filesystem')) {\n const root = flag('--fs-root')\n if (root) tools.push(...filesystem({ basePath: root }))\n else warn('skipping \"filesystem\": pass --fs-root <dir>')\n }\n if (requested.includes('sqlite')) {\n const file = flag('--sqlite')\n if (file) tools.push(sqliteQueryTool({ path: file }))\n else warn('skipping \"sqlite\": pass --sqlite <file>')\n }\n if (requested.includes('shell')) {\n if (has('--allow-shell')) tools.push(shell())\n else warn('skipping \"shell\": pass --allow-shell (runs commands)')\n }\n return tools\n}\n\ntype KeyedFactory = (cfg: { apiKey: string; model: string; baseUrl?: string }) => AdapterFactory\ntype LocalFactory = (cfg: { model: string; baseUrl?: string }) => AdapterFactory\n\n/** Providers that take { apiKey, model } — first-class + OpenAI-compatible (hosted + local-OpenAI-compat). */\nconst KEYED: Record<string, KeyedFactory> = {\n openai, anthropic, gemini, deepseek, grok, groq, mistral, cohere, together,\n fireworks, openrouter, cerebras, kimi, huggingface, qwen,\n lmstudio, vllm, llamacpp,\n}\n/** Local providers whose adapter needs no key. */\nconst LOCAL: Record<string, LocalFactory> = { ollama }\n/** Local OpenAI-compatible servers — key is a placeholder. */\nconst LOCAL_COMPAT = new Set(['lmstudio', 'vllm', 'llamacpp'])\n\nconst DEFAULT_MODEL: Record<string, string> = {\n openai: 'gpt-4o', anthropic: 'claude-sonnet-4-6', gemini: 'gemini-2.0-flash',\n deepseek: 'deepseek-chat', grok: 'grok-2', groq: 'llama-3.3-70b-versatile',\n mistral: 'mistral-large-latest', ollama: 'llama3',\n}\n\nfunction resolveAdapter(): AdapterFactory | null {\n const provider = flag('--provider') ?? 'openai'\n const model = flag('--model') ?? DEFAULT_MODEL[provider]\n if (!model) {\n warn(`--agents needs a model for \"${provider}\": pass --model`)\n return null\n }\n const baseUrl = flag('--base-url')\n\n if (LOCAL[provider]) return LOCAL[provider]({ model, baseUrl })\n\n const apiKey =\n flag('--api-key') ??\n process.env[`${provider.toUpperCase().replace(/-/g, '_')}_API_KEY`] ??\n (LOCAL_COMPAT.has(provider) ? 'local' : undefined)\n if (!apiKey) {\n warn(`--agents needs a key for \"${provider}\": pass --api-key or set ${provider.toUpperCase()}_API_KEY`)\n return null\n }\n if (KEYED[provider]) return KEYED[provider]({ apiKey, model })\n\n // Long tail: any other OpenAI-compatible provider in the models.dev catalog.\n try {\n return dispatchFromCatalog({ provider, model, apiKey, baseUrl })\n } catch {\n warn(`unknown provider \"${provider}\". Known: ${[...Object.keys(KEYED), ...Object.keys(LOCAL)].join(', ')}, or any catalog OpenAI-compatible provider.`)\n return null\n }\n}\n\nasync function buildAgentTools(): Promise<ToolDefinition[]> {\n const ids = (flag('--agents') ?? '').split(',').map((s) => s.trim()).filter(Boolean)\n if (ids.length === 0) return []\n const adapter = resolveAdapter()\n if (!adapter) return []\n const tools: ToolDefinition[] = []\n for (const id of ids) {\n const skill = await fetchAgentSkill(id)\n if (!skill) {\n warn(`skipping agent \"${id}\": not found or not runnable (tool-composing agent)`)\n continue\n }\n tools.push(\n createAgentTool({ id: skill.id, description: skill.description, systemPrompt: skill.systemPrompt, adapter }),\n )\n }\n return tools\n}\n\nasync function main(): Promise<void> {\n const tools = [...buildTools(), ...(await buildAgentTools())]\n if (tools.length === 0) {\n warn('no tools or agents enabled — nothing to serve. See --tools / --agents.')\n process.exit(1)\n }\n createAgentsKitMcpServer({\n tools,\n onEvent: (e) => {\n if (e.type === 'error') warn(`tool error (${e.tool}): ${e.error}`)\n },\n })\n warn(`serving ${tools.length} item(s) over stdio (${tools.map((t) => t.name).join(', ')})`)\n}\n\nvoid main()\n"]}
1
+ {"version":3,"sources":["../src/validation.ts","../src/agent-tool.ts","../src/registry-fetch.ts","../src/index.ts","../src/cli.ts","../src/bin.ts"],"names":["ConfigError","ErrorCodes","ToolError","runtime","createRuntime","isRecord","systemPrompt","createStdioTransport","createMcpServer","anthropic","cerebras","cohere","deepseek","fireworks","gemini","grok","groq","huggingface","kimi","llamacpp","lmstudio","mistral","openai","openrouter","qwen","together","vllm","ollama","warn","tools","fetchUrl","webSearch","filesystem","sqliteQueryTool","shell","dispatchFromCatalog"],"mappings":"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","file":"bin.cjs","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 ToolDefinition,\n} from '@agentskit/core'\nimport { createRuntime } from '@agentskit/runtime'\nimport { assertNonEmptyString, assertPositiveInteger, assertToolName, isRecord } from './validation'\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\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","const 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])?$/\n\nexport interface FetchedAgentSkill {\n id: string\n description: string\n systemPrompt: string\n}\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 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 fetchAgentSkill(\n id: string,\n fetchImpl: typeof fetch = globalThis.fetch,\n options: FetchAgentSkillOptions = {},\n): Promise<FetchedAgentSkill | 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 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 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 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 return Object.freeze({\n id,\n description: boundedString(meta.description, 4096) ?? id,\n systemPrompt,\n })\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 * Claude Desktop / Cursor / Windsurf 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 — Claude Desktop, Cursor, Windsurf — 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, type AgentToolConfig } from './agent-tool'\nexport {\n fetchAgentSkill,\n type FetchedAgentSkill,\n type FetchAgentSkillOptions,\n} from './registry-fetch'\nexport type { McpServer, McpTransport } from '@agentskit/tools/mcp'\n","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: 'llama-3.3-70b-versatile',\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"]}
package/dist/bin.js CHANGED
@@ -1,124 +1,215 @@
1
1
  #!/usr/bin/env node
2
- import { createAgentsKitMcpServer, fetchAgentSkill, createAgentTool } from './chunk-F5SVUT7Z.js';
3
- import { fetchUrl, webSearch, filesystem, sqliteQueryTool, shell } from '@agentskit/tools';
4
- import { ollama, llamacpp, vllm, lmstudio, qwen, huggingface, kimi, cerebras, openrouter, fireworks, together, cohere, mistral, groq, grok, deepseek, gemini, anthropic, openai } from '@agentskit/adapters';
2
+ import { fetchAgentSkill, createAgentTool, createAgentsKitMcpServer } from './chunk-CKAUENP5.js';
3
+ import { ollama, vllm, together, qwen, openrouter, openai, mistral, lmstudio, llamacpp, kimi, huggingface, groq, grok, gemini, fireworks, deepseek, cohere, cerebras, anthropic } from '@agentskit/adapters';
5
4
  import { dispatchFromCatalog } from '@agentskit/adapters/catalog';
5
+ import { fetchUrl, webSearch, filesystem, sqliteQueryTool, shell } from '@agentskit/tools';
6
6
 
7
- var warn = (msg) => process.stderr.write(`agentskit-mcp: ${msg}
8
- `);
9
- var flag = (name) => {
10
- const i = process.argv.indexOf(name);
11
- return i >= 0 ? process.argv[i + 1] : void 0;
12
- };
13
- var has = (name) => process.argv.includes(name);
14
- function buildTools() {
15
- if (!has("--tools")) return [fetchUrl(), webSearch()];
16
- const requested = (flag("--tools") ?? "").split(",").map((s) => s.trim());
17
- const tools = [];
18
- if (requested.includes("fetch")) tools.push(fetchUrl());
19
- if (requested.includes("search")) tools.push(webSearch());
20
- if (requested.includes("filesystem")) {
21
- const root = flag("--fs-root");
22
- if (root) tools.push(...filesystem({ basePath: root }));
23
- else warn('skipping "filesystem": pass --fs-root <dir>');
24
- }
25
- if (requested.includes("sqlite")) {
26
- const file = flag("--sqlite");
27
- if (file) tools.push(sqliteQueryTool({ path: file }));
28
- else warn('skipping "sqlite": pass --sqlite <file>');
7
+ var VALUE_FLAGS = /* @__PURE__ */ new Set([
8
+ "--agents",
9
+ "--api-key",
10
+ "--base-url",
11
+ "--fs-root",
12
+ "--max-steps",
13
+ "--model",
14
+ "--provider",
15
+ "--sqlite",
16
+ "--tools"
17
+ ]);
18
+ var BOOLEAN_FLAGS = /* @__PURE__ */ new Set(["--allow-shell", "--help"]);
19
+ var TOOL_IDS = /* @__PURE__ */ new Set(["fetch", "filesystem", "search", "shell", "sqlite"]);
20
+ var csv = (input) => [...new Set(input.split(",").map((value) => value.trim()).filter(Boolean))];
21
+ var parseMcpCliArgs = (argv) => {
22
+ const values = /* @__PURE__ */ new Map();
23
+ const booleans = /* @__PURE__ */ new Set();
24
+ for (let index = 0; index < argv.length; index += 1) {
25
+ const argument = argv[index];
26
+ if (BOOLEAN_FLAGS.has(argument)) {
27
+ if (booleans.has(argument)) return { message: `duplicate flag: ${argument}`, status: "rejected" };
28
+ booleans.add(argument);
29
+ continue;
30
+ }
31
+ if (!VALUE_FLAGS.has(argument)) return { message: `unknown argument: ${argument}`, status: "rejected" };
32
+ if (values.has(argument)) return { message: `duplicate flag: ${argument}`, status: "rejected" };
33
+ const value = argv[index + 1];
34
+ if (value === void 0 || value.startsWith("--")) {
35
+ return { message: `missing value for ${argument}`, status: "rejected" };
36
+ }
37
+ values.set(argument, value);
38
+ index += 1;
29
39
  }
30
- if (requested.includes("shell")) {
31
- if (has("--allow-shell")) tools.push(shell());
32
- else warn('skipping "shell": pass --allow-shell (runs commands)');
40
+ const tools = values.has("--tools") ? csv(values.get("--tools")) : ["fetch", "search"];
41
+ const unknownTool = tools.find((tool) => !TOOL_IDS.has(tool));
42
+ if (unknownTool) return { message: `unknown tool: ${unknownTool}`, status: "rejected" };
43
+ const agents = values.has("--agents") ? csv(values.get("--agents")) : [];
44
+ const maxStepsText = values.get("--max-steps") ?? "8";
45
+ const maxSteps = Number(maxStepsText);
46
+ if (!Number.isSafeInteger(maxSteps) || maxSteps < 1 || maxSteps > 100) {
47
+ return { message: "--max-steps must be a safe integer between 1 and 100", status: "rejected" };
33
48
  }
34
- return tools;
35
- }
49
+ return {
50
+ options: {
51
+ agents,
52
+ allowShell: booleans.has("--allow-shell"),
53
+ apiKey: values.get("--api-key"),
54
+ baseUrl: values.get("--base-url"),
55
+ fsRoot: values.get("--fs-root"),
56
+ help: booleans.has("--help"),
57
+ maxSteps,
58
+ model: values.get("--model"),
59
+ provider: (values.get("--provider") ?? "openai").toLowerCase(),
60
+ sqlite: values.get("--sqlite"),
61
+ tools
62
+ },
63
+ status: "parsed"
64
+ };
65
+ };
36
66
  var KEYED = {
37
- openai,
38
67
  anthropic,
39
- gemini,
68
+ cerebras,
69
+ cohere,
40
70
  deepseek,
71
+ fireworks,
72
+ gemini,
41
73
  grok,
42
74
  groq,
75
+ huggingface,
76
+ kimi,
77
+ llamacpp,
78
+ lmstudio,
43
79
  mistral,
44
- cohere,
45
- together,
46
- fireworks,
80
+ openai,
47
81
  openrouter,
48
- cerebras,
49
- kimi,
50
- huggingface,
51
82
  qwen,
52
- lmstudio,
53
- vllm,
54
- llamacpp
83
+ together,
84
+ vllm
55
85
  };
56
86
  var LOCAL = { ollama };
57
- var LOCAL_COMPAT = /* @__PURE__ */ new Set(["lmstudio", "vllm", "llamacpp"]);
87
+ var LOCAL_COMPAT = /* @__PURE__ */ new Set(["llamacpp", "lmstudio", "vllm"]);
58
88
  var DEFAULT_MODEL = {
59
- openai: "gpt-4o",
60
89
  anthropic: "claude-sonnet-4-6",
61
- gemini: "gemini-2.0-flash",
62
90
  deepseek: "deepseek-chat",
91
+ gemini: "gemini-2.0-flash",
63
92
  grok: "grok-2",
64
93
  groq: "llama-3.3-70b-versatile",
65
94
  mistral: "mistral-large-latest",
66
- ollama: "llama3"
95
+ ollama: "llama3",
96
+ openai: "gpt-4o"
67
97
  };
68
- function resolveAdapter() {
69
- const provider = flag("--provider") ?? "openai";
70
- const model = flag("--model") ?? DEFAULT_MODEL[provider];
98
+ var MCP_CLI_HELP = [
99
+ "Usage: agentskit-mcp [options]",
100
+ "--tools <fetch,search,filesystem,shell,sqlite>",
101
+ "--agents <registry-ids> --provider <provider> --model <model>",
102
+ "--fs-root <dir> --sqlite <file> --allow-shell"
103
+ ].join("\n");
104
+ var buildPrimitiveTools = (options, warn2) => {
105
+ const tools = [];
106
+ if (options.tools.includes("fetch")) tools.push(fetchUrl());
107
+ if (options.tools.includes("search")) tools.push(webSearch());
108
+ if (options.tools.includes("filesystem")) {
109
+ if (options.fsRoot) tools.push(...filesystem({ basePath: options.fsRoot }));
110
+ else warn2('skipping "filesystem": pass --fs-root <dir>');
111
+ }
112
+ if (options.tools.includes("sqlite")) {
113
+ if (options.sqlite) tools.push(sqliteQueryTool({ path: options.sqlite }));
114
+ else warn2('skipping "sqlite": pass --sqlite <file>');
115
+ }
116
+ if (options.tools.includes("shell")) {
117
+ if (options.allowShell) tools.push(shell());
118
+ else warn2('skipping "shell": pass --allow-shell (runs commands)');
119
+ }
120
+ return tools;
121
+ };
122
+ var resolveAdapter = (options, env, warn2) => {
123
+ const model = options.model ?? DEFAULT_MODEL[options.provider];
71
124
  if (!model) {
72
- warn(`--agents needs a model for "${provider}": pass --model`);
125
+ warn2(`--agents needs a model for "${options.provider}": pass --model`);
73
126
  return null;
74
127
  }
75
- const baseUrl = flag("--base-url");
76
- if (LOCAL[provider]) return LOCAL[provider]({ model, baseUrl });
77
- const apiKey = flag("--api-key") ?? process.env[`${provider.toUpperCase().replace(/-/g, "_")}_API_KEY`] ?? (LOCAL_COMPAT.has(provider) ? "local" : void 0);
128
+ const local = LOCAL[options.provider];
129
+ if (local) return local({ baseUrl: options.baseUrl, model });
130
+ const envName = `${options.provider.toUpperCase().replace(/-/g, "_")}_API_KEY`;
131
+ const apiKey = options.apiKey ?? env[envName] ?? (LOCAL_COMPAT.has(options.provider) ? "local" : void 0);
78
132
  if (!apiKey) {
79
- warn(`--agents needs a key for "${provider}": pass --api-key or set ${provider.toUpperCase()}_API_KEY`);
133
+ warn2(`--agents needs a key for "${options.provider}": pass --api-key or set ${envName}`);
80
134
  return null;
81
135
  }
82
- if (KEYED[provider]) return KEYED[provider]({ apiKey, model });
136
+ const keyed = KEYED[options.provider];
137
+ if (keyed) return keyed({ apiKey, baseUrl: options.baseUrl, model });
83
138
  try {
84
- return dispatchFromCatalog({ provider, model, apiKey, baseUrl });
139
+ return dispatchFromCatalog({ apiKey, baseUrl: options.baseUrl, model, provider: options.provider });
85
140
  } catch {
86
- warn(`unknown provider "${provider}". Known: ${[...Object.keys(KEYED), ...Object.keys(LOCAL)].join(", ")}, or any catalog OpenAI-compatible provider.`);
141
+ warn2(`unknown or incompatible provider "${options.provider}"`);
87
142
  return null;
88
143
  }
89
- }
90
- async function buildAgentTools() {
91
- const ids = (flag("--agents") ?? "").split(",").map((s) => s.trim()).filter(Boolean);
92
- if (ids.length === 0) return [];
93
- const adapter = resolveAdapter();
94
- if (!adapter) return [];
95
- const tools = [];
96
- for (const id of ids) {
97
- const skill = await fetchAgentSkill(id);
98
- if (!skill) {
99
- warn(`skipping agent "${id}": not found or not runnable (tool-composing agent)`);
100
- continue;
144
+ };
145
+ var runMcpCli = async (argv, dependencies = {}) => {
146
+ const warn2 = dependencies.warn ?? (() => void 0);
147
+ const parsed = parseMcpCliArgs(argv);
148
+ if (parsed.status === "rejected") {
149
+ warn2(parsed.message);
150
+ return { exitCode: 1, status: "rejected" };
151
+ }
152
+ if (parsed.options.help) {
153
+ warn2(MCP_CLI_HELP);
154
+ return { exitCode: 0, status: "help" };
155
+ }
156
+ const tools = buildPrimitiveTools(parsed.options, warn2);
157
+ if (parsed.options.agents.length > 0) {
158
+ const adapter = resolveAdapter(parsed.options, dependencies.env ?? process.env, warn2);
159
+ if (adapter) {
160
+ const fetchSkill = dependencies.fetchSkill ?? fetchAgentSkill;
161
+ for (const id of parsed.options.agents) {
162
+ const skill = await fetchSkill(id).catch(() => null);
163
+ if (!skill) {
164
+ warn2(`skipping agent "${id}": not found or not runnable`);
165
+ continue;
166
+ }
167
+ tools.push(createAgentTool({ ...skill, adapter, maxSteps: parsed.options.maxSteps }));
168
+ }
101
169
  }
102
- tools.push(
103
- createAgentTool({ id: skill.id, description: skill.description, systemPrompt: skill.systemPrompt, adapter })
104
- );
105
170
  }
106
- return tools;
107
- }
108
- async function main() {
109
- const tools = [...buildTools(), ...await buildAgentTools()];
110
171
  if (tools.length === 0) {
111
- warn("no tools or agents enabled \u2014 nothing to serve. See --tools / --agents.");
112
- process.exit(1);
172
+ warn2("no tools or agents enabled \u2014 nothing to serve");
173
+ return { exitCode: 1, status: "rejected" };
113
174
  }
114
- createAgentsKitMcpServer({
115
- tools,
116
- onEvent: (e) => {
117
- if (e.type === "error") warn(`tool error (${e.tool}): ${e.error}`);
118
- }
175
+ const seen = /* @__PURE__ */ new Set();
176
+ const duplicate = tools.find((tool) => {
177
+ if (seen.has(tool.name)) return true;
178
+ seen.add(tool.name);
179
+ return false;
119
180
  });
120
- warn(`serving ${tools.length} item(s) over stdio (${tools.map((t) => t.name).join(", ")})`);
121
- }
122
- void main();
181
+ if (duplicate) {
182
+ warn2(`duplicate tool name: ${duplicate.name}`);
183
+ return { exitCode: 1, status: "rejected" };
184
+ }
185
+ const createServer = dependencies.createServer ?? createAgentsKitMcpServer;
186
+ let server;
187
+ try {
188
+ server = createServer({
189
+ tools,
190
+ onEvent: (event) => {
191
+ if (event.type === "error") warn2(`tool error (${event.tool ?? "unknown"}): ${event.error ?? "unknown"}`);
192
+ }
193
+ });
194
+ } catch {
195
+ warn2("failed to start MCP server");
196
+ return { exitCode: 1, status: "rejected" };
197
+ }
198
+ const toolNames = tools.map((tool) => tool.name);
199
+ warn2(`serving ${toolNames.length} item(s) over stdio (${toolNames.join(", ")})`);
200
+ return { exitCode: 0, server, status: "started", toolNames };
201
+ };
202
+
203
+ // src/bin.ts
204
+ var warn = (message) => {
205
+ process.stderr.write(`agentskit-mcp: ${message}
206
+ `);
207
+ };
208
+ void runMcpCli(process.argv.slice(2), { warn }).then((result) => {
209
+ process.exitCode = result.exitCode;
210
+ }).catch(() => {
211
+ warn("unexpected startup failure");
212
+ process.exitCode = 1;
213
+ });
123
214
  //# sourceMappingURL=bin.js.map
124
215
  //# sourceMappingURL=bin.js.map
package/dist/bin.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/bin.ts"],"names":[],"mappings":"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","file":"bin.js","sourcesContent":["#!/usr/bin/env node\nimport type { AdapterFactory, ToolDefinition } from '@agentskit/core'\nimport { fetchUrl, webSearch, filesystem, shell, sqliteQueryTool } from '@agentskit/tools'\nimport {\n anthropic, gemini, openai, deepseek, grok, groq, mistral, cohere, together,\n fireworks, openrouter, cerebras, kimi, huggingface, qwen,\n ollama, lmstudio, vllm, llamacpp,\n} from '@agentskit/adapters'\nimport { dispatchFromCatalog } from '@agentskit/adapters/catalog'\nimport { createAgentsKitMcpServer } from './index'\nimport { createAgentTool } from './agent-tool'\nimport { fetchAgentSkill } from './registry-fetch'\n\n/**\n * `agentskit-mcp` — start an MCP server exposing AgentsKit tools and/or agents.\n *\n * --tools <a,b> primitive tools (default: fetch,search; also filesystem/shell/sqlite)\n * --fs-root <dir> root for the filesystem tool\n * --sqlite <file> database file for the sqlite tool\n * --allow-shell enable the shell tool\n * --agents <a,b> expose registry agents as tools (each runs server-side)\n * --provider <p> model for --agents: openai | anthropic | gemini | ollama (default openai)\n * --model <m> model name for --agents\n * --api-key <k> key for --agents (else the provider's env var)\n *\n * stdout is the MCP JSON-RPC channel; all human output goes to stderr.\n */\nconst warn = (msg: string) => process.stderr.write(`agentskit-mcp: ${msg}\\n`)\nconst flag = (name: string): string | undefined => {\n const i = process.argv.indexOf(name)\n return i >= 0 ? process.argv[i + 1] : undefined\n}\nconst has = (name: string): boolean => process.argv.includes(name)\n\nfunction buildTools(): ToolDefinition[] {\n if (!has('--tools')) return [fetchUrl(), webSearch()]\n const requested = (flag('--tools') ?? '').split(',').map((s) => s.trim())\n const tools: ToolDefinition[] = []\n if (requested.includes('fetch')) tools.push(fetchUrl())\n if (requested.includes('search')) tools.push(webSearch())\n if (requested.includes('filesystem')) {\n const root = flag('--fs-root')\n if (root) tools.push(...filesystem({ basePath: root }))\n else warn('skipping \"filesystem\": pass --fs-root <dir>')\n }\n if (requested.includes('sqlite')) {\n const file = flag('--sqlite')\n if (file) tools.push(sqliteQueryTool({ path: file }))\n else warn('skipping \"sqlite\": pass --sqlite <file>')\n }\n if (requested.includes('shell')) {\n if (has('--allow-shell')) tools.push(shell())\n else warn('skipping \"shell\": pass --allow-shell (runs commands)')\n }\n return tools\n}\n\ntype KeyedFactory = (cfg: { apiKey: string; model: string; baseUrl?: string }) => AdapterFactory\ntype LocalFactory = (cfg: { model: string; baseUrl?: string }) => AdapterFactory\n\n/** Providers that take { apiKey, model } — first-class + OpenAI-compatible (hosted + local-OpenAI-compat). */\nconst KEYED: Record<string, KeyedFactory> = {\n openai, anthropic, gemini, deepseek, grok, groq, mistral, cohere, together,\n fireworks, openrouter, cerebras, kimi, huggingface, qwen,\n lmstudio, vllm, llamacpp,\n}\n/** Local providers whose adapter needs no key. */\nconst LOCAL: Record<string, LocalFactory> = { ollama }\n/** Local OpenAI-compatible servers — key is a placeholder. */\nconst LOCAL_COMPAT = new Set(['lmstudio', 'vllm', 'llamacpp'])\n\nconst DEFAULT_MODEL: Record<string, string> = {\n openai: 'gpt-4o', anthropic: 'claude-sonnet-4-6', gemini: 'gemini-2.0-flash',\n deepseek: 'deepseek-chat', grok: 'grok-2', groq: 'llama-3.3-70b-versatile',\n mistral: 'mistral-large-latest', ollama: 'llama3',\n}\n\nfunction resolveAdapter(): AdapterFactory | null {\n const provider = flag('--provider') ?? 'openai'\n const model = flag('--model') ?? DEFAULT_MODEL[provider]\n if (!model) {\n warn(`--agents needs a model for \"${provider}\": pass --model`)\n return null\n }\n const baseUrl = flag('--base-url')\n\n if (LOCAL[provider]) return LOCAL[provider]({ model, baseUrl })\n\n const apiKey =\n flag('--api-key') ??\n process.env[`${provider.toUpperCase().replace(/-/g, '_')}_API_KEY`] ??\n (LOCAL_COMPAT.has(provider) ? 'local' : undefined)\n if (!apiKey) {\n warn(`--agents needs a key for \"${provider}\": pass --api-key or set ${provider.toUpperCase()}_API_KEY`)\n return null\n }\n if (KEYED[provider]) return KEYED[provider]({ apiKey, model })\n\n // Long tail: any other OpenAI-compatible provider in the models.dev catalog.\n try {\n return dispatchFromCatalog({ provider, model, apiKey, baseUrl })\n } catch {\n warn(`unknown provider \"${provider}\". Known: ${[...Object.keys(KEYED), ...Object.keys(LOCAL)].join(', ')}, or any catalog OpenAI-compatible provider.`)\n return null\n }\n}\n\nasync function buildAgentTools(): Promise<ToolDefinition[]> {\n const ids = (flag('--agents') ?? '').split(',').map((s) => s.trim()).filter(Boolean)\n if (ids.length === 0) return []\n const adapter = resolveAdapter()\n if (!adapter) return []\n const tools: ToolDefinition[] = []\n for (const id of ids) {\n const skill = await fetchAgentSkill(id)\n if (!skill) {\n warn(`skipping agent \"${id}\": not found or not runnable (tool-composing agent)`)\n continue\n }\n tools.push(\n createAgentTool({ id: skill.id, description: skill.description, systemPrompt: skill.systemPrompt, adapter }),\n )\n }\n return tools\n}\n\nasync function main(): Promise<void> {\n const tools = [...buildTools(), ...(await buildAgentTools())]\n if (tools.length === 0) {\n warn('no tools or agents enabled — nothing to serve. See --tools / --agents.')\n process.exit(1)\n }\n createAgentsKitMcpServer({\n tools,\n onEvent: (e) => {\n if (e.type === 'error') warn(`tool error (${e.tool}): ${e.error}`)\n },\n })\n warn(`serving ${tools.length} item(s) over stdio (${tools.map((t) => t.name).join(', ')})`)\n}\n\nvoid main()\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 } 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: 'llama-3.3-70b-versatile',\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"]}