@atel-ai/agent 0.2.16 → 0.2.17
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/mcp-shim.d.ts.map +1 -1
- package/dist/mcp-shim.js +114 -28
- package/dist/mcp-shim.js.map +1 -1
- package/package.json +1 -1
package/dist/mcp-shim.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-shim.d.ts","sourceRoot":"","sources":["../src/mcp-shim.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"mcp-shim.d.ts","sourceRoot":"","sources":["../src/mcp-shim.ts"],"names":[],"mappings":"AA4EA,8CAA8C;AAC9C,wBAAsB,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAiHhF"}
|
package/dist/mcp-shim.js
CHANGED
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
*/
|
|
17
17
|
import fs from 'node:fs';
|
|
18
18
|
import path from 'node:path';
|
|
19
|
-
import { AuthManager, fetchWithProxy, loadIdentity, } from '@atel-ai/runtime-core';
|
|
19
|
+
import { AuthManager, fetchWithProxy, loadIdentity, spineWalletBalance, } from '@atel-ai/runtime-core';
|
|
20
20
|
import { Client } from '@modelcontextprotocol/sdk/client/index.js';
|
|
21
21
|
import { StreamableHTTPClientTransport } from '@modelcontextprotocol/sdk/client/streamableHttp.js';
|
|
22
22
|
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
|
|
@@ -25,6 +25,36 @@ import { ListToolsRequestSchema, CallToolRequestSchema, } from '@modelcontextpro
|
|
|
25
25
|
const elog = (m) => {
|
|
26
26
|
process.stderr.write(`[atel-mcp] ${m}\n`);
|
|
27
27
|
};
|
|
28
|
+
const LOCAL_TOOLS = [
|
|
29
|
+
{
|
|
30
|
+
name: 'atel_whoami',
|
|
31
|
+
description: 'Return this ATEL agent identity and local runtime context.',
|
|
32
|
+
inputSchema: {
|
|
33
|
+
type: 'object',
|
|
34
|
+
properties: {},
|
|
35
|
+
additionalProperties: false,
|
|
36
|
+
},
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
name: 'atel_balance',
|
|
40
|
+
description: 'Return this ATEL account balance from the ATEL spine wallet endpoint.',
|
|
41
|
+
inputSchema: {
|
|
42
|
+
type: 'object',
|
|
43
|
+
properties: {},
|
|
44
|
+
additionalProperties: false,
|
|
45
|
+
},
|
|
46
|
+
},
|
|
47
|
+
];
|
|
48
|
+
function textResult(value) {
|
|
49
|
+
return {
|
|
50
|
+
content: [
|
|
51
|
+
{
|
|
52
|
+
type: 'text',
|
|
53
|
+
text: typeof value === 'string' ? value : JSON.stringify(value),
|
|
54
|
+
},
|
|
55
|
+
],
|
|
56
|
+
};
|
|
57
|
+
}
|
|
28
58
|
/** 起一个本地 stdio MCP 垫片,代理到远端 atel MCP,鉴权自管。 */
|
|
29
59
|
export async function runMcpShim(dataDir, version) {
|
|
30
60
|
const cfgPath = path.join(dataDir, 'config.json');
|
|
@@ -46,42 +76,98 @@ export async function runMcpShim(dataDir, version) {
|
|
|
46
76
|
}
|
|
47
77
|
// 持久身份 → 自取/自动续 JWT(不写任何配置文件,onToken 留空)
|
|
48
78
|
const auth = new AuthManager(identity, cfg.spineBaseUrl, { log: elog });
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
return
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
79
|
+
let remote = null;
|
|
80
|
+
let remoteConnecting = null;
|
|
81
|
+
let remoteTools = [];
|
|
82
|
+
// 远端 MCP 建连不能阻塞本地 stdio 初始化。Codex 对 MCP startup 默认只有 30s;
|
|
83
|
+
// 如果这里先 await 远端 streamable-http,冷启动会被网络/代理/SSE 慢路径拖死。
|
|
84
|
+
const connectRemote = async () => {
|
|
85
|
+
if (remote)
|
|
86
|
+
return remote;
|
|
87
|
+
if (remoteConnecting)
|
|
88
|
+
return remoteConnecting;
|
|
89
|
+
remoteConnecting = (async () => {
|
|
90
|
+
const transport = new StreamableHTTPClientTransport(new URL(cfg.mcpUrl), {
|
|
91
|
+
fetch: async (url, init) => {
|
|
92
|
+
const token = await auth.ensureFresh();
|
|
93
|
+
const headers = new Headers(init?.headers);
|
|
94
|
+
headers.set('Authorization', `Bearer ${token}`);
|
|
95
|
+
return fetchWithProxy(url, { ...init, headers });
|
|
96
|
+
},
|
|
97
|
+
});
|
|
98
|
+
const client = new Client({ name: 'atel-mcp-shim', version }, { capabilities: {} });
|
|
99
|
+
transport.onclose = () => {
|
|
100
|
+
elog('远端连接关闭,保留本地 MCP;下次请求时重连');
|
|
101
|
+
remote = null;
|
|
102
|
+
remoteConnecting = null;
|
|
103
|
+
remoteTools = [];
|
|
104
|
+
};
|
|
105
|
+
await client.connect(transport);
|
|
106
|
+
const state = { client, transport };
|
|
107
|
+
remote = state;
|
|
108
|
+
try {
|
|
109
|
+
remoteTools = (await client.listTools()).tools || [];
|
|
110
|
+
}
|
|
111
|
+
catch (e) {
|
|
112
|
+
elog(`读取远端工具列表失败: ${e.message}`);
|
|
113
|
+
}
|
|
114
|
+
elog(`已连远端 ${cfg.mcpUrl}(did=${identity.did}, tools=${remoteTools.length})`);
|
|
115
|
+
void server.sendToolListChanged().catch(() => { });
|
|
116
|
+
return state;
|
|
117
|
+
})().catch((e) => {
|
|
118
|
+
remote = null;
|
|
119
|
+
remoteConnecting = null;
|
|
120
|
+
elog(`连远端 MCP 失败 ${cfg.mcpUrl}: ${e.message}`);
|
|
121
|
+
throw e;
|
|
122
|
+
});
|
|
123
|
+
return remoteConnecting;
|
|
124
|
+
};
|
|
125
|
+
// 本地 stdio server 先就绪:基础账户工具本地实现,其他工具 lazy proxy 到远端。
|
|
69
126
|
const server = new Server({ name: 'atel', version }, { capabilities: { tools: {} } });
|
|
70
|
-
server.setRequestHandler(ListToolsRequestSchema, async (
|
|
71
|
-
|
|
127
|
+
server.setRequestHandler(ListToolsRequestSchema, async () => {
|
|
128
|
+
void connectRemote().catch(() => { });
|
|
129
|
+
const seen = new Set(LOCAL_TOOLS.map((t) => t.name));
|
|
130
|
+
return {
|
|
131
|
+
tools: [
|
|
132
|
+
...LOCAL_TOOLS,
|
|
133
|
+
...remoteTools.filter((t) => {
|
|
134
|
+
const name = t.name;
|
|
135
|
+
if (typeof name !== 'string' || seen.has(name))
|
|
136
|
+
return false;
|
|
137
|
+
seen.add(name);
|
|
138
|
+
return true;
|
|
139
|
+
}),
|
|
140
|
+
],
|
|
141
|
+
};
|
|
72
142
|
});
|
|
73
143
|
server.setRequestHandler(CallToolRequestSchema, async (req) => {
|
|
74
|
-
|
|
144
|
+
if (req.params.name === 'atel_whoami') {
|
|
145
|
+
return textResult({
|
|
146
|
+
did: identity.did,
|
|
147
|
+
runtime: cfg.runtime,
|
|
148
|
+
dataDir: cfg.dataDir,
|
|
149
|
+
mcpUrl: cfg.mcpUrl,
|
|
150
|
+
spineBaseUrl: cfg.spineBaseUrl,
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
if (req.params.name === 'atel_balance') {
|
|
154
|
+
const r = await spineWalletBalance(cfg.spineBaseUrl, identity);
|
|
155
|
+
if (!r.ok) {
|
|
156
|
+
return textResult({ ok: false, status: r.status, body: r.body.slice(0, 500) });
|
|
157
|
+
}
|
|
158
|
+
return textResult(r.json ?? r.body);
|
|
159
|
+
}
|
|
160
|
+
const state = await connectRemote();
|
|
161
|
+
return await state.client.callTool(req.params);
|
|
75
162
|
});
|
|
76
163
|
const onExit = () => {
|
|
77
164
|
auth.stop();
|
|
78
|
-
void client.close().catch(() => { });
|
|
165
|
+
void remote?.client.close().catch(() => { });
|
|
79
166
|
};
|
|
80
167
|
process.on('SIGINT', () => { onExit(); process.exit(0); });
|
|
81
168
|
process.on('SIGTERM', () => { onExit(); process.exit(0); });
|
|
82
|
-
// 远端断开则退出,让宿主 CLI 感知(它会按需重启垫片)。
|
|
83
|
-
transport.onclose = () => { elog('远端连接关闭,退出'); process.exit(0); };
|
|
84
169
|
await server.connect(new StdioServerTransport());
|
|
85
|
-
elog('stdio MCP server 就绪(atel
|
|
170
|
+
elog('stdio MCP server 就绪(基础 atel 工具已就位;远端工具后台连接)');
|
|
171
|
+
void connectRemote().catch(() => { });
|
|
86
172
|
}
|
|
87
173
|
//# sourceMappingURL=mcp-shim.js.map
|
package/dist/mcp-shim.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-shim.js","sourceRoot":"","sources":["../src/mcp-shim.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EACL,WAAW,EACX,cAAc,EACd,YAAY,
|
|
1
|
+
{"version":3,"file":"mcp-shim.js","sourceRoot":"","sources":["../src/mcp-shim.ts"],"names":[],"mappings":"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"}
|