@clawmasons/mcp-agent 0.1.1 → 0.1.3
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/acp-agent.d.ts +39 -0
- package/dist/acp-agent.d.ts.map +1 -0
- package/dist/acp-agent.js +87 -0
- package/dist/acp-agent.js.map +1 -0
- package/dist/agent-package.d.ts +5 -0
- package/dist/agent-package.d.ts.map +1 -0
- package/dist/index.d.ts +17 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +304 -0
- package/dist/index.js.map +1 -0
- package/dist/materializer.d.ts +18 -0
- package/dist/materializer.d.ts.map +1 -0
- package/dist/materializer.js +0 -2
- package/dist/materializer.js.map +2 -2
- package/dist/mcp-client.d.ts +19 -0
- package/dist/mcp-client.d.ts.map +1 -0
- package/dist/mcp-client.js +152 -0
- package/dist/mcp-client.js.map +1 -0
- package/dist/tool-caller.d.ts +67 -0
- package/dist/tool-caller.d.ts.map +1 -0
- package/dist/tool-caller.js +144 -0
- package/dist/tool-caller.js.map +1 -0
- package/package.json +3 -3
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ACP Agent — implements the ACP SDK `Agent` interface backed by a ToolCaller.
|
|
3
|
+
*
|
|
4
|
+
* Handles `initialize`, `newSession`, `prompt`, and `cancel` protocol messages.
|
|
5
|
+
* The `prompt` handler lists available MCP tools and returns them as a text
|
|
6
|
+
* response so the ACP client knows what tools the agent exposes.
|
|
7
|
+
*/
|
|
8
|
+
import type { AgentSideConnection, Agent } from "@agentclientprotocol/sdk";
|
|
9
|
+
import type { InitializeRequest, InitializeResponse, NewSessionRequest, NewSessionResponse, PromptRequest, PromptResponse, CancelNotification } from "@agentclientprotocol/sdk";
|
|
10
|
+
import type { ToolCaller } from "./tool-caller.js";
|
|
11
|
+
export interface AcpAgentConfig {
|
|
12
|
+
/** ToolCaller for listing and calling MCP tools */
|
|
13
|
+
caller: ToolCaller;
|
|
14
|
+
/**
|
|
15
|
+
* Optional callback invoked during newSession to resolve credentials
|
|
16
|
+
* and connect to the MCP proxy. Called once per session.
|
|
17
|
+
*/
|
|
18
|
+
onSessionSetup?: () => Promise<void>;
|
|
19
|
+
}
|
|
20
|
+
export declare class AcpAgent implements Agent {
|
|
21
|
+
private connection;
|
|
22
|
+
private caller;
|
|
23
|
+
private onSessionSetup?;
|
|
24
|
+
private sessionId;
|
|
25
|
+
constructor(connection: AgentSideConnection, config: AcpAgentConfig);
|
|
26
|
+
initialize(_params: InitializeRequest): Promise<InitializeResponse>;
|
|
27
|
+
newSession(_params: NewSessionRequest): Promise<NewSessionResponse>;
|
|
28
|
+
prompt(params: PromptRequest): Promise<PromptResponse>;
|
|
29
|
+
cancel(_params: CancelNotification): Promise<void>;
|
|
30
|
+
authenticate(): Promise<Record<string, never>>;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Create a factory function suitable for passing to `AgentSideConnection`.
|
|
34
|
+
*
|
|
35
|
+
* Usage:
|
|
36
|
+
* new AgentSideConnection(createAcpAgentFactory(config), stream)
|
|
37
|
+
*/
|
|
38
|
+
export declare function createAcpAgentFactory(config: AcpAgentConfig): (conn: AgentSideConnection) => Agent;
|
|
39
|
+
//# sourceMappingURL=acp-agent.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"acp-agent.d.ts","sourceRoot":"","sources":["../src/acp-agent.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,mBAAmB,EAAE,KAAK,EAAE,MAAM,0BAA0B,CAAC;AAE3E,OAAO,KAAK,EACV,iBAAiB,EACjB,kBAAkB,EAClB,iBAAiB,EACjB,kBAAkB,EAClB,aAAa,EACb,cAAc,EACd,kBAAkB,EACnB,MAAM,0BAA0B,CAAC;AAClC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAKnD,MAAM,WAAW,cAAc;IAC7B,mDAAmD;IACnD,MAAM,EAAE,UAAU,CAAC;IACnB;;;OAGG;IACH,cAAc,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CACtC;AAID,qBAAa,QAAS,YAAW,KAAK;IACpC,OAAO,CAAC,UAAU,CAAsB;IACxC,OAAO,CAAC,MAAM,CAAa;IAC3B,OAAO,CAAC,cAAc,CAAC,CAAsB;IAC7C,OAAO,CAAC,SAAS,CAAuB;gBAE5B,UAAU,EAAE,mBAAmB,EAAE,MAAM,EAAE,cAAc;IAM7D,UAAU,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAanE,UAAU,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAgBnE,MAAM,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,cAAc,CAAC;IA4BtD,MAAM,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC;IAIlD,YAAY,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;CAGrD;AAID;;;;;GAKG;AACH,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,cAAc,GACrB,CAAC,IAAI,EAAE,mBAAmB,KAAK,KAAK,CAEtC"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ACP Agent — implements the ACP SDK `Agent` interface backed by a ToolCaller.
|
|
3
|
+
*
|
|
4
|
+
* Handles `initialize`, `newSession`, `prompt`, and `cancel` protocol messages.
|
|
5
|
+
* The `prompt` handler lists available MCP tools and returns them as a text
|
|
6
|
+
* response so the ACP client knows what tools the agent exposes.
|
|
7
|
+
*/
|
|
8
|
+
import { PROTOCOL_VERSION } from "@agentclientprotocol/sdk";
|
|
9
|
+
import { executeCommand } from "./tool-caller.js";
|
|
10
|
+
// ── Implementation ────────────────────────────────────────────────────
|
|
11
|
+
export class AcpAgent {
|
|
12
|
+
connection;
|
|
13
|
+
caller;
|
|
14
|
+
onSessionSetup;
|
|
15
|
+
sessionId = null;
|
|
16
|
+
constructor(connection, config) {
|
|
17
|
+
this.connection = connection;
|
|
18
|
+
this.caller = config.caller;
|
|
19
|
+
this.onSessionSetup = config.onSessionSetup;
|
|
20
|
+
}
|
|
21
|
+
async initialize(_params) {
|
|
22
|
+
return {
|
|
23
|
+
protocolVersion: PROTOCOL_VERSION,
|
|
24
|
+
agentInfo: {
|
|
25
|
+
name: "mcp-agent",
|
|
26
|
+
version: "0.1.0",
|
|
27
|
+
},
|
|
28
|
+
agentCapabilities: {
|
|
29
|
+
loadSession: false,
|
|
30
|
+
},
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
async newSession(_params) {
|
|
34
|
+
// Run credential resolution and proxy connection if configured
|
|
35
|
+
if (this.onSessionSetup) {
|
|
36
|
+
await this.onSessionSetup();
|
|
37
|
+
}
|
|
38
|
+
// Generate a random session ID
|
|
39
|
+
this.sessionId = Array.from(crypto.getRandomValues(new Uint8Array(16)))
|
|
40
|
+
.map((b) => b.toString(16).padStart(2, "0"))
|
|
41
|
+
.join("");
|
|
42
|
+
return {
|
|
43
|
+
sessionId: this.sessionId,
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
async prompt(params) {
|
|
47
|
+
// Extract text from prompt content blocks
|
|
48
|
+
const inputText = params.prompt
|
|
49
|
+
.filter((block) => block.type === "text")
|
|
50
|
+
.map((block) => block.text)
|
|
51
|
+
.join("\n")
|
|
52
|
+
.trim();
|
|
53
|
+
// Execute the command (list, help, call <tool> <args>, etc.)
|
|
54
|
+
const { output } = await executeCommand(inputText, this.caller);
|
|
55
|
+
// Send the result as a session update notification
|
|
56
|
+
await this.connection.sessionUpdate({
|
|
57
|
+
sessionId: params.sessionId,
|
|
58
|
+
update: {
|
|
59
|
+
sessionUpdate: "agent_message_chunk",
|
|
60
|
+
content: {
|
|
61
|
+
type: "text",
|
|
62
|
+
text: output,
|
|
63
|
+
},
|
|
64
|
+
},
|
|
65
|
+
});
|
|
66
|
+
return {
|
|
67
|
+
stopReason: "end_turn",
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
async cancel(_params) {
|
|
71
|
+
// No-op: prompt handler is synchronous, nothing to cancel
|
|
72
|
+
}
|
|
73
|
+
async authenticate() {
|
|
74
|
+
return {};
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
// ── Factory ───────────────────────────────────────────────────────────
|
|
78
|
+
/**
|
|
79
|
+
* Create a factory function suitable for passing to `AgentSideConnection`.
|
|
80
|
+
*
|
|
81
|
+
* Usage:
|
|
82
|
+
* new AgentSideConnection(createAcpAgentFactory(config), stream)
|
|
83
|
+
*/
|
|
84
|
+
export function createAcpAgentFactory(config) {
|
|
85
|
+
return (conn) => new AcpAgent(conn, config);
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=acp-agent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"acp-agent.js","sourceRoot":"","sources":["../src/acp-agent.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAW5D,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAclD,yEAAyE;AAEzE,MAAM,OAAO,QAAQ;IACX,UAAU,CAAsB;IAChC,MAAM,CAAa;IACnB,cAAc,CAAuB;IACrC,SAAS,GAAkB,IAAI,CAAC;IAExC,YAAY,UAA+B,EAAE,MAAsB;QACjE,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;QAC7B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;QAC5B,IAAI,CAAC,cAAc,GAAG,MAAM,CAAC,cAAc,CAAC;IAC9C,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,OAA0B;QACzC,OAAO;YACL,eAAe,EAAE,gBAAgB;YACjC,SAAS,EAAE;gBACT,IAAI,EAAE,WAAW;gBACjB,OAAO,EAAE,OAAO;aACjB;YACD,iBAAiB,EAAE;gBACjB,WAAW,EAAE,KAAK;aACnB;SACF,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,OAA0B;QACzC,+DAA+D;QAC/D,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YACxB,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC;QAC9B,CAAC;QAED,+BAA+B;QAC/B,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,IAAI,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC;aACpE,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;aAC3C,IAAI,CAAC,EAAE,CAAC,CAAC;QAEZ,OAAO;YACL,SAAS,EAAE,IAAI,CAAC,SAAS;SAC1B,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,MAAqB;QAChC,0CAA0C;QAC1C,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM;aAC5B,MAAM,CAAC,CAAC,KAAK,EAA2C,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,MAAM,CAAC;aACjF,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC;aAC1B,IAAI,CAAC,IAAI,CAAC;aACV,IAAI,EAAE,CAAC;QAEV,6DAA6D;QAC7D,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,cAAc,CAAC,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;QAEhE,mDAAmD;QACnD,MAAM,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC;YAClC,SAAS,EAAE,MAAM,CAAC,SAAS;YAC3B,MAAM,EAAE;gBACN,aAAa,EAAE,qBAAqB;gBACpC,OAAO,EAAE;oBACP,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,MAAM;iBACb;aACF;SACF,CAAC,CAAC;QAEH,OAAO;YACL,UAAU,EAAE,UAAU;SACvB,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,OAA2B;QACtC,0DAA0D;IAC5D,CAAC;IAED,KAAK,CAAC,YAAY;QAChB,OAAO,EAAE,CAAC;IACZ,CAAC;CACF;AAED,yEAAyE;AAEzE;;;;;GAKG;AACH,MAAM,UAAU,qBAAqB,CACnC,MAAsB;IAEtB,OAAO,CAAC,IAAyB,EAAS,EAAE,CAAC,IAAI,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;AAC1E,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-package.d.ts","sourceRoot":"","sources":["../src/agent-package.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAG1D,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAEzD,QAAA,MAAM,QAAQ,EAAE,YAaf,CAAC;AAKF,eAAe,QAAQ,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP Agent — General-purpose MCP agent with REPL and ACP modes.
|
|
3
|
+
*
|
|
4
|
+
* Modes:
|
|
5
|
+
* - REPL (default): Interactive tool-calling interface via stdin/stdout
|
|
6
|
+
* - ACP (--acp): ACP endpoint reading/writing ndjson on stdin/stdout
|
|
7
|
+
*
|
|
8
|
+
* Environment variables:
|
|
9
|
+
* - TEST_TOKEN — credential injected by agent-entry (required)
|
|
10
|
+
* - MCP_PROXY_URL — proxy URL (default: http://localhost:9090)
|
|
11
|
+
* - MCP_PROXY_TOKEN — proxy auth token (required for MCP calls)
|
|
12
|
+
*
|
|
13
|
+
* CLI flags:
|
|
14
|
+
* --acp — start in ACP agent mode (stdin/stdout ndjson)
|
|
15
|
+
*/
|
|
16
|
+
export declare function main(argv?: string[]): Promise<void>;
|
|
17
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAiLH,wBAAsB,IAAI,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA+IzD"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,304 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP Agent — General-purpose MCP agent with REPL and ACP modes.
|
|
3
|
+
*
|
|
4
|
+
* Modes:
|
|
5
|
+
* - REPL (default): Interactive tool-calling interface via stdin/stdout
|
|
6
|
+
* - ACP (--acp): ACP endpoint reading/writing ndjson on stdin/stdout
|
|
7
|
+
*
|
|
8
|
+
* Environment variables:
|
|
9
|
+
* - TEST_TOKEN — credential injected by agent-entry (required)
|
|
10
|
+
* - MCP_PROXY_URL — proxy URL (default: http://localhost:9090)
|
|
11
|
+
* - MCP_PROXY_TOKEN — proxy auth token (required for MCP calls)
|
|
12
|
+
*
|
|
13
|
+
* CLI flags:
|
|
14
|
+
* --acp — start in ACP agent mode (stdin/stdout ndjson)
|
|
15
|
+
*/
|
|
16
|
+
import { createInterface } from "node:readline";
|
|
17
|
+
import { Readable, Writable } from "node:stream";
|
|
18
|
+
import { AgentSideConnection, ndJsonStream } from "@agentclientprotocol/sdk";
|
|
19
|
+
import { createMcpClient } from "./mcp-client.js";
|
|
20
|
+
import { createAcpAgentFactory } from "./acp-agent.js";
|
|
21
|
+
import { executeCommand } from "./tool-caller.js";
|
|
22
|
+
function parseArgs(argv) {
|
|
23
|
+
const args = {
|
|
24
|
+
acpMode: false,
|
|
25
|
+
};
|
|
26
|
+
for (let i = 0; i < argv.length; i++) {
|
|
27
|
+
if (argv[i] === "--acp") {
|
|
28
|
+
args.acpMode = true;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
return args;
|
|
32
|
+
}
|
|
33
|
+
// ── REPL Mode ─────────────────────────────────────────────────────────
|
|
34
|
+
async function runRepl(caller) {
|
|
35
|
+
// Pre-fetch tools for help messages
|
|
36
|
+
let cachedTools = [];
|
|
37
|
+
try {
|
|
38
|
+
cachedTools = await caller.listTools();
|
|
39
|
+
console.log(`[mcp-agent] ${cachedTools.length} tool(s) available. Type "help" for commands.`);
|
|
40
|
+
}
|
|
41
|
+
catch (err) {
|
|
42
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
43
|
+
console.error(`[mcp-agent] WARNING: Could not list tools: ${msg}`);
|
|
44
|
+
}
|
|
45
|
+
console.log('[mcp-agent] Type "list" for available tools, "<tool> <json>" to call, "exit" to quit.');
|
|
46
|
+
console.log("");
|
|
47
|
+
const rl = createInterface({
|
|
48
|
+
input: process.stdin,
|
|
49
|
+
output: process.stdout,
|
|
50
|
+
prompt: "> ",
|
|
51
|
+
});
|
|
52
|
+
rl.prompt();
|
|
53
|
+
rl.on("line", async (line) => {
|
|
54
|
+
const input = line.trim();
|
|
55
|
+
if (!input) {
|
|
56
|
+
rl.prompt();
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
const result = await executeCommand(input, caller, cachedTools);
|
|
60
|
+
console.log(result.output);
|
|
61
|
+
if (result.exit) {
|
|
62
|
+
rl.close();
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
// Refresh cached tools after list command
|
|
66
|
+
if (input === "list") {
|
|
67
|
+
try {
|
|
68
|
+
cachedTools = await caller.listTools();
|
|
69
|
+
}
|
|
70
|
+
catch {
|
|
71
|
+
// Keep existing cache
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
rl.prompt();
|
|
75
|
+
});
|
|
76
|
+
rl.on("close", () => {
|
|
77
|
+
process.exit(0);
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
// ── Credential Resolution ─────────────────────────────────────────────
|
|
81
|
+
/**
|
|
82
|
+
* Connect to the proxy's /connect-agent endpoint to get a session token.
|
|
83
|
+
* The session token is required for credential_request calls.
|
|
84
|
+
*/
|
|
85
|
+
async function connectAgent(proxyUrl, proxyToken) {
|
|
86
|
+
const response = await fetch(`${proxyUrl}/connect-agent`, {
|
|
87
|
+
method: "POST",
|
|
88
|
+
headers: {
|
|
89
|
+
Authorization: `Bearer ${proxyToken}`,
|
|
90
|
+
"Content-Type": "application/json",
|
|
91
|
+
},
|
|
92
|
+
});
|
|
93
|
+
if (!response.ok) {
|
|
94
|
+
throw new Error(`connect-agent failed: ${response.status} ${response.statusText}`);
|
|
95
|
+
}
|
|
96
|
+
const body = (await response.json());
|
|
97
|
+
return body.sessionToken;
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Resolve credentials via the proxy's credential_request MCP tool.
|
|
101
|
+
* First obtains a session token via /connect-agent, then calls
|
|
102
|
+
* credential_request for each key.
|
|
103
|
+
* Retries proxy connection to handle startup timing.
|
|
104
|
+
*/
|
|
105
|
+
async function resolveCredentials(proxyUrl, proxyToken, keys) {
|
|
106
|
+
const maxRetries = 15;
|
|
107
|
+
let client = null;
|
|
108
|
+
let sessionToken = null;
|
|
109
|
+
for (let attempt = 1; attempt <= maxRetries; attempt++) {
|
|
110
|
+
try {
|
|
111
|
+
if (!sessionToken) {
|
|
112
|
+
sessionToken = await connectAgent(proxyUrl, proxyToken);
|
|
113
|
+
}
|
|
114
|
+
client = await createMcpClient({ proxyUrl, proxyToken });
|
|
115
|
+
break;
|
|
116
|
+
}
|
|
117
|
+
catch (err) {
|
|
118
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
119
|
+
if (attempt < maxRetries) {
|
|
120
|
+
console.error(`[mcp-agent] Proxy not ready for credentials (attempt ${attempt}/${maxRetries}): ${msg}`);
|
|
121
|
+
await new Promise((r) => setTimeout(r, 2000));
|
|
122
|
+
}
|
|
123
|
+
else {
|
|
124
|
+
throw new Error(`Could not connect to proxy after ${maxRetries} attempts: ${msg}`);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
if (!client)
|
|
129
|
+
throw new Error("Failed to create MCP client for credential resolution");
|
|
130
|
+
if (!sessionToken)
|
|
131
|
+
throw new Error("Failed to obtain session token for credential resolution");
|
|
132
|
+
const credentials = {};
|
|
133
|
+
for (const key of keys) {
|
|
134
|
+
const result = await client.callTool("credential_request", { key, session_token: sessionToken });
|
|
135
|
+
const text = result.content[0]?.text;
|
|
136
|
+
if (!text)
|
|
137
|
+
throw new Error(`No response for credential: ${key}`);
|
|
138
|
+
let parsed;
|
|
139
|
+
try {
|
|
140
|
+
parsed = JSON.parse(text);
|
|
141
|
+
}
|
|
142
|
+
catch {
|
|
143
|
+
throw new Error(`Invalid response for credential ${key}: ${text}`);
|
|
144
|
+
}
|
|
145
|
+
if ("error" in parsed) {
|
|
146
|
+
throw new Error(`Credential ${key}: ${parsed.error}`);
|
|
147
|
+
}
|
|
148
|
+
if ("value" in parsed && typeof parsed.value === "string") {
|
|
149
|
+
credentials[key] = parsed.value;
|
|
150
|
+
}
|
|
151
|
+
else {
|
|
152
|
+
throw new Error(`Unexpected response for credential ${key}`);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
return credentials;
|
|
156
|
+
}
|
|
157
|
+
// ── Main ──────────────────────────────────────────────────────────────
|
|
158
|
+
export async function main(argv) {
|
|
159
|
+
const cliArgs = parseArgs(argv ?? process.argv.slice(2));
|
|
160
|
+
// 1. Read proxy config
|
|
161
|
+
const proxyUrl = process.env.MCP_PROXY_URL ?? "http://localhost:9090";
|
|
162
|
+
const proxyToken = process.env.MCP_PROXY_TOKEN;
|
|
163
|
+
// 2. Parse declared credential keys
|
|
164
|
+
const declaredCredentials = (process.env.AGENT_CREDENTIALS ?? "").trim();
|
|
165
|
+
let credentialKeys = [];
|
|
166
|
+
if (declaredCredentials) {
|
|
167
|
+
try {
|
|
168
|
+
credentialKeys = JSON.parse(declaredCredentials);
|
|
169
|
+
}
|
|
170
|
+
catch { /* ignore parse errors */ }
|
|
171
|
+
}
|
|
172
|
+
// 3. Resolve credentials and verify (blocking for non-ACP, deferred for ACP)
|
|
173
|
+
async function resolveAndVerifyCredentials() {
|
|
174
|
+
if (credentialKeys.length > 0 && proxyToken) {
|
|
175
|
+
console.error(`[mcp-agent] Requesting ${credentialKeys.length} credential(s)...`);
|
|
176
|
+
const creds = await resolveCredentials(proxyUrl, proxyToken, credentialKeys);
|
|
177
|
+
for (const [key, value] of Object.entries(creds)) {
|
|
178
|
+
process.env[key] = value;
|
|
179
|
+
}
|
|
180
|
+
console.error("[mcp-agent] All credentials received.");
|
|
181
|
+
}
|
|
182
|
+
const testToken = process.env.TEST_TOKEN;
|
|
183
|
+
if (!testToken) {
|
|
184
|
+
console.error("[mcp-agent] ERROR: TEST_TOKEN not found in environment.");
|
|
185
|
+
console.error("[mcp-agent] The credential pipeline did not inject TEST_TOKEN.");
|
|
186
|
+
process.exit(1);
|
|
187
|
+
}
|
|
188
|
+
console.error("[mcp-agent] Connected. TEST_TOKEN received.");
|
|
189
|
+
}
|
|
190
|
+
let caller = null;
|
|
191
|
+
// connectToProxy retries MCP session establishment
|
|
192
|
+
async function connectToProxy() {
|
|
193
|
+
if (!proxyToken) {
|
|
194
|
+
console.error("[mcp-agent] MCP_PROXY_TOKEN not set. Running in credential-only mode.");
|
|
195
|
+
return null;
|
|
196
|
+
}
|
|
197
|
+
const maxRetries = 15;
|
|
198
|
+
for (let attempt = 1; attempt <= maxRetries; attempt++) {
|
|
199
|
+
try {
|
|
200
|
+
const c = await createMcpClient({ proxyUrl, proxyToken });
|
|
201
|
+
console.error("[mcp-agent] MCP session established.");
|
|
202
|
+
return c;
|
|
203
|
+
}
|
|
204
|
+
catch (err) {
|
|
205
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
206
|
+
if (attempt < maxRetries) {
|
|
207
|
+
console.error(`[mcp-agent] Proxy not ready (attempt ${attempt}/${maxRetries}): ${msg}`);
|
|
208
|
+
await new Promise((r) => setTimeout(r, 2000));
|
|
209
|
+
}
|
|
210
|
+
else {
|
|
211
|
+
console.error(`[mcp-agent] WARNING: Could not establish MCP session after ${maxRetries} attempts: ${msg}`);
|
|
212
|
+
console.error("[mcp-agent] Tool listing and calling will not work.");
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
return null;
|
|
217
|
+
}
|
|
218
|
+
// In ACP mode, use AgentSideConnection on stdin/stdout
|
|
219
|
+
if (cliArgs.acpMode) {
|
|
220
|
+
// REQ-SDK-012: Redirect console.log to stderr to protect stdout for ACP ndjson
|
|
221
|
+
console.log = (...args) => {
|
|
222
|
+
console.error(...args);
|
|
223
|
+
};
|
|
224
|
+
console.error("[mcp-agent] Starting ACP agent on stdin/stdout...");
|
|
225
|
+
// Create a deferred caller that forwards to the real caller once connected
|
|
226
|
+
let realCaller = null;
|
|
227
|
+
const deferredCaller = {
|
|
228
|
+
async listTools() {
|
|
229
|
+
if (realCaller)
|
|
230
|
+
return realCaller.listTools();
|
|
231
|
+
return [];
|
|
232
|
+
},
|
|
233
|
+
async callTool(name, args) {
|
|
234
|
+
if (realCaller)
|
|
235
|
+
return realCaller.callTool(name, args);
|
|
236
|
+
throw new Error("MCP session not yet established. Proxy connection in progress.");
|
|
237
|
+
},
|
|
238
|
+
};
|
|
239
|
+
// Session setup: resolve credentials + connect to proxy (called from newSession)
|
|
240
|
+
let setupDone = false;
|
|
241
|
+
const onSessionSetup = async () => {
|
|
242
|
+
if (setupDone)
|
|
243
|
+
return;
|
|
244
|
+
setupDone = true;
|
|
245
|
+
try {
|
|
246
|
+
await resolveAndVerifyCredentials();
|
|
247
|
+
}
|
|
248
|
+
catch (err) {
|
|
249
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
250
|
+
console.error(`[mcp-agent] Credential resolution failed (non-fatal): ${msg}`);
|
|
251
|
+
console.error("[mcp-agent] ACP agent continues without credentials.");
|
|
252
|
+
}
|
|
253
|
+
try {
|
|
254
|
+
const c = await connectToProxy();
|
|
255
|
+
if (c)
|
|
256
|
+
realCaller = c;
|
|
257
|
+
}
|
|
258
|
+
catch (err) {
|
|
259
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
260
|
+
console.error(`[mcp-agent] Proxy connection failed (non-fatal): ${msg}`);
|
|
261
|
+
}
|
|
262
|
+
};
|
|
263
|
+
// Create the ACP stream and connection
|
|
264
|
+
const output = Writable.toWeb(process.stdout);
|
|
265
|
+
const input = Readable.toWeb(process.stdin);
|
|
266
|
+
const stream = ndJsonStream(output, input);
|
|
267
|
+
const connection = new AgentSideConnection(createAcpAgentFactory({ caller: deferredCaller, onSessionSetup }), stream);
|
|
268
|
+
// Handle graceful shutdown
|
|
269
|
+
const shutdown = () => {
|
|
270
|
+
console.error("\n[mcp-agent] Shutting down ACP agent...");
|
|
271
|
+
process.exit(0);
|
|
272
|
+
};
|
|
273
|
+
process.on("SIGTERM", shutdown);
|
|
274
|
+
process.on("SIGINT", shutdown);
|
|
275
|
+
// Keep process alive until connection closes
|
|
276
|
+
await connection.closed;
|
|
277
|
+
console.error("[mcp-agent] ACP connection closed.");
|
|
278
|
+
}
|
|
279
|
+
else {
|
|
280
|
+
// REPL mode: resolve credentials and connect synchronously before starting
|
|
281
|
+
await resolveAndVerifyCredentials();
|
|
282
|
+
caller = await connectToProxy();
|
|
283
|
+
if (!caller) {
|
|
284
|
+
caller = {
|
|
285
|
+
async listTools() { return []; },
|
|
286
|
+
async callTool() { throw new Error("No MCP session available. Cannot call tools."); },
|
|
287
|
+
};
|
|
288
|
+
}
|
|
289
|
+
await runRepl(caller);
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
// ── Run if executed directly ──────────────────────────────────────────
|
|
293
|
+
const isMain = typeof process !== "undefined" &&
|
|
294
|
+
process.argv[1] &&
|
|
295
|
+
(process.argv[1].endsWith("mcp-agent.js") ||
|
|
296
|
+
process.argv[1].endsWith("/mcp-agent") ||
|
|
297
|
+
process.argv[1].endsWith("index.js"));
|
|
298
|
+
if (isMain) {
|
|
299
|
+
main().catch((err) => {
|
|
300
|
+
console.error("[mcp-agent] Fatal:", err instanceof Error ? err.message : String(err));
|
|
301
|
+
process.exit(1);
|
|
302
|
+
});
|
|
303
|
+
}
|
|
304
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { RuntimeMaterializer, AgentPackage } from "@clawmasons/agent-sdk";
|
|
2
|
+
/**
|
|
3
|
+
* MCP Agent runtime materializer.
|
|
4
|
+
*
|
|
5
|
+
* Generates a minimal workspace directory for the mcp-agent package:
|
|
6
|
+
* - .mcp.json — MCP server config pointing to chapter-proxy
|
|
7
|
+
* - AGENTS.md — agent identity and role documentation
|
|
8
|
+
*
|
|
9
|
+
* The mcp-agent is a tool-calling REPL/ACP agent, not a full coding
|
|
10
|
+
* agent, so it does not need slash commands, IDE settings, or extensions.
|
|
11
|
+
*/
|
|
12
|
+
export declare const mcpAgentMaterializer: RuntimeMaterializer;
|
|
13
|
+
/**
|
|
14
|
+
* Set the parent AgentPackage reference (called during package initialization).
|
|
15
|
+
* @internal
|
|
16
|
+
*/
|
|
17
|
+
export declare function _setAgentPackage(pkg: AgentPackage): void;
|
|
18
|
+
//# sourceMappingURL=materializer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"materializer.d.ts","sourceRoot":"","sources":["../src/materializer.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,mBAAmB,EAA6C,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAuC1H;;;;;;;;;GASG;AACH,eAAO,MAAM,oBAAoB,EAAE,mBA0BlC,CAAC;AAEF;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,YAAY,GAAG,IAAI,CAExD"}
|
package/dist/materializer.js
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import {
|
|
2
|
-
generateAgentsMd,
|
|
3
2
|
generateAgentLaunchJson
|
|
4
3
|
} from "@clawmasons/agent-sdk";
|
|
5
4
|
function generateMcpJson(proxyEndpoint, proxyType, proxyToken) {
|
|
@@ -28,7 +27,6 @@ const mcpAgentMaterializer = {
|
|
|
28
27
|
".mcp.json",
|
|
29
28
|
generateMcpJson(proxyEndpoint, proxyType, proxyToken)
|
|
30
29
|
);
|
|
31
|
-
result.set("AGENTS.md", generateAgentsMd(agent));
|
|
32
30
|
result.set(
|
|
33
31
|
"agent-launch.json",
|
|
34
32
|
generateAgentLaunchJson(_agentPkg, agent.credentials, options?.acpMode, void 0, options?.agentArgs)
|
package/dist/materializer.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/materializer.ts"],
|
|
4
|
-
"sourcesContent": ["import type { ResolvedAgent } from \"@clawmasons/shared\";\nimport type { RuntimeMaterializer, MaterializationResult, MaterializeOptions, AgentPackage } from \"@clawmasons/agent-sdk\";\nimport {\n
|
|
5
|
-
"mappings": "AAEA;AAAA,EACE;AAAA,
|
|
4
|
+
"sourcesContent": ["import type { ResolvedAgent } from \"@clawmasons/shared\";\nimport type { RuntimeMaterializer, MaterializationResult, MaterializeOptions, AgentPackage } from \"@clawmasons/agent-sdk\";\nimport {\n generateAgentLaunchJson,\n} from \"@clawmasons/agent-sdk\";\n\n/**\n * Generate .mcp.json content for the mcp-agent.\n *\n * Creates a single \"chapter\" MCP server entry pointing at the proxy's\n * unified endpoint: /sse (SSE) or /mcp (streamable-http).\n */\nfunction generateMcpJson(\n proxyEndpoint: string,\n proxyType: \"sse\" | \"streamable-http\",\n proxyToken?: string,\n): string {\n const pathSuffix = proxyType === \"sse\" ? \"/sse\" : \"/mcp\";\n const bearerValue = proxyToken\n ? `Bearer ${proxyToken}`\n : \"Bearer ${MCP_PROXY_TOKEN}\";\n\n const mcpConfig = {\n mcpServers: {\n chapter: {\n type: proxyType,\n url: `${proxyEndpoint}${pathSuffix}`,\n headers: {\n Authorization: bearerValue,\n },\n },\n },\n };\n\n return JSON.stringify(mcpConfig, null, 2);\n}\n\n/** Reference to the parent AgentPackage \u2014 set after construction. */\nlet _agentPkg: AgentPackage;\n\n/**\n * MCP Agent runtime materializer.\n *\n * Generates a minimal workspace directory for the mcp-agent package:\n * - .mcp.json \u2014 MCP server config pointing to chapter-proxy\n * - AGENTS.md \u2014 agent identity and role documentation\n *\n * The mcp-agent is a tool-calling REPL/ACP agent, not a full coding\n * agent, so it does not need slash commands, IDE settings, or extensions.\n */\nexport const mcpAgentMaterializer: RuntimeMaterializer = {\n name: \"mcp-agent\",\n\n materializeWorkspace(\n agent: ResolvedAgent,\n proxyEndpoint: string,\n proxyToken?: string,\n options?: MaterializeOptions,\n ): MaterializationResult {\n const result: MaterializationResult = new Map();\n const proxyType = agent.proxy?.type ?? \"sse\";\n\n // .mcp.json \u2014 MCP server config at workspace root\n result.set(\n \".mcp.json\",\n generateMcpJson(proxyEndpoint, proxyType, proxyToken),\n );\n\n // agent-launch.json \u2014 tells agent-entry how to bootstrap this agent\n result.set(\n \"agent-launch.json\",\n generateAgentLaunchJson(_agentPkg, agent.credentials, options?.acpMode, undefined, options?.agentArgs),\n );\n\n return result;\n },\n};\n\n/**\n * Set the parent AgentPackage reference (called during package initialization).\n * @internal\n */\nexport function _setAgentPackage(pkg: AgentPackage): void {\n _agentPkg = pkg;\n}\n"],
|
|
5
|
+
"mappings": "AAEA;AAAA,EACE;AAAA,OACK;AAQP,SAAS,gBACP,eACA,WACA,YACQ;AACR,QAAM,aAAa,cAAc,QAAQ,SAAS;AAClD,QAAM,cAAc,aAChB,UAAU,UAAU,KACpB;AAEJ,QAAM,YAAY;AAAA,IAChB,YAAY;AAAA,MACV,SAAS;AAAA,QACP,MAAM;AAAA,QACN,KAAK,GAAG,aAAa,GAAG,UAAU;AAAA,QAClC,SAAS;AAAA,UACP,eAAe;AAAA,QACjB;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,SAAO,KAAK,UAAU,WAAW,MAAM,CAAC;AAC1C;AAGA,IAAI;AAYG,MAAM,uBAA4C;AAAA,EACvD,MAAM;AAAA,EAEN,qBACE,OACA,eACA,YACA,SACuB;AACvB,UAAM,SAAgC,oBAAI,IAAI;AAC9C,UAAM,YAAY,MAAM,OAAO,QAAQ;AAGvC,WAAO;AAAA,MACL;AAAA,MACA,gBAAgB,eAAe,WAAW,UAAU;AAAA,IACtD;AAGA,WAAO;AAAA,MACL;AAAA,MACA,wBAAwB,WAAW,MAAM,aAAa,SAAS,SAAS,QAAW,SAAS,SAAS;AAAA,IACvG;AAEA,WAAO;AAAA,EACT;AACF;AAMO,SAAS,iBAAiB,KAAyB;AACxD,cAAY;AACd;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Lightweight MCP client for the mcp-agent.
|
|
3
|
+
*
|
|
4
|
+
* Provides session initialization, tool listing, and tool calling
|
|
5
|
+
* via the MCP streamable-http protocol over the chapter proxy.
|
|
6
|
+
*/
|
|
7
|
+
import type { ToolCaller } from "./tool-caller.js";
|
|
8
|
+
export interface McpClientConfig {
|
|
9
|
+
proxyUrl: string;
|
|
10
|
+
proxyToken: string;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Create a ToolCaller backed by the MCP streamable-http protocol.
|
|
14
|
+
*
|
|
15
|
+
* Initializes an MCP session with the proxy and returns a ToolCaller
|
|
16
|
+
* interface for listing and calling tools.
|
|
17
|
+
*/
|
|
18
|
+
export declare function createMcpClient(config: McpClientConfig): Promise<ToolCaller>;
|
|
19
|
+
//# 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":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAkC,MAAM,kBAAkB,CAAC;AAInF,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;CACpB;AAkLD;;;;;GAKG;AACH,wBAAsB,eAAe,CAAC,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,UAAU,CAAC,CAalF"}
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Lightweight MCP client for the mcp-agent.
|
|
3
|
+
*
|
|
4
|
+
* Provides session initialization, tool listing, and tool calling
|
|
5
|
+
* via the MCP streamable-http protocol over the chapter proxy.
|
|
6
|
+
*/
|
|
7
|
+
// ── Helpers ───────────────────────────────────────────────────────────
|
|
8
|
+
let requestIdCounter = 1;
|
|
9
|
+
const MCP_HEADERS = {
|
|
10
|
+
"Content-Type": "application/json",
|
|
11
|
+
Accept: "application/json, text/event-stream",
|
|
12
|
+
};
|
|
13
|
+
/**
|
|
14
|
+
* Parse an MCP response which may be JSON or SSE (text/event-stream).
|
|
15
|
+
* SSE responses contain JSON-RPC messages in `data:` lines.
|
|
16
|
+
*/
|
|
17
|
+
async function parseMcpResponse(response) {
|
|
18
|
+
const contentType = response.headers.get("content-type") ?? "";
|
|
19
|
+
if (contentType.includes("text/event-stream")) {
|
|
20
|
+
// Parse SSE to extract JSON-RPC response
|
|
21
|
+
const text = await response.text();
|
|
22
|
+
const lines = text.split("\n");
|
|
23
|
+
let lastData = "";
|
|
24
|
+
for (const line of lines) {
|
|
25
|
+
if (line.startsWith("data: ")) {
|
|
26
|
+
lastData = line.slice(6);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
if (!lastData) {
|
|
30
|
+
throw new Error("SSE response contained no data events");
|
|
31
|
+
}
|
|
32
|
+
return JSON.parse(lastData);
|
|
33
|
+
}
|
|
34
|
+
// Standard JSON response
|
|
35
|
+
return response.json();
|
|
36
|
+
}
|
|
37
|
+
// ── Implementation ────────────────────────────────────────────────────
|
|
38
|
+
async function initializeMcpSession(proxyUrl, proxyToken) {
|
|
39
|
+
const initResponse = await fetch(`${proxyUrl}/mcp`, {
|
|
40
|
+
method: "POST",
|
|
41
|
+
headers: {
|
|
42
|
+
...MCP_HEADERS,
|
|
43
|
+
Authorization: `Bearer ${proxyToken}`,
|
|
44
|
+
},
|
|
45
|
+
body: JSON.stringify({
|
|
46
|
+
jsonrpc: "2.0",
|
|
47
|
+
id: requestIdCounter++,
|
|
48
|
+
method: "initialize",
|
|
49
|
+
params: {
|
|
50
|
+
protocolVersion: "2025-03-26",
|
|
51
|
+
capabilities: {},
|
|
52
|
+
clientInfo: { name: "mcp-agent", version: "1.0.0" },
|
|
53
|
+
},
|
|
54
|
+
}),
|
|
55
|
+
});
|
|
56
|
+
if (!initResponse.ok) {
|
|
57
|
+
throw new Error(`MCP initialize failed: ${initResponse.status} ${initResponse.statusText}`);
|
|
58
|
+
}
|
|
59
|
+
// Consume the response body (may be JSON or SSE)
|
|
60
|
+
await parseMcpResponse(initResponse);
|
|
61
|
+
const mcpSessionId = initResponse.headers.get("mcp-session-id");
|
|
62
|
+
if (!mcpSessionId) {
|
|
63
|
+
throw new Error("MCP initialize response missing mcp-session-id header");
|
|
64
|
+
}
|
|
65
|
+
// Send initialized notification
|
|
66
|
+
await fetch(`${proxyUrl}/mcp`, {
|
|
67
|
+
method: "POST",
|
|
68
|
+
headers: {
|
|
69
|
+
...MCP_HEADERS,
|
|
70
|
+
Authorization: `Bearer ${proxyToken}`,
|
|
71
|
+
"mcp-session-id": mcpSessionId,
|
|
72
|
+
},
|
|
73
|
+
body: JSON.stringify({
|
|
74
|
+
jsonrpc: "2.0",
|
|
75
|
+
method: "notifications/initialized",
|
|
76
|
+
}),
|
|
77
|
+
});
|
|
78
|
+
return mcpSessionId;
|
|
79
|
+
}
|
|
80
|
+
async function mcpListTools(proxyUrl, proxyToken, mcpSessionId) {
|
|
81
|
+
const id = requestIdCounter++;
|
|
82
|
+
const response = await fetch(`${proxyUrl}/mcp`, {
|
|
83
|
+
method: "POST",
|
|
84
|
+
headers: {
|
|
85
|
+
...MCP_HEADERS,
|
|
86
|
+
Authorization: `Bearer ${proxyToken}`,
|
|
87
|
+
"mcp-session-id": mcpSessionId,
|
|
88
|
+
},
|
|
89
|
+
body: JSON.stringify({
|
|
90
|
+
jsonrpc: "2.0",
|
|
91
|
+
id,
|
|
92
|
+
method: "tools/list",
|
|
93
|
+
params: {},
|
|
94
|
+
}),
|
|
95
|
+
});
|
|
96
|
+
if (!response.ok) {
|
|
97
|
+
throw new Error(`MCP tools/list failed: ${response.status} ${response.statusText}`);
|
|
98
|
+
}
|
|
99
|
+
const body = (await parseMcpResponse(response));
|
|
100
|
+
if (body.error) {
|
|
101
|
+
throw new Error(`MCP tools/list error: ${body.error.message}`);
|
|
102
|
+
}
|
|
103
|
+
return body.result?.tools ?? [];
|
|
104
|
+
}
|
|
105
|
+
async function mcpCallTool(proxyUrl, proxyToken, mcpSessionId, toolName, args) {
|
|
106
|
+
const id = requestIdCounter++;
|
|
107
|
+
const response = await fetch(`${proxyUrl}/mcp`, {
|
|
108
|
+
method: "POST",
|
|
109
|
+
headers: {
|
|
110
|
+
...MCP_HEADERS,
|
|
111
|
+
Authorization: `Bearer ${proxyToken}`,
|
|
112
|
+
"mcp-session-id": mcpSessionId,
|
|
113
|
+
},
|
|
114
|
+
body: JSON.stringify({
|
|
115
|
+
jsonrpc: "2.0",
|
|
116
|
+
id,
|
|
117
|
+
method: "tools/call",
|
|
118
|
+
params: { name: toolName, arguments: args },
|
|
119
|
+
}),
|
|
120
|
+
});
|
|
121
|
+
if (!response.ok) {
|
|
122
|
+
throw new Error(`MCP tool call failed: ${response.status} ${response.statusText}`);
|
|
123
|
+
}
|
|
124
|
+
const body = (await parseMcpResponse(response));
|
|
125
|
+
if (body.error) {
|
|
126
|
+
throw new Error(`MCP tool error: ${body.error.message}`);
|
|
127
|
+
}
|
|
128
|
+
if (!body.result) {
|
|
129
|
+
throw new Error("MCP tool call returned no result");
|
|
130
|
+
}
|
|
131
|
+
return body.result;
|
|
132
|
+
}
|
|
133
|
+
// ── Public API ────────────────────────────────────────────────────────
|
|
134
|
+
/**
|
|
135
|
+
* Create a ToolCaller backed by the MCP streamable-http protocol.
|
|
136
|
+
*
|
|
137
|
+
* Initializes an MCP session with the proxy and returns a ToolCaller
|
|
138
|
+
* interface for listing and calling tools.
|
|
139
|
+
*/
|
|
140
|
+
export async function createMcpClient(config) {
|
|
141
|
+
const { proxyUrl, proxyToken } = config;
|
|
142
|
+
const mcpSessionId = await initializeMcpSession(proxyUrl, proxyToken);
|
|
143
|
+
return {
|
|
144
|
+
async listTools() {
|
|
145
|
+
return mcpListTools(proxyUrl, proxyToken, mcpSessionId);
|
|
146
|
+
},
|
|
147
|
+
async callTool(name, args) {
|
|
148
|
+
return mcpCallTool(proxyUrl, proxyToken, mcpSessionId, name, args);
|
|
149
|
+
},
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
//# 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,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared tool-calling logic for the MCP agent.
|
|
3
|
+
*
|
|
4
|
+
* Provides command parsing, tool invocation, result formatting,
|
|
5
|
+
* and help generation used by both REPL and ACP modes.
|
|
6
|
+
*/
|
|
7
|
+
export interface ToolDefinition {
|
|
8
|
+
name: string;
|
|
9
|
+
description?: string;
|
|
10
|
+
}
|
|
11
|
+
export interface ToolCallResult {
|
|
12
|
+
content: Array<{
|
|
13
|
+
type: string;
|
|
14
|
+
text: string;
|
|
15
|
+
}>;
|
|
16
|
+
isError?: boolean;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Abstraction over the MCP client for tool operations.
|
|
20
|
+
*/
|
|
21
|
+
export interface ToolCaller {
|
|
22
|
+
listTools(): Promise<ToolDefinition[]>;
|
|
23
|
+
callTool(name: string, args: Record<string, unknown>): Promise<ToolCallResult>;
|
|
24
|
+
}
|
|
25
|
+
export type ParsedCommand = {
|
|
26
|
+
type: "list";
|
|
27
|
+
} | {
|
|
28
|
+
type: "exit";
|
|
29
|
+
} | {
|
|
30
|
+
type: "help";
|
|
31
|
+
} | {
|
|
32
|
+
type: "call";
|
|
33
|
+
toolName: string;
|
|
34
|
+
args: Record<string, unknown>;
|
|
35
|
+
} | {
|
|
36
|
+
type: "error";
|
|
37
|
+
message: string;
|
|
38
|
+
};
|
|
39
|
+
/**
|
|
40
|
+
* Parse a user input string into a structured command.
|
|
41
|
+
*
|
|
42
|
+
* Recognized commands:
|
|
43
|
+
* - "list" — list available tools
|
|
44
|
+
* - "exit" — exit the agent
|
|
45
|
+
* - "help" — show help message
|
|
46
|
+
* - "<tool_name>" — call tool with empty args
|
|
47
|
+
* - "<tool_name> <json>" — call tool with JSON args
|
|
48
|
+
*/
|
|
49
|
+
export declare function parseCommand(input: string): ParsedCommand;
|
|
50
|
+
/**
|
|
51
|
+
* Format a tool call result for display.
|
|
52
|
+
*/
|
|
53
|
+
export declare function formatResult(result: ToolCallResult): string;
|
|
54
|
+
/**
|
|
55
|
+
* Generate a help message listing all available tools.
|
|
56
|
+
*/
|
|
57
|
+
export declare function formatHelp(tools: ToolDefinition[]): string;
|
|
58
|
+
/**
|
|
59
|
+
* Execute a parsed command using the provided tool caller.
|
|
60
|
+
*
|
|
61
|
+
* Returns the output string and whether the agent should exit.
|
|
62
|
+
*/
|
|
63
|
+
export declare function executeCommand(input: string, caller: ToolCaller, cachedTools?: ToolDefinition[]): Promise<{
|
|
64
|
+
output: string;
|
|
65
|
+
exit: boolean;
|
|
66
|
+
}>;
|
|
67
|
+
//# sourceMappingURL=tool-caller.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-caller.d.ts","sourceRoot":"","sources":["../src/tool-caller.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC/C,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,SAAS,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC;IACvC,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;CAChF;AAID,MAAM,MAAM,aAAa,GACrB;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAChB;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAChB;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAChB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,GACjE;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAIvC;;;;;;;;;GASG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,aAAa,CAwCzD;AAID;;GAEG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM,CAM3D;AAID;;GAEG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,cAAc,EAAE,GAAG,MAAM,CAuB1D;AAID;;;;GAIG;AACH,wBAAsB,cAAc,CAClC,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,UAAU,EAClB,WAAW,CAAC,EAAE,cAAc,EAAE,GAC7B,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,OAAO,CAAA;CAAE,CAAC,CAkD5C"}
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared tool-calling logic for the MCP agent.
|
|
3
|
+
*
|
|
4
|
+
* Provides command parsing, tool invocation, result formatting,
|
|
5
|
+
* and help generation used by both REPL and ACP modes.
|
|
6
|
+
*/
|
|
7
|
+
// ── Command Parsing ───────────────────────────────────────────────────
|
|
8
|
+
/**
|
|
9
|
+
* Parse a user input string into a structured command.
|
|
10
|
+
*
|
|
11
|
+
* Recognized commands:
|
|
12
|
+
* - "list" — list available tools
|
|
13
|
+
* - "exit" — exit the agent
|
|
14
|
+
* - "help" — show help message
|
|
15
|
+
* - "<tool_name>" — call tool with empty args
|
|
16
|
+
* - "<tool_name> <json>" — call tool with JSON args
|
|
17
|
+
*/
|
|
18
|
+
export function parseCommand(input) {
|
|
19
|
+
const trimmed = input.trim();
|
|
20
|
+
if (!trimmed) {
|
|
21
|
+
return { type: "help" };
|
|
22
|
+
}
|
|
23
|
+
if (trimmed === "list") {
|
|
24
|
+
return { type: "list" };
|
|
25
|
+
}
|
|
26
|
+
if (trimmed === "exit") {
|
|
27
|
+
return { type: "exit" };
|
|
28
|
+
}
|
|
29
|
+
if (trimmed === "help") {
|
|
30
|
+
return { type: "help" };
|
|
31
|
+
}
|
|
32
|
+
// Parse "<tool_name> <json_args>" or "<tool_name>"
|
|
33
|
+
const spaceIdx = trimmed.indexOf(" ");
|
|
34
|
+
if (spaceIdx === -1) {
|
|
35
|
+
return { type: "call", toolName: trimmed, args: {} };
|
|
36
|
+
}
|
|
37
|
+
const toolName = trimmed.substring(0, spaceIdx);
|
|
38
|
+
const argsStr = trimmed.substring(spaceIdx + 1).trim();
|
|
39
|
+
try {
|
|
40
|
+
const args = JSON.parse(argsStr);
|
|
41
|
+
if (typeof args !== "object" || args === null || Array.isArray(args)) {
|
|
42
|
+
return { type: "error", message: "Arguments must be a JSON object, e.g. {\"key\": \"value\"}" };
|
|
43
|
+
}
|
|
44
|
+
return { type: "call", toolName, args };
|
|
45
|
+
}
|
|
46
|
+
catch {
|
|
47
|
+
return {
|
|
48
|
+
type: "error",
|
|
49
|
+
message: `Invalid JSON arguments. Usage: ${toolName} {"key": "value"}`,
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
// ── Result Formatting ─────────────────────────────────────────────────
|
|
54
|
+
/**
|
|
55
|
+
* Format a tool call result for display.
|
|
56
|
+
*/
|
|
57
|
+
export function formatResult(result) {
|
|
58
|
+
const text = result.content.map((c) => c.text).join("\n");
|
|
59
|
+
if (result.isError) {
|
|
60
|
+
return `Error: ${text}`;
|
|
61
|
+
}
|
|
62
|
+
return `Result: ${text}`;
|
|
63
|
+
}
|
|
64
|
+
// ── Help Formatting ───────────────────────────────────────────────────
|
|
65
|
+
/**
|
|
66
|
+
* Generate a help message listing all available tools.
|
|
67
|
+
*/
|
|
68
|
+
export function formatHelp(tools) {
|
|
69
|
+
const lines = [];
|
|
70
|
+
lines.push("[mcp-agent] Available commands:");
|
|
71
|
+
lines.push(" list — List available MCP tools");
|
|
72
|
+
lines.push(" help — Show this help message");
|
|
73
|
+
lines.push(" <tool_name> — Call a tool with no arguments");
|
|
74
|
+
lines.push(' <tool_name> {"key": "val"} — Call a tool with JSON arguments');
|
|
75
|
+
lines.push(" exit — Exit the agent");
|
|
76
|
+
if (tools.length > 0) {
|
|
77
|
+
lines.push("");
|
|
78
|
+
lines.push("Available tools:");
|
|
79
|
+
for (const tool of tools) {
|
|
80
|
+
const desc = tool.description ? ` — ${tool.description}` : "";
|
|
81
|
+
lines.push(` - ${tool.name}${desc}`);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
else {
|
|
85
|
+
lines.push("");
|
|
86
|
+
lines.push("No tools available. Use 'list' to refresh.");
|
|
87
|
+
}
|
|
88
|
+
return lines.join("\n");
|
|
89
|
+
}
|
|
90
|
+
// ── Command Execution ─────────────────────────────────────────────────
|
|
91
|
+
/**
|
|
92
|
+
* Execute a parsed command using the provided tool caller.
|
|
93
|
+
*
|
|
94
|
+
* Returns the output string and whether the agent should exit.
|
|
95
|
+
*/
|
|
96
|
+
export async function executeCommand(input, caller, cachedTools) {
|
|
97
|
+
const command = parseCommand(input);
|
|
98
|
+
switch (command.type) {
|
|
99
|
+
case "exit":
|
|
100
|
+
return { output: "[mcp-agent] Goodbye.", exit: true };
|
|
101
|
+
case "list": {
|
|
102
|
+
try {
|
|
103
|
+
const tools = await caller.listTools();
|
|
104
|
+
if (tools.length === 0) {
|
|
105
|
+
return { output: "No tools available.", exit: false };
|
|
106
|
+
}
|
|
107
|
+
const lines = ["Available tools:"];
|
|
108
|
+
for (const tool of tools) {
|
|
109
|
+
const desc = tool.description ? ` — ${tool.description}` : "";
|
|
110
|
+
lines.push(` - ${tool.name}${desc}`);
|
|
111
|
+
}
|
|
112
|
+
return { output: lines.join("\n"), exit: false };
|
|
113
|
+
}
|
|
114
|
+
catch (err) {
|
|
115
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
116
|
+
return { output: `[mcp-agent] Error listing tools: ${msg}`, exit: false };
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
case "help": {
|
|
120
|
+
const tools = cachedTools ?? [];
|
|
121
|
+
return { output: formatHelp(tools), exit: false };
|
|
122
|
+
}
|
|
123
|
+
case "error":
|
|
124
|
+
return { output: `[mcp-agent] ${command.message}`, exit: false };
|
|
125
|
+
case "call": {
|
|
126
|
+
try {
|
|
127
|
+
const result = await caller.callTool(command.toolName, command.args);
|
|
128
|
+
return { output: formatResult(result), exit: false };
|
|
129
|
+
}
|
|
130
|
+
catch (err) {
|
|
131
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
132
|
+
// If the tool call fails, show help with available tools
|
|
133
|
+
if (cachedTools && cachedTools.length > 0) {
|
|
134
|
+
return {
|
|
135
|
+
output: `[mcp-agent] Error: ${msg}\n\n${formatHelp(cachedTools)}`,
|
|
136
|
+
exit: false,
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
return { output: `[mcp-agent] Error: ${msg}`, exit: false };
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
//# sourceMappingURL=tool-caller.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-caller.js","sourceRoot":"","sources":["../src/tool-caller.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AA+BH,yEAAyE;AAEzE;;;;;;;;;GASG;AACH,MAAM,UAAU,YAAY,CAAC,KAAa;IACxC,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAE7B,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;IAC1B,CAAC;IAED,IAAI,OAAO,KAAK,MAAM,EAAE,CAAC;QACvB,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;IAC1B,CAAC;IAED,IAAI,OAAO,KAAK,MAAM,EAAE,CAAC;QACvB,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;IAC1B,CAAC;IAED,IAAI,OAAO,KAAK,MAAM,EAAE,CAAC;QACvB,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;IAC1B,CAAC;IAED,mDAAmD;IACnD,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACtC,IAAI,QAAQ,KAAK,CAAC,CAAC,EAAE,CAAC;QACpB,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;IACvD,CAAC;IAED,MAAM,QAAQ,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;IAChD,MAAM,OAAO,GAAG,OAAO,CAAC,SAAS,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAEvD,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAA4B,CAAC;QAC5D,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;YACrE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,4DAA4D,EAAE,CAAC;QAClG,CAAC;QACD,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;IAC1C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO;YACL,IAAI,EAAE,OAAO;YACb,OAAO,EAAE,kCAAkC,QAAQ,mBAAmB;SACvE,CAAC;IACJ,CAAC;AACH,CAAC;AAED,yEAAyE;AAEzE;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,MAAsB;IACjD,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1D,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QACnB,OAAO,UAAU,IAAI,EAAE,CAAC;IAC1B,CAAC;IACD,OAAO,WAAW,IAAI,EAAE,CAAC;AAC3B,CAAC;AAED,yEAAyE;AAEzE;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,KAAuB;IAChD,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,KAAK,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC;IAC9C,KAAK,CAAC,IAAI,CAAC,0DAA0D,CAAC,CAAC;IACvE,KAAK,CAAC,IAAI,CAAC,wDAAwD,CAAC,CAAC;IACrE,KAAK,CAAC,IAAI,CAAC,+DAA+D,CAAC,CAAC;IAC5E,KAAK,CAAC,IAAI,CAAC,iEAAiE,CAAC,CAAC;IAC9E,KAAK,CAAC,IAAI,CAAC,gDAAgD,CAAC,CAAC;IAE7D,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACrB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;QAC/B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC9D,KAAK,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,GAAG,IAAI,EAAE,CAAC,CAAC;QACxC,CAAC;IACH,CAAC;SAAM,CAAC;QACN,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,4CAA4C,CAAC,CAAC;IAC3D,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,yEAAyE;AAEzE;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,KAAa,EACb,MAAkB,EAClB,WAA8B;IAE9B,MAAM,OAAO,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;IAEpC,QAAQ,OAAO,CAAC,IAAI,EAAE,CAAC;QACrB,KAAK,MAAM;YACT,OAAO,EAAE,MAAM,EAAE,sBAAsB,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;QAExD,KAAK,MAAM,CAAC,CAAC,CAAC;YACZ,IAAI,CAAC;gBACH,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,SAAS,EAAE,CAAC;gBACvC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;oBACvB,OAAO,EAAE,MAAM,EAAE,qBAAqB,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;gBACxD,CAAC;gBACD,MAAM,KAAK,GAAG,CAAC,kBAAkB,CAAC,CAAC;gBACnC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;oBACzB,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;oBAC9D,KAAK,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,GAAG,IAAI,EAAE,CAAC,CAAC;gBACxC,CAAC;gBACD,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;YACnD,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBAC7D,OAAO,EAAE,MAAM,EAAE,oCAAoC,GAAG,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;YAC5E,CAAC;QACH,CAAC;QAED,KAAK,MAAM,CAAC,CAAC,CAAC;YACZ,MAAM,KAAK,GAAG,WAAW,IAAI,EAAE,CAAC;YAChC,OAAO,EAAE,MAAM,EAAE,UAAU,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;QACpD,CAAC;QAED,KAAK,OAAO;YACV,OAAO,EAAE,MAAM,EAAE,eAAe,OAAO,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;QAEnE,KAAK,MAAM,CAAC,CAAC,CAAC;YACZ,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;gBACrE,OAAO,EAAE,MAAM,EAAE,YAAY,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;YACvD,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBAC7D,yDAAyD;gBACzD,IAAI,WAAW,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBAC1C,OAAO;wBACL,MAAM,EAAE,sBAAsB,GAAG,OAAO,UAAU,CAAC,WAAW,CAAC,EAAE;wBACjE,IAAI,EAAE,KAAK;qBACZ,CAAC;gBACJ,CAAC;gBACD,OAAO,EAAE,MAAM,EAAE,sBAAsB,GAAG,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;YAC9D,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@clawmasons/mcp-agent",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.3",
|
|
4
4
|
"description": "General-purpose MCP agent with REPL and ACP modes for testing and debugging the chapter proxy pipeline",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -29,8 +29,8 @@
|
|
|
29
29
|
"license": "MIT",
|
|
30
30
|
"dependencies": {
|
|
31
31
|
"@agentclientprotocol/sdk": "^0.16.0",
|
|
32
|
-
"@clawmasons/agent-sdk": "^0.1.
|
|
33
|
-
"@clawmasons/shared": "^0.1.
|
|
32
|
+
"@clawmasons/agent-sdk": "^0.1.3",
|
|
33
|
+
"@clawmasons/shared": "^0.1.3"
|
|
34
34
|
},
|
|
35
35
|
"devDependencies": {
|
|
36
36
|
"esbuild": "^0.25.0",
|