@agentskit/mcp 0.4.8 → 0.4.10

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 CHANGED
@@ -31,7 +31,7 @@ Docs: [MCP package guide](https://www.agentskit.io/docs/agents/tools/mcp) · [ag
31
31
 
32
32
  <!-- readme-command:install -->
33
33
  ```bash
34
- npx -y @agentskit/mcp@0.4.8 --tools fetch,search
34
+ npx -y @agentskit/mcp@0.4.10 --tools fetch,search
35
35
  ```
36
36
 
37
37
  Then point your MCP host at the command. Claude Desktop, Cursor, Codex, and
@@ -42,7 +42,7 @@ Claude Desktop or Cursor (`mcpServers` / `.cursor/mcp.json`):
42
42
  ```json
43
43
  {
44
44
  "mcpServers": {
45
- "agentskit": { "command": "npx", "args": ["-y", "@agentskit/mcp@0.4.8", "--tools", "fetch,search"] }
45
+ "agentskit": { "command": "npx", "args": ["-y", "@agentskit/mcp@0.4.10", "--tools", "fetch,search"] }
46
46
  }
47
47
  }
48
48
  ```
@@ -52,7 +52,7 @@ Codex (`~/.codex/config.toml`):
52
52
  ```toml
53
53
  [mcp_servers.agentskit]
54
54
  command = "npx"
55
- args = ["-y", "@agentskit/mcp@0.4.8", "--tools", "fetch,search"]
55
+ args = ["-y", "@agentskit/mcp@0.4.10", "--tools", "fetch,search"]
56
56
  ```
57
57
 
58
58
  OpenClaw:
@@ -61,7 +61,7 @@ OpenClaw:
61
61
  openclaw mcp add agentskit \
62
62
  --command npx \
63
63
  --arg -y \
64
- --arg @agentskit/mcp@0.4.8 \
64
+ --arg @agentskit/mcp@0.4.10 \
65
65
  --arg --tools \
66
66
  --arg fetch,search
67
67
  openclaw mcp doctor agentskit --probe
@@ -107,7 +107,7 @@ Run a registry agent server-side and expose it as a single MCP tool — the host
107
107
  delegates a specialized job instead of orchestrating primitives:
108
108
 
109
109
  ```bash
110
- npx @agentskit/mcp@0.4.8 --agents legal-contract-reviewer,fintech-kyc-screener --provider openai
110
+ npx @agentskit/mcp@0.4.10 --agents legal-contract-reviewer,fintech-kyc-screener --provider openai
111
111
  ```
112
112
 
113
113
  `--provider` covers the first-class adapters (openai, anthropic, gemini, ollama)
@@ -125,6 +125,23 @@ Typed Registry projections use `fetchAgent` + `createTypedAgentTool`; their
125
125
  input/output JSON Schemas are preserved. `fetchAgentSkill` intentionally
126
126
  rejects typed projections so they cannot be flattened into a text tool.
127
127
 
128
+ `fetchAgent` and `fetchAgentSkill` try the hosted registry first and may fall
129
+ back to raw registry files when hosted data is unavailable or unreadable. Each
130
+ response is limited to 131072 bytes and each request to 10000 ms by default.
131
+ Set `maxResponseBytes` (1–1048576) or `timeoutMs` (1–120000) to adjust those
132
+ bounds, or pass an `AbortSignal`; aborting stops later fallback requests.
133
+ Oversized bodies are cancelled and treated as a failed source. Calls resolve to
134
+ `null` for invalid IDs or options, aborted operations, typed projections passed
135
+ to `fetchAgentSkill`, or when neither source provides a supported result.
136
+ Network error codes are not exposed by these APIs.
137
+
138
+ ```ts
139
+ import { fetchAgent, fetchAgentSkill } from '@agentskit/mcp'
140
+
141
+ const agent = await fetchAgent('legal-contract-reviewer', fetch, { maxResponseBytes: 131072 })
142
+ const skill = await fetchAgentSkill('legal-contract-reviewer')
143
+ ```
144
+
128
145
  ## Quick start
129
146
 
130
147
  <!-- readme-example:quickstart -->
package/dist/bin.cjs CHANGED
@@ -8,6 +8,7 @@ var core = require('@agentskit/core');
8
8
  var runtime = require('@agentskit/runtime');
9
9
  var validation = require('@agentskit/tools/validation');
10
10
  var mcp = require('@agentskit/tools/mcp');
11
+ var net = require('@agentskit/net');
11
12
 
12
13
  var encoder = new TextEncoder();
13
14
  var TOOL_NAME = /^[A-Za-z0-9_.-]+$/;
@@ -169,8 +170,6 @@ ${task}`,
169
170
  };
170
171
  return Object.freeze(tool);
171
172
  }
172
-
173
- // src/registry-fetch.ts
174
173
  var HOSTED = "https://registry.agentskit.io/r";
175
174
  var RAW = "https://raw.githubusercontent.com/AgentsKit-io/agentskit-registry/main";
176
175
  var REGISTRY_ID = /^[a-z0-9](?:[a-z0-9-]{0,62}[a-z0-9])?$/;
@@ -195,26 +194,6 @@ var boundedString = (input, maximum) => {
195
194
  if (typeof input !== "string" || input.trim().length === 0) return null;
196
195
  return new TextEncoder().encode(input).byteLength <= maximum ? input.trim() : null;
197
196
  };
198
- var readBounded = async (response, maximum) => {
199
- const declared = Number(response.headers.get("content-length"));
200
- if (Number.isFinite(declared) && declared > maximum) return null;
201
- if (!response.body) return "";
202
- const reader = response.body.getReader();
203
- const decoder = new TextDecoder();
204
- let bytes = 0;
205
- let text = "";
206
- while (true) {
207
- const chunk = await reader.read();
208
- if (chunk.done) break;
209
- bytes += chunk.value.byteLength;
210
- if (bytes > maximum) {
211
- await reader.cancel().catch(() => void 0);
212
- return null;
213
- }
214
- text += decoder.decode(chunk.value, { stream: true });
215
- }
216
- return text + decoder.decode();
217
- };
218
197
  var requestText = async (url, fetchImpl, options) => {
219
198
  if (options.signal?.aborted) return null;
220
199
  const controller = new AbortController();
@@ -232,7 +211,7 @@ var requestText = async (url, fetchImpl, options) => {
232
211
  const request = (async () => {
233
212
  const response = await fetchImpl(url, { signal: controller.signal });
234
213
  if (!response.ok) return null;
235
- return readBounded(response, options.maxResponseBytes);
214
+ return await net.readText(response, { maxBytes: options.maxResponseBytes });
236
215
  })().catch(() => null);
237
216
  const timeout = new Promise((resolve) => {
238
217
  timer = setTimeout(() => {
@@ -275,10 +254,12 @@ async function fetchAgent(id, fetchImpl = globalThis.fetch, options = {}) {
275
254
  }
276
255
  }
277
256
  }
257
+ if (options.signal?.aborted) return null;
278
258
  const meta = await requestJson(`${RAW}/registry/${id}/meta.json`, fetchImpl, bounds);
279
259
  if (!isRecord2(meta)) return null;
280
260
  const typed = readTypedMcpProjection(meta);
281
261
  if (typed === null) return null;
262
+ if (options.signal?.aborted) return null;
282
263
  const source = await requestText(`${RAW}/registry/${id}/agent.ts`, fetchImpl, bounds);
283
264
  if (!source) return null;
284
265
  const match = source.match(/systemPrompt:\s*`((?:\\.|[^`\\])*)`/);
package/dist/bin.cjs.map CHANGED
@@ -1 +1 @@
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","createAjvValidator","invokeStructured","TOOL_NAME","isRecord","typed","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 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 maxSteps = assertPositiveInteger(config.maxSteps ?? 4, 'typed agent maxSteps', 100)\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,\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","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
+ {"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","createAjvValidator","invokeStructured","TOOL_NAME","isRecord","readText","typed","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 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 maxSteps = assertPositiveInteger(config.maxSteps ?? 4, 'typed agent maxSteps', 100)\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,\n })\n },\n }\n return Object.freeze(tool)\n}\n","import type { ToolDefinition } from '@agentskit/core'\nimport { readText } from '@agentskit/net'\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\n/** A validated text skill projection returned by the registry. */\nexport interface FetchedAgentSkill {\n /** Registry ID. */\n id: string\n /** Display description, or the registry ID when absent. */\n description: string\n /** Prompt text supplied by the skill. */\n systemPrompt: string\n}\n\n/** A validated typed MCP projection returned by the registry. */\nexport interface FetchedTypedAgent extends FetchedAgentSkill {\n /** Identifies this result as a typed MCP projection. */\n mode: 'typed'\n /** Input JSON Schema for the typed tool. */\n inputSchema: JsonSchema\n /** Output JSON Schema for the typed tool. */\n outputSchema: JsonSchema\n /** MCP tool name used to submit the typed result. */\n resultToolName: string\n}\n\n/** A registry agent exposed as either a text skill or a typed MCP tool. */\nexport type FetchedAgent = FetchedAgentSkill | FetchedTypedAgent\n\n/** Options shared by the registry fetch functions. */\nexport interface FetchAgentSkillOptions {\n /** Per-request timeout in milliseconds. Default 10000; accepted range is 1–120000. */\n timeoutMs?: number\n /** Maximum response bytes. Default 131072; accepted range is 1–1048576. */\n maxResponseBytes?: number\n /** Cancels the active read and prevents later fallback requests. */\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 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 await readText(response, { maxBytes: 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\n/**\n * Fetch a registry agent, preserving typed MCP projections when present.\n * Unreadable hosted data or data without a usable projection falls back to the\n * raw registry; an explicit null skill or malformed typed projection resolves\n * to `null`. Reads default to 10000 ms and 131072 bytes per response.\n *\n * The result is `null` for invalid IDs or bounds, an aborted operation, or\n * when neither source provides a supported agent. A hosted timeout, HTTP\n * failure, malformed JSON, or oversized response may still succeed through\n * raw fallback. Oversized reads use `AK_NET_BODY_TOO_LARGE` internally; no\n * network error code is exposed by this null-returning API.\n *\n * @param id Lowercase kebab-case registry ID.\n * @param fetchImpl Fetch implementation, defaulting to `globalThis.fetch`.\n * @param options Timeout, response-size, and abort settings.\n * @returns A skill or typed projection, or `null` when no supported result is available.\n *\n * @example\n * ```ts\n * const agent = await fetchAgent('legal-review', fetch, { maxResponseBytes: 131072 })\n * if (agent && 'mode' in agent) console.log(agent.resultToolName)\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 if (options.signal?.aborted) return null\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 if (options.signal?.aborted) 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\n/**\n * Fetch a text skill from the registry. Typed MCP projections resolve to\n * `null` so they cannot be flattened into a generic text tool.\n *\n * Reads default to 10000 ms and 131072 bytes per response. Unreadable hosted\n * data may fall back to raw registry files; a hosted timeout, HTTP failure,\n * malformed JSON, or oversized body may therefore still produce a skill.\n * Typed projections, invalid IDs or bounds, aborted operations, and requests\n * for which neither source provides a supported text skill resolve to `null`.\n * Oversized reads use `AK_NET_BODY_TOO_LARGE` internally; network error codes\n * are not exposed.\n *\n * @param id Lowercase kebab-case registry ID.\n * @param fetchImpl Fetch implementation, defaulting to `globalThis.fetch`.\n * @param options Timeout, response-size, and abort settings.\n * @returns A text skill, or `null` for typed projections or when no supported skill is available.\n *\n * @example\n * ```ts\n * const skill = await fetchAgentSkill('legal-review', fetch, { timeoutMs: 10000 })\n * if (skill) console.log(skill.systemPrompt)\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","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"]}
package/dist/bin.js CHANGED
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import { fetchAgent, createTypedAgentTool, createAgentTool, createAgentsKitMcpServer } from './chunk-IDEAK3MO.js';
2
+ import { fetchAgent, createTypedAgentTool, createAgentTool, createAgentsKitMcpServer } from './chunk-AFMMBKBR.js';
3
3
  import { ollama, vllm, together, qwen, openrouter, openai, mistral, lmstudio, llamacpp, kimi, huggingface, groq, grok, gemini, fireworks, deepseek, cohere, cerebras, anthropic } from '@agentskit/adapters';
4
4
  import { dispatchFromCatalog } from '@agentskit/adapters/catalog';
5
5
  import { fetchUrl, webSearch, filesystem, sqliteQueryTool, shell } from '@agentskit/tools';
@@ -2,6 +2,7 @@ import { ConfigError, ErrorCodes, ToolError } from '@agentskit/core';
2
2
  import { createStdioTransport, createMcpServer } from '@agentskit/tools/mcp';
3
3
  import { createRuntime, invokeStructured } from '@agentskit/runtime';
4
4
  import { createAjvValidator } from '@agentskit/tools/validation';
5
+ import { readText } from '@agentskit/net';
5
6
 
6
7
  // src/index.ts
7
8
  var encoder = new TextEncoder();
@@ -162,8 +163,6 @@ ${task}`,
162
163
  };
163
164
  return Object.freeze(tool);
164
165
  }
165
-
166
- // src/registry-fetch.ts
167
166
  var HOSTED = "https://registry.agentskit.io/r";
168
167
  var RAW = "https://raw.githubusercontent.com/AgentsKit-io/agentskit-registry/main";
169
168
  var REGISTRY_ID = /^[a-z0-9](?:[a-z0-9-]{0,62}[a-z0-9])?$/;
@@ -188,26 +187,6 @@ var boundedString = (input, maximum) => {
188
187
  if (typeof input !== "string" || input.trim().length === 0) return null;
189
188
  return new TextEncoder().encode(input).byteLength <= maximum ? input.trim() : null;
190
189
  };
191
- var readBounded = async (response, maximum) => {
192
- const declared = Number(response.headers.get("content-length"));
193
- if (Number.isFinite(declared) && declared > maximum) return null;
194
- if (!response.body) return "";
195
- const reader = response.body.getReader();
196
- const decoder = new TextDecoder();
197
- let bytes = 0;
198
- let text = "";
199
- while (true) {
200
- const chunk = await reader.read();
201
- if (chunk.done) break;
202
- bytes += chunk.value.byteLength;
203
- if (bytes > maximum) {
204
- await reader.cancel().catch(() => void 0);
205
- return null;
206
- }
207
- text += decoder.decode(chunk.value, { stream: true });
208
- }
209
- return text + decoder.decode();
210
- };
211
190
  var requestText = async (url, fetchImpl, options) => {
212
191
  if (options.signal?.aborted) return null;
213
192
  const controller = new AbortController();
@@ -225,7 +204,7 @@ var requestText = async (url, fetchImpl, options) => {
225
204
  const request = (async () => {
226
205
  const response = await fetchImpl(url, { signal: controller.signal });
227
206
  if (!response.ok) return null;
228
- return readBounded(response, options.maxResponseBytes);
207
+ return await readText(response, { maxBytes: options.maxResponseBytes });
229
208
  })().catch(() => null);
230
209
  const timeout = new Promise((resolve) => {
231
210
  timer = setTimeout(() => {
@@ -268,10 +247,12 @@ async function fetchAgent(id, fetchImpl = globalThis.fetch, options = {}) {
268
247
  }
269
248
  }
270
249
  }
250
+ if (options.signal?.aborted) return null;
271
251
  const meta = await requestJson(`${RAW}/registry/${id}/meta.json`, fetchImpl, bounds);
272
252
  if (!isRecord2(meta)) return null;
273
253
  const typed = readTypedMcpProjection(meta);
274
254
  if (typed === null) return null;
255
+ if (options.signal?.aborted) return null;
275
256
  const source = await requestText(`${RAW}/registry/${id}/agent.ts`, fetchImpl, bounds);
276
257
  if (!source) return null;
277
258
  const match = source.match(/systemPrompt:\s*`((?:\\.|[^`\\])*)`/);
@@ -359,5 +340,5 @@ function createAgentsKitMcpServer(options) {
359
340
  }
360
341
 
361
342
  export { createAgentTool, createAgentsKitMcpServer, createTypedAgentTool, fetchAgent, fetchAgentSkill, processStdio };
362
- //# sourceMappingURL=chunk-IDEAK3MO.js.map
363
- //# sourceMappingURL=chunk-IDEAK3MO.js.map
343
+ //# sourceMappingURL=chunk-AFMMBKBR.js.map
344
+ //# sourceMappingURL=chunk-AFMMBKBR.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-AFMMBKBR.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 maxSteps = assertPositiveInteger(config.maxSteps ?? 4, 'typed agent maxSteps', 100)\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,\n })\n },\n }\n return Object.freeze(tool)\n}\n","import type { ToolDefinition } from '@agentskit/core'\nimport { readText } from '@agentskit/net'\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\n/** A validated text skill projection returned by the registry. */\nexport interface FetchedAgentSkill {\n /** Registry ID. */\n id: string\n /** Display description, or the registry ID when absent. */\n description: string\n /** Prompt text supplied by the skill. */\n systemPrompt: string\n}\n\n/** A validated typed MCP projection returned by the registry. */\nexport interface FetchedTypedAgent extends FetchedAgentSkill {\n /** Identifies this result as a typed MCP projection. */\n mode: 'typed'\n /** Input JSON Schema for the typed tool. */\n inputSchema: JsonSchema\n /** Output JSON Schema for the typed tool. */\n outputSchema: JsonSchema\n /** MCP tool name used to submit the typed result. */\n resultToolName: string\n}\n\n/** A registry agent exposed as either a text skill or a typed MCP tool. */\nexport type FetchedAgent = FetchedAgentSkill | FetchedTypedAgent\n\n/** Options shared by the registry fetch functions. */\nexport interface FetchAgentSkillOptions {\n /** Per-request timeout in milliseconds. Default 10000; accepted range is 1–120000. */\n timeoutMs?: number\n /** Maximum response bytes. Default 131072; accepted range is 1–1048576. */\n maxResponseBytes?: number\n /** Cancels the active read and prevents later fallback requests. */\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 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 await readText(response, { maxBytes: 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\n/**\n * Fetch a registry agent, preserving typed MCP projections when present.\n * Unreadable hosted data or data without a usable projection falls back to the\n * raw registry; an explicit null skill or malformed typed projection resolves\n * to `null`. Reads default to 10000 ms and 131072 bytes per response.\n *\n * The result is `null` for invalid IDs or bounds, an aborted operation, or\n * when neither source provides a supported agent. A hosted timeout, HTTP\n * failure, malformed JSON, or oversized response may still succeed through\n * raw fallback. Oversized reads use `AK_NET_BODY_TOO_LARGE` internally; no\n * network error code is exposed by this null-returning API.\n *\n * @param id Lowercase kebab-case registry ID.\n * @param fetchImpl Fetch implementation, defaulting to `globalThis.fetch`.\n * @param options Timeout, response-size, and abort settings.\n * @returns A skill or typed projection, or `null` when no supported result is available.\n *\n * @example\n * ```ts\n * const agent = await fetchAgent('legal-review', fetch, { maxResponseBytes: 131072 })\n * if (agent && 'mode' in agent) console.log(agent.resultToolName)\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 if (options.signal?.aborted) return null\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 if (options.signal?.aborted) 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\n/**\n * Fetch a text skill from the registry. Typed MCP projections resolve to\n * `null` so they cannot be flattened into a generic text tool.\n *\n * Reads default to 10000 ms and 131072 bytes per response. Unreadable hosted\n * data may fall back to raw registry files; a hosted timeout, HTTP failure,\n * malformed JSON, or oversized body may therefore still produce a skill.\n * Typed projections, invalid IDs or bounds, aborted operations, and requests\n * for which neither source provides a supported text skill resolve to `null`.\n * Oversized reads use `AK_NET_BODY_TOO_LARGE` internally; network error codes\n * are not exposed.\n *\n * @param id Lowercase kebab-case registry ID.\n * @param fetchImpl Fetch implementation, defaulting to `globalThis.fetch`.\n * @param options Timeout, response-size, and abort settings.\n * @returns A text skill, or `null` for typed projections or when no supported skill is available.\n *\n * @example\n * ```ts\n * const skill = await fetchAgentSkill('legal-review', fetch, { timeoutMs: 10000 })\n * if (skill) console.log(skill.systemPrompt)\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
@@ -4,6 +4,7 @@ var core = require('@agentskit/core');
4
4
  var mcp = require('@agentskit/tools/mcp');
5
5
  var runtime = require('@agentskit/runtime');
6
6
  var validation = require('@agentskit/tools/validation');
7
+ var net = require('@agentskit/net');
7
8
 
8
9
  // src/index.ts
9
10
  var encoder = new TextEncoder();
@@ -164,8 +165,6 @@ ${task}`,
164
165
  };
165
166
  return Object.freeze(tool);
166
167
  }
167
-
168
- // src/registry-fetch.ts
169
168
  var HOSTED = "https://registry.agentskit.io/r";
170
169
  var RAW = "https://raw.githubusercontent.com/AgentsKit-io/agentskit-registry/main";
171
170
  var REGISTRY_ID = /^[a-z0-9](?:[a-z0-9-]{0,62}[a-z0-9])?$/;
@@ -190,26 +189,6 @@ var boundedString = (input, maximum) => {
190
189
  if (typeof input !== "string" || input.trim().length === 0) return null;
191
190
  return new TextEncoder().encode(input).byteLength <= maximum ? input.trim() : null;
192
191
  };
193
- var readBounded = async (response, maximum) => {
194
- const declared = Number(response.headers.get("content-length"));
195
- if (Number.isFinite(declared) && declared > maximum) return null;
196
- if (!response.body) return "";
197
- const reader = response.body.getReader();
198
- const decoder = new TextDecoder();
199
- let bytes = 0;
200
- let text = "";
201
- while (true) {
202
- const chunk = await reader.read();
203
- if (chunk.done) break;
204
- bytes += chunk.value.byteLength;
205
- if (bytes > maximum) {
206
- await reader.cancel().catch(() => void 0);
207
- return null;
208
- }
209
- text += decoder.decode(chunk.value, { stream: true });
210
- }
211
- return text + decoder.decode();
212
- };
213
192
  var requestText = async (url, fetchImpl, options) => {
214
193
  if (options.signal?.aborted) return null;
215
194
  const controller = new AbortController();
@@ -227,7 +206,7 @@ var requestText = async (url, fetchImpl, options) => {
227
206
  const request = (async () => {
228
207
  const response = await fetchImpl(url, { signal: controller.signal });
229
208
  if (!response.ok) return null;
230
- return readBounded(response, options.maxResponseBytes);
209
+ return await net.readText(response, { maxBytes: options.maxResponseBytes });
231
210
  })().catch(() => null);
232
211
  const timeout = new Promise((resolve) => {
233
212
  timer = setTimeout(() => {
@@ -270,10 +249,12 @@ async function fetchAgent(id, fetchImpl = globalThis.fetch, options = {}) {
270
249
  }
271
250
  }
272
251
  }
252
+ if (options.signal?.aborted) return null;
273
253
  const meta = await requestJson(`${RAW}/registry/${id}/meta.json`, fetchImpl, bounds);
274
254
  if (!isRecord2(meta)) return null;
275
255
  const typed = readTypedMcpProjection(meta);
276
256
  if (typed === null) return null;
257
+ if (options.signal?.aborted) return null;
277
258
  const source = await requestText(`${RAW}/registry/${id}/agent.ts`, fetchImpl, bounds);
278
259
  if (!source) return null;
279
260
  const match = source.match(/systemPrompt:\s*`((?:\\.|[^`\\])*)`/);
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/validation.ts","../src/agent-tool.ts","../src/registry-fetch.ts","../src/index.ts"],"names":["ConfigError","ErrorCodes","ToolError","runtime","createRuntime","createAjvValidator","invokeStructured","TOOL_NAME","isRecord","typed","systemPrompt","createStdioTransport","createMcpServer"],"mappings":"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","file":"index.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 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 maxSteps = assertPositiveInteger(config.maxSteps ?? 4, 'typed agent maxSteps', 100)\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,\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"]}
1
+ {"version":3,"sources":["../src/validation.ts","../src/agent-tool.ts","../src/registry-fetch.ts","../src/index.ts"],"names":["ConfigError","ErrorCodes","ToolError","runtime","createRuntime","createAjvValidator","invokeStructured","TOOL_NAME","isRecord","readText","typed","systemPrompt","createStdioTransport","createMcpServer"],"mappings":"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","file":"index.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 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 maxSteps = assertPositiveInteger(config.maxSteps ?? 4, 'typed agent maxSteps', 100)\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,\n })\n },\n }\n return Object.freeze(tool)\n}\n","import type { ToolDefinition } from '@agentskit/core'\nimport { readText } from '@agentskit/net'\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\n/** A validated text skill projection returned by the registry. */\nexport interface FetchedAgentSkill {\n /** Registry ID. */\n id: string\n /** Display description, or the registry ID when absent. */\n description: string\n /** Prompt text supplied by the skill. */\n systemPrompt: string\n}\n\n/** A validated typed MCP projection returned by the registry. */\nexport interface FetchedTypedAgent extends FetchedAgentSkill {\n /** Identifies this result as a typed MCP projection. */\n mode: 'typed'\n /** Input JSON Schema for the typed tool. */\n inputSchema: JsonSchema\n /** Output JSON Schema for the typed tool. */\n outputSchema: JsonSchema\n /** MCP tool name used to submit the typed result. */\n resultToolName: string\n}\n\n/** A registry agent exposed as either a text skill or a typed MCP tool. */\nexport type FetchedAgent = FetchedAgentSkill | FetchedTypedAgent\n\n/** Options shared by the registry fetch functions. */\nexport interface FetchAgentSkillOptions {\n /** Per-request timeout in milliseconds. Default 10000; accepted range is 1–120000. */\n timeoutMs?: number\n /** Maximum response bytes. Default 131072; accepted range is 1–1048576. */\n maxResponseBytes?: number\n /** Cancels the active read and prevents later fallback requests. */\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 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 await readText(response, { maxBytes: 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\n/**\n * Fetch a registry agent, preserving typed MCP projections when present.\n * Unreadable hosted data or data without a usable projection falls back to the\n * raw registry; an explicit null skill or malformed typed projection resolves\n * to `null`. Reads default to 10000 ms and 131072 bytes per response.\n *\n * The result is `null` for invalid IDs or bounds, an aborted operation, or\n * when neither source provides a supported agent. A hosted timeout, HTTP\n * failure, malformed JSON, or oversized response may still succeed through\n * raw fallback. Oversized reads use `AK_NET_BODY_TOO_LARGE` internally; no\n * network error code is exposed by this null-returning API.\n *\n * @param id Lowercase kebab-case registry ID.\n * @param fetchImpl Fetch implementation, defaulting to `globalThis.fetch`.\n * @param options Timeout, response-size, and abort settings.\n * @returns A skill or typed projection, or `null` when no supported result is available.\n *\n * @example\n * ```ts\n * const agent = await fetchAgent('legal-review', fetch, { maxResponseBytes: 131072 })\n * if (agent && 'mode' in agent) console.log(agent.resultToolName)\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 if (options.signal?.aborted) return null\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 if (options.signal?.aborted) 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\n/**\n * Fetch a text skill from the registry. Typed MCP projections resolve to\n * `null` so they cannot be flattened into a generic text tool.\n *\n * Reads default to 10000 ms and 131072 bytes per response. Unreadable hosted\n * data may fall back to raw registry files; a hosted timeout, HTTP failure,\n * malformed JSON, or oversized body may therefore still produce a skill.\n * Typed projections, invalid IDs or bounds, aborted operations, and requests\n * for which neither source provides a supported text skill resolve to `null`.\n * Oversized reads use `AK_NET_BODY_TOO_LARGE` internally; network error codes\n * are not exposed.\n *\n * @param id Lowercase kebab-case registry ID.\n * @param fetchImpl Fetch implementation, defaulting to `globalThis.fetch`.\n * @param options Timeout, response-size, and abort settings.\n * @returns A text skill, or `null` for typed projections or when no supported skill is available.\n *\n * @example\n * ```ts\n * const skill = await fetchAgentSkill('legal-review', fetch, { timeoutMs: 10000 })\n * if (skill) console.log(skill.systemPrompt)\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.d.cts CHANGED
@@ -36,26 +36,84 @@ declare function createAgentTool(config: AgentToolConfig): ToolDefinition;
36
36
  declare function createTypedAgentTool(config: TypedAgentToolConfig): ToolDefinition;
37
37
 
38
38
  type JsonSchema = NonNullable<ToolDefinition['schema']>;
39
+ /** A validated text skill projection returned by the registry. */
39
40
  interface FetchedAgentSkill {
41
+ /** Registry ID. */
40
42
  id: string;
43
+ /** Display description, or the registry ID when absent. */
41
44
  description: string;
45
+ /** Prompt text supplied by the skill. */
42
46
  systemPrompt: string;
43
47
  }
48
+ /** A validated typed MCP projection returned by the registry. */
44
49
  interface FetchedTypedAgent extends FetchedAgentSkill {
50
+ /** Identifies this result as a typed MCP projection. */
45
51
  mode: 'typed';
52
+ /** Input JSON Schema for the typed tool. */
46
53
  inputSchema: JsonSchema;
54
+ /** Output JSON Schema for the typed tool. */
47
55
  outputSchema: JsonSchema;
56
+ /** MCP tool name used to submit the typed result. */
48
57
  resultToolName: string;
49
58
  }
59
+ /** A registry agent exposed as either a text skill or a typed MCP tool. */
50
60
  type FetchedAgent = FetchedAgentSkill | FetchedTypedAgent;
61
+ /** Options shared by the registry fetch functions. */
51
62
  interface FetchAgentSkillOptions {
52
- /** Per-request timeout. Default 10000 ms. */
63
+ /** Per-request timeout in milliseconds. Default 10000; accepted range is 1–120000. */
53
64
  timeoutMs?: number;
54
- /** Maximum UTF-8 response bytes. Default 131072. */
65
+ /** Maximum response bytes. Default 131072; accepted range is 1–1048576. */
55
66
  maxResponseBytes?: number;
67
+ /** Cancels the active read and prevents later fallback requests. */
56
68
  signal?: AbortSignal;
57
69
  }
70
+ /**
71
+ * Fetch a registry agent, preserving typed MCP projections when present.
72
+ * Unreadable hosted data or data without a usable projection falls back to the
73
+ * raw registry; an explicit null skill or malformed typed projection resolves
74
+ * to `null`. Reads default to 10000 ms and 131072 bytes per response.
75
+ *
76
+ * The result is `null` for invalid IDs or bounds, an aborted operation, or
77
+ * when neither source provides a supported agent. A hosted timeout, HTTP
78
+ * failure, malformed JSON, or oversized response may still succeed through
79
+ * raw fallback. Oversized reads use `AK_NET_BODY_TOO_LARGE` internally; no
80
+ * network error code is exposed by this null-returning API.
81
+ *
82
+ * @param id Lowercase kebab-case registry ID.
83
+ * @param fetchImpl Fetch implementation, defaulting to `globalThis.fetch`.
84
+ * @param options Timeout, response-size, and abort settings.
85
+ * @returns A skill or typed projection, or `null` when no supported result is available.
86
+ *
87
+ * @example
88
+ * ```ts
89
+ * const agent = await fetchAgent('legal-review', fetch, { maxResponseBytes: 131072 })
90
+ * if (agent && 'mode' in agent) console.log(agent.resultToolName)
91
+ * ```
92
+ */
58
93
  declare function fetchAgent(id: string, fetchImpl?: typeof fetch, options?: FetchAgentSkillOptions): Promise<FetchedAgent | null>;
94
+ /**
95
+ * Fetch a text skill from the registry. Typed MCP projections resolve to
96
+ * `null` so they cannot be flattened into a generic text tool.
97
+ *
98
+ * Reads default to 10000 ms and 131072 bytes per response. Unreadable hosted
99
+ * data may fall back to raw registry files; a hosted timeout, HTTP failure,
100
+ * malformed JSON, or oversized body may therefore still produce a skill.
101
+ * Typed projections, invalid IDs or bounds, aborted operations, and requests
102
+ * for which neither source provides a supported text skill resolve to `null`.
103
+ * Oversized reads use `AK_NET_BODY_TOO_LARGE` internally; network error codes
104
+ * are not exposed.
105
+ *
106
+ * @param id Lowercase kebab-case registry ID.
107
+ * @param fetchImpl Fetch implementation, defaulting to `globalThis.fetch`.
108
+ * @param options Timeout, response-size, and abort settings.
109
+ * @returns A text skill, or `null` for typed projections or when no supported skill is available.
110
+ *
111
+ * @example
112
+ * ```ts
113
+ * const skill = await fetchAgentSkill('legal-review', fetch, { timeoutMs: 10000 })
114
+ * if (skill) console.log(skill.systemPrompt)
115
+ * ```
116
+ */
59
117
  declare function fetchAgentSkill(id: string, fetchImpl?: typeof fetch, options?: FetchAgentSkillOptions): Promise<FetchedAgentSkill | null>;
60
118
 
61
119
  interface AgentsKitMcpServerOptions {
package/dist/index.d.ts CHANGED
@@ -36,26 +36,84 @@ declare function createAgentTool(config: AgentToolConfig): ToolDefinition;
36
36
  declare function createTypedAgentTool(config: TypedAgentToolConfig): ToolDefinition;
37
37
 
38
38
  type JsonSchema = NonNullable<ToolDefinition['schema']>;
39
+ /** A validated text skill projection returned by the registry. */
39
40
  interface FetchedAgentSkill {
41
+ /** Registry ID. */
40
42
  id: string;
43
+ /** Display description, or the registry ID when absent. */
41
44
  description: string;
45
+ /** Prompt text supplied by the skill. */
42
46
  systemPrompt: string;
43
47
  }
48
+ /** A validated typed MCP projection returned by the registry. */
44
49
  interface FetchedTypedAgent extends FetchedAgentSkill {
50
+ /** Identifies this result as a typed MCP projection. */
45
51
  mode: 'typed';
52
+ /** Input JSON Schema for the typed tool. */
46
53
  inputSchema: JsonSchema;
54
+ /** Output JSON Schema for the typed tool. */
47
55
  outputSchema: JsonSchema;
56
+ /** MCP tool name used to submit the typed result. */
48
57
  resultToolName: string;
49
58
  }
59
+ /** A registry agent exposed as either a text skill or a typed MCP tool. */
50
60
  type FetchedAgent = FetchedAgentSkill | FetchedTypedAgent;
61
+ /** Options shared by the registry fetch functions. */
51
62
  interface FetchAgentSkillOptions {
52
- /** Per-request timeout. Default 10000 ms. */
63
+ /** Per-request timeout in milliseconds. Default 10000; accepted range is 1–120000. */
53
64
  timeoutMs?: number;
54
- /** Maximum UTF-8 response bytes. Default 131072. */
65
+ /** Maximum response bytes. Default 131072; accepted range is 1–1048576. */
55
66
  maxResponseBytes?: number;
67
+ /** Cancels the active read and prevents later fallback requests. */
56
68
  signal?: AbortSignal;
57
69
  }
70
+ /**
71
+ * Fetch a registry agent, preserving typed MCP projections when present.
72
+ * Unreadable hosted data or data without a usable projection falls back to the
73
+ * raw registry; an explicit null skill or malformed typed projection resolves
74
+ * to `null`. Reads default to 10000 ms and 131072 bytes per response.
75
+ *
76
+ * The result is `null` for invalid IDs or bounds, an aborted operation, or
77
+ * when neither source provides a supported agent. A hosted timeout, HTTP
78
+ * failure, malformed JSON, or oversized response may still succeed through
79
+ * raw fallback. Oversized reads use `AK_NET_BODY_TOO_LARGE` internally; no
80
+ * network error code is exposed by this null-returning API.
81
+ *
82
+ * @param id Lowercase kebab-case registry ID.
83
+ * @param fetchImpl Fetch implementation, defaulting to `globalThis.fetch`.
84
+ * @param options Timeout, response-size, and abort settings.
85
+ * @returns A skill or typed projection, or `null` when no supported result is available.
86
+ *
87
+ * @example
88
+ * ```ts
89
+ * const agent = await fetchAgent('legal-review', fetch, { maxResponseBytes: 131072 })
90
+ * if (agent && 'mode' in agent) console.log(agent.resultToolName)
91
+ * ```
92
+ */
58
93
  declare function fetchAgent(id: string, fetchImpl?: typeof fetch, options?: FetchAgentSkillOptions): Promise<FetchedAgent | null>;
94
+ /**
95
+ * Fetch a text skill from the registry. Typed MCP projections resolve to
96
+ * `null` so they cannot be flattened into a generic text tool.
97
+ *
98
+ * Reads default to 10000 ms and 131072 bytes per response. Unreadable hosted
99
+ * data may fall back to raw registry files; a hosted timeout, HTTP failure,
100
+ * malformed JSON, or oversized body may therefore still produce a skill.
101
+ * Typed projections, invalid IDs or bounds, aborted operations, and requests
102
+ * for which neither source provides a supported text skill resolve to `null`.
103
+ * Oversized reads use `AK_NET_BODY_TOO_LARGE` internally; network error codes
104
+ * are not exposed.
105
+ *
106
+ * @param id Lowercase kebab-case registry ID.
107
+ * @param fetchImpl Fetch implementation, defaulting to `globalThis.fetch`.
108
+ * @param options Timeout, response-size, and abort settings.
109
+ * @returns A text skill, or `null` for typed projections or when no supported skill is available.
110
+ *
111
+ * @example
112
+ * ```ts
113
+ * const skill = await fetchAgentSkill('legal-review', fetch, { timeoutMs: 10000 })
114
+ * if (skill) console.log(skill.systemPrompt)
115
+ * ```
116
+ */
59
117
  declare function fetchAgentSkill(id: string, fetchImpl?: typeof fetch, options?: FetchAgentSkillOptions): Promise<FetchedAgentSkill | null>;
60
118
 
61
119
  interface AgentsKitMcpServerOptions {
package/dist/index.js CHANGED
@@ -1,3 +1,3 @@
1
- export { createAgentTool, createAgentsKitMcpServer, createTypedAgentTool, fetchAgent, fetchAgentSkill, processStdio } from './chunk-IDEAK3MO.js';
1
+ export { createAgentTool, createAgentsKitMcpServer, createTypedAgentTool, fetchAgent, fetchAgentSkill, processStdio } from './chunk-AFMMBKBR.js';
2
2
  //# sourceMappingURL=index.js.map
3
3
  //# sourceMappingURL=index.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agentskit/mcp",
3
- "version": "0.4.8",
3
+ "version": "0.4.10",
4
4
  "description": "Expose AgentsKit tools as an MCP server for hosts supporting the documented 2024-11-05 tools bridge.",
5
5
  "keywords": [
6
6
  "codex",
@@ -44,10 +44,11 @@
44
44
  "dev": "tsup --watch"
45
45
  },
46
46
  "dependencies": {
47
- "@agentskit/adapters": "0.17.4",
48
- "@agentskit/core": "1.13.0",
49
- "@agentskit/runtime": "0.10.19",
50
- "@agentskit/tools": "0.13.12"
47
+ "@agentskit/adapters": "0.18.1",
48
+ "@agentskit/core": "1.14.1",
49
+ "@agentskit/net": "0.2.2",
50
+ "@agentskit/runtime": "0.11.1",
51
+ "@agentskit/tools": "0.13.14"
51
52
  },
52
53
  "devDependencies": {
53
54
  "@types/node": "^25.9.5",
@@ -1 +0,0 @@
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-IDEAK3MO.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 maxSteps = assertPositiveInteger(config.maxSteps ?? 4, 'typed agent maxSteps', 100)\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,\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"]}