@agentskit/mcp 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Emerson Braun
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,60 @@
1
+ # @agentskit/mcp
2
+
3
+ Expose AgentsKit tools as an [MCP](https://modelcontextprotocol.io) server — use
4
+ them from Claude Desktop, Cursor, Windsurf, or any MCP host.
5
+
6
+ ```bash
7
+ npx @agentskit/mcp --tools fetch,search
8
+ ```
9
+
10
+ Then point your MCP host at the command. Example (Claude Desktop config):
11
+
12
+ ```json
13
+ {
14
+ "mcpServers": {
15
+ "agentskit": { "command": "npx", "args": ["@agentskit/mcp", "--tools", "fetch,search"] }
16
+ }
17
+ }
18
+ ```
19
+
20
+ ## Flags
21
+
22
+ | Flag | Effect |
23
+ |------|--------|
24
+ | `--tools <a,b>` | which tools to expose (default `fetch,search`). Available: `fetch`, `search`, `filesystem`, `shell`, `sqlite` |
25
+ | `--fs-root <dir>` | enable the filesystem tool, rooted at `<dir>` |
26
+ | `--sqlite <file>` | enable the sqlite query tool against `<file>` |
27
+ | `--allow-shell` | enable the shell tool (off by default — it runs commands) |
28
+
29
+ `stdout` is the MCP JSON-RPC channel; human output goes to `stderr`.
30
+
31
+ ## Programmatic
32
+
33
+ ```ts
34
+ import { createAgentsKitMcpServer } from '@agentskit/mcp'
35
+ import { fetchUrl } from '@agentskit/tools'
36
+
37
+ createAgentsKitMcpServer({ tools: [fetchUrl()] }) // stdio by default
38
+ ```
39
+
40
+ Pass `transport` to use a custom MCP transport (e.g. in-memory for tests).
41
+
42
+ ## Expose whole agents (agents as MCP tools)
43
+
44
+ Run a registry agent server-side and expose it as a single MCP tool — the host
45
+ delegates a specialized job instead of orchestrating primitives:
46
+
47
+ ```bash
48
+ npx @agentskit/mcp --agents legal-contract-reviewer,fintech-kyc-screener --provider openai
49
+ ```
50
+
51
+ `--provider` covers the first-class adapters (openai, anthropic, gemini, ollama)
52
+ plus the OpenAI-compatible set (deepseek, grok, groq, mistral, cohere, together,
53
+ fireworks, openrouter, cerebras, kimi, huggingface, qwen, lmstudio, vllm, llamacpp)
54
+ and any other OpenAI-compatible provider in the models.dev catalog. Key from
55
+ `--api-key` or `<PROVIDER>_API_KEY`; `--model` / `--base-url` optional.
56
+
57
+ ```ts
58
+ import { createAgentTool } from '@agentskit/mcp'
59
+ createAgentsKitMcpServer({ tools: [createAgentTool({ id, description, systemPrompt, adapter })] })
60
+ ```
package/dist/bin.cjs ADDED
@@ -0,0 +1,206 @@
1
+ #!/usr/bin/env node
2
+ 'use strict';
3
+
4
+ var tools = require('@agentskit/tools');
5
+ var adapters = require('@agentskit/adapters');
6
+ var catalog = require('@agentskit/adapters/catalog');
7
+ var mcp = require('@agentskit/tools/mcp');
8
+ var runtime = require('@agentskit/runtime');
9
+
10
+ function createAgentTool(config) {
11
+ const skill = {
12
+ name: config.id,
13
+ description: config.description,
14
+ systemPrompt: config.systemPrompt
15
+ };
16
+ return {
17
+ name: config.id,
18
+ description: config.description,
19
+ schema: {
20
+ type: "object",
21
+ properties: { task: { type: "string", description: "The task or input for the agent." } },
22
+ required: ["task"]
23
+ },
24
+ execute: async (args) => {
25
+ const runtime$1 = runtime.createRuntime({ adapter: config.adapter, maxSteps: config.maxSteps ?? 8 });
26
+ const result = await runtime$1.run(String(args.task ?? ""), { skill });
27
+ return { content: result.content, steps: result.steps };
28
+ }
29
+ };
30
+ }
31
+
32
+ // src/registry-fetch.ts
33
+ var HOSTED = "https://registry.agentskit.io/r";
34
+ var RAW = "https://raw.githubusercontent.com/AgentsKit-io/agentskit-registry/main";
35
+ async function fetchAgentSkill(id, fetchImpl = globalThis.fetch) {
36
+ const tryUrl = async (url) => {
37
+ try {
38
+ const res = await fetchImpl(url);
39
+ return res.ok ? await res.json() : null;
40
+ } catch {
41
+ return null;
42
+ }
43
+ };
44
+ const hosted = await tryUrl(`${HOSTED}/${id}.json`);
45
+ if (hosted?.skill?.systemPrompt) {
46
+ return { id, description: hosted.description ?? id, systemPrompt: hosted.skill.systemPrompt };
47
+ }
48
+ const meta = await tryUrl(`${RAW}/registry/${id}/meta.json`);
49
+ if (!meta) return null;
50
+ let src = null;
51
+ try {
52
+ const res = await fetchImpl(`${RAW}/registry/${id}/agent.ts`);
53
+ src = res.ok ? await res.text() : null;
54
+ } catch {
55
+ src = null;
56
+ }
57
+ if (!src) return null;
58
+ const m = src.match(/systemPrompt:\s*`((?:\\.|[^`\\])*)`/);
59
+ if (!m) return null;
60
+ return {
61
+ id,
62
+ description: meta.description ?? id,
63
+ systemPrompt: m[1].replace(/\\`/g, "`").replace(/\\\$\{/g, "${")
64
+ };
65
+ }
66
+
67
+ // src/index.ts
68
+ function processStdio() {
69
+ return {
70
+ stdin: { write: (chunk) => void process.stdout.write(chunk) },
71
+ stdout: {
72
+ on: (_event, cb) => void process.stdin.on("data", cb),
73
+ off: (_event, cb) => void process.stdin.off("data", cb)
74
+ },
75
+ on: (event, cb) => void process.on(event === "close" ? "beforeExit" : "exit", cb)
76
+ };
77
+ }
78
+ function createAgentsKitMcpServer(options) {
79
+ const transport = options.transport ?? mcp.createStdioTransport(processStdio());
80
+ return mcp.createMcpServer({
81
+ transport,
82
+ tools: options.tools,
83
+ serverInfo: options.serverInfo ?? { name: "agentskit-mcp", version: "0.1.0" },
84
+ onEvent: options.onEvent
85
+ });
86
+ }
87
+
88
+ // src/bin.ts
89
+ var warn = (msg) => process.stderr.write(`agentskit-mcp: ${msg}
90
+ `);
91
+ var flag = (name) => {
92
+ const i = process.argv.indexOf(name);
93
+ return i >= 0 ? process.argv[i + 1] : void 0;
94
+ };
95
+ var has = (name) => process.argv.includes(name);
96
+ function buildTools() {
97
+ if (!has("--tools")) return [tools.fetchUrl(), tools.webSearch()];
98
+ const requested = (flag("--tools") ?? "").split(",").map((s) => s.trim());
99
+ const tools$1 = [];
100
+ if (requested.includes("fetch")) tools$1.push(tools.fetchUrl());
101
+ if (requested.includes("search")) tools$1.push(tools.webSearch());
102
+ if (requested.includes("filesystem")) {
103
+ const root = flag("--fs-root");
104
+ if (root) tools$1.push(...tools.filesystem({ basePath: root }));
105
+ else warn('skipping "filesystem": pass --fs-root <dir>');
106
+ }
107
+ if (requested.includes("sqlite")) {
108
+ const file = flag("--sqlite");
109
+ if (file) tools$1.push(tools.sqliteQueryTool({ path: file }));
110
+ else warn('skipping "sqlite": pass --sqlite <file>');
111
+ }
112
+ if (requested.includes("shell")) {
113
+ if (has("--allow-shell")) tools$1.push(tools.shell());
114
+ else warn('skipping "shell": pass --allow-shell (runs commands)');
115
+ }
116
+ return tools$1;
117
+ }
118
+ var KEYED = {
119
+ openai: adapters.openai,
120
+ anthropic: adapters.anthropic,
121
+ gemini: adapters.gemini,
122
+ deepseek: adapters.deepseek,
123
+ grok: adapters.grok,
124
+ groq: adapters.groq,
125
+ mistral: adapters.mistral,
126
+ cohere: adapters.cohere,
127
+ together: adapters.together,
128
+ fireworks: adapters.fireworks,
129
+ openrouter: adapters.openrouter,
130
+ cerebras: adapters.cerebras,
131
+ kimi: adapters.kimi,
132
+ huggingface: adapters.huggingface,
133
+ qwen: adapters.qwen,
134
+ lmstudio: adapters.lmstudio,
135
+ vllm: adapters.vllm,
136
+ llamacpp: adapters.llamacpp
137
+ };
138
+ var LOCAL = { ollama: adapters.ollama };
139
+ var LOCAL_COMPAT = /* @__PURE__ */ new Set(["lmstudio", "vllm", "llamacpp"]);
140
+ var DEFAULT_MODEL = {
141
+ openai: "gpt-4o",
142
+ anthropic: "claude-sonnet-4-6",
143
+ gemini: "gemini-2.0-flash",
144
+ deepseek: "deepseek-chat",
145
+ grok: "grok-2",
146
+ groq: "llama-3.3-70b-versatile",
147
+ mistral: "mistral-large-latest",
148
+ ollama: "llama3"
149
+ };
150
+ function resolveAdapter() {
151
+ const provider = flag("--provider") ?? "openai";
152
+ const model = flag("--model") ?? DEFAULT_MODEL[provider];
153
+ if (!model) {
154
+ warn(`--agents needs a model for "${provider}": pass --model`);
155
+ return null;
156
+ }
157
+ const baseUrl = flag("--base-url");
158
+ if (LOCAL[provider]) return LOCAL[provider]({ model, baseUrl });
159
+ const apiKey = flag("--api-key") ?? process.env[`${provider.toUpperCase().replace(/-/g, "_")}_API_KEY`] ?? (LOCAL_COMPAT.has(provider) ? "local" : void 0);
160
+ if (!apiKey) {
161
+ warn(`--agents needs a key for "${provider}": pass --api-key or set ${provider.toUpperCase()}_API_KEY`);
162
+ return null;
163
+ }
164
+ if (KEYED[provider]) return KEYED[provider]({ apiKey, model });
165
+ try {
166
+ return catalog.dispatchFromCatalog({ provider, model, apiKey, baseUrl });
167
+ } catch {
168
+ warn(`unknown provider "${provider}". Known: ${[...Object.keys(KEYED), ...Object.keys(LOCAL)].join(", ")}, or any catalog OpenAI-compatible provider.`);
169
+ return null;
170
+ }
171
+ }
172
+ async function buildAgentTools() {
173
+ const ids = (flag("--agents") ?? "").split(",").map((s) => s.trim()).filter(Boolean);
174
+ if (ids.length === 0) return [];
175
+ const adapter = resolveAdapter();
176
+ if (!adapter) return [];
177
+ const tools = [];
178
+ for (const id of ids) {
179
+ const skill = await fetchAgentSkill(id);
180
+ if (!skill) {
181
+ warn(`skipping agent "${id}": not found or not runnable (tool-composing agent)`);
182
+ continue;
183
+ }
184
+ tools.push(
185
+ createAgentTool({ id: skill.id, description: skill.description, systemPrompt: skill.systemPrompt, adapter })
186
+ );
187
+ }
188
+ return tools;
189
+ }
190
+ async function main() {
191
+ const tools = [...buildTools(), ...await buildAgentTools()];
192
+ if (tools.length === 0) {
193
+ warn("no tools or agents enabled \u2014 nothing to serve. See --tools / --agents.");
194
+ process.exit(1);
195
+ }
196
+ createAgentsKitMcpServer({
197
+ tools,
198
+ onEvent: (e) => {
199
+ if (e.type === "error") warn(`tool error (${e.tool}): ${e.error}`);
200
+ }
201
+ });
202
+ warn(`serving ${tools.length} item(s) over stdio (${tools.map((t) => t.name).join(", ")})`);
203
+ }
204
+ void main();
205
+ //# sourceMappingURL=bin.cjs.map
206
+ //# sourceMappingURL=bin.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/agent-tool.ts","../src/registry-fetch.ts","../src/index.ts","../src/bin.ts"],"names":["runtime","createRuntime","createStdioTransport","createMcpServer","fetchUrl","webSearch","tools","filesystem","sqliteQueryTool","shell","openai","anthropic","gemini","deepseek","grok","groq","mistral","cohere","together","fireworks","openrouter","cerebras","kimi","huggingface","qwen","lmstudio","vllm","llamacpp","ollama","dispatchFromCatalog"],"mappings":"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","file":"bin.cjs","sourcesContent":["import type { AdapterFactory, SkillDefinition, ToolDefinition } from '@agentskit/core'\nimport { createRuntime } from '@agentskit/runtime'\n\nexport interface AgentToolConfig {\n /** Tool name exposed to the MCP host (the agent id). */\n id: string\n description: string\n /** The agent's system prompt (its skill). */\n systemPrompt: string\n /** Model adapter the agent runs on (server-side). */\n adapter: AdapterFactory\n maxSteps?: number\n}\n\n/**\n * Wrap a whole agent as a single MCP tool. The MCP host calls it with a `task`\n * string; the agent runs server-side (its own skill + reasoning loop on the\n * provided adapter) and returns the result. This is \"agents as MCP tools\" — the\n * host delegates a specialized job rather than orchestrating primitives.\n */\nexport function createAgentTool(config: AgentToolConfig): ToolDefinition {\n const skill: SkillDefinition = {\n name: config.id,\n description: config.description,\n systemPrompt: config.systemPrompt,\n }\n return {\n name: config.id,\n description: config.description,\n schema: {\n type: 'object',\n properties: { task: { type: 'string', description: 'The task or input for the agent.' } },\n required: ['task'],\n },\n execute: async (args: Record<string, unknown>) => {\n const runtime = createRuntime({ adapter: config.adapter, maxSteps: config.maxSteps ?? 8 })\n const result = await runtime.run(String(args.task ?? ''), { skill })\n return { content: result.content, steps: result.steps }\n },\n }\n}\n","const HOSTED = 'https://registry.agentskit.io/r'\nconst RAW = 'https://raw.githubusercontent.com/AgentsKit-io/agentskit-registry/main'\n\nexport interface FetchedAgentSkill {\n id: string\n description: string\n systemPrompt: string\n}\n\n/**\n * Fetch a registry agent's runnable skill (id, description, systemPrompt) so it\n * can be exposed as an MCP tool. Hosted index first, raw-GitHub fallback. Returns\n * null for tool-composing agents (no inline prompt) or unknown ids.\n */\nexport async function fetchAgentSkill(\n id: string,\n fetchImpl: typeof fetch = globalThis.fetch,\n): Promise<FetchedAgentSkill | null> {\n const tryUrl = async (url: string): Promise<unknown | null> => {\n try {\n const res = await fetchImpl(url)\n return res.ok ? await res.json() : null\n } catch {\n return null\n }\n }\n\n const hosted = (await tryUrl(`${HOSTED}/${id}.json`)) as\n | { description?: string; skill?: { systemPrompt?: string } | null }\n | null\n if (hosted?.skill?.systemPrompt) {\n return { id, description: hosted.description ?? id, systemPrompt: hosted.skill.systemPrompt }\n }\n\n // Fallback: extract the inline skill from the raw agent.ts source.\n const meta = (await tryUrl(`${RAW}/registry/${id}/meta.json`)) as { description?: string } | null\n if (!meta) return null\n let src: string | null = null\n try {\n const res = await fetchImpl(`${RAW}/registry/${id}/agent.ts`)\n src = res.ok ? await res.text() : null\n } catch {\n src = null\n }\n if (!src) return null\n const m = src.match(/systemPrompt:\\s*`((?:\\\\.|[^`\\\\])*)`/)\n if (!m) return null\n return {\n id,\n description: meta.description ?? id,\n systemPrompt: m[1].replace(/\\\\`/g, '`').replace(/\\\\\\$\\{/g, '${'),\n }\n}\n","import type { ToolDefinition } from '@agentskit/core'\nimport {\n createMcpServer,\n createStdioTransport,\n type McpServer,\n type McpTransport,\n type StdioLikeProcess,\n} from '@agentskit/tools/mcp'\n\nexport interface AgentsKitMcpServerOptions {\n /** AgentsKit tools to expose to the MCP host. */\n tools: ToolDefinition[]\n serverInfo?: { name: string; version: string }\n /** Observability hook (call / error / list). Logs must NOT go to stdout — it is the MCP channel. */\n onEvent?: (event: { type: 'call' | 'error' | 'list'; tool?: string; error?: string }) => void\n /**\n * Transport override. Defaults to stdio over the current process (the form\n * Claude Desktop / Cursor / Windsurf launch). Inject a custom transport for tests.\n */\n transport?: McpTransport\n}\n\n/**\n * Adapt the current Node process to the `StdioLikeProcess` the transport expects:\n * the server RECEIVES JSON-RPC on stdin and SENDS on stdout.\n */\nexport function processStdio(): StdioLikeProcess {\n return {\n stdin: { write: (chunk: string) => void process.stdout.write(chunk) },\n stdout: {\n on: (_event: 'data', cb: (chunk: Buffer | string) => void) => void process.stdin.on('data', cb),\n off: (_event: 'data', cb: (chunk: Buffer | string) => void) => void process.stdin.off('data', cb),\n },\n on: (event: 'exit' | 'close', cb: () => void) =>\n void process.on(event === 'close' ? 'beforeExit' : 'exit', cb),\n }\n}\n\n/**\n * Expose a set of AgentsKit tools as an MCP server (over stdio by default), so\n * any MCP host — Claude Desktop, Cursor, Windsurf — can call them.\n */\nexport function createAgentsKitMcpServer(options: AgentsKitMcpServerOptions): McpServer {\n const transport = options.transport ?? createStdioTransport(processStdio())\n return createMcpServer({\n transport,\n tools: options.tools,\n serverInfo: options.serverInfo ?? { name: 'agentskit-mcp', version: '0.1.0' },\n onEvent: options.onEvent,\n })\n}\n\nexport { createAgentTool, type AgentToolConfig } from './agent-tool'\nexport { fetchAgentSkill, type FetchedAgentSkill } from './registry-fetch'\nexport type { McpServer, McpTransport } from '@agentskit/tools/mcp'\n","#!/usr/bin/env node\nimport type { AdapterFactory, ToolDefinition } from '@agentskit/core'\nimport { fetchUrl, webSearch, filesystem, shell, sqliteQueryTool } from '@agentskit/tools'\nimport {\n anthropic, gemini, openai, deepseek, grok, groq, mistral, cohere, together,\n fireworks, openrouter, cerebras, kimi, huggingface, qwen,\n ollama, lmstudio, vllm, llamacpp,\n} from '@agentskit/adapters'\nimport { dispatchFromCatalog } from '@agentskit/adapters/catalog'\nimport { createAgentsKitMcpServer } from './index'\nimport { createAgentTool } from './agent-tool'\nimport { fetchAgentSkill } from './registry-fetch'\n\n/**\n * `agentskit-mcp` — start an MCP server exposing AgentsKit tools and/or agents.\n *\n * --tools <a,b> primitive tools (default: fetch,search; also filesystem/shell/sqlite)\n * --fs-root <dir> root for the filesystem tool\n * --sqlite <file> database file for the sqlite tool\n * --allow-shell enable the shell tool\n * --agents <a,b> expose registry agents as tools (each runs server-side)\n * --provider <p> model for --agents: openai | anthropic | gemini | ollama (default openai)\n * --model <m> model name for --agents\n * --api-key <k> key for --agents (else the provider's env var)\n *\n * stdout is the MCP JSON-RPC channel; all human output goes to stderr.\n */\nconst warn = (msg: string) => process.stderr.write(`agentskit-mcp: ${msg}\\n`)\nconst flag = (name: string): string | undefined => {\n const i = process.argv.indexOf(name)\n return i >= 0 ? process.argv[i + 1] : undefined\n}\nconst has = (name: string): boolean => process.argv.includes(name)\n\nfunction buildTools(): ToolDefinition[] {\n if (!has('--tools')) return [fetchUrl(), webSearch()]\n const requested = (flag('--tools') ?? '').split(',').map((s) => s.trim())\n const tools: ToolDefinition[] = []\n if (requested.includes('fetch')) tools.push(fetchUrl())\n if (requested.includes('search')) tools.push(webSearch())\n if (requested.includes('filesystem')) {\n const root = flag('--fs-root')\n if (root) tools.push(...filesystem({ basePath: root }))\n else warn('skipping \"filesystem\": pass --fs-root <dir>')\n }\n if (requested.includes('sqlite')) {\n const file = flag('--sqlite')\n if (file) tools.push(sqliteQueryTool({ path: file }))\n else warn('skipping \"sqlite\": pass --sqlite <file>')\n }\n if (requested.includes('shell')) {\n if (has('--allow-shell')) tools.push(shell())\n else warn('skipping \"shell\": pass --allow-shell (runs commands)')\n }\n return tools\n}\n\ntype KeyedFactory = (cfg: { apiKey: string; model: string; baseUrl?: string }) => AdapterFactory\ntype LocalFactory = (cfg: { model: string; baseUrl?: string }) => AdapterFactory\n\n/** Providers that take { apiKey, model } — first-class + OpenAI-compatible (hosted + local-OpenAI-compat). */\nconst KEYED: Record<string, KeyedFactory> = {\n openai, anthropic, gemini, deepseek, grok, groq, mistral, cohere, together,\n fireworks, openrouter, cerebras, kimi, huggingface, qwen,\n lmstudio, vllm, llamacpp,\n}\n/** Local providers whose adapter needs no key. */\nconst LOCAL: Record<string, LocalFactory> = { ollama }\n/** Local OpenAI-compatible servers — key is a placeholder. */\nconst LOCAL_COMPAT = new Set(['lmstudio', 'vllm', 'llamacpp'])\n\nconst DEFAULT_MODEL: Record<string, string> = {\n openai: 'gpt-4o', anthropic: 'claude-sonnet-4-6', gemini: 'gemini-2.0-flash',\n deepseek: 'deepseek-chat', grok: 'grok-2', groq: 'llama-3.3-70b-versatile',\n mistral: 'mistral-large-latest', ollama: 'llama3',\n}\n\nfunction resolveAdapter(): AdapterFactory | null {\n const provider = flag('--provider') ?? 'openai'\n const model = flag('--model') ?? DEFAULT_MODEL[provider]\n if (!model) {\n warn(`--agents needs a model for \"${provider}\": pass --model`)\n return null\n }\n const baseUrl = flag('--base-url')\n\n if (LOCAL[provider]) return LOCAL[provider]({ model, baseUrl })\n\n const apiKey =\n flag('--api-key') ??\n process.env[`${provider.toUpperCase().replace(/-/g, '_')}_API_KEY`] ??\n (LOCAL_COMPAT.has(provider) ? 'local' : undefined)\n if (!apiKey) {\n warn(`--agents needs a key for \"${provider}\": pass --api-key or set ${provider.toUpperCase()}_API_KEY`)\n return null\n }\n if (KEYED[provider]) return KEYED[provider]({ apiKey, model })\n\n // Long tail: any other OpenAI-compatible provider in the models.dev catalog.\n try {\n return dispatchFromCatalog({ provider, model, apiKey, baseUrl })\n } catch {\n warn(`unknown provider \"${provider}\". Known: ${[...Object.keys(KEYED), ...Object.keys(LOCAL)].join(', ')}, or any catalog OpenAI-compatible provider.`)\n return null\n }\n}\n\nasync function buildAgentTools(): Promise<ToolDefinition[]> {\n const ids = (flag('--agents') ?? '').split(',').map((s) => s.trim()).filter(Boolean)\n if (ids.length === 0) return []\n const adapter = resolveAdapter()\n if (!adapter) return []\n const tools: ToolDefinition[] = []\n for (const id of ids) {\n const skill = await fetchAgentSkill(id)\n if (!skill) {\n warn(`skipping agent \"${id}\": not found or not runnable (tool-composing agent)`)\n continue\n }\n tools.push(\n createAgentTool({ id: skill.id, description: skill.description, systemPrompt: skill.systemPrompt, adapter }),\n )\n }\n return tools\n}\n\nasync function main(): Promise<void> {\n const tools = [...buildTools(), ...(await buildAgentTools())]\n if (tools.length === 0) {\n warn('no tools or agents enabled — nothing to serve. See --tools / --agents.')\n process.exit(1)\n }\n createAgentsKitMcpServer({\n tools,\n onEvent: (e) => {\n if (e.type === 'error') warn(`tool error (${e.tool}): ${e.error}`)\n },\n })\n warn(`serving ${tools.length} item(s) over stdio (${tools.map((t) => t.name).join(', ')})`)\n}\n\nvoid main()\n"]}
package/dist/bin.d.cts ADDED
@@ -0,0 +1 @@
1
+ #!/usr/bin/env node
package/dist/bin.d.ts ADDED
@@ -0,0 +1 @@
1
+ #!/usr/bin/env node
package/dist/bin.js ADDED
@@ -0,0 +1,124 @@
1
+ #!/usr/bin/env node
2
+ import { createAgentsKitMcpServer, fetchAgentSkill, createAgentTool } from './chunk-F5SVUT7Z.js';
3
+ import { fetchUrl, webSearch, filesystem, sqliteQueryTool, shell } from '@agentskit/tools';
4
+ import { ollama, llamacpp, vllm, lmstudio, qwen, huggingface, kimi, cerebras, openrouter, fireworks, together, cohere, mistral, groq, grok, deepseek, gemini, anthropic, openai } from '@agentskit/adapters';
5
+ import { dispatchFromCatalog } from '@agentskit/adapters/catalog';
6
+
7
+ var warn = (msg) => process.stderr.write(`agentskit-mcp: ${msg}
8
+ `);
9
+ var flag = (name) => {
10
+ const i = process.argv.indexOf(name);
11
+ return i >= 0 ? process.argv[i + 1] : void 0;
12
+ };
13
+ var has = (name) => process.argv.includes(name);
14
+ function buildTools() {
15
+ if (!has("--tools")) return [fetchUrl(), webSearch()];
16
+ const requested = (flag("--tools") ?? "").split(",").map((s) => s.trim());
17
+ const tools = [];
18
+ if (requested.includes("fetch")) tools.push(fetchUrl());
19
+ if (requested.includes("search")) tools.push(webSearch());
20
+ if (requested.includes("filesystem")) {
21
+ const root = flag("--fs-root");
22
+ if (root) tools.push(...filesystem({ basePath: root }));
23
+ else warn('skipping "filesystem": pass --fs-root <dir>');
24
+ }
25
+ if (requested.includes("sqlite")) {
26
+ const file = flag("--sqlite");
27
+ if (file) tools.push(sqliteQueryTool({ path: file }));
28
+ else warn('skipping "sqlite": pass --sqlite <file>');
29
+ }
30
+ if (requested.includes("shell")) {
31
+ if (has("--allow-shell")) tools.push(shell());
32
+ else warn('skipping "shell": pass --allow-shell (runs commands)');
33
+ }
34
+ return tools;
35
+ }
36
+ var KEYED = {
37
+ openai,
38
+ anthropic,
39
+ gemini,
40
+ deepseek,
41
+ grok,
42
+ groq,
43
+ mistral,
44
+ cohere,
45
+ together,
46
+ fireworks,
47
+ openrouter,
48
+ cerebras,
49
+ kimi,
50
+ huggingface,
51
+ qwen,
52
+ lmstudio,
53
+ vllm,
54
+ llamacpp
55
+ };
56
+ var LOCAL = { ollama };
57
+ var LOCAL_COMPAT = /* @__PURE__ */ new Set(["lmstudio", "vllm", "llamacpp"]);
58
+ var DEFAULT_MODEL = {
59
+ openai: "gpt-4o",
60
+ anthropic: "claude-sonnet-4-6",
61
+ gemini: "gemini-2.0-flash",
62
+ deepseek: "deepseek-chat",
63
+ grok: "grok-2",
64
+ groq: "llama-3.3-70b-versatile",
65
+ mistral: "mistral-large-latest",
66
+ ollama: "llama3"
67
+ };
68
+ function resolveAdapter() {
69
+ const provider = flag("--provider") ?? "openai";
70
+ const model = flag("--model") ?? DEFAULT_MODEL[provider];
71
+ if (!model) {
72
+ warn(`--agents needs a model for "${provider}": pass --model`);
73
+ return null;
74
+ }
75
+ const baseUrl = flag("--base-url");
76
+ if (LOCAL[provider]) return LOCAL[provider]({ model, baseUrl });
77
+ const apiKey = flag("--api-key") ?? process.env[`${provider.toUpperCase().replace(/-/g, "_")}_API_KEY`] ?? (LOCAL_COMPAT.has(provider) ? "local" : void 0);
78
+ if (!apiKey) {
79
+ warn(`--agents needs a key for "${provider}": pass --api-key or set ${provider.toUpperCase()}_API_KEY`);
80
+ return null;
81
+ }
82
+ if (KEYED[provider]) return KEYED[provider]({ apiKey, model });
83
+ try {
84
+ return dispatchFromCatalog({ provider, model, apiKey, baseUrl });
85
+ } catch {
86
+ warn(`unknown provider "${provider}". Known: ${[...Object.keys(KEYED), ...Object.keys(LOCAL)].join(", ")}, or any catalog OpenAI-compatible provider.`);
87
+ return null;
88
+ }
89
+ }
90
+ async function buildAgentTools() {
91
+ const ids = (flag("--agents") ?? "").split(",").map((s) => s.trim()).filter(Boolean);
92
+ if (ids.length === 0) return [];
93
+ const adapter = resolveAdapter();
94
+ if (!adapter) return [];
95
+ const tools = [];
96
+ for (const id of ids) {
97
+ const skill = await fetchAgentSkill(id);
98
+ if (!skill) {
99
+ warn(`skipping agent "${id}": not found or not runnable (tool-composing agent)`);
100
+ continue;
101
+ }
102
+ tools.push(
103
+ createAgentTool({ id: skill.id, description: skill.description, systemPrompt: skill.systemPrompt, adapter })
104
+ );
105
+ }
106
+ return tools;
107
+ }
108
+ async function main() {
109
+ const tools = [...buildTools(), ...await buildAgentTools()];
110
+ if (tools.length === 0) {
111
+ warn("no tools or agents enabled \u2014 nothing to serve. See --tools / --agents.");
112
+ process.exit(1);
113
+ }
114
+ createAgentsKitMcpServer({
115
+ tools,
116
+ onEvent: (e) => {
117
+ if (e.type === "error") warn(`tool error (${e.tool}): ${e.error}`);
118
+ }
119
+ });
120
+ warn(`serving ${tools.length} item(s) over stdio (${tools.map((t) => t.name).join(", ")})`);
121
+ }
122
+ void main();
123
+ //# sourceMappingURL=bin.js.map
124
+ //# sourceMappingURL=bin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/bin.ts"],"names":[],"mappings":"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","file":"bin.js","sourcesContent":["#!/usr/bin/env node\nimport type { AdapterFactory, ToolDefinition } from '@agentskit/core'\nimport { fetchUrl, webSearch, filesystem, shell, sqliteQueryTool } from '@agentskit/tools'\nimport {\n anthropic, gemini, openai, deepseek, grok, groq, mistral, cohere, together,\n fireworks, openrouter, cerebras, kimi, huggingface, qwen,\n ollama, lmstudio, vllm, llamacpp,\n} from '@agentskit/adapters'\nimport { dispatchFromCatalog } from '@agentskit/adapters/catalog'\nimport { createAgentsKitMcpServer } from './index'\nimport { createAgentTool } from './agent-tool'\nimport { fetchAgentSkill } from './registry-fetch'\n\n/**\n * `agentskit-mcp` — start an MCP server exposing AgentsKit tools and/or agents.\n *\n * --tools <a,b> primitive tools (default: fetch,search; also filesystem/shell/sqlite)\n * --fs-root <dir> root for the filesystem tool\n * --sqlite <file> database file for the sqlite tool\n * --allow-shell enable the shell tool\n * --agents <a,b> expose registry agents as tools (each runs server-side)\n * --provider <p> model for --agents: openai | anthropic | gemini | ollama (default openai)\n * --model <m> model name for --agents\n * --api-key <k> key for --agents (else the provider's env var)\n *\n * stdout is the MCP JSON-RPC channel; all human output goes to stderr.\n */\nconst warn = (msg: string) => process.stderr.write(`agentskit-mcp: ${msg}\\n`)\nconst flag = (name: string): string | undefined => {\n const i = process.argv.indexOf(name)\n return i >= 0 ? process.argv[i + 1] : undefined\n}\nconst has = (name: string): boolean => process.argv.includes(name)\n\nfunction buildTools(): ToolDefinition[] {\n if (!has('--tools')) return [fetchUrl(), webSearch()]\n const requested = (flag('--tools') ?? '').split(',').map((s) => s.trim())\n const tools: ToolDefinition[] = []\n if (requested.includes('fetch')) tools.push(fetchUrl())\n if (requested.includes('search')) tools.push(webSearch())\n if (requested.includes('filesystem')) {\n const root = flag('--fs-root')\n if (root) tools.push(...filesystem({ basePath: root }))\n else warn('skipping \"filesystem\": pass --fs-root <dir>')\n }\n if (requested.includes('sqlite')) {\n const file = flag('--sqlite')\n if (file) tools.push(sqliteQueryTool({ path: file }))\n else warn('skipping \"sqlite\": pass --sqlite <file>')\n }\n if (requested.includes('shell')) {\n if (has('--allow-shell')) tools.push(shell())\n else warn('skipping \"shell\": pass --allow-shell (runs commands)')\n }\n return tools\n}\n\ntype KeyedFactory = (cfg: { apiKey: string; model: string; baseUrl?: string }) => AdapterFactory\ntype LocalFactory = (cfg: { model: string; baseUrl?: string }) => AdapterFactory\n\n/** Providers that take { apiKey, model } — first-class + OpenAI-compatible (hosted + local-OpenAI-compat). */\nconst KEYED: Record<string, KeyedFactory> = {\n openai, anthropic, gemini, deepseek, grok, groq, mistral, cohere, together,\n fireworks, openrouter, cerebras, kimi, huggingface, qwen,\n lmstudio, vllm, llamacpp,\n}\n/** Local providers whose adapter needs no key. */\nconst LOCAL: Record<string, LocalFactory> = { ollama }\n/** Local OpenAI-compatible servers — key is a placeholder. */\nconst LOCAL_COMPAT = new Set(['lmstudio', 'vllm', 'llamacpp'])\n\nconst DEFAULT_MODEL: Record<string, string> = {\n openai: 'gpt-4o', anthropic: 'claude-sonnet-4-6', gemini: 'gemini-2.0-flash',\n deepseek: 'deepseek-chat', grok: 'grok-2', groq: 'llama-3.3-70b-versatile',\n mistral: 'mistral-large-latest', ollama: 'llama3',\n}\n\nfunction resolveAdapter(): AdapterFactory | null {\n const provider = flag('--provider') ?? 'openai'\n const model = flag('--model') ?? DEFAULT_MODEL[provider]\n if (!model) {\n warn(`--agents needs a model for \"${provider}\": pass --model`)\n return null\n }\n const baseUrl = flag('--base-url')\n\n if (LOCAL[provider]) return LOCAL[provider]({ model, baseUrl })\n\n const apiKey =\n flag('--api-key') ??\n process.env[`${provider.toUpperCase().replace(/-/g, '_')}_API_KEY`] ??\n (LOCAL_COMPAT.has(provider) ? 'local' : undefined)\n if (!apiKey) {\n warn(`--agents needs a key for \"${provider}\": pass --api-key or set ${provider.toUpperCase()}_API_KEY`)\n return null\n }\n if (KEYED[provider]) return KEYED[provider]({ apiKey, model })\n\n // Long tail: any other OpenAI-compatible provider in the models.dev catalog.\n try {\n return dispatchFromCatalog({ provider, model, apiKey, baseUrl })\n } catch {\n warn(`unknown provider \"${provider}\". Known: ${[...Object.keys(KEYED), ...Object.keys(LOCAL)].join(', ')}, or any catalog OpenAI-compatible provider.`)\n return null\n }\n}\n\nasync function buildAgentTools(): Promise<ToolDefinition[]> {\n const ids = (flag('--agents') ?? '').split(',').map((s) => s.trim()).filter(Boolean)\n if (ids.length === 0) return []\n const adapter = resolveAdapter()\n if (!adapter) return []\n const tools: ToolDefinition[] = []\n for (const id of ids) {\n const skill = await fetchAgentSkill(id)\n if (!skill) {\n warn(`skipping agent \"${id}\": not found or not runnable (tool-composing agent)`)\n continue\n }\n tools.push(\n createAgentTool({ id: skill.id, description: skill.description, systemPrompt: skill.systemPrompt, adapter }),\n )\n }\n return tools\n}\n\nasync function main(): Promise<void> {\n const tools = [...buildTools(), ...(await buildAgentTools())]\n if (tools.length === 0) {\n warn('no tools or agents enabled — nothing to serve. See --tools / --agents.')\n process.exit(1)\n }\n createAgentsKitMcpServer({\n tools,\n onEvent: (e) => {\n if (e.type === 'error') warn(`tool error (${e.tool}): ${e.error}`)\n },\n })\n warn(`serving ${tools.length} item(s) over stdio (${tools.map((t) => t.name).join(', ')})`)\n}\n\nvoid main()\n"]}
@@ -0,0 +1,85 @@
1
+ import { createStdioTransport, createMcpServer } from '@agentskit/tools/mcp';
2
+ import { createRuntime } from '@agentskit/runtime';
3
+
4
+ // src/index.ts
5
+ function createAgentTool(config) {
6
+ const skill = {
7
+ name: config.id,
8
+ description: config.description,
9
+ systemPrompt: config.systemPrompt
10
+ };
11
+ return {
12
+ name: config.id,
13
+ description: config.description,
14
+ schema: {
15
+ type: "object",
16
+ properties: { task: { type: "string", description: "The task or input for the agent." } },
17
+ required: ["task"]
18
+ },
19
+ execute: async (args) => {
20
+ const runtime = createRuntime({ adapter: config.adapter, maxSteps: config.maxSteps ?? 8 });
21
+ const result = await runtime.run(String(args.task ?? ""), { skill });
22
+ return { content: result.content, steps: result.steps };
23
+ }
24
+ };
25
+ }
26
+
27
+ // src/registry-fetch.ts
28
+ var HOSTED = "https://registry.agentskit.io/r";
29
+ var RAW = "https://raw.githubusercontent.com/AgentsKit-io/agentskit-registry/main";
30
+ async function fetchAgentSkill(id, fetchImpl = globalThis.fetch) {
31
+ const tryUrl = async (url) => {
32
+ try {
33
+ const res = await fetchImpl(url);
34
+ return res.ok ? await res.json() : null;
35
+ } catch {
36
+ return null;
37
+ }
38
+ };
39
+ const hosted = await tryUrl(`${HOSTED}/${id}.json`);
40
+ if (hosted?.skill?.systemPrompt) {
41
+ return { id, description: hosted.description ?? id, systemPrompt: hosted.skill.systemPrompt };
42
+ }
43
+ const meta = await tryUrl(`${RAW}/registry/${id}/meta.json`);
44
+ if (!meta) return null;
45
+ let src = null;
46
+ try {
47
+ const res = await fetchImpl(`${RAW}/registry/${id}/agent.ts`);
48
+ src = res.ok ? await res.text() : null;
49
+ } catch {
50
+ src = null;
51
+ }
52
+ if (!src) return null;
53
+ const m = src.match(/systemPrompt:\s*`((?:\\.|[^`\\])*)`/);
54
+ if (!m) return null;
55
+ return {
56
+ id,
57
+ description: meta.description ?? id,
58
+ systemPrompt: m[1].replace(/\\`/g, "`").replace(/\\\$\{/g, "${")
59
+ };
60
+ }
61
+
62
+ // src/index.ts
63
+ function processStdio() {
64
+ return {
65
+ stdin: { write: (chunk) => void process.stdout.write(chunk) },
66
+ stdout: {
67
+ on: (_event, cb) => void process.stdin.on("data", cb),
68
+ off: (_event, cb) => void process.stdin.off("data", cb)
69
+ },
70
+ on: (event, cb) => void process.on(event === "close" ? "beforeExit" : "exit", cb)
71
+ };
72
+ }
73
+ function createAgentsKitMcpServer(options) {
74
+ const transport = options.transport ?? createStdioTransport(processStdio());
75
+ return createMcpServer({
76
+ transport,
77
+ tools: options.tools,
78
+ serverInfo: options.serverInfo ?? { name: "agentskit-mcp", version: "0.1.0" },
79
+ onEvent: options.onEvent
80
+ });
81
+ }
82
+
83
+ export { createAgentTool, createAgentsKitMcpServer, fetchAgentSkill, processStdio };
84
+ //# sourceMappingURL=chunk-F5SVUT7Z.js.map
85
+ //# sourceMappingURL=chunk-F5SVUT7Z.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/agent-tool.ts","../src/registry-fetch.ts","../src/index.ts"],"names":[],"mappings":"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","file":"chunk-F5SVUT7Z.js","sourcesContent":["import type { AdapterFactory, SkillDefinition, ToolDefinition } from '@agentskit/core'\nimport { createRuntime } from '@agentskit/runtime'\n\nexport interface AgentToolConfig {\n /** Tool name exposed to the MCP host (the agent id). */\n id: string\n description: string\n /** The agent's system prompt (its skill). */\n systemPrompt: string\n /** Model adapter the agent runs on (server-side). */\n adapter: AdapterFactory\n maxSteps?: number\n}\n\n/**\n * Wrap a whole agent as a single MCP tool. The MCP host calls it with a `task`\n * string; the agent runs server-side (its own skill + reasoning loop on the\n * provided adapter) and returns the result. This is \"agents as MCP tools\" — the\n * host delegates a specialized job rather than orchestrating primitives.\n */\nexport function createAgentTool(config: AgentToolConfig): ToolDefinition {\n const skill: SkillDefinition = {\n name: config.id,\n description: config.description,\n systemPrompt: config.systemPrompt,\n }\n return {\n name: config.id,\n description: config.description,\n schema: {\n type: 'object',\n properties: { task: { type: 'string', description: 'The task or input for the agent.' } },\n required: ['task'],\n },\n execute: async (args: Record<string, unknown>) => {\n const runtime = createRuntime({ adapter: config.adapter, maxSteps: config.maxSteps ?? 8 })\n const result = await runtime.run(String(args.task ?? ''), { skill })\n return { content: result.content, steps: result.steps }\n },\n }\n}\n","const HOSTED = 'https://registry.agentskit.io/r'\nconst RAW = 'https://raw.githubusercontent.com/AgentsKit-io/agentskit-registry/main'\n\nexport interface FetchedAgentSkill {\n id: string\n description: string\n systemPrompt: string\n}\n\n/**\n * Fetch a registry agent's runnable skill (id, description, systemPrompt) so it\n * can be exposed as an MCP tool. Hosted index first, raw-GitHub fallback. Returns\n * null for tool-composing agents (no inline prompt) or unknown ids.\n */\nexport async function fetchAgentSkill(\n id: string,\n fetchImpl: typeof fetch = globalThis.fetch,\n): Promise<FetchedAgentSkill | null> {\n const tryUrl = async (url: string): Promise<unknown | null> => {\n try {\n const res = await fetchImpl(url)\n return res.ok ? await res.json() : null\n } catch {\n return null\n }\n }\n\n const hosted = (await tryUrl(`${HOSTED}/${id}.json`)) as\n | { description?: string; skill?: { systemPrompt?: string } | null }\n | null\n if (hosted?.skill?.systemPrompt) {\n return { id, description: hosted.description ?? id, systemPrompt: hosted.skill.systemPrompt }\n }\n\n // Fallback: extract the inline skill from the raw agent.ts source.\n const meta = (await tryUrl(`${RAW}/registry/${id}/meta.json`)) as { description?: string } | null\n if (!meta) return null\n let src: string | null = null\n try {\n const res = await fetchImpl(`${RAW}/registry/${id}/agent.ts`)\n src = res.ok ? await res.text() : null\n } catch {\n src = null\n }\n if (!src) return null\n const m = src.match(/systemPrompt:\\s*`((?:\\\\.|[^`\\\\])*)`/)\n if (!m) return null\n return {\n id,\n description: meta.description ?? id,\n systemPrompt: m[1].replace(/\\\\`/g, '`').replace(/\\\\\\$\\{/g, '${'),\n }\n}\n","import type { ToolDefinition } from '@agentskit/core'\nimport {\n createMcpServer,\n createStdioTransport,\n type McpServer,\n type McpTransport,\n type StdioLikeProcess,\n} from '@agentskit/tools/mcp'\n\nexport interface AgentsKitMcpServerOptions {\n /** AgentsKit tools to expose to the MCP host. */\n tools: ToolDefinition[]\n serverInfo?: { name: string; version: string }\n /** Observability hook (call / error / list). Logs must NOT go to stdout — it is the MCP channel. */\n onEvent?: (event: { type: 'call' | 'error' | 'list'; tool?: string; error?: string }) => void\n /**\n * Transport override. Defaults to stdio over the current process (the form\n * Claude Desktop / Cursor / Windsurf launch). Inject a custom transport for tests.\n */\n transport?: McpTransport\n}\n\n/**\n * Adapt the current Node process to the `StdioLikeProcess` the transport expects:\n * the server RECEIVES JSON-RPC on stdin and SENDS on stdout.\n */\nexport function processStdio(): StdioLikeProcess {\n return {\n stdin: { write: (chunk: string) => void process.stdout.write(chunk) },\n stdout: {\n on: (_event: 'data', cb: (chunk: Buffer | string) => void) => void process.stdin.on('data', cb),\n off: (_event: 'data', cb: (chunk: Buffer | string) => void) => void process.stdin.off('data', cb),\n },\n on: (event: 'exit' | 'close', cb: () => void) =>\n void process.on(event === 'close' ? 'beforeExit' : 'exit', cb),\n }\n}\n\n/**\n * Expose a set of AgentsKit tools as an MCP server (over stdio by default), so\n * any MCP host — Claude Desktop, Cursor, Windsurf — can call them.\n */\nexport function createAgentsKitMcpServer(options: AgentsKitMcpServerOptions): McpServer {\n const transport = options.transport ?? createStdioTransport(processStdio())\n return createMcpServer({\n transport,\n tools: options.tools,\n serverInfo: options.serverInfo ?? { name: 'agentskit-mcp', version: '0.1.0' },\n onEvent: options.onEvent,\n })\n}\n\nexport { createAgentTool, type AgentToolConfig } from './agent-tool'\nexport { fetchAgentSkill, type FetchedAgentSkill } from './registry-fetch'\nexport type { McpServer, McpTransport } from '@agentskit/tools/mcp'\n"]}
package/dist/index.cjs ADDED
@@ -0,0 +1,90 @@
1
+ 'use strict';
2
+
3
+ var mcp = require('@agentskit/tools/mcp');
4
+ var runtime = require('@agentskit/runtime');
5
+
6
+ // src/index.ts
7
+ function createAgentTool(config) {
8
+ const skill = {
9
+ name: config.id,
10
+ description: config.description,
11
+ systemPrompt: config.systemPrompt
12
+ };
13
+ return {
14
+ name: config.id,
15
+ description: config.description,
16
+ schema: {
17
+ type: "object",
18
+ properties: { task: { type: "string", description: "The task or input for the agent." } },
19
+ required: ["task"]
20
+ },
21
+ execute: async (args) => {
22
+ const runtime$1 = runtime.createRuntime({ adapter: config.adapter, maxSteps: config.maxSteps ?? 8 });
23
+ const result = await runtime$1.run(String(args.task ?? ""), { skill });
24
+ return { content: result.content, steps: result.steps };
25
+ }
26
+ };
27
+ }
28
+
29
+ // src/registry-fetch.ts
30
+ var HOSTED = "https://registry.agentskit.io/r";
31
+ var RAW = "https://raw.githubusercontent.com/AgentsKit-io/agentskit-registry/main";
32
+ async function fetchAgentSkill(id, fetchImpl = globalThis.fetch) {
33
+ const tryUrl = async (url) => {
34
+ try {
35
+ const res = await fetchImpl(url);
36
+ return res.ok ? await res.json() : null;
37
+ } catch {
38
+ return null;
39
+ }
40
+ };
41
+ const hosted = await tryUrl(`${HOSTED}/${id}.json`);
42
+ if (hosted?.skill?.systemPrompt) {
43
+ return { id, description: hosted.description ?? id, systemPrompt: hosted.skill.systemPrompt };
44
+ }
45
+ const meta = await tryUrl(`${RAW}/registry/${id}/meta.json`);
46
+ if (!meta) return null;
47
+ let src = null;
48
+ try {
49
+ const res = await fetchImpl(`${RAW}/registry/${id}/agent.ts`);
50
+ src = res.ok ? await res.text() : null;
51
+ } catch {
52
+ src = null;
53
+ }
54
+ if (!src) return null;
55
+ const m = src.match(/systemPrompt:\s*`((?:\\.|[^`\\])*)`/);
56
+ if (!m) return null;
57
+ return {
58
+ id,
59
+ description: meta.description ?? id,
60
+ systemPrompt: m[1].replace(/\\`/g, "`").replace(/\\\$\{/g, "${")
61
+ };
62
+ }
63
+
64
+ // src/index.ts
65
+ function processStdio() {
66
+ return {
67
+ stdin: { write: (chunk) => void process.stdout.write(chunk) },
68
+ stdout: {
69
+ on: (_event, cb) => void process.stdin.on("data", cb),
70
+ off: (_event, cb) => void process.stdin.off("data", cb)
71
+ },
72
+ on: (event, cb) => void process.on(event === "close" ? "beforeExit" : "exit", cb)
73
+ };
74
+ }
75
+ function createAgentsKitMcpServer(options) {
76
+ const transport = options.transport ?? mcp.createStdioTransport(processStdio());
77
+ return mcp.createMcpServer({
78
+ transport,
79
+ tools: options.tools,
80
+ serverInfo: options.serverInfo ?? { name: "agentskit-mcp", version: "0.1.0" },
81
+ onEvent: options.onEvent
82
+ });
83
+ }
84
+
85
+ exports.createAgentTool = createAgentTool;
86
+ exports.createAgentsKitMcpServer = createAgentsKitMcpServer;
87
+ exports.fetchAgentSkill = fetchAgentSkill;
88
+ exports.processStdio = processStdio;
89
+ //# sourceMappingURL=index.cjs.map
90
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/agent-tool.ts","../src/registry-fetch.ts","../src/index.ts"],"names":["runtime","createRuntime","createStdioTransport","createMcpServer"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { AdapterFactory, SkillDefinition, ToolDefinition } from '@agentskit/core'\nimport { createRuntime } from '@agentskit/runtime'\n\nexport interface AgentToolConfig {\n /** Tool name exposed to the MCP host (the agent id). */\n id: string\n description: string\n /** The agent's system prompt (its skill). */\n systemPrompt: string\n /** Model adapter the agent runs on (server-side). */\n adapter: AdapterFactory\n maxSteps?: number\n}\n\n/**\n * Wrap a whole agent as a single MCP tool. The MCP host calls it with a `task`\n * string; the agent runs server-side (its own skill + reasoning loop on the\n * provided adapter) and returns the result. This is \"agents as MCP tools\" — the\n * host delegates a specialized job rather than orchestrating primitives.\n */\nexport function createAgentTool(config: AgentToolConfig): ToolDefinition {\n const skill: SkillDefinition = {\n name: config.id,\n description: config.description,\n systemPrompt: config.systemPrompt,\n }\n return {\n name: config.id,\n description: config.description,\n schema: {\n type: 'object',\n properties: { task: { type: 'string', description: 'The task or input for the agent.' } },\n required: ['task'],\n },\n execute: async (args: Record<string, unknown>) => {\n const runtime = createRuntime({ adapter: config.adapter, maxSteps: config.maxSteps ?? 8 })\n const result = await runtime.run(String(args.task ?? ''), { skill })\n return { content: result.content, steps: result.steps }\n },\n }\n}\n","const HOSTED = 'https://registry.agentskit.io/r'\nconst RAW = 'https://raw.githubusercontent.com/AgentsKit-io/agentskit-registry/main'\n\nexport interface FetchedAgentSkill {\n id: string\n description: string\n systemPrompt: string\n}\n\n/**\n * Fetch a registry agent's runnable skill (id, description, systemPrompt) so it\n * can be exposed as an MCP tool. Hosted index first, raw-GitHub fallback. Returns\n * null for tool-composing agents (no inline prompt) or unknown ids.\n */\nexport async function fetchAgentSkill(\n id: string,\n fetchImpl: typeof fetch = globalThis.fetch,\n): Promise<FetchedAgentSkill | null> {\n const tryUrl = async (url: string): Promise<unknown | null> => {\n try {\n const res = await fetchImpl(url)\n return res.ok ? await res.json() : null\n } catch {\n return null\n }\n }\n\n const hosted = (await tryUrl(`${HOSTED}/${id}.json`)) as\n | { description?: string; skill?: { systemPrompt?: string } | null }\n | null\n if (hosted?.skill?.systemPrompt) {\n return { id, description: hosted.description ?? id, systemPrompt: hosted.skill.systemPrompt }\n }\n\n // Fallback: extract the inline skill from the raw agent.ts source.\n const meta = (await tryUrl(`${RAW}/registry/${id}/meta.json`)) as { description?: string } | null\n if (!meta) return null\n let src: string | null = null\n try {\n const res = await fetchImpl(`${RAW}/registry/${id}/agent.ts`)\n src = res.ok ? await res.text() : null\n } catch {\n src = null\n }\n if (!src) return null\n const m = src.match(/systemPrompt:\\s*`((?:\\\\.|[^`\\\\])*)`/)\n if (!m) return null\n return {\n id,\n description: meta.description ?? id,\n systemPrompt: m[1].replace(/\\\\`/g, '`').replace(/\\\\\\$\\{/g, '${'),\n }\n}\n","import type { ToolDefinition } from '@agentskit/core'\nimport {\n createMcpServer,\n createStdioTransport,\n type McpServer,\n type McpTransport,\n type StdioLikeProcess,\n} from '@agentskit/tools/mcp'\n\nexport interface AgentsKitMcpServerOptions {\n /** AgentsKit tools to expose to the MCP host. */\n tools: ToolDefinition[]\n serverInfo?: { name: string; version: string }\n /** Observability hook (call / error / list). Logs must NOT go to stdout — it is the MCP channel. */\n onEvent?: (event: { type: 'call' | 'error' | 'list'; tool?: string; error?: string }) => void\n /**\n * Transport override. Defaults to stdio over the current process (the form\n * Claude Desktop / Cursor / Windsurf launch). Inject a custom transport for tests.\n */\n transport?: McpTransport\n}\n\n/**\n * Adapt the current Node process to the `StdioLikeProcess` the transport expects:\n * the server RECEIVES JSON-RPC on stdin and SENDS on stdout.\n */\nexport function processStdio(): StdioLikeProcess {\n return {\n stdin: { write: (chunk: string) => void process.stdout.write(chunk) },\n stdout: {\n on: (_event: 'data', cb: (chunk: Buffer | string) => void) => void process.stdin.on('data', cb),\n off: (_event: 'data', cb: (chunk: Buffer | string) => void) => void process.stdin.off('data', cb),\n },\n on: (event: 'exit' | 'close', cb: () => void) =>\n void process.on(event === 'close' ? 'beforeExit' : 'exit', cb),\n }\n}\n\n/**\n * Expose a set of AgentsKit tools as an MCP server (over stdio by default), so\n * any MCP host — Claude Desktop, Cursor, Windsurf — can call them.\n */\nexport function createAgentsKitMcpServer(options: AgentsKitMcpServerOptions): McpServer {\n const transport = options.transport ?? createStdioTransport(processStdio())\n return createMcpServer({\n transport,\n tools: options.tools,\n serverInfo: options.serverInfo ?? { name: 'agentskit-mcp', version: '0.1.0' },\n onEvent: options.onEvent,\n })\n}\n\nexport { createAgentTool, type AgentToolConfig } from './agent-tool'\nexport { fetchAgentSkill, type FetchedAgentSkill } from './registry-fetch'\nexport type { McpServer, McpTransport } from '@agentskit/tools/mcp'\n"]}
@@ -0,0 +1,65 @@
1
+ import { AdapterFactory, ToolDefinition } from '@agentskit/core';
2
+ import { McpTransport, McpServer, StdioLikeProcess } from '@agentskit/tools/mcp';
3
+ export { McpServer, McpTransport } from '@agentskit/tools/mcp';
4
+
5
+ interface AgentToolConfig {
6
+ /** Tool name exposed to the MCP host (the agent id). */
7
+ id: string;
8
+ description: string;
9
+ /** The agent's system prompt (its skill). */
10
+ systemPrompt: string;
11
+ /** Model adapter the agent runs on (server-side). */
12
+ adapter: AdapterFactory;
13
+ maxSteps?: number;
14
+ }
15
+ /**
16
+ * Wrap a whole agent as a single MCP tool. The MCP host calls it with a `task`
17
+ * string; the agent runs server-side (its own skill + reasoning loop on the
18
+ * provided adapter) and returns the result. This is "agents as MCP tools" — the
19
+ * host delegates a specialized job rather than orchestrating primitives.
20
+ */
21
+ declare function createAgentTool(config: AgentToolConfig): ToolDefinition;
22
+
23
+ interface FetchedAgentSkill {
24
+ id: string;
25
+ description: string;
26
+ systemPrompt: string;
27
+ }
28
+ /**
29
+ * Fetch a registry agent's runnable skill (id, description, systemPrompt) so it
30
+ * can be exposed as an MCP tool. Hosted index first, raw-GitHub fallback. Returns
31
+ * null for tool-composing agents (no inline prompt) or unknown ids.
32
+ */
33
+ declare function fetchAgentSkill(id: string, fetchImpl?: typeof fetch): Promise<FetchedAgentSkill | null>;
34
+
35
+ interface AgentsKitMcpServerOptions {
36
+ /** AgentsKit tools to expose to the MCP host. */
37
+ tools: ToolDefinition[];
38
+ serverInfo?: {
39
+ name: string;
40
+ version: string;
41
+ };
42
+ /** Observability hook (call / error / list). Logs must NOT go to stdout — it is the MCP channel. */
43
+ onEvent?: (event: {
44
+ type: 'call' | 'error' | 'list';
45
+ tool?: string;
46
+ error?: string;
47
+ }) => void;
48
+ /**
49
+ * Transport override. Defaults to stdio over the current process (the form
50
+ * Claude Desktop / Cursor / Windsurf launch). Inject a custom transport for tests.
51
+ */
52
+ transport?: McpTransport;
53
+ }
54
+ /**
55
+ * Adapt the current Node process to the `StdioLikeProcess` the transport expects:
56
+ * the server RECEIVES JSON-RPC on stdin and SENDS on stdout.
57
+ */
58
+ declare function processStdio(): StdioLikeProcess;
59
+ /**
60
+ * Expose a set of AgentsKit tools as an MCP server (over stdio by default), so
61
+ * any MCP host — Claude Desktop, Cursor, Windsurf — can call them.
62
+ */
63
+ declare function createAgentsKitMcpServer(options: AgentsKitMcpServerOptions): McpServer;
64
+
65
+ export { type AgentToolConfig, type AgentsKitMcpServerOptions, type FetchedAgentSkill, createAgentTool, createAgentsKitMcpServer, fetchAgentSkill, processStdio };
@@ -0,0 +1,65 @@
1
+ import { AdapterFactory, ToolDefinition } from '@agentskit/core';
2
+ import { McpTransport, McpServer, StdioLikeProcess } from '@agentskit/tools/mcp';
3
+ export { McpServer, McpTransport } from '@agentskit/tools/mcp';
4
+
5
+ interface AgentToolConfig {
6
+ /** Tool name exposed to the MCP host (the agent id). */
7
+ id: string;
8
+ description: string;
9
+ /** The agent's system prompt (its skill). */
10
+ systemPrompt: string;
11
+ /** Model adapter the agent runs on (server-side). */
12
+ adapter: AdapterFactory;
13
+ maxSteps?: number;
14
+ }
15
+ /**
16
+ * Wrap a whole agent as a single MCP tool. The MCP host calls it with a `task`
17
+ * string; the agent runs server-side (its own skill + reasoning loop on the
18
+ * provided adapter) and returns the result. This is "agents as MCP tools" — the
19
+ * host delegates a specialized job rather than orchestrating primitives.
20
+ */
21
+ declare function createAgentTool(config: AgentToolConfig): ToolDefinition;
22
+
23
+ interface FetchedAgentSkill {
24
+ id: string;
25
+ description: string;
26
+ systemPrompt: string;
27
+ }
28
+ /**
29
+ * Fetch a registry agent's runnable skill (id, description, systemPrompt) so it
30
+ * can be exposed as an MCP tool. Hosted index first, raw-GitHub fallback. Returns
31
+ * null for tool-composing agents (no inline prompt) or unknown ids.
32
+ */
33
+ declare function fetchAgentSkill(id: string, fetchImpl?: typeof fetch): Promise<FetchedAgentSkill | null>;
34
+
35
+ interface AgentsKitMcpServerOptions {
36
+ /** AgentsKit tools to expose to the MCP host. */
37
+ tools: ToolDefinition[];
38
+ serverInfo?: {
39
+ name: string;
40
+ version: string;
41
+ };
42
+ /** Observability hook (call / error / list). Logs must NOT go to stdout — it is the MCP channel. */
43
+ onEvent?: (event: {
44
+ type: 'call' | 'error' | 'list';
45
+ tool?: string;
46
+ error?: string;
47
+ }) => void;
48
+ /**
49
+ * Transport override. Defaults to stdio over the current process (the form
50
+ * Claude Desktop / Cursor / Windsurf launch). Inject a custom transport for tests.
51
+ */
52
+ transport?: McpTransport;
53
+ }
54
+ /**
55
+ * Adapt the current Node process to the `StdioLikeProcess` the transport expects:
56
+ * the server RECEIVES JSON-RPC on stdin and SENDS on stdout.
57
+ */
58
+ declare function processStdio(): StdioLikeProcess;
59
+ /**
60
+ * Expose a set of AgentsKit tools as an MCP server (over stdio by default), so
61
+ * any MCP host — Claude Desktop, Cursor, Windsurf — can call them.
62
+ */
63
+ declare function createAgentsKitMcpServer(options: AgentsKitMcpServerOptions): McpServer;
64
+
65
+ export { type AgentToolConfig, type AgentsKitMcpServerOptions, type FetchedAgentSkill, createAgentTool, createAgentsKitMcpServer, fetchAgentSkill, processStdio };
package/dist/index.js ADDED
@@ -0,0 +1,3 @@
1
+ export { createAgentTool, createAgentsKitMcpServer, fetchAgentSkill, processStdio } from './chunk-F5SVUT7Z.js';
2
+ //# sourceMappingURL=index.js.map
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"index.js"}
package/package.json ADDED
@@ -0,0 +1,63 @@
1
+ {
2
+ "name": "@agentskit/mcp",
3
+ "version": "0.2.0",
4
+ "description": "Expose AgentsKit tools as an MCP server — use them from Claude Desktop, Cursor, Windsurf, or any MCP host.",
5
+ "keywords": [
6
+ "agentskit",
7
+ "mcp",
8
+ "model-context-protocol",
9
+ "tools",
10
+ "ai",
11
+ "agents",
12
+ "claude",
13
+ "cursor"
14
+ ],
15
+ "type": "module",
16
+ "sideEffects": false,
17
+ "main": "./dist/index.cjs",
18
+ "module": "./dist/index.js",
19
+ "types": "./dist/index.d.ts",
20
+ "bin": {
21
+ "agentskit-mcp": "./dist/bin.js"
22
+ },
23
+ "exports": {
24
+ ".": {
25
+ "types": "./dist/index.d.ts",
26
+ "import": "./dist/index.js",
27
+ "require": "./dist/index.cjs"
28
+ }
29
+ },
30
+ "files": [
31
+ "dist"
32
+ ],
33
+ "dependencies": {
34
+ "@agentskit/adapters": "0.13.0",
35
+ "@agentskit/core": "1.8.0",
36
+ "@agentskit/runtime": "0.8.0",
37
+ "@agentskit/tools": "0.10.1"
38
+ },
39
+ "devDependencies": {
40
+ "@types/node": "^25.9.1",
41
+ "tsup": "^8.5.1",
42
+ "typescript": "^6.0.3",
43
+ "vitest": "^4.1.7"
44
+ },
45
+ "publishConfig": {
46
+ "access": "public"
47
+ },
48
+ "license": "MIT",
49
+ "homepage": "https://www.agentskit.io/docs/packages/mcp",
50
+ "repository": {
51
+ "type": "git",
52
+ "url": "git+https://github.com/AgentsKit-io/agentskit.git",
53
+ "directory": "packages/mcp"
54
+ },
55
+ "author": "AgentsKit Contributors",
56
+ "scripts": {
57
+ "build": "tsup",
58
+ "test": "vitest run",
59
+ "test:coverage": "vitest run --coverage",
60
+ "lint": "tsc --noEmit",
61
+ "dev": "tsup --watch"
62
+ }
63
+ }