llmist 17.2.1 → 17.5.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.
@@ -0,0 +1,187 @@
1
+ import {
2
+ LLMMessageBuilder,
3
+ McpClient,
4
+ McpLifecycle,
5
+ __esm,
6
+ init_client,
7
+ init_lifecycle,
8
+ init_messages,
9
+ init_tool_adapter,
10
+ mcpToolToGadget
11
+ } from "./chunk-HM7PUGPA.js";
12
+
13
+ // src/mcp/multi-server.ts
14
+ function resolveToolNames(input) {
15
+ const counts = /* @__PURE__ */ new Map();
16
+ for (const s of input) {
17
+ for (const t of s.tools) {
18
+ counts.set(t.name, (counts.get(t.name) ?? 0) + 1);
19
+ }
20
+ }
21
+ const collidingServers = /* @__PURE__ */ new Set();
22
+ for (const s of input) {
23
+ if (s.tools.some((t) => (counts.get(t.name) ?? 0) > 1)) {
24
+ collidingServers.add(s.server.name);
25
+ }
26
+ }
27
+ return input.map((s) => ({
28
+ ...s,
29
+ prefix: collidingServers.has(s.server.name) ? `${s.server.name}__` : void 0
30
+ }));
31
+ }
32
+ var init_multi_server = __esm({
33
+ "src/mcp/multi-server.ts"() {
34
+ "use strict";
35
+ }
36
+ });
37
+
38
+ // src/mcp/prompt-adapter.ts
39
+ function mcpPromptToSkill(descriptor, client, opts) {
40
+ return new McpPromptSkill(descriptor, client, opts);
41
+ }
42
+ var McpPromptSkill;
43
+ var init_prompt_adapter = __esm({
44
+ "src/mcp/prompt-adapter.ts"() {
45
+ "use strict";
46
+ McpPromptSkill = class {
47
+ name;
48
+ description;
49
+ metadata;
50
+ isUserInvocable = true;
51
+ isModelInvocable = true;
52
+ client;
53
+ mcpToolName;
54
+ constructor(descriptor, client, opts) {
55
+ const prefix = opts?.prefix ?? "";
56
+ this.name = prefix + descriptor.name;
57
+ this.description = descriptor.description ?? `MCP prompt "${descriptor.name}" from server "${client.serverName}"`;
58
+ this.metadata = {
59
+ name: this.name,
60
+ description: this.description,
61
+ ...descriptor.arguments ? { arguments: descriptor.arguments } : {}
62
+ };
63
+ this.client = client;
64
+ this.mcpToolName = descriptor.name;
65
+ }
66
+ /**
67
+ * Render the prompt by calling the MCP server's prompts/get with the
68
+ * supplied arguments and joining the resulting message text.
69
+ */
70
+ async getInstructions(args) {
71
+ const result = await this.client.getPrompt(this.mcpToolName, args ?? {});
72
+ const parts = [];
73
+ for (const m of result.messages) {
74
+ const c = m.content;
75
+ if (c.type === "text" && typeof c.text === "string") {
76
+ parts.push(c.text);
77
+ } else {
78
+ try {
79
+ parts.push(JSON.stringify(c));
80
+ } catch {
81
+ parts.push(String(c));
82
+ }
83
+ }
84
+ }
85
+ return parts.join("\n");
86
+ }
87
+ };
88
+ }
89
+ });
90
+
91
+ // src/mcp/runtime.ts
92
+ async function setupMcpServers(opts) {
93
+ const { specs, registry, conversation, prefixConfig, systemPrompt, logger, onPromptDiscovered } = opts;
94
+ const lifecycle = new McpLifecycle();
95
+ lifecycle.installSignalHandlers();
96
+ const connected = [];
97
+ await Promise.all(
98
+ specs.map(async (spec) => {
99
+ const client = new McpClient(spec);
100
+ try {
101
+ await client.connect();
102
+ } catch (err) {
103
+ logger.warn(
104
+ `MCP server "${spec.name}" failed to connect \u2014 skipping. Reason: ${err.message}`
105
+ );
106
+ return;
107
+ }
108
+ lifecycle.register(client);
109
+ const caps = client.serverCapabilities;
110
+ const hasTools = caps?.tools !== void 0;
111
+ let tools = [];
112
+ if (hasTools) {
113
+ try {
114
+ tools = await client.listTools();
115
+ } catch (err) {
116
+ logger.warn(
117
+ `MCP server "${spec.name}" listTools failed \u2014 skipping. Reason: ${err.message}`
118
+ );
119
+ return;
120
+ }
121
+ } else {
122
+ logger.debug(
123
+ `MCP server "${spec.name}" did not advertise tools capability \u2014 skipping listTools.`
124
+ );
125
+ }
126
+ if (caps?.resources !== void 0) {
127
+ logger.debug(
128
+ `MCP server "${spec.name}" advertises 'resources' capability \u2014 not yet implemented in llmist (deferred to v1.5).`
129
+ );
130
+ }
131
+ if (caps?.prompts !== void 0 && onPromptDiscovered) {
132
+ try {
133
+ const prompts = await client.listPrompts();
134
+ for (const p of prompts) {
135
+ onPromptDiscovered(mcpPromptToSkill(p, client));
136
+ }
137
+ } catch (err) {
138
+ logger.debug(
139
+ `MCP server "${spec.name}" listPrompts failed \u2014 skipping prompts. Reason: ${err.message}`
140
+ );
141
+ }
142
+ }
143
+ connected.push({ client, serverToolList: { server: spec, tools } });
144
+ })
145
+ );
146
+ const resolved = resolveToolNames(connected.map((c) => c.serverToolList));
147
+ for (const r of resolved) {
148
+ const cs = connected.find((c) => c.serverToolList.server.name === r.server.name);
149
+ if (!cs) continue;
150
+ for (const tool of r.tools) {
151
+ const gadget = mcpToolToGadget(tool, cs.client, { prefix: r.prefix });
152
+ try {
153
+ registry.register(gadget.name ?? tool.name, gadget);
154
+ } catch (err) {
155
+ logger.warn(
156
+ `MCP server "${r.server.name}" tool "${tool.name}" was not registered: ${err.message}`
157
+ );
158
+ }
159
+ }
160
+ }
161
+ const builder = new LLMMessageBuilder();
162
+ if (typeof systemPrompt === "string" && systemPrompt.length > 0) {
163
+ builder.addSystem(systemPrompt);
164
+ }
165
+ builder.addGadgets(registry.getAll(), {
166
+ startPrefix: prefixConfig?.gadgetStartPrefix,
167
+ endPrefix: prefixConfig?.gadgetEndPrefix,
168
+ argPrefix: prefixConfig?.gadgetArgPrefix
169
+ });
170
+ conversation.replaceBaseMessages(builder.build());
171
+ return lifecycle;
172
+ }
173
+ var init_runtime = __esm({
174
+ "src/mcp/runtime.ts"() {
175
+ init_messages();
176
+ init_client();
177
+ init_lifecycle();
178
+ init_multi_server();
179
+ init_prompt_adapter();
180
+ init_tool_adapter();
181
+ }
182
+ });
183
+ init_runtime();
184
+ export {
185
+ setupMcpServers
186
+ };
187
+ //# sourceMappingURL=runtime-GKQ6QIQP.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/mcp/multi-server.ts","../src/mcp/prompt-adapter.ts","../src/mcp/runtime.ts"],"sourcesContent":["/**\n * Deterministic multi-server tool name conflict resolution.\n *\n * When two or more MCP servers expose tools with the same name, llmist\n * prefixes those servers' tools with `<server>__`. The check is per-tool-name:\n * any name that appears on more than one server triggers prefixing on every\n * server that owns the colliding name. To keep the gadget naming uniform\n * within a server, all tools on a server with at least one collision get the\n * prefix.\n *\n * This shape matches the convention used by every major MCP-aware framework\n * (LangChain, OpenAI Agents SDK, Cline) — divergence buys nothing.\n *\n * @module mcp/multi-server\n */\n\nimport type { McpServerSpec, McpToolDescriptor } from \"./types.js\";\n\nexport interface ServerToolList {\n server: McpServerSpec;\n tools: McpToolDescriptor[];\n}\n\nexport interface ResolvedServerToolList extends ServerToolList {\n /** Prefix applied to each tool of this server (e.g. \"fs__\"). undefined when no collision. */\n prefix: string | undefined;\n}\n\nexport function resolveToolNames(input: ServerToolList[]): ResolvedServerToolList[] {\n // Count occurrences of each tool name across servers.\n const counts = new Map<string, number>();\n for (const s of input) {\n for (const t of s.tools) {\n counts.set(t.name, (counts.get(t.name) ?? 0) + 1);\n }\n }\n\n // Determine which servers have at least one colliding tool.\n const collidingServers = new Set<string>();\n for (const s of input) {\n if (s.tools.some((t) => (counts.get(t.name) ?? 0) > 1)) {\n collidingServers.add(s.server.name);\n }\n }\n\n return input.map((s) => ({\n ...s,\n prefix: collidingServers.has(s.server.name) ? `${s.server.name}__` : undefined,\n }));\n}\n","/**\n * Adapter that wraps an MCP prompt descriptor as an llmist Skill-shaped\n * artifact, so MCP prompts compose with the existing skill subsystem\n * (slash invocation, skill registry, load-skill meta-gadget).\n *\n * The shape returned mirrors the public surface of `Skill` that llmist\n * consumers use (name, description, getInstructions, invocable flags),\n * plus a `mcpArguments` field for MCP-specific argument metadata.\n *\n * @module mcp/prompt-adapter\n */\n\nimport type { McpClient } from \"./client.js\";\nimport type { McpContentBlock, McpPromptArgument, McpPromptDescriptor } from \"./types.js\";\n\nexport interface McpPromptSkillOptions {\n /** Prefix prepended to the skill name. Used for multi-server name conflict resolution. */\n prefix?: string;\n}\n\nexport interface McpPromptSkillMetadata {\n name: string;\n description: string;\n arguments?: McpPromptArgument[];\n}\n\nexport class McpPromptSkill {\n readonly name: string;\n readonly description: string;\n readonly metadata: McpPromptSkillMetadata;\n readonly isUserInvocable: boolean = true;\n readonly isModelInvocable: boolean = true;\n\n private readonly client: McpClient;\n private readonly mcpToolName: string;\n\n constructor(descriptor: McpPromptDescriptor, client: McpClient, opts?: McpPromptSkillOptions) {\n const prefix = opts?.prefix ?? \"\";\n this.name = prefix + descriptor.name;\n this.description =\n descriptor.description ??\n `MCP prompt \"${descriptor.name}\" from server \"${client.serverName}\"`;\n this.metadata = {\n name: this.name,\n description: this.description,\n ...(descriptor.arguments ? { arguments: descriptor.arguments } : {}),\n };\n this.client = client;\n this.mcpToolName = descriptor.name;\n }\n\n /**\n * Render the prompt by calling the MCP server's prompts/get with the\n * supplied arguments and joining the resulting message text.\n */\n async getInstructions(args?: Record<string, unknown>): Promise<string> {\n const result = await this.client.getPrompt(this.mcpToolName, args ?? {});\n const parts: string[] = [];\n for (const m of result.messages) {\n const c = m.content as McpContentBlock;\n if (c.type === \"text\" && typeof (c as { text?: unknown }).text === \"string\") {\n parts.push((c as { text: string }).text);\n } else {\n try {\n parts.push(JSON.stringify(c));\n } catch {\n parts.push(String(c));\n }\n }\n }\n return parts.join(\"\\n\");\n }\n}\n\nexport function mcpPromptToSkill(\n descriptor: McpPromptDescriptor,\n client: McpClient,\n opts?: McpPromptSkillOptions,\n): McpPromptSkill {\n return new McpPromptSkill(descriptor, client, opts);\n}\n","/**\n * Runtime orchestration for MCP-attached agents. This file is dynamic-imported\n * by Agent.run() only when at least one MCP server is configured, so agents\n * that don't use MCP never load the SDK.\n *\n * @module mcp/runtime\n */\n\nimport type { ILogObj, Logger } from \"tslog\";\nimport type { PrefixConfig } from \"../agent/agent.js\";\nimport type { ConversationManager } from \"../agent/conversation-manager.js\";\nimport { LLMMessageBuilder } from \"../core/messages.js\";\nimport type { GadgetRegistry } from \"../gadgets/registry.js\";\nimport { McpClient } from \"./client.js\";\nimport { McpLifecycle } from \"./lifecycle.js\";\nimport { resolveToolNames, type ServerToolList } from \"./multi-server.js\";\nimport { type McpPromptSkill, mcpPromptToSkill } from \"./prompt-adapter.js\";\nimport { mcpToolToGadget } from \"./tool-adapter.js\";\nimport type { McpServerSpec } from \"./types.js\";\n\nexport interface SetupMcpServersOptions {\n specs: McpServerSpec[];\n registry: GadgetRegistry;\n conversation: ConversationManager;\n prefixConfig?: PrefixConfig;\n systemPrompt?: string;\n logger: Logger<ILogObj>;\n /** Receives discovered MCP prompts as skill-shaped artifacts for slash invocation. */\n onPromptDiscovered?: (skill: McpPromptSkill) => void;\n}\n\n/**\n * Setup MCP servers attached to an agent.\n *\n * - Connects each server in parallel.\n * - Lists tools and registers them as adapter gadgets in the agent's registry.\n * - Rebuilds the conversation's base (system + gadget catalog) messages so\n * the LLM sees the full effective gadget set.\n *\n * Returns an `McpLifecycle` instance the caller must close at agent teardown.\n *\n * If a server fails to connect, the failure is logged and that server is\n * skipped — the agent continues with whatever servers connected\n * successfully. (Plan 2 will polish this with hook-driven error events.)\n */\nexport async function setupMcpServers(opts: SetupMcpServersOptions): Promise<McpLifecycle> {\n const { specs, registry, conversation, prefixConfig, systemPrompt, logger, onPromptDiscovered } =\n opts;\n\n const lifecycle = new McpLifecycle();\n lifecycle.installSignalHandlers();\n\n // Phase 1: connect every server in parallel, list its tools.\n type ConnectedServer = { client: McpClient; serverToolList: ServerToolList };\n const connected: ConnectedServer[] = [];\n\n await Promise.all(\n specs.map(async (spec) => {\n const client = new McpClient(spec);\n try {\n await client.connect();\n } catch (err) {\n logger.warn(\n `MCP server \"${spec.name}\" failed to connect — skipping. Reason: ${(err as Error).message}`,\n );\n return;\n }\n lifecycle.register(client);\n\n // Capability negotiation: only fetch tools if the server advertises them.\n const caps = client.serverCapabilities;\n const hasTools = caps?.tools !== undefined;\n\n let tools: import(\"./types.js\").McpToolDescriptor[] = [];\n if (hasTools) {\n try {\n tools = await client.listTools();\n } catch (err) {\n logger.warn(\n `MCP server \"${spec.name}\" listTools failed — skipping. Reason: ${(err as Error).message}`,\n );\n return;\n }\n } else {\n logger.debug(\n `MCP server \"${spec.name}\" did not advertise tools capability — skipping listTools.`,\n );\n }\n\n // Surface unsupported-primitive warnings once.\n if (caps?.resources !== undefined) {\n logger.debug(\n `MCP server \"${spec.name}\" advertises 'resources' capability — not yet implemented in llmist (deferred to v1.5).`,\n );\n }\n\n // Discover prompts (capability-gated).\n if (caps?.prompts !== undefined && onPromptDiscovered) {\n try {\n const prompts = await client.listPrompts();\n for (const p of prompts) {\n onPromptDiscovered(mcpPromptToSkill(p, client));\n }\n } catch (err) {\n logger.debug(\n `MCP server \"${spec.name}\" listPrompts failed — skipping prompts. Reason: ${(err as Error).message}`,\n );\n }\n }\n\n connected.push({ client, serverToolList: { server: spec, tools } });\n }),\n );\n\n // Phase 2: resolve tool name conflicts, then register each as a gadget.\n const resolved = resolveToolNames(connected.map((c) => c.serverToolList));\n\n for (const r of resolved) {\n const cs = connected.find((c) => c.serverToolList.server.name === r.server.name);\n if (!cs) continue;\n for (const tool of r.tools) {\n const gadget = mcpToolToGadget(tool, cs.client, { prefix: r.prefix });\n try {\n registry.register(gadget.name ?? tool.name, gadget);\n } catch (err) {\n logger.warn(\n `MCP server \"${r.server.name}\" tool \"${tool.name}\" was not registered: ${(err as Error).message}`,\n );\n }\n }\n }\n\n // Rebuild conversation base messages so the system prompt's gadget catalog\n // includes the freshly-added MCP-backed gadgets.\n const builder = new LLMMessageBuilder();\n if (typeof systemPrompt === \"string\" && systemPrompt.length > 0) {\n builder.addSystem(systemPrompt);\n }\n builder.addGadgets(registry.getAll(), {\n startPrefix: prefixConfig?.gadgetStartPrefix,\n endPrefix: prefixConfig?.gadgetEndPrefix,\n argPrefix: prefixConfig?.gadgetArgPrefix,\n });\n conversation.replaceBaseMessages(builder.build());\n\n return lifecycle;\n}\n"],"mappings":"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","names":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "llmist",
3
- "version": "17.2.1",
3
+ "version": "17.5.0",
4
4
  "description": "TypeScript LLM client with streaming tool execution. Tools fire mid-stream. Built-in function calling works with any model—no structured outputs or native tool support required.",
5
5
  "type": "module",
6
6
  "main": "dist/index.cjs",
@@ -66,11 +66,12 @@
66
66
  "dependencies": {
67
67
  "@anthropic-ai/sdk": "^0.69.0",
68
68
  "@google/genai": "^1.27.0",
69
+ "@modelcontextprotocol/sdk": "^1.29.0",
69
70
  "chalk": "^5.6.2",
70
71
  "diff": "^8.0.2",
71
72
  "eta": "^4.4.1",
72
73
  "fast-deep-equal": "^3.1.3",
73
- "js-toml": "^1.0.2",
74
+ "js-toml": "^1.1.0",
74
75
  "js-yaml": "^4.1.0",
75
76
  "marked": "^15.0.12",
76
77
  "marked-terminal": "^7.3.0",