@mce-bt/microagents-mcp 0.1.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/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp-client.d.ts +42 -0
- package/dist/mcp-client.d.ts.map +1 -0
- package/dist/mcp-client.js +129 -0
- package/dist/mcp-client.js.map +1 -0
- package/dist/mcp-server.d.ts +34 -0
- package/dist/mcp-server.d.ts.map +1 -0
- package/dist/mcp-server.js +92 -0
- package/dist/mcp-server.js.map +1 -0
- package/package.json +50 -0
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,KAAK,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AAC9E,OAAO,EAAE,gBAAgB,EAAE,KAAK,eAAe,EAAE,MAAM,iBAAiB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAA8B,MAAM,iBAAiB,CAAC;AAC9E,OAAO,EAAE,gBAAgB,EAAwB,MAAM,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import type { ToolRegistry } from '@mce-bt/microagents-core';
|
|
2
|
+
export interface McpServerConfig {
|
|
3
|
+
/** Unique name for this MCP server connection */
|
|
4
|
+
name: string;
|
|
5
|
+
/** Transport type */
|
|
6
|
+
transport: 'stdio' | 'http';
|
|
7
|
+
/** For stdio: command and args to launch the MCP server */
|
|
8
|
+
command?: string;
|
|
9
|
+
args?: string[];
|
|
10
|
+
env?: Record<string, string>;
|
|
11
|
+
/** For http: URL of the MCP server */
|
|
12
|
+
url?: string;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* MCP Client Manager — connects to external MCP servers
|
|
16
|
+
* and imports their tools into the agent's ToolRegistry.
|
|
17
|
+
*/
|
|
18
|
+
export declare class McpClientManager {
|
|
19
|
+
private servers;
|
|
20
|
+
private toolRegistry;
|
|
21
|
+
constructor(toolRegistry: ToolRegistry);
|
|
22
|
+
/**
|
|
23
|
+
* Connect to an MCP server and import its tools into the agent's ToolRegistry.
|
|
24
|
+
*/
|
|
25
|
+
connectServer(config: McpServerConfig): Promise<string[]>;
|
|
26
|
+
/**
|
|
27
|
+
* Disconnect from an MCP server and remove its tools.
|
|
28
|
+
*/
|
|
29
|
+
disconnectServer(name: string): Promise<void>;
|
|
30
|
+
/**
|
|
31
|
+
* Disconnect from all MCP servers.
|
|
32
|
+
*/
|
|
33
|
+
disconnectAll(): Promise<void>;
|
|
34
|
+
/** List connected MCP servers */
|
|
35
|
+
listServers(): Array<{
|
|
36
|
+
name: string;
|
|
37
|
+
toolCount: number;
|
|
38
|
+
}>;
|
|
39
|
+
/** Get all tool names from a specific server */
|
|
40
|
+
getServerTools(name: string): string[];
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=mcp-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-client.d.ts","sourceRoot":"","sources":["../src/mcp-client.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,YAAY,EAAkB,MAAM,0BAA0B,CAAC;AAG7E,MAAM,WAAW,eAAe;IAC9B,iDAAiD;IACjD,IAAI,EAAE,MAAM,CAAC;IACb,qBAAqB;IACrB,SAAS,EAAE,OAAO,GAAG,MAAM,CAAC;IAC5B,2DAA2D;IAC3D,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,sCAAsC;IACtC,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AASD;;;GAGG;AACH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,OAAO,CAAsC;IACrD,OAAO,CAAC,YAAY,CAAe;gBAEvB,YAAY,EAAE,YAAY;IAItC;;OAEG;IACG,aAAa,CAAC,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IA2F/D;;OAEG;IACG,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAanD;;OAEG;IACG,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;IAOpC,iCAAiC;IACjC,WAAW,IAAI,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC;IAOzD,gDAAgD;IAChD,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE;CAGvC"}
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
import { Client } from '@modelcontextprotocol/sdk/client/index.js';
|
|
2
|
+
import { StdioClientTransport } from '@modelcontextprotocol/sdk/client/stdio.js';
|
|
3
|
+
import { StreamableHTTPClientTransport } from '@modelcontextprotocol/sdk/client/streamableHttp.js';
|
|
4
|
+
import { z } from 'zod';
|
|
5
|
+
/**
|
|
6
|
+
* MCP Client Manager — connects to external MCP servers
|
|
7
|
+
* and imports their tools into the agent's ToolRegistry.
|
|
8
|
+
*/
|
|
9
|
+
export class McpClientManager {
|
|
10
|
+
servers = new Map();
|
|
11
|
+
toolRegistry;
|
|
12
|
+
constructor(toolRegistry) {
|
|
13
|
+
this.toolRegistry = toolRegistry;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Connect to an MCP server and import its tools into the agent's ToolRegistry.
|
|
17
|
+
*/
|
|
18
|
+
async connectServer(config) {
|
|
19
|
+
if (this.servers.has(config.name)) {
|
|
20
|
+
throw new Error(`MCP server "${config.name}" is already connected`);
|
|
21
|
+
}
|
|
22
|
+
let transport;
|
|
23
|
+
if (config.transport === 'stdio') {
|
|
24
|
+
if (!config.command)
|
|
25
|
+
throw new Error('stdio transport requires "command"');
|
|
26
|
+
transport = new StdioClientTransport({
|
|
27
|
+
command: config.command,
|
|
28
|
+
args: config.args,
|
|
29
|
+
env: config.env,
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
else if (config.transport === 'http') {
|
|
33
|
+
if (!config.url)
|
|
34
|
+
throw new Error('http transport requires "url"');
|
|
35
|
+
transport = new StreamableHTTPClientTransport(new URL(config.url));
|
|
36
|
+
}
|
|
37
|
+
else {
|
|
38
|
+
throw new Error(`Unsupported transport: ${config.transport}`);
|
|
39
|
+
}
|
|
40
|
+
const client = new Client({ name: `microagent-mcp-client`, version: '0.1.0' }, { capabilities: {} });
|
|
41
|
+
await client.connect(transport);
|
|
42
|
+
// List available tools from the server
|
|
43
|
+
const { tools } = await client.listTools();
|
|
44
|
+
const registeredNames = [];
|
|
45
|
+
for (const tool of tools) {
|
|
46
|
+
const toolName = `mcp_${config.name}_${tool.name}`;
|
|
47
|
+
// Build a pass-through Zod schema (we validate at MCP server side)
|
|
48
|
+
const zodSchema = z.record(z.unknown());
|
|
49
|
+
// Use the MCP tool's own JSON schema for LLM completion requests
|
|
50
|
+
const inputSchema = (tool.inputSchema ?? { type: 'object', properties: {} });
|
|
51
|
+
const registeredTool = {
|
|
52
|
+
name: toolName,
|
|
53
|
+
description: tool.description ?? `MCP tool from ${config.name}`,
|
|
54
|
+
parameters: zodSchema,
|
|
55
|
+
jsonSchema: inputSchema,
|
|
56
|
+
visibility: 'internal',
|
|
57
|
+
handler: async (params) => {
|
|
58
|
+
const result = await client.callTool({
|
|
59
|
+
name: tool.name,
|
|
60
|
+
arguments: params,
|
|
61
|
+
});
|
|
62
|
+
if (result.isError) {
|
|
63
|
+
const errorContent = result.content;
|
|
64
|
+
const errorText = Array.isArray(errorContent)
|
|
65
|
+
? errorContent
|
|
66
|
+
.filter((c) => c.type === 'text')
|
|
67
|
+
.map((c) => c.text)
|
|
68
|
+
.join('\n')
|
|
69
|
+
: String(errorContent);
|
|
70
|
+
throw new Error(errorText);
|
|
71
|
+
}
|
|
72
|
+
// Extract text content from MCP result
|
|
73
|
+
const content = result.content;
|
|
74
|
+
if (Array.isArray(content)) {
|
|
75
|
+
const texts = content
|
|
76
|
+
.filter((c) => c.type === 'text')
|
|
77
|
+
.map((c) => c.text);
|
|
78
|
+
return texts.length === 1 ? texts[0] : texts.join('\n');
|
|
79
|
+
}
|
|
80
|
+
return content;
|
|
81
|
+
},
|
|
82
|
+
};
|
|
83
|
+
this.toolRegistry.register(registeredTool);
|
|
84
|
+
registeredNames.push(toolName);
|
|
85
|
+
}
|
|
86
|
+
this.servers.set(config.name, {
|
|
87
|
+
name: config.name,
|
|
88
|
+
client,
|
|
89
|
+
transport,
|
|
90
|
+
toolNames: registeredNames,
|
|
91
|
+
});
|
|
92
|
+
return registeredNames;
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Disconnect from an MCP server and remove its tools.
|
|
96
|
+
*/
|
|
97
|
+
async disconnectServer(name) {
|
|
98
|
+
const server = this.servers.get(name);
|
|
99
|
+
if (!server)
|
|
100
|
+
return;
|
|
101
|
+
// Unregister tools
|
|
102
|
+
for (const toolName of server.toolNames) {
|
|
103
|
+
this.toolRegistry.unregister(toolName);
|
|
104
|
+
}
|
|
105
|
+
await server.client.close();
|
|
106
|
+
this.servers.delete(name);
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Disconnect from all MCP servers.
|
|
110
|
+
*/
|
|
111
|
+
async disconnectAll() {
|
|
112
|
+
const names = [...this.servers.keys()];
|
|
113
|
+
for (const name of names) {
|
|
114
|
+
await this.disconnectServer(name);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
/** List connected MCP servers */
|
|
118
|
+
listServers() {
|
|
119
|
+
return [...this.servers.values()].map((s) => ({
|
|
120
|
+
name: s.name,
|
|
121
|
+
toolCount: s.toolNames.length,
|
|
122
|
+
}));
|
|
123
|
+
}
|
|
124
|
+
/** Get all tool names from a specific server */
|
|
125
|
+
getServerTools(name) {
|
|
126
|
+
return this.servers.get(name)?.toolNames ?? [];
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
//# sourceMappingURL=mcp-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-client.js","sourceRoot":"","sources":["../src/mcp-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js';
|
|
2
|
+
import type { Transport } from '@modelcontextprotocol/sdk/shared/transport.js';
|
|
3
|
+
import type { ToolRegistry } from '@mce-bt/microagents-core';
|
|
4
|
+
export interface McpServerBridgeConfig {
|
|
5
|
+
name: string;
|
|
6
|
+
version: string;
|
|
7
|
+
instructions?: string;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Bridge between a microagent's ToolRegistry and the MCP protocol.
|
|
11
|
+
* Exposes agent's public tools as MCP tools so external MCP clients can call them.
|
|
12
|
+
*/
|
|
13
|
+
export declare class McpServerBridge {
|
|
14
|
+
private mcpServer;
|
|
15
|
+
private toolRegistry;
|
|
16
|
+
private transport;
|
|
17
|
+
constructor(toolRegistry: ToolRegistry, config: McpServerBridgeConfig);
|
|
18
|
+
private registerTools;
|
|
19
|
+
/**
|
|
20
|
+
* Start the MCP server with stdio transport (default for CLI-based MCP servers).
|
|
21
|
+
*/
|
|
22
|
+
startStdio(): Promise<void>;
|
|
23
|
+
/**
|
|
24
|
+
* Start the MCP server with a Streamable HTTP transport.
|
|
25
|
+
* Returns the transport so it can be mounted on an existing HTTP server.
|
|
26
|
+
*/
|
|
27
|
+
createHttpTransport(): StreamableHTTPServerTransport;
|
|
28
|
+
/**
|
|
29
|
+
* Connect with any custom transport.
|
|
30
|
+
*/
|
|
31
|
+
connect(transport: Transport): Promise<void>;
|
|
32
|
+
stop(): Promise<void>;
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=mcp-server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-server.d.ts","sourceRoot":"","sources":["../src/mcp-server.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,6BAA6B,EAAE,MAAM,oDAAoD,CAAC;AACnG,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,+CAA+C,CAAC;AAC/E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAG7D,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAcD;;;GAGG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,SAAS,CAAY;IAC7B,OAAO,CAAC,YAAY,CAAe;IACnC,OAAO,CAAC,SAAS,CAA0B;gBAE/B,YAAY,EAAE,YAAY,EAAE,MAAM,EAAE,qBAAqB;IAarE,OAAO,CAAC,aAAa;IAuCrB;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAKjC;;;OAGG;IACH,mBAAmB,IAAI,6BAA6B;IASpD;;OAEG;IACG,OAAO,CAAC,SAAS,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;IAK5C,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;CAI5B"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
|
+
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
3
|
+
import { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js';
|
|
4
|
+
/**
|
|
5
|
+
* Try to extract the raw shape from a ZodObject schema.
|
|
6
|
+
* Returns undefined if the schema is not a ZodObject.
|
|
7
|
+
*/
|
|
8
|
+
function extractZodShape(schema) {
|
|
9
|
+
const def = schema._def;
|
|
10
|
+
if (def?.typeName === 'ZodObject' && typeof def.shape === 'function') {
|
|
11
|
+
return def.shape();
|
|
12
|
+
}
|
|
13
|
+
return undefined;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Bridge between a microagent's ToolRegistry and the MCP protocol.
|
|
17
|
+
* Exposes agent's public tools as MCP tools so external MCP clients can call them.
|
|
18
|
+
*/
|
|
19
|
+
export class McpServerBridge {
|
|
20
|
+
mcpServer;
|
|
21
|
+
toolRegistry;
|
|
22
|
+
transport = null;
|
|
23
|
+
constructor(toolRegistry, config) {
|
|
24
|
+
this.toolRegistry = toolRegistry;
|
|
25
|
+
this.mcpServer = new McpServer({ name: config.name, version: config.version }, {
|
|
26
|
+
capabilities: { tools: {} },
|
|
27
|
+
instructions: config.instructions,
|
|
28
|
+
});
|
|
29
|
+
this.registerTools();
|
|
30
|
+
}
|
|
31
|
+
registerTools() {
|
|
32
|
+
const publicTools = this.toolRegistry.getByVisibility('public');
|
|
33
|
+
for (const tool of publicTools) {
|
|
34
|
+
const shape = extractZodShape(tool.parameters);
|
|
35
|
+
const callback = async (args) => {
|
|
36
|
+
const result = await this.toolRegistry.execute(`mcp-${Date.now()}`, tool.name, args);
|
|
37
|
+
if (result.error) {
|
|
38
|
+
return {
|
|
39
|
+
content: [{ type: 'text', text: result.error }],
|
|
40
|
+
isError: true,
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
return {
|
|
44
|
+
content: [{
|
|
45
|
+
type: 'text',
|
|
46
|
+
text: typeof result.result === 'string'
|
|
47
|
+
? result.result
|
|
48
|
+
: JSON.stringify(result.result),
|
|
49
|
+
}],
|
|
50
|
+
};
|
|
51
|
+
};
|
|
52
|
+
if (shape) {
|
|
53
|
+
this.mcpServer.tool(tool.name, tool.description, shape, callback);
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
// No schema — register without parameters
|
|
57
|
+
this.mcpServer.tool(tool.name, tool.description, callback);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Start the MCP server with stdio transport (default for CLI-based MCP servers).
|
|
63
|
+
*/
|
|
64
|
+
async startStdio() {
|
|
65
|
+
this.transport = new StdioServerTransport();
|
|
66
|
+
await this.mcpServer.connect(this.transport);
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Start the MCP server with a Streamable HTTP transport.
|
|
70
|
+
* Returns the transport so it can be mounted on an existing HTTP server.
|
|
71
|
+
*/
|
|
72
|
+
createHttpTransport() {
|
|
73
|
+
const transport = new StreamableHTTPServerTransport({
|
|
74
|
+
sessionIdGenerator: () => crypto.randomUUID(),
|
|
75
|
+
});
|
|
76
|
+
this.transport = transport;
|
|
77
|
+
void this.mcpServer.connect(transport);
|
|
78
|
+
return transport;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Connect with any custom transport.
|
|
82
|
+
*/
|
|
83
|
+
async connect(transport) {
|
|
84
|
+
this.transport = transport;
|
|
85
|
+
await this.mcpServer.connect(transport);
|
|
86
|
+
}
|
|
87
|
+
async stop() {
|
|
88
|
+
await this.mcpServer.close();
|
|
89
|
+
this.transport = null;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=mcp-server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-server.js","sourceRoot":"","sources":["../src/mcp-server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,6BAA6B,EAAE,MAAM,oDAAoD,CAAC;AAWnG;;;GAGG;AACH,SAAS,eAAe,CAAC,MAAiB;IACxC,MAAM,GAAG,GAAI,MAAuD,CAAC,IAAI,CAAC;IAC1E,IAAI,GAAG,EAAE,QAAQ,KAAK,WAAW,IAAI,OAAO,GAAG,CAAC,KAAK,KAAK,UAAU,EAAE,CAAC;QACrE,OAAQ,GAAG,CAAC,KAA2B,EAAE,CAAC;IAC5C,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;GAGG;AACH,MAAM,OAAO,eAAe;IAClB,SAAS,CAAY;IACrB,YAAY,CAAe;IAC3B,SAAS,GAAqB,IAAI,CAAC;IAE3C,YAAY,YAA0B,EAAE,MAA6B;QACnE,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;QACjC,IAAI,CAAC,SAAS,GAAG,IAAI,SAAS,CAC5B,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,EAC9C;YACE,YAAY,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE;YAC3B,YAAY,EAAE,MAAM,CAAC,YAAY;SAClC,CACF,CAAC;QAEF,IAAI,CAAC,aAAa,EAAE,CAAC;IACvB,CAAC;IAEO,aAAa;QACnB,MAAM,WAAW,GAAG,IAAI,CAAC,YAAY,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC;QAEhE,KAAK,MAAM,IAAI,IAAI,WAAW,EAAE,CAAC;YAC/B,MAAM,KAAK,GAAG,eAAe,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAE/C,MAAM,QAAQ,GAAG,KAAK,EAAE,IAA6B,EAAE,EAAE;gBACvD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,OAAO,CAC5C,OAAO,IAAI,CAAC,GAAG,EAAE,EAAE,EACnB,IAAI,CAAC,IAAI,EACT,IAAI,CACL,CAAC;gBAEF,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;oBACjB,OAAO;wBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC;wBACxD,OAAO,EAAE,IAAI;qBACd,CAAC;gBACJ,CAAC;gBAED,OAAO;oBACL,OAAO,EAAE,CAAC;4BACR,IAAI,EAAE,MAAe;4BACrB,IAAI,EAAE,OAAO,MAAM,CAAC,MAAM,KAAK,QAAQ;gCACrC,CAAC,CAAC,MAAM,CAAC,MAAM;gCACf,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC;yBAClC,CAAC;iBACH,CAAC;YACJ,CAAC,CAAC;YAEF,IAAI,KAAK,EAAE,CAAC;gBACV,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,WAAW,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;YACpE,CAAC;iBAAM,CAAC;gBACN,0CAA0C;gBAC1C,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;YAC7D,CAAC;QACH,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,UAAU;QACd,IAAI,CAAC,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;QAC5C,MAAM,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC/C,CAAC;IAED;;;OAGG;IACH,mBAAmB;QACjB,MAAM,SAAS,GAAG,IAAI,6BAA6B,CAAC;YAClD,kBAAkB,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,UAAU,EAAE;SAC9C,CAAC,CAAC;QACH,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,KAAK,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QACvC,OAAO,SAAS,CAAC;IACnB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,OAAO,CAAC,SAAoB;QAChC,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,MAAM,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAC1C,CAAC;IAED,KAAK,CAAC,IAAI;QACR,MAAM,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;QAC7B,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;IACxB,CAAC;CACF"}
|
package/package.json
ADDED
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@mce-bt/microagents-mcp",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "MCP integration — expose agent tools as MCP server and consume external MCP servers",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "dist/index.js",
|
|
7
|
+
"types": "dist/index.d.ts",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"types": "./dist/index.d.ts",
|
|
11
|
+
"import": "./dist/index.js"
|
|
12
|
+
}
|
|
13
|
+
},
|
|
14
|
+
"scripts": {
|
|
15
|
+
"build": "tsc --build",
|
|
16
|
+
"clean": "rm -rf dist tsconfig.tsbuildinfo",
|
|
17
|
+
"test": "vitest run --passWithNoTests"
|
|
18
|
+
},
|
|
19
|
+
"dependencies": {
|
|
20
|
+
"@modelcontextprotocol/sdk": "^1.12.1",
|
|
21
|
+
"zod": "^3.23.0"
|
|
22
|
+
},
|
|
23
|
+
"peerDependencies": {
|
|
24
|
+
"@mce-bt/microagents-core": "^0.1.0"
|
|
25
|
+
},
|
|
26
|
+
"peerDependenciesMeta": {
|
|
27
|
+
"@mce-bt/microagents-core": {
|
|
28
|
+
"optional": false
|
|
29
|
+
}
|
|
30
|
+
},
|
|
31
|
+
"license": "MIT",
|
|
32
|
+
"files": [
|
|
33
|
+
"dist"
|
|
34
|
+
],
|
|
35
|
+
"publishConfig": {
|
|
36
|
+
"access": "public"
|
|
37
|
+
},
|
|
38
|
+
"repository": {
|
|
39
|
+
"type": "git",
|
|
40
|
+
"url": "git+https://github.com/cavillo/microagents.git",
|
|
41
|
+
"directory": "packages/mcp"
|
|
42
|
+
},
|
|
43
|
+
"homepage": "https://github.com/cavillo/microagents#readme",
|
|
44
|
+
"bugs": {
|
|
45
|
+
"url": "https://github.com/cavillo/microagents/issues"
|
|
46
|
+
},
|
|
47
|
+
"engines": {
|
|
48
|
+
"node": ">=20.0.0"
|
|
49
|
+
}
|
|
50
|
+
}
|