@loopstack/mcp-module 0.2.1 → 0.3.1

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
@@ -39,16 +39,18 @@ flow through headers.
39
39
 
40
40
  ## Authentication
41
41
 
42
- Configure auth headers via `@InjectTool(...)`:
42
+ Configure auth headers via constructor injection config:
43
43
 
44
44
  ```ts
45
- @InjectTool({
46
- allowedHosts: ['mcp.linear.app'],
47
- hostHeaderEnv: {
48
- 'mcp.linear.app': { Authorization: 'LINEAR_MCP_TOKEN' },
45
+ constructor(private readonly mcpCallTool: McpCallTool) {}
46
+
47
+ // Configure allowedHosts and hostHeaderEnv via call config:
48
+ await this.mcpCallTool.call(args, {
49
+ config: {
50
+ allowedHosts: ['mcp.linear.app'],
51
+ hostHeaderEnv: { 'mcp.linear.app': { Authorization: 'LINEAR_MCP_TOKEN' } },
49
52
  },
50
- })
51
- private readonly mcpCallTool: McpCallTool;
53
+ });
52
54
  ```
53
55
 
54
56
  Three knobs, in increasing specificity:
@@ -76,10 +78,10 @@ LINEAR_MCP_TOKEN="Bearer lin_oauth_..."
76
78
  ## Registering the tools (workspace vs workflow)
77
79
 
78
80
  Import `McpModule` in your Nest module so the tool classes are available. Then
79
- register **instances** with `@InjectTool()` — where you put that decorator
81
+ register **instances** via the constructor — where you inject them
80
82
  depends on how you run the LLM loop.
81
83
 
82
- | How you run the agent | Where to `@InjectTool` MCP tools |
84
+ | How you run the agent | Where to injection MCP tools |
83
85
  | -------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
84
86
  | **`ChatAgentWorkflow` / `AgentWorkflow` as a sub-workflow** (`this.agent.run({ tools: [...] })`) | **Workspace** — the child agent resolves tools from the executing workflow first, then the workspace. Tools on the parent workflow are not visible while the sub-agent runs. |
85
87
  | **Inline agent loop in one workflow** (your transitions call `this.llmGenerateText.call()` / `this.llmDelegateToolCalls.call()` on the same class) | **That workflow** — same pattern as other registry agents (e.g. Google Workspace). |
@@ -110,19 +112,17 @@ const mcpToolConfig = {
110
112
  @Injectable()
111
113
  @Workspace({ uiConfig: { title: 'My Workspace' } })
112
114
  export class MyWorkspace {
113
- @InjectWorkflow() mcpAgent: MyMcpWorkflow;
114
-
115
- @InjectTool(mcpToolConfig)
116
- mcpListTools: McpListToolsTool;
117
-
118
- @InjectTool(mcpToolConfig)
119
- mcpCallTool: McpCallTool;
115
+ constructor(
116
+ public readonly mcpAgent: MyMcpWorkflow,
117
+ public readonly mcpListTools: McpListToolsTool,
118
+ public readonly mcpCallTool: McpCallTool,
119
+ ) {}
120
120
  }
121
121
  ```
122
122
 
123
123
  ```ts
124
124
  // my-mcp.workflow.ts — parent only starts the sub-agent
125
- @InjectWorkflow({ model: 'claude-sonnet-4-6' }) private agent: ChatAgentWorkflow;
125
+ constructor(private readonly agent: ChatAgentWorkflow) { super(); }
126
126
 
127
127
  await this.agent.run({
128
128
  system: '...',
@@ -145,7 +145,7 @@ allowlisted hosts within the same chat.
145
145
  `serverUrl` is a per-call argument. **An agent can reach any host listed in
146
146
  `allowedHosts`** — there is no "primary" server. To add a new server:
147
147
 
148
- 1. Add its hostname to `allowedHosts` on both `@InjectTool` configs.
148
+ 1. Add its hostname to `allowedHosts` on both injection configs.
149
149
  2. Add its auth mapping to `hostHeaderEnv`.
150
150
  3. Set the corresponding env var.
151
151
 
@@ -8,4 +8,5 @@ export declare const McpToolConfigSchema: z.ZodObject<{
8
8
  hostHeaderEnv: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodRecord<z.ZodString, z.ZodString>>>;
9
9
  }, z.core.$strict>;
10
10
  export type McpToolConfig = z.infer<typeof McpToolConfigSchema>;
11
+ export type McpToolConfigInput = z.input<typeof McpToolConfigSchema>;
11
12
  //# sourceMappingURL=mcp-tool-config.schema.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"mcp-tool-config.schema.d.ts","sourceRoot":"","sources":["../../src/config/mcp-tool-config.schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAuBxB,eAAO,MAAM,mBAAmB;;;;;;;kBAiC5B,CAAC;AAEL,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC"}
1
+ {"version":3,"file":"mcp-tool-config.schema.d.ts","sourceRoot":"","sources":["../../src/config/mcp-tool-config.schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAuBxB,eAAO,MAAM,mBAAmB;;;;;;;kBAiC5B,CAAC;AAEL,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAChE,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC"}
package/dist/index.d.ts CHANGED
@@ -1,6 +1,7 @@
1
1
  export * from './config/mcp-tool-config.schema.js';
2
2
  export * from './errors.js';
3
3
  export * from './mcp.module.js';
4
+ export * from './tokens.js';
4
5
  export * from './services/index.js';
5
6
  export * from './tools/index.js';
6
7
  export * from './types.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,oCAAoC,CAAC;AACnD,cAAc,aAAa,CAAC;AAC5B,cAAc,iBAAiB,CAAC;AAChC,cAAc,qBAAqB,CAAC;AACpC,cAAc,kBAAkB,CAAC;AACjC,cAAc,YAAY,CAAC;AAC3B,cAAc,yBAAyB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,oCAAoC,CAAC;AACnD,cAAc,aAAa,CAAC;AAC5B,cAAc,iBAAiB,CAAC;AAChC,cAAc,aAAa,CAAC;AAC5B,cAAc,qBAAqB,CAAC;AACpC,cAAc,kBAAkB,CAAC;AACjC,cAAc,YAAY,CAAC;AAC3B,cAAc,yBAAyB,CAAC"}
package/dist/index.js CHANGED
@@ -1,6 +1,7 @@
1
1
  export * from './config/mcp-tool-config.schema.js';
2
2
  export * from './errors.js';
3
3
  export * from './mcp.module.js';
4
+ export * from './tokens.js';
4
5
  export * from './services/index.js';
5
6
  export * from './tools/index.js';
6
7
  export * from './types.js';
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,oCAAoC,CAAC;AACnD,cAAc,aAAa,CAAC;AAC5B,cAAc,iBAAiB,CAAC;AAChC,cAAc,qBAAqB,CAAC;AACpC,cAAc,kBAAkB,CAAC;AACjC,cAAc,YAAY,CAAC;AAC3B,cAAc,yBAAyB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,oCAAoC,CAAC;AACnD,cAAc,aAAa,CAAC;AAC5B,cAAc,iBAAiB,CAAC;AAChC,cAAc,aAAa,CAAC;AAC5B,cAAc,qBAAqB,CAAC;AACpC,cAAc,kBAAkB,CAAC;AACjC,cAAc,YAAY,CAAC;AAC3B,cAAc,yBAAyB,CAAC"}
@@ -1,3 +1,6 @@
1
+ import { type DynamicModule } from '@nestjs/common';
2
+ import type { McpToolConfigInput } from './config/mcp-tool-config.schema.js';
1
3
  export declare class McpModule {
4
+ static forRoot(config?: McpToolConfigInput): DynamicModule;
2
5
  }
3
6
  //# sourceMappingURL=mcp.module.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"mcp.module.d.ts","sourceRoot":"","sources":["../src/mcp.module.ts"],"names":[],"mappings":"AAiBA,qBAKa,SAAS;CAAG"}
1
+ {"version":3,"file":"mcp.module.d.ts","sourceRoot":"","sources":["../src/mcp.module.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,aAAa,EAAU,MAAM,gBAAgB,CAAC;AAG5D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAC;AAO7E,qBACa,SAAS;IACpB,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,kBAAkB,GAAG,aAAa;CAiB3D"}
@@ -4,28 +4,36 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
4
4
  else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
5
  return c > 3 && r && Object.defineProperty(target, key, r), r;
6
6
  };
7
+ var McpModule_1;
7
8
  import { Module } from '@nestjs/common';
8
9
  import { LoopCoreModule } from '@loopstack/core';
10
+ import { McpToolConfigSchema } from './config/mcp-tool-config.schema.js';
9
11
  import { MCP_ENV_READER, ProcessEnvReader } from './services/env-reader.js';
10
12
  import { McpClientService } from './services/index.js';
11
13
  import { MCP_METRICS, NoopMcpMetrics } from './services/metrics-port.js';
14
+ import { MCP_DEFAULT_CONFIG } from './tokens.js';
12
15
  import { McpCallTool, McpListToolsTool } from './tools/index.js';
13
- const envReaderProvider = {
14
- provide: MCP_ENV_READER,
15
- useClass: ProcessEnvReader,
16
+ let McpModule = McpModule_1 = class McpModule {
17
+ static forRoot(config) {
18
+ const parsed = config ? McpToolConfigSchema.parse(config) : null;
19
+ return {
20
+ global: true,
21
+ module: McpModule_1,
22
+ imports: [LoopCoreModule],
23
+ providers: [
24
+ { provide: MCP_ENV_READER, useClass: ProcessEnvReader },
25
+ { provide: MCP_METRICS, useClass: NoopMcpMetrics },
26
+ { provide: MCP_DEFAULT_CONFIG, useValue: parsed },
27
+ McpClientService,
28
+ McpListToolsTool,
29
+ McpCallTool,
30
+ ],
31
+ exports: [MCP_DEFAULT_CONFIG, MCP_ENV_READER, MCP_METRICS, McpClientService, McpListToolsTool, McpCallTool],
32
+ };
33
+ }
16
34
  };
17
- const metricsProvider = {
18
- provide: MCP_METRICS,
19
- useClass: NoopMcpMetrics,
20
- };
21
- let McpModule = class McpModule {
22
- };
23
- McpModule = __decorate([
24
- Module({
25
- imports: [LoopCoreModule],
26
- providers: [envReaderProvider, metricsProvider, McpClientService, McpListToolsTool, McpCallTool],
27
- exports: [MCP_ENV_READER, MCP_METRICS, McpClientService, McpListToolsTool, McpCallTool],
28
- })
35
+ McpModule = McpModule_1 = __decorate([
36
+ Module({})
29
37
  ], McpModule);
30
38
  export { McpModule };
31
39
  //# sourceMappingURL=mcp.module.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"mcp.module.js","sourceRoot":"","sources":["../src/mcp.module.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAE,MAAM,EAAY,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC5E,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AACzE,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAEjE,MAAM,iBAAiB,GAAa;IAClC,OAAO,EAAE,cAAc;IACvB,QAAQ,EAAE,gBAAgB;CAC3B,CAAC;AAEF,MAAM,eAAe,GAAa;IAChC,OAAO,EAAE,WAAW;IACpB,QAAQ,EAAE,cAAc;CACzB,CAAC;AAOK,IAAM,SAAS,GAAf,MAAM,SAAS;CAAG,CAAA;AAAZ,SAAS;IALrB,MAAM,CAAC;QACN,OAAO,EAAE,CAAC,cAAc,CAAC;QACzB,SAAS,EAAE,CAAC,iBAAiB,EAAE,eAAe,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,WAAW,CAAC;QAChG,OAAO,EAAE,CAAC,cAAc,EAAE,WAAW,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,WAAW,CAAC;KACxF,CAAC;GACW,SAAS,CAAG"}
1
+ {"version":3,"file":"mcp.module.js","sourceRoot":"","sources":["../src/mcp.module.ts"],"names":[],"mappings":";;;;;;;AAAA,OAAO,EAAsB,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAC5D,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAAE,mBAAmB,EAAE,MAAM,oCAAoC,CAAC;AAEzE,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC5E,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AACzE,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAG1D,IAAM,SAAS,iBAAf,MAAM,SAAS;IACpB,MAAM,CAAC,OAAO,CAAC,MAA2B;QACxC,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,mBAAmB,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QACjE,OAAO;YACL,MAAM,EAAE,IAAI;YACZ,MAAM,EAAE,WAAS;YACjB,OAAO,EAAE,CAAC,cAAc,CAAC;YACzB,SAAS,EAAE;gBACT,EAAE,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,gBAAgB,EAAE;gBACvD,EAAE,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,cAAc,EAAE;gBAClD,EAAE,OAAO,EAAE,kBAAkB,EAAE,QAAQ,EAAE,MAAM,EAAE;gBACjD,gBAAgB;gBAChB,gBAAgB;gBAChB,WAAW;aACZ;YACD,OAAO,EAAE,CAAC,kBAAkB,EAAE,cAAc,EAAE,WAAW,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,WAAW,CAAC;SAC5G,CAAC;IACJ,CAAC;CACF,CAAA;AAlBY,SAAS;IADrB,MAAM,CAAC,EAAE,CAAC;GACE,SAAS,CAkBrB"}
@@ -0,0 +1,2 @@
1
+ export declare const MCP_DEFAULT_CONFIG: unique symbol;
2
+ //# sourceMappingURL=tokens.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tokens.d.ts","sourceRoot":"","sources":["../src/tokens.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,kBAAkB,eAA+B,CAAC"}
package/dist/tokens.js ADDED
@@ -0,0 +1,2 @@
1
+ export const MCP_DEFAULT_CONFIG = Symbol('MCP_DEFAULT_CONFIG');
2
+ //# sourceMappingURL=tokens.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tokens.js","sourceRoot":"","sources":["../src/tokens.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,kBAAkB,GAAG,MAAM,CAAC,oBAAoB,CAAC,CAAC"}
@@ -1,5 +1,6 @@
1
1
  import { z } from 'zod';
2
2
  import { ToolCallOptions, ToolResult } from '@loopstack/common';
3
+ import type { LoopstackContext } from '@loopstack/common';
3
4
  import type { McpToolConfig } from '../config/mcp-tool-config.schema.js';
4
5
  import { McpToolBase } from './mcp-tool-base.js';
5
6
  export declare const McpCallToolArgsSchema: z.ZodObject<{
@@ -14,6 +15,6 @@ export declare const McpCallToolArgsSchema: z.ZodObject<{
14
15
  }, z.core.$strict>;
15
16
  export type McpCallToolArgs = z.infer<typeof McpCallToolArgsSchema>;
16
17
  export declare class McpCallTool extends McpToolBase<McpCallToolArgs> {
17
- call(args: McpCallToolArgs, options?: ToolCallOptions<McpToolConfig>): Promise<ToolResult>;
18
+ protected handle(args: McpCallToolArgs, ctx: LoopstackContext, options?: ToolCallOptions<McpToolConfig>): Promise<ToolResult>;
18
19
  }
19
20
  //# sourceMappingURL=mcp-call.tool.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"mcp-call.tool.d.ts","sourceRoot":"","sources":["../../src/tools/mcp-call.tool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAQ,eAAe,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAEtE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qCAAqC,CAAC;AAEzE,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEjD,eAAO,MAAM,qBAAqB;;;;;;;;;kBAGvB,CAAC;AAEZ,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AAEpE,qBAQa,WAAY,SAAQ,WAAW,CAAC,eAAe,CAAC;IACrD,IAAI,CAAC,IAAI,EAAE,eAAe,EAAE,OAAO,CAAC,EAAE,eAAe,CAAC,aAAa,CAAC,GAAG,OAAO,CAAC,UAAU,CAAC;CAUjG"}
1
+ {"version":3,"file":"mcp-call.tool.d.ts","sourceRoot":"","sources":["../../src/tools/mcp-call.tool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAQ,eAAe,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACtE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAE1D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qCAAqC,CAAC;AAEzE,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEjD,eAAO,MAAM,qBAAqB;;;;;;;;;kBAGvB,CAAC;AAEZ,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AAEpE,qBAOa,WAAY,SAAQ,WAAW,CAAC,eAAe,CAAC;cAC3C,MAAM,CACpB,IAAI,EAAE,eAAe,EACrB,GAAG,EAAE,gBAAgB,EACrB,OAAO,CAAC,EAAE,eAAe,CAAC,aAAa,CAAC,GACvC,OAAO,CAAC,UAAU,CAAC;CAUvB"}
@@ -14,7 +14,7 @@ export const McpCallToolArgsSchema = McpConnectionArgsSchema.extend({
14
14
  arguments: z.record(z.string(), z.unknown()).optional().default({}).describe('JSON object passed to the tool.'),
15
15
  }).strict();
16
16
  let McpCallTool = class McpCallTool extends McpToolBase {
17
- async call(args, options) {
17
+ async handle(args, ctx, options) {
18
18
  const cfg = this.requireConfig(options?.config);
19
19
  const result = await this.mcp.callTool(args.serverUrl, cfg, args.toolName, args.arguments, {
20
20
  timeoutMs: args.timeoutMs,
@@ -25,9 +25,8 @@ let McpCallTool = class McpCallTool extends McpToolBase {
25
25
  };
26
26
  McpCallTool = __decorate([
27
27
  Tool({
28
- uiConfig: {
29
- description: 'Calls a tool on a remote MCP server over HTTPS (Streamable HTTP or legacy SSE). Requires `allowedHosts` and optional `headerEnv`/`hostHeaderEnv` via `@InjectTool`.',
30
- },
28
+ name: 'mcp_call',
29
+ description: 'Calls a tool on a remote MCP server over HTTPS (Streamable HTTP or legacy SSE). Requires `allowedHosts` and optional `headerEnv`/`hostHeaderEnv` via tool config.',
31
30
  schema: McpCallToolArgsSchema,
32
31
  configSchema: McpToolConfigSchema,
33
32
  })
@@ -1 +1 @@
1
- {"version":3,"file":"mcp-call.tool.js","sourceRoot":"","sources":["../../src/tools/mcp-call.tool.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,IAAI,EAA+B,MAAM,mBAAmB,CAAC;AACtE,OAAO,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAC;AAE1E,OAAO,EAAE,uBAAuB,EAAE,MAAM,iCAAiC,CAAC;AAC1E,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEjD,MAAM,CAAC,MAAM,qBAAqB,GAAG,uBAAuB,CAAC,MAAM,CAAC;IAClE,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,wCAAwC,CAAC;IAC9E,SAAS,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,iCAAiC,CAAC;CAChH,CAAC,CAAC,MAAM,EAAE,CAAC;AAYL,IAAM,WAAW,GAAjB,MAAM,WAAY,SAAQ,WAA4B;IAC3D,KAAK,CAAC,IAAI,CAAC,IAAqB,EAAE,OAAwC;QACxE,MAAM,GAAG,GAAG,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAEhD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,EAAE;YACzF,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,SAAS,EAAE,IAAI,CAAC,SAAS;SAC1B,CAAC,CAAC;QAEH,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;IAC1B,CAAC;CACF,CAAA;AAXY,WAAW;IARvB,IAAI,CAAC;QACJ,QAAQ,EAAE;YACR,WAAW,EACT,qKAAqK;SACxK;QACD,MAAM,EAAE,qBAAqB;QAC7B,YAAY,EAAE,mBAAmB;KAClC,CAAC;GACW,WAAW,CAWvB"}
1
+ {"version":3,"file":"mcp-call.tool.js","sourceRoot":"","sources":["../../src/tools/mcp-call.tool.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,IAAI,EAA+B,MAAM,mBAAmB,CAAC;AAEtE,OAAO,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAC;AAE1E,OAAO,EAAE,uBAAuB,EAAE,MAAM,iCAAiC,CAAC;AAC1E,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEjD,MAAM,CAAC,MAAM,qBAAqB,GAAG,uBAAuB,CAAC,MAAM,CAAC;IAClE,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,wCAAwC,CAAC;IAC9E,SAAS,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,iCAAiC,CAAC;CAChH,CAAC,CAAC,MAAM,EAAE,CAAC;AAWL,IAAM,WAAW,GAAjB,MAAM,WAAY,SAAQ,WAA4B;IACjD,KAAK,CAAC,MAAM,CACpB,IAAqB,EACrB,GAAqB,EACrB,OAAwC;QAExC,MAAM,GAAG,GAAG,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAEhD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,EAAE;YACzF,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,SAAS,EAAE,IAAI,CAAC,SAAS;SAC1B,CAAC,CAAC;QAEH,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;IAC1B,CAAC;CACF,CAAA;AAfY,WAAW;IAPvB,IAAI,CAAC;QACJ,IAAI,EAAE,UAAU;QAChB,WAAW,EACT,mKAAmK;QACrK,MAAM,EAAE,qBAAqB;QAC7B,YAAY,EAAE,mBAAmB;KAClC,CAAC;GACW,WAAW,CAevB"}
@@ -1,5 +1,6 @@
1
1
  import { z } from 'zod';
2
2
  import { ToolCallOptions, ToolResult } from '@loopstack/common';
3
+ import type { LoopstackContext } from '@loopstack/common';
3
4
  import type { McpToolConfig } from '../config/mcp-tool-config.schema.js';
4
5
  import { McpToolBase } from './mcp-tool-base.js';
5
6
  export declare const McpListToolsArgsSchema: z.ZodObject<{
@@ -12,6 +13,6 @@ export declare const McpListToolsArgsSchema: z.ZodObject<{
12
13
  }, z.core.$strict>;
13
14
  export type McpListToolsArgs = z.infer<typeof McpListToolsArgsSchema>;
14
15
  export declare class McpListToolsTool extends McpToolBase<McpListToolsArgs> {
15
- call(args: McpListToolsArgs, options?: ToolCallOptions<McpToolConfig>): Promise<ToolResult>;
16
+ protected handle(args: McpListToolsArgs, ctx: LoopstackContext, options?: ToolCallOptions<McpToolConfig>): Promise<ToolResult>;
16
17
  }
17
18
  //# sourceMappingURL=mcp-list-tools.tool.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"mcp-list-tools.tool.d.ts","sourceRoot":"","sources":["../../src/tools/mcp-list-tools.tool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAQ,eAAe,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAEtE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qCAAqC,CAAC;AAEzE,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEjD,eAAO,MAAM,sBAAsB;;;;;;;kBAA0B,CAAC;AAE9D,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC;AAEtE,qBAQa,gBAAiB,SAAQ,WAAW,CAAC,gBAAgB,CAAC;IAC3D,IAAI,CAAC,IAAI,EAAE,gBAAgB,EAAE,OAAO,CAAC,EAAE,eAAe,CAAC,aAAa,CAAC,GAAG,OAAO,CAAC,UAAU,CAAC;CAUlG"}
1
+ {"version":3,"file":"mcp-list-tools.tool.d.ts","sourceRoot":"","sources":["../../src/tools/mcp-list-tools.tool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAQ,eAAe,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACtE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAE1D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qCAAqC,CAAC;AAEzE,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEjD,eAAO,MAAM,sBAAsB;;;;;;;kBAA0B,CAAC;AAE9D,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC;AAEtE,qBAOa,gBAAiB,SAAQ,WAAW,CAAC,gBAAgB,CAAC;cACjD,MAAM,CACpB,IAAI,EAAE,gBAAgB,EACtB,GAAG,EAAE,gBAAgB,EACrB,OAAO,CAAC,EAAE,eAAe,CAAC,aAAa,CAAC,GACvC,OAAO,CAAC,UAAU,CAAC;CAUvB"}
@@ -10,7 +10,7 @@ import { McpConnectionArgsSchema } from './mcp-connection-args.schema.js';
10
10
  import { McpToolBase } from './mcp-tool-base.js';
11
11
  export const McpListToolsArgsSchema = McpConnectionArgsSchema;
12
12
  let McpListToolsTool = class McpListToolsTool extends McpToolBase {
13
- async call(args, options) {
13
+ async handle(args, ctx, options) {
14
14
  const cfg = this.requireConfig(options?.config);
15
15
  const result = await this.mcp.listTools(args.serverUrl, cfg, {
16
16
  timeoutMs: args.timeoutMs,
@@ -21,9 +21,8 @@ let McpListToolsTool = class McpListToolsTool extends McpToolBase {
21
21
  };
22
22
  McpListToolsTool = __decorate([
23
23
  Tool({
24
- uiConfig: {
25
- description: 'Lists tool definitions exposed by a remote MCP server (Streamable HTTP or legacy SSE). Requires `allowedHosts` (and optional auth headers) via `@InjectTool`.',
26
- },
24
+ name: 'mcp_list_tools',
25
+ description: 'Lists tool definitions exposed by a remote MCP server (Streamable HTTP or legacy SSE). Requires `allowedHosts` (and optional auth headers) via tool config.',
27
26
  schema: McpListToolsArgsSchema,
28
27
  configSchema: McpToolConfigSchema,
29
28
  })
@@ -1 +1 @@
1
- {"version":3,"file":"mcp-list-tools.tool.js","sourceRoot":"","sources":["../../src/tools/mcp-list-tools.tool.ts"],"names":[],"mappings":";;;;;;AACA,OAAO,EAAE,IAAI,EAA+B,MAAM,mBAAmB,CAAC;AACtE,OAAO,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAC;AAE1E,OAAO,EAAE,uBAAuB,EAAE,MAAM,iCAAiC,CAAC;AAC1E,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEjD,MAAM,CAAC,MAAM,sBAAsB,GAAG,uBAAuB,CAAC;AAYvD,IAAM,gBAAgB,GAAtB,MAAM,gBAAiB,SAAQ,WAA6B;IACjE,KAAK,CAAC,IAAI,CAAC,IAAsB,EAAE,OAAwC;QACzE,MAAM,GAAG,GAAG,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAEhD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,EAAE;YAC3D,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,SAAS,EAAE,IAAI,CAAC,SAAS;SAC1B,CAAC,CAAC;QAEH,OAAO,EAAE,IAAI,EAAE,MAAiC,EAAE,CAAC;IACrD,CAAC;CACF,CAAA;AAXY,gBAAgB;IAR5B,IAAI,CAAC;QACJ,QAAQ,EAAE;YACR,WAAW,EACT,+JAA+J;SAClK;QACD,MAAM,EAAE,sBAAsB;QAC9B,YAAY,EAAE,mBAAmB;KAClC,CAAC;GACW,gBAAgB,CAW5B"}
1
+ {"version":3,"file":"mcp-list-tools.tool.js","sourceRoot":"","sources":["../../src/tools/mcp-list-tools.tool.ts"],"names":[],"mappings":";;;;;;AACA,OAAO,EAAE,IAAI,EAA+B,MAAM,mBAAmB,CAAC;AAEtE,OAAO,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAC;AAE1E,OAAO,EAAE,uBAAuB,EAAE,MAAM,iCAAiC,CAAC;AAC1E,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEjD,MAAM,CAAC,MAAM,sBAAsB,GAAG,uBAAuB,CAAC;AAWvD,IAAM,gBAAgB,GAAtB,MAAM,gBAAiB,SAAQ,WAA6B;IACvD,KAAK,CAAC,MAAM,CACpB,IAAsB,EACtB,GAAqB,EACrB,OAAwC;QAExC,MAAM,GAAG,GAAG,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAEhD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,EAAE;YAC3D,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,SAAS,EAAE,IAAI,CAAC,SAAS;SAC1B,CAAC,CAAC;QAEH,OAAO,EAAE,IAAI,EAAE,MAAiC,EAAE,CAAC;IACrD,CAAC;CACF,CAAA;AAfY,gBAAgB;IAP5B,IAAI,CAAC;QACJ,IAAI,EAAE,gBAAgB;QACtB,WAAW,EACT,6JAA6J;QAC/J,MAAM,EAAE,sBAAsB;QAC9B,YAAY,EAAE,mBAAmB;KAClC,CAAC;GACW,gBAAgB,CAe5B"}
@@ -3,6 +3,7 @@ import type { McpToolConfig } from '../config/mcp-tool-config.schema.js';
3
3
  import { McpClientService } from '../services/mcp-client.service.js';
4
4
  export declare abstract class McpToolBase<TArgs extends object> extends BaseTool<TArgs, McpToolConfig> {
5
5
  protected readonly mcp: McpClientService;
6
+ private readonly defaultConfig?;
6
7
  protected requireConfig(config: McpToolConfig | undefined): McpToolConfig;
7
8
  }
8
9
  //# sourceMappingURL=mcp-tool-base.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"mcp-tool-base.d.ts","sourceRoot":"","sources":["../../src/tools/mcp-tool-base.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qCAAqC,CAAC;AACzE,OAAO,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAC;AAMrE,8BAAsB,WAAW,CAAC,KAAK,SAAS,MAAM,CAAE,SAAQ,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC;IAClF,SAAS,CAAC,QAAQ,CAAC,GAAG,EAAG,gBAAgB,CAAC;IAEpD,SAAS,CAAC,aAAa,CAAC,MAAM,EAAE,aAAa,GAAG,SAAS,GAAG,aAAa;CAM1E"}
1
+ {"version":3,"file":"mcp-tool-base.d.ts","sourceRoot":"","sources":["../../src/tools/mcp-tool-base.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qCAAqC,CAAC;AACzE,OAAO,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAC;AAOrE,8BAAsB,WAAW,CAAC,KAAK,SAAS,MAAM,CAAE,SAAQ,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC;IAClF,SAAS,CAAC,QAAQ,CAAC,GAAG,EAAG,gBAAgB,CAAC;IACZ,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAuB;IAE9F,SAAS,CAAC,aAAa,CAAC,MAAM,EAAE,aAAa,GAAG,SAAS,GAAG,aAAa;CAS1E"}
@@ -7,20 +7,28 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
7
7
  var __metadata = (this && this.__metadata) || function (k, v) {
8
8
  if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
9
  };
10
- import { Inject } from '@nestjs/common';
10
+ import { Inject, Optional } from '@nestjs/common';
11
11
  import { BaseTool } from '@loopstack/common';
12
12
  import { McpClientService } from '../services/mcp-client.service.js';
13
+ import { MCP_DEFAULT_CONFIG } from '../tokens.js';
13
14
  export class McpToolBase extends BaseTool {
14
15
  mcp;
16
+ defaultConfig;
15
17
  requireConfig(config) {
16
- if (!config?.allowedHosts?.length) {
17
- throw new Error(`${this.constructor.name} requires @InjectTool({ allowedHosts: [...] }) configuration.`);
18
+ const resolved = config ?? this.defaultConfig ?? undefined;
19
+ if (!resolved?.allowedHosts?.length) {
20
+ throw new Error(`${this.constructor.name} requires config with allowedHosts: [...] (via options.config or McpModule.forRoot()).`);
18
21
  }
19
- return config;
22
+ return resolved;
20
23
  }
21
24
  }
22
25
  __decorate([
23
26
  Inject(),
24
27
  __metadata("design:type", McpClientService)
25
28
  ], McpToolBase.prototype, "mcp", void 0);
29
+ __decorate([
30
+ Optional(),
31
+ Inject(MCP_DEFAULT_CONFIG),
32
+ __metadata("design:type", Object)
33
+ ], McpToolBase.prototype, "defaultConfig", void 0);
26
34
  //# sourceMappingURL=mcp-tool-base.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"mcp-tool-base.js","sourceRoot":"","sources":["../../src/tools/mcp-tool-base.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AACxC,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAE7C,OAAO,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAC;AAMrE,MAAM,OAAgB,WAAkC,SAAQ,QAA8B;IAC/D,GAAG,CAAoB;IAE1C,aAAa,CAAC,MAAiC;QACvD,IAAI,CAAC,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,CAAC;YAClC,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,+DAA+D,CAAC,CAAC;QAC3G,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;CACF;AAR8B;IAA5B,MAAM,EAAE;8BAA0B,gBAAgB;wCAAC"}
1
+ {"version":3,"file":"mcp-tool-base.js","sourceRoot":"","sources":["../../src/tools/mcp-tool-base.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAE7C,OAAO,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAC;AACrE,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAMlD,MAAM,OAAgB,WAAkC,SAAQ,QAA8B;IAC/D,GAAG,CAAoB;IACK,aAAa,CAAwB;IAEpF,aAAa,CAAC,MAAiC;QACvD,MAAM,QAAQ,GAAG,MAAM,IAAI,IAAI,CAAC,aAAa,IAAI,SAAS,CAAC;QAC3D,IAAI,CAAC,QAAQ,EAAE,YAAY,EAAE,MAAM,EAAE,CAAC;YACpC,MAAM,IAAI,KAAK,CACb,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,wFAAwF,CACjH,CAAC;QACJ,CAAC;QACD,OAAO,QAAQ,CAAC;IAClB,CAAC;CACF;AAZ8B;IAA5B,MAAM,EAAE;8BAA0B,gBAAgB;wCAAC;AACK;IAAxD,QAAQ,EAAE;IAAE,MAAM,CAAC,kBAAkB,CAAC;;kDAAuD"}
package/package.json CHANGED
@@ -8,7 +8,7 @@
8
8
  "loopstack",
9
9
  "tool"
10
10
  ],
11
- "version": "0.2.1",
11
+ "version": "0.3.1",
12
12
  "license": "MIT",
13
13
  "author": {
14
14
  "name": "Jakob Klippel",
@@ -32,19 +32,26 @@
32
32
  "watch": "nest build --watch"
33
33
  },
34
34
  "dependencies": {
35
- "@loopstack/common": "^0.31.0",
36
- "@loopstack/core": "^0.31.0",
37
- "@modelcontextprotocol/sdk": "^1.29.0",
35
+ "@modelcontextprotocol/sdk": "^1.29.0"
36
+ },
37
+ "devDependencies": {
38
+ "@loopstack/common": "^0.32.3",
39
+ "@loopstack/core": "^0.32.3",
38
40
  "@nestjs/common": "^11.1.19",
39
41
  "@nestjs/core": "^11.1.19",
42
+ "@swc/core": "^1.15.33",
43
+ "unplugin-swc": "^1.5.9",
44
+ "vitest": "^4.1.6",
40
45
  "zod": "^4.3.6"
41
46
  },
47
+ "peerDependencies": {
48
+ "@loopstack/common": "^0.32.3",
49
+ "@loopstack/core": "^0.32.3",
50
+ "@nestjs/common": "^11.0.0",
51
+ "@nestjs/core": "^11.0.0",
52
+ "zod": "^4.0.0"
53
+ },
42
54
  "files": [
43
55
  "dist"
44
- ],
45
- "devDependencies": {
46
- "vitest": "^4.1.6",
47
- "@swc/core": "^1.15.33",
48
- "unplugin-swc": "^1.5.9"
49
- }
56
+ ]
50
57
  }