@loopstack/mcp-module 0.2.1 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +18 -18
- package/dist/config/mcp-tool-config.schema.d.ts +1 -0
- package/dist/config/mcp-tool-config.schema.d.ts.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/mcp.module.d.ts +3 -0
- package/dist/mcp.module.d.ts.map +1 -1
- package/dist/mcp.module.js +23 -15
- package/dist/mcp.module.js.map +1 -1
- package/dist/tokens.d.ts +2 -0
- package/dist/tokens.d.ts.map +1 -0
- package/dist/tokens.js +2 -0
- package/dist/tokens.js.map +1 -0
- package/dist/tools/mcp-call.tool.d.ts +2 -1
- package/dist/tools/mcp-call.tool.d.ts.map +1 -1
- package/dist/tools/mcp-call.tool.js +3 -4
- package/dist/tools/mcp-call.tool.js.map +1 -1
- package/dist/tools/mcp-list-tools.tool.d.ts +2 -1
- package/dist/tools/mcp-list-tools.tool.d.ts.map +1 -1
- package/dist/tools/mcp-list-tools.tool.js +3 -4
- package/dist/tools/mcp-list-tools.tool.js.map +1 -1
- package/dist/tools/mcp-tool-base.d.ts +1 -0
- package/dist/tools/mcp-tool-base.d.ts.map +1 -1
- package/dist/tools/mcp-tool-base.js +12 -4
- package/dist/tools/mcp-tool-base.js.map +1 -1
- package/package.json +3 -3
package/README.md
CHANGED
|
@@ -39,16 +39,18 @@ flow through headers.
|
|
|
39
39
|
|
|
40
40
|
## Authentication
|
|
41
41
|
|
|
42
|
-
Configure auth headers via
|
|
42
|
+
Configure auth headers via constructor injection config:
|
|
43
43
|
|
|
44
44
|
```ts
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
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**
|
|
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
|
|
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
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
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
|
-
|
|
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
|
|
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
package/dist/index.d.ts.map
CHANGED
|
@@ -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
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"}
|
package/dist/mcp.module.d.ts
CHANGED
|
@@ -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
|
package/dist/mcp.module.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp.module.d.ts","sourceRoot":"","sources":["../src/mcp.module.ts"],"names":[],"mappings":"
|
|
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"}
|
package/dist/mcp.module.js
CHANGED
|
@@ -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
|
-
|
|
14
|
-
|
|
15
|
-
|
|
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
|
-
|
|
18
|
-
|
|
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
|
package/dist/mcp.module.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp.module.js","sourceRoot":"","sources":["../src/mcp.module.ts"],"names":[],"mappings":"
|
|
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"}
|
package/dist/tokens.d.ts
ADDED
|
@@ -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 @@
|
|
|
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
|
-
|
|
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;
|
|
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
|
|
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
|
-
|
|
29
|
-
|
|
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;
|
|
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
|
-
|
|
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;
|
|
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
|
|
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
|
-
|
|
25
|
-
|
|
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;
|
|
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;
|
|
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
|
-
|
|
17
|
-
|
|
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
|
|
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;
|
|
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.
|
|
11
|
+
"version": "0.3.0",
|
|
12
12
|
"license": "MIT",
|
|
13
13
|
"author": {
|
|
14
14
|
"name": "Jakob Klippel",
|
|
@@ -32,8 +32,8 @@
|
|
|
32
32
|
"watch": "nest build --watch"
|
|
33
33
|
},
|
|
34
34
|
"dependencies": {
|
|
35
|
-
"@loopstack/common": "^0.
|
|
36
|
-
"@loopstack/core": "^0.
|
|
35
|
+
"@loopstack/common": "^0.32.0",
|
|
36
|
+
"@loopstack/core": "^0.32.0",
|
|
37
37
|
"@modelcontextprotocol/sdk": "^1.29.0",
|
|
38
38
|
"@nestjs/common": "^11.1.19",
|
|
39
39
|
"@nestjs/core": "^11.1.19",
|